So I bitterly complain about people globally changing things that has the side-effect of breaking my code. Some changes are well-intentioned, but even those often break my code. If you ack through your @INC, you'll often find all sorts of CORE::GLOBAL trickery which just doesn't belong there. Which is why my post yesterday on customizing Test::Most is a wee bit embarrassing.
Oh, it looks safe enough, but there's this little bit here:
for my $i ( 0 .. $#_ ) { if ( 'trace' eq ( $_[$i] || '' ) ) { splice @_, $i, 1; $SIG{__DIE__} = sub { require Carp; Carp::confess(@_); }; } }
That let's me do use Pips3::Test::Most qw/no_plan trace/; and get a stack trace when a test fails. Nifty, eh? Plus, it only overrides $SIG{__DIE__} when I ask for it. Er, sort of.
I spent a lot of time debugging some tests running under Test::Aggregate. Our tests run about three times faster under that, but were somehow failing miserably for mysterious reasons. Seems that when a test with "trace" enabled was aggregated, other tests in different files picked up the trace and exception tests would often fail mysteriously. I'm uploading a new version of Test::Aggregate to PAUSE which ensures that the TEST_AGGREGATE environment variable is set in a BEGIN block (as it should have been). This allows me to do this:
for my $i ( 0 .. $#_ ) { if ( 'trace' eq ( $_[$i] || '' ) ) { splice @_, $i, 1; if ( $ENV{TEST_AGGREGATE} ) { explain("No tracing aggregate tests (due to tests checking exceptions"); } else { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_); }; } } }
I'll think of a better fix later, but for right now, this will do.
Once again, a global change to behavior, no matter how safely written, breaks things in strange and mysterious ways.