Today I upgraded to the latest stable Test::Builder and now we have the following failure:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::Builder 0.75;
use Test::More qw/no_plan/;
BEGIN {
package Foo;
use Test::More;
}
TODO: {
local $TODO = 'foobar';
ok 0, 'testing todo';
}
Since my latest posts have been focusing heavily on global effects breaking code, you might be immediately suspicious of the local $TODO and you'd be right.
Test::Builder versions 0.75 and above have an ok() method which has this interesting line:
my $todo = $self->todo;
It used to say this:
my($pack, $file, $line) = $self->caller; my $todo = $self->todo($pack);
In the todo method, we have this:
sub todo {
my($self, $pack) = @_;
$pack = $pack || $self->exported_to || $self->caller($Level);
return 0 unless $pack;
no strict 'refs'; ## no critic
return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
: 0;
}
In other words, rather than check our actual calling package, we wind up checking the last package that the functions were exported to.
Once again, relying on global data has introduced a bug in our code.