>From http://use.perl.org/~Ovid/journal/39193


The latest developer release of Test::More allows subtests. Subtests are great 
in that they solve a lot of
problems in advanced Perl testing, but they have required a change in 
Test::Builder.  Previously you could do stuff like this:
package Test::StringReverse;

use base 'Test::Builder::Module';
our @EXPORT = qw(is_reversed);

my $BUILDER = Test::Builder->new;

sub is_reversed ($$;$) {
    my ( $have, $want, $name ) = @_;

    my $passed = $want eq scalar reverse $name;

    $BUILDER->ok($passed, $name);
    $BUILDER->diag(<<"    END_DIAG") if not $passed;
    have: $have
    want: $want
    END_DIAG

    return $passed;
}

1;
And you've have a simple (untested;) test for whether or not strings are 
reversed.  The reason that worked is that Test::Builder->new used to return a 
singleton. This is no longer true. If someone uses
your test library in a subtest, the above code would break. Instead,
you want to do this:
sub is_reversed ($$;$) {
    my ( $have, $want, $name ) = @_;

    my $passed  = $want eq scalar reverse $name;
    my $builder = __PACKAGE__->builder;

    $builder->ok($passed, $name);
    $builder->diag(<<"    END_DIAG") if not $passed;
    have: $have
    want: $want
    END_DIAG

    return $passed;
}
It's a minor change, it's completely backwards-compatible and it supports 
subtests.
Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://use.perl.org/~Ovid/journal/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6

Reply via email to