Blame t/Test/Builder.pm

Packit d03632
package Test::Builder;
Packit d03632
Packit d03632
use 5.004;
Packit d03632
Packit d03632
# $^C was only introduced in 5.005-ish.  We do this to prevent
Packit d03632
# use of uninitialized value warnings in older perls.
Packit d03632
$^C ||= 0;
Packit d03632
Packit d03632
use strict;
Packit d03632
use vars qw($VERSION);
Packit d03632
$VERSION = '0.30';
Packit d03632
$VERSION = eval $VERSION;    # make the alpha version come out as a number
Packit d03632
Packit d03632
# Make Test::Builder thread-safe for ithreads.
Packit d03632
BEGIN {
Packit d03632
    use Config;
Packit d03632
    # Load threads::shared when threads are turned on
Packit d03632
    if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) {
Packit d03632
        require threads::shared;
Packit d03632
Packit d03632
        # Hack around YET ANOTHER threads::shared bug.  It would 
Packit d03632
        # occassionally forget the contents of the variable when sharing it.
Packit d03632
        # So we first copy the data, then share, then put our copy back.
Packit d03632
        *share = sub (\[$@%]) {
Packit d03632
            my $type = ref $_[0];
Packit d03632
            my $data;
Packit d03632
Packit d03632
            if( $type eq 'HASH' ) {
Packit d03632
                %$data = %{$_[0]};
Packit d03632
            }
Packit d03632
            elsif( $type eq 'ARRAY' ) {
Packit d03632
                @$data = @{$_[0]};
Packit d03632
            }
Packit d03632
            elsif( $type eq 'SCALAR' ) {
Packit d03632
                $$data = ${$_[0]};
Packit d03632
            }
Packit d03632
            else {
Packit d03632
                die "Unknown type: ".$type;
Packit d03632
            }
Packit d03632
Packit d03632
            $_[0] = &threads::shared::share($_[0]);
Packit d03632
Packit d03632
            if( $type eq 'HASH' ) {
Packit d03632
                %{$_[0]} = %$data;
Packit d03632
            }
Packit d03632
            elsif( $type eq 'ARRAY' ) {
Packit d03632
                @{$_[0]} = @$data;
Packit d03632
            }
Packit d03632
            elsif( $type eq 'SCALAR' ) {
Packit d03632
                ${$_[0]} = $$data;
Packit d03632
            }
Packit d03632
            else {
Packit d03632
                die "Unknown type: ".$type;
Packit d03632
            }
Packit d03632
Packit d03632
            return $_[0];
Packit d03632
        };
Packit d03632
    }
Packit d03632
    # 5.8.0's threads::shared is busted when threads are off.
Packit d03632
    # We emulate it here.
Packit d03632
    else {
Packit d03632
        *share = sub { return $_[0] };
Packit d03632
        *lock  = sub { 0 };
Packit d03632
    }
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=head1 NAME
Packit d03632
Packit d03632
Test::Builder - Backend for building test libraries
Packit d03632
Packit d03632
=head1 SYNOPSIS
Packit d03632
Packit d03632
  package My::Test::Module;
Packit d03632
  use Test::Builder;
Packit d03632
  require Exporter;
Packit d03632
  @ISA = qw(Exporter);
Packit d03632
  @EXPORT = qw(ok);
Packit d03632
Packit d03632
  my $Test = Test::Builder->new;
Packit d03632
  $Test->output('my_logfile');
Packit d03632
Packit d03632
  sub import {
Packit d03632
      my($self) = shift;
Packit d03632
      my $pack = caller;
Packit d03632
Packit d03632
      $Test->exported_to($pack);
Packit d03632
      $Test->plan(@_);
Packit d03632
Packit d03632
      $self->export_to_level(1, $self, 'ok');
Packit d03632
  }
Packit d03632
Packit d03632
  sub ok {
Packit d03632
      my($test, $name) = @_;
Packit d03632
Packit d03632
      $Test->ok($test, $name);
Packit d03632
  }
Packit d03632
Packit d03632
Packit d03632
=head1 DESCRIPTION
Packit d03632
Packit d03632
Test::Simple and Test::More have proven to be popular testing modules,
Packit d03632
but they're not always flexible enough.  Test::Builder provides the a
Packit d03632
building block upon which to write your own test libraries I
Packit d03632
work together>.
Packit d03632
Packit d03632
=head2 Construction
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<new>
Packit d03632
Packit d03632
  my $Test = Test::Builder->new;
Packit d03632
Packit d03632
Returns a Test::Builder object representing the current state of the
Packit d03632
test.
Packit d03632
Packit d03632
Since you only run one test per program C<new> always returns the same
Packit d03632
Test::Builder object.  No matter how many times you call new(), you're
Packit d03632
getting the same object.  This is called a singleton.  This is done so that
Packit d03632
multiple modules share such global information as the test counter and
Packit d03632
where test output is going.
Packit d03632
Packit d03632
If you want a completely new Test::Builder object different from the
Packit d03632
singleton, use C<create>.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
my $Test = Test::Builder->new;
Packit d03632
sub new {
Packit d03632
    my($class) = shift;
Packit d03632
    $Test ||= $class->create;
Packit d03632
    return $Test;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<create>
Packit d03632
Packit d03632
  my $Test = Test::Builder->create;
Packit d03632
Packit d03632
Ok, so there can be more than one Test::Builder object and this is how
Packit d03632
you get it.  You might use this instead of C<new()> if you're testing
Packit d03632
a Test::Builder based module, but otherwise you probably want C<new>.
Packit d03632
Packit d03632
B<NOTE>: the implementation is not complete.  C<level>, for example, is
Packit d03632
still shared amongst B<all> Test::Builder objects, even ones created using
Packit d03632
this method.  Also, the method name may change in the future.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub create {
Packit d03632
    my $class = shift;
Packit d03632
Packit d03632
    my $self = bless {}, $class;
Packit d03632
    $self->reset;
Packit d03632
Packit d03632
    return $self;
Packit d03632
}
Packit d03632
Packit d03632
=item B<reset>
Packit d03632
Packit d03632
  $Test->reset;
Packit d03632
Packit d03632
Reinitializes the Test::Builder singleton to its original state.
Packit d03632
Mostly useful for tests run in persistent environments where the same
Packit d03632
test might be run multiple times in the same process.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
use vars qw($Level);
Packit d03632
Packit d03632
sub reset {
Packit d03632
    my ($self) = @_;
Packit d03632
Packit d03632
    # We leave this a global because it has to be localized and localizing
Packit d03632
    # hash keys is just asking for pain.  Also, it was documented.
Packit d03632
    $Level = 1;
Packit d03632
Packit d03632
    $self->{Test_Died}    = 0;
Packit d03632
    $self->{Have_Plan}    = 0;
Packit d03632
    $self->{No_Plan}      = 0;
Packit d03632
    $self->{Original_Pid} = $$;
Packit d03632
Packit d03632
    share($self->{Curr_Test});
Packit d03632
    $self->{Curr_Test}    = 0;
Packit d03632
    $self->{Test_Results} = &share([]);
Packit d03632
Packit d03632
    $self->{Exported_To}    = undef;
Packit d03632
    $self->{Expected_Tests} = 0;
Packit d03632
Packit d03632
    $self->{Skip_All}   = 0;
Packit d03632
Packit d03632
    $self->{Use_Nums}   = 1;
Packit d03632
Packit d03632
    $self->{No_Header}  = 0;
Packit d03632
    $self->{No_Ending}  = 0;
Packit d03632
Packit d03632
    $self->_dup_stdhandles unless $^C;
Packit d03632
Packit d03632
    return undef;
Packit d03632
}
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
=head2 Setting up tests
Packit d03632
Packit d03632
These methods are for setting up tests and declaring how many there
Packit d03632
are.  You usually only want to call one of these methods.
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<exported_to>
Packit d03632
Packit d03632
  my $pack = $Test->exported_to;
Packit d03632
  $Test->exported_to($pack);
Packit d03632
Packit d03632
Tells Test::Builder what package you exported your functions to.
Packit d03632
This is important for getting TODO tests right.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub exported_to {
Packit d03632
    my($self, $pack) = @_;
Packit d03632
Packit d03632
    if( defined $pack ) {
Packit d03632
        $self->{Exported_To} = $pack;
Packit d03632
    }
Packit d03632
    return $self->{Exported_To};
Packit d03632
}
Packit d03632
Packit d03632
=item B<plan>
Packit d03632
Packit d03632
  $Test->plan('no_plan');
Packit d03632
  $Test->plan( skip_all => $reason );
Packit d03632
  $Test->plan( tests => $num_tests );
Packit d03632
Packit d03632
A convenient way to set up your tests.  Call this and Test::Builder
Packit d03632
will print the appropriate headers and take the appropriate actions.
Packit d03632
Packit d03632
If you call plan(), don't call any of the other methods below.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub plan {
Packit d03632
    my($self, $cmd, $arg) = @_;
Packit d03632
Packit d03632
    return unless $cmd;
Packit d03632
Packit d03632
    if( $self->{Have_Plan} ) {
Packit d03632
        die sprintf "You tried to plan twice!  Second plan at %s line %d\n",
Packit d03632
          ($self->caller)[1,2];
Packit d03632
    }
Packit d03632
Packit d03632
    if( $cmd eq 'no_plan' ) {
Packit d03632
        $self->no_plan;
Packit d03632
    }
Packit d03632
    elsif( $cmd eq 'skip_all' ) {
Packit d03632
        return $self->skip_all($arg);
Packit d03632
    }
Packit d03632
    elsif( $cmd eq 'tests' ) {
Packit d03632
        if( $arg ) {
Packit d03632
            return $self->expected_tests($arg);
Packit d03632
        }
Packit d03632
        elsif( !defined $arg ) {
Packit d03632
            die "Got an undefined number of tests.  Looks like you tried to ".
Packit d03632
                "say how many tests you plan to run but made a mistake.\n";
Packit d03632
        }
Packit d03632
        elsif( !$arg ) {
Packit d03632
            die "You said to run 0 tests!  You've got to run something.\n";
Packit d03632
        }
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        require Carp;
Packit d03632
        my @args = grep { defined } ($cmd, $arg);
Packit d03632
        Carp::croak("plan() doesn't understand @args");
Packit d03632
    }
Packit d03632
Packit d03632
    return 1;
Packit d03632
}
Packit d03632
Packit d03632
=item B<expected_tests>
Packit d03632
Packit d03632
    my $max = $Test->expected_tests;
Packit d03632
    $Test->expected_tests($max);
Packit d03632
Packit d03632
Gets/sets the # of tests we expect this test to run and prints out
Packit d03632
the appropriate headers.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub expected_tests {
Packit d03632
    my $self = shift;
Packit d03632
    my($max) = @_;
Packit d03632
Packit d03632
    if( @_ ) {
Packit d03632
        die "Number of tests must be a postive integer.  You gave it '$max'.\n"
Packit d03632
          unless $max =~ /^\+?\d+$/ and $max > 0;
Packit d03632
Packit d03632
        $self->{Expected_Tests} = $max;
Packit d03632
        $self->{Have_Plan}      = 1;
Packit d03632
Packit d03632
        $self->_print("1..$max\n") unless $self->no_header;
Packit d03632
    }
Packit d03632
    return $self->{Expected_Tests};
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<no_plan>
Packit d03632
Packit d03632
  $Test->no_plan;
Packit d03632
Packit d03632
Declares that this test will run an indeterminate # of tests.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub no_plan {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    $self->{No_Plan}   = 1;
Packit d03632
    $self->{Have_Plan} = 1;
Packit d03632
}
Packit d03632
Packit d03632
=item B<has_plan>
Packit d03632
Packit d03632
  $plan = $Test->has_plan
Packit d03632
Packit d03632
Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests).
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub has_plan {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    return($self->{Expected_Tests}) if $self->{Expected_Tests};
Packit d03632
    return('no_plan') if $self->{No_Plan};
Packit d03632
    return(undef);
Packit d03632
};
Packit d03632
Packit d03632
Packit d03632
=item B<skip_all>
Packit d03632
Packit d03632
  $Test->skip_all;
Packit d03632
  $Test->skip_all($reason);
Packit d03632
Packit d03632
Skips all the tests, using the given $reason.  Exits immediately with 0.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub skip_all {
Packit d03632
    my($self, $reason) = @_;
Packit d03632
Packit d03632
    my $out = "1..0";
Packit d03632
    $out .= " # Skip $reason" if $reason;
Packit d03632
    $out .= "\n";
Packit d03632
Packit d03632
    $self->{Skip_All} = 1;
Packit d03632
Packit d03632
    $self->_print($out) unless $self->no_header;
Packit d03632
    exit(0);
Packit d03632
}
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
=head2 Running tests
Packit d03632
Packit d03632
These actually run the tests, analogous to the functions in
Packit d03632
Test::More.
Packit d03632
Packit d03632
$name is always optional.
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<ok>
Packit d03632
Packit d03632
  $Test->ok($test, $name);
Packit d03632
Packit d03632
Your basic test.  Pass if $test is true, fail if $test is false.  Just
Packit d03632
like Test::Simple's ok().
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub ok {
Packit d03632
    my($self, $test, $name) = @_;
Packit d03632
Packit d03632
    # $test might contain an object which we don't want to accidentally
Packit d03632
    # store, so we turn it into a boolean.
Packit d03632
    $test = $test ? 1 : 0;
Packit d03632
Packit d03632
    unless( $self->{Have_Plan} ) {
Packit d03632
        require Carp;
Packit d03632
        Carp::croak("You tried to run a test without a plan!  Gotta have a plan.");
Packit d03632
    }
Packit d03632
Packit d03632
    lock $self->{Curr_Test};
Packit d03632
    $self->{Curr_Test}++;
Packit d03632
Packit d03632
    # In case $name is a string overloaded object, force it to stringify.
Packit d03632
    $self->_unoverload(\$name);
Packit d03632
Packit d03632
    $self->diag(<
Packit d03632
    You named your test '$name'.  You shouldn't use numbers for your test names.
Packit d03632
    Very confusing.
Packit d03632
ERR
Packit d03632
Packit d03632
    my($pack, $file, $line) = $self->caller;
Packit d03632
Packit d03632
    my $todo = $self->todo($pack);
Packit d03632
    $self->_unoverload(\$todo);
Packit d03632
Packit d03632
    my $out;
Packit d03632
    my $result = &share({});
Packit d03632
Packit d03632
    unless( $test ) {
Packit d03632
        $out .= "not ";
Packit d03632
        @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        @$result{ 'ok', 'actual_ok' } = ( 1, $test );
Packit d03632
    }
Packit d03632
Packit d03632
    $out .= "ok";
Packit d03632
    $out .= " $self->{Curr_Test}" if $self->use_numbers;
Packit d03632
Packit d03632
    if( defined $name ) {
Packit d03632
        $name =~ s|#|\\#|g;     # # in a name can confuse Test::Harness.
Packit d03632
        $out   .= " - $name";
Packit d03632
        $result->{name} = $name;
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        $result->{name} = '';
Packit d03632
    }
Packit d03632
Packit d03632
    if( $todo ) {
Packit d03632
        $out   .= " # TODO $todo";
Packit d03632
        $result->{reason} = $todo;
Packit d03632
        $result->{type}   = 'todo';
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        $result->{reason} = '';
Packit d03632
        $result->{type}   = '';
Packit d03632
    }
Packit d03632
Packit d03632
    $self->{Test_Results}[$self->{Curr_Test}-1] = $result;
Packit d03632
    $out .= "\n";
Packit d03632
Packit d03632
    $self->_print($out);
Packit d03632
Packit d03632
    unless( $test ) {
Packit d03632
        my $msg = $todo ? "Failed (TODO)" : "Failed";
Packit d03632
        $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE};
Packit d03632
        $self->diag("    $msg test ($file at line $line)\n");
Packit d03632
    } 
Packit d03632
Packit d03632
    return $test ? 1 : 0;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
sub _unoverload {
Packit d03632
    my $self  = shift;
Packit d03632
Packit d03632
    local($@,$!);
Packit d03632
Packit d03632
    eval { require overload } || return;
Packit d03632
Packit d03632
    foreach my $thing (@_) {
Packit d03632
        eval { 
Packit d03632
            if( defined $$thing ) {
Packit d03632
                if( my $string_meth = overload::Method($$thing, '""') ) {
Packit d03632
                    $$thing = $$thing->$string_meth();
Packit d03632
                }
Packit d03632
            }
Packit d03632
        };
Packit d03632
    }
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<is_eq>
Packit d03632
Packit d03632
  $Test->is_eq($got, $expected, $name);
Packit d03632
Packit d03632
Like Test::More's is().  Checks if $got eq $expected.  This is the
Packit d03632
string version.
Packit d03632
Packit d03632
=item B<is_num>
Packit d03632
Packit d03632
  $Test->is_num($got, $expected, $name);
Packit d03632
Packit d03632
Like Test::More's is().  Checks if $got == $expected.  This is the
Packit d03632
numeric version.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub is_eq {
Packit d03632
    my($self, $got, $expect, $name) = @_;
Packit d03632
    local $Level = $Level + 1;
Packit d03632
Packit d03632
    if( !defined $got || !defined $expect ) {
Packit d03632
        # undef only matches undef and nothing else
Packit d03632
        my $test = !defined $got && !defined $expect;
Packit d03632
Packit d03632
        $self->ok($test, $name);
Packit d03632
        $self->_is_diag($got, 'eq', $expect) unless $test;
Packit d03632
        return $test;
Packit d03632
    }
Packit d03632
Packit d03632
    return $self->cmp_ok($got, 'eq', $expect, $name);
Packit d03632
}
Packit d03632
Packit d03632
sub is_num {
Packit d03632
    my($self, $got, $expect, $name) = @_;
Packit d03632
    local $Level = $Level + 1;
Packit d03632
Packit d03632
    if( !defined $got || !defined $expect ) {
Packit d03632
        # undef only matches undef and nothing else
Packit d03632
        my $test = !defined $got && !defined $expect;
Packit d03632
Packit d03632
        $self->ok($test, $name);
Packit d03632
        $self->_is_diag($got, '==', $expect) unless $test;
Packit d03632
        return $test;
Packit d03632
    }
Packit d03632
Packit d03632
    return $self->cmp_ok($got, '==', $expect, $name);
Packit d03632
}
Packit d03632
Packit d03632
sub _is_diag {
Packit d03632
    my($self, $got, $type, $expect) = @_;
Packit d03632
Packit d03632
    foreach my $val (\$got, \$expect) {
Packit d03632
        if( defined $$val ) {
Packit d03632
            if( $type eq 'eq' ) {
Packit d03632
                # quote and force string context
Packit d03632
                $$val = "'$$val'"
Packit d03632
            }
Packit d03632
            else {
Packit d03632
                # force numeric context
Packit d03632
                $$val = $$val+0;
Packit d03632
            }
Packit d03632
        }
Packit d03632
        else {
Packit d03632
            $$val = 'undef';
Packit d03632
        }
Packit d03632
    }
Packit d03632
Packit d03632
    return $self->diag(sprintf <
Packit d03632
         got: %s
Packit d03632
    expected: %s
Packit d03632
DIAGNOSTIC
Packit d03632
Packit d03632
}    
Packit d03632
Packit d03632
=item B<isnt_eq>
Packit d03632
Packit d03632
  $Test->isnt_eq($got, $dont_expect, $name);
Packit d03632
Packit d03632
Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
Packit d03632
the string version.
Packit d03632
Packit d03632
=item B<isnt_num>
Packit d03632
Packit d03632
  $Test->is_num($got, $dont_expect, $name);
Packit d03632
Packit d03632
Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
Packit d03632
the numeric version.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub isnt_eq {
Packit d03632
    my($self, $got, $dont_expect, $name) = @_;
Packit d03632
    local $Level = $Level + 1;
Packit d03632
Packit d03632
    if( !defined $got || !defined $dont_expect ) {
Packit d03632
        # undef only matches undef and nothing else
Packit d03632
        my $test = defined $got || defined $dont_expect;
Packit d03632
Packit d03632
        $self->ok($test, $name);
Packit d03632
        $self->_cmp_diag($got, 'ne', $dont_expect) unless $test;
Packit d03632
        return $test;
Packit d03632
    }
Packit d03632
Packit d03632
    return $self->cmp_ok($got, 'ne', $dont_expect, $name);
Packit d03632
}
Packit d03632
Packit d03632
sub isnt_num {
Packit d03632
    my($self, $got, $dont_expect, $name) = @_;
Packit d03632
    local $Level = $Level + 1;
Packit d03632
Packit d03632
    if( !defined $got || !defined $dont_expect ) {
Packit d03632
        # undef only matches undef and nothing else
Packit d03632
        my $test = defined $got || defined $dont_expect;
Packit d03632
Packit d03632
        $self->ok($test, $name);
Packit d03632
        $self->_cmp_diag($got, '!=', $dont_expect) unless $test;
Packit d03632
        return $test;
Packit d03632
    }
Packit d03632
Packit d03632
    return $self->cmp_ok($got, '!=', $dont_expect, $name);
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<like>
Packit d03632
Packit d03632
  $Test->like($this, qr/$regex/, $name);
Packit d03632
  $Test->like($this, '/$regex/', $name);
Packit d03632
Packit d03632
Like Test::More's like().  Checks if $this matches the given $regex.
Packit d03632
Packit d03632
You'll want to avoid qr// if you want your tests to work before 5.005.
Packit d03632
Packit d03632
=item B<unlike>
Packit d03632
Packit d03632
  $Test->unlike($this, qr/$regex/, $name);
Packit d03632
  $Test->unlike($this, '/$regex/', $name);
Packit d03632
Packit d03632
Like Test::More's unlike().  Checks if $this B<does not match> the
Packit d03632
given $regex.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub like {
Packit d03632
    my($self, $this, $regex, $name) = @_;
Packit d03632
Packit d03632
    local $Level = $Level + 1;
Packit d03632
    $self->_regex_ok($this, $regex, '=~', $name);
Packit d03632
}
Packit d03632
Packit d03632
sub unlike {
Packit d03632
    my($self, $this, $regex, $name) = @_;
Packit d03632
Packit d03632
    local $Level = $Level + 1;
Packit d03632
    $self->_regex_ok($this, $regex, '!~', $name);
Packit d03632
}
Packit d03632
Packit d03632
=item B<maybe_regex>
Packit d03632
Packit d03632
  $Test->maybe_regex(qr/$regex/);
Packit d03632
  $Test->maybe_regex('/$regex/');
Packit d03632
Packit d03632
Convenience method for building testing functions that take regular
Packit d03632
expressions as arguments, but need to work before perl 5.005.
Packit d03632
Packit d03632
Takes a quoted regular expression produced by qr//, or a string
Packit d03632
representing a regular expression.
Packit d03632
Packit d03632
Returns a Perl value which may be used instead of the corresponding
Packit d03632
regular expression, or undef if it's argument is not recognised.
Packit d03632
Packit d03632
For example, a version of like(), sans the useful diagnostic messages,
Packit d03632
could be written as:
Packit d03632
Packit d03632
  sub laconic_like {
Packit d03632
      my ($self, $this, $regex, $name) = @_;
Packit d03632
      my $usable_regex = $self->maybe_regex($regex);
Packit d03632
      die "expecting regex, found '$regex'\n"
Packit d03632
          unless $usable_regex;
Packit d03632
      $self->ok($this =~ m/$usable_regex/, $name);
Packit d03632
  }
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
Packit d03632
sub maybe_regex {
Packit d03632
    my ($self, $regex) = @_;
Packit d03632
    my $usable_regex = undef;
Packit d03632
Packit d03632
    return $usable_regex unless defined $regex;
Packit d03632
Packit d03632
    my($re, $opts);
Packit d03632
Packit d03632
    # Check for qr/foo/
Packit d03632
    if( ref $regex eq 'Regexp' ) {
Packit d03632
        $usable_regex = $regex;
Packit d03632
    }
Packit d03632
    # Check for '/foo/' or 'm,foo,'
Packit d03632
    elsif( ($re, $opts)        = $regex =~ m{^ /(.*)/ (\w*) $ }sx           or
Packit d03632
           (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
Packit d03632
         )
Packit d03632
    {
Packit d03632
        $usable_regex = length $opts ? "(?$opts)$re" : $re;
Packit d03632
    }
Packit d03632
Packit d03632
    return $usable_regex;
Packit d03632
};
Packit d03632
Packit d03632
sub _regex_ok {
Packit d03632
    my($self, $this, $regex, $cmp, $name) = @_;
Packit d03632
Packit d03632
    local $Level = $Level + 1;
Packit d03632
Packit d03632
    my $ok = 0;
Packit d03632
    my $usable_regex = $self->maybe_regex($regex);
Packit d03632
    unless (defined $usable_regex) {
Packit d03632
        $ok = $self->ok( 0, $name );
Packit d03632
        $self->diag("    '$regex' doesn't look much like a regex to me.");
Packit d03632
        return $ok;
Packit d03632
    }
Packit d03632
Packit d03632
    {
Packit d03632
        local $^W = 0;
Packit d03632
        my $test = $this =~ /$usable_regex/ ? 1 : 0;
Packit d03632
        $test = !$test if $cmp eq '!~';
Packit d03632
        $ok = $self->ok( $test, $name );
Packit d03632
    }
Packit d03632
Packit d03632
    unless( $ok ) {
Packit d03632
        $this = defined $this ? "'$this'" : 'undef';
Packit d03632
        my $match = $cmp eq '=~' ? "doesn't match" : "matches";
Packit d03632
        $self->diag(sprintf <
Packit d03632
                  %s
Packit d03632
    %13s '%s'
Packit d03632
DIAGNOSTIC
Packit d03632
Packit d03632
    }
Packit d03632
Packit d03632
    return $ok;
Packit d03632
}
Packit d03632
Packit d03632
=item B<cmp_ok>
Packit d03632
Packit d03632
  $Test->cmp_ok($this, $type, $that, $name);
Packit d03632
Packit d03632
Works just like Test::More's cmp_ok().
Packit d03632
Packit d03632
    $Test->cmp_ok($big_num, '!=', $other_big_num);
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub cmp_ok {
Packit d03632
    my($self, $got, $type, $expect, $name) = @_;
Packit d03632
Packit d03632
    my $test;
Packit d03632
    {
Packit d03632
        local $^W = 0;
Packit d03632
        local($@,$!);   # don't interfere with $@
Packit d03632
                        # eval() sometimes resets $!
Packit d03632
        $test = eval "\$got $type \$expect";
Packit d03632
    }
Packit d03632
    local $Level = $Level + 1;
Packit d03632
    my $ok = $self->ok($test, $name);
Packit d03632
Packit d03632
    unless( $ok ) {
Packit d03632
        if( $type =~ /^(eq|==)$/ ) {
Packit d03632
            $self->_is_diag($got, $type, $expect);
Packit d03632
        }
Packit d03632
        else {
Packit d03632
            $self->_cmp_diag($got, $type, $expect);
Packit d03632
        }
Packit d03632
    }
Packit d03632
    return $ok;
Packit d03632
}
Packit d03632
Packit d03632
sub _cmp_diag {
Packit d03632
    my($self, $got, $type, $expect) = @_;
Packit d03632
    
Packit d03632
    $got    = defined $got    ? "'$got'"    : 'undef';
Packit d03632
    $expect = defined $expect ? "'$expect'" : 'undef';
Packit d03632
    return $self->diag(sprintf <
Packit d03632
    %s
Packit d03632
        %s
Packit d03632
    %s
Packit d03632
DIAGNOSTIC
Packit d03632
}
Packit d03632
Packit d03632
=item B<BAILOUT>
Packit d03632
Packit d03632
    $Test->BAILOUT($reason);
Packit d03632
Packit d03632
Indicates to the Test::Harness that things are going so badly all
Packit d03632
testing should terminate.  This includes running any additional test
Packit d03632
scripts.
Packit d03632
Packit d03632
It will exit with 255.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub BAILOUT {
Packit d03632
    my($self, $reason) = @_;
Packit d03632
Packit d03632
    $self->_print("Bail out!  $reason");
Packit d03632
    exit 255;
Packit d03632
}
Packit d03632
Packit d03632
=item B<skip>
Packit d03632
Packit d03632
    $Test->skip;
Packit d03632
    $Test->skip($why);
Packit d03632
Packit d03632
Skips the current test, reporting $why.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub skip {
Packit d03632
    my($self, $why) = @_;
Packit d03632
    $why ||= '';
Packit d03632
    $self->_unoverload(\$why);
Packit d03632
Packit d03632
    unless( $self->{Have_Plan} ) {
Packit d03632
        require Carp;
Packit d03632
        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
Packit d03632
    }
Packit d03632
Packit d03632
    lock($self->{Curr_Test});
Packit d03632
    $self->{Curr_Test}++;
Packit d03632
Packit d03632
    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
Packit d03632
        'ok'      => 1,
Packit d03632
        actual_ok => 1,
Packit d03632
        name      => '',
Packit d03632
        type      => 'skip',
Packit d03632
        reason    => $why,
Packit d03632
    });
Packit d03632
Packit d03632
    my $out = "ok";
Packit d03632
    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
Packit d03632
    $out   .= " # skip";
Packit d03632
    $out   .= " $why"       if length $why;
Packit d03632
    $out   .= "\n";
Packit d03632
Packit d03632
    $self->_print($out);
Packit d03632
Packit d03632
    return 1;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<todo_skip>
Packit d03632
Packit d03632
  $Test->todo_skip;
Packit d03632
  $Test->todo_skip($why);
Packit d03632
Packit d03632
Like skip(), only it will declare the test as failing and TODO.  Similar
Packit d03632
to
Packit d03632
Packit d03632
    print "not ok $tnum # TODO $why\n";
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub todo_skip {
Packit d03632
    my($self, $why) = @_;
Packit d03632
    $why ||= '';
Packit d03632
Packit d03632
    unless( $self->{Have_Plan} ) {
Packit d03632
        require Carp;
Packit d03632
        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
Packit d03632
    }
Packit d03632
Packit d03632
    lock($self->{Curr_Test});
Packit d03632
    $self->{Curr_Test}++;
Packit d03632
Packit d03632
    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
Packit d03632
        'ok'      => 1,
Packit d03632
        actual_ok => 0,
Packit d03632
        name      => '',
Packit d03632
        type      => 'todo_skip',
Packit d03632
        reason    => $why,
Packit d03632
    });
Packit d03632
Packit d03632
    my $out = "not ok";
Packit d03632
    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
Packit d03632
    $out   .= " # TODO & SKIP $why\n";
Packit d03632
Packit d03632
    $self->_print($out);
Packit d03632
Packit d03632
    return 1;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=begin _unimplemented
Packit d03632
Packit d03632
=item B<skip_rest>
Packit d03632
Packit d03632
  $Test->skip_rest;
Packit d03632
  $Test->skip_rest($reason);
Packit d03632
Packit d03632
Like skip(), only it skips all the rest of the tests you plan to run
Packit d03632
and terminates the test.
Packit d03632
Packit d03632
If you're running under no_plan, it skips once and terminates the
Packit d03632
test.
Packit d03632
Packit d03632
=end _unimplemented
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
Packit d03632
=head2 Test style
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<level>
Packit d03632
Packit d03632
    $Test->level($how_high);
Packit d03632
Packit d03632
How far up the call stack should $Test look when reporting where the
Packit d03632
test failed.
Packit d03632
Packit d03632
Defaults to 1.
Packit d03632
Packit d03632
Setting $Test::Builder::Level overrides.  This is typically useful
Packit d03632
localized:
Packit d03632
Packit d03632
    {
Packit d03632
        local $Test::Builder::Level = 2;
Packit d03632
        $Test->ok($test);
Packit d03632
    }
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub level {
Packit d03632
    my($self, $level) = @_;
Packit d03632
Packit d03632
    if( defined $level ) {
Packit d03632
        $Level = $level;
Packit d03632
    }
Packit d03632
    return $Level;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<use_numbers>
Packit d03632
Packit d03632
    $Test->use_numbers($on_or_off);
Packit d03632
Packit d03632
Whether or not the test should output numbers.  That is, this if true:
Packit d03632
Packit d03632
  ok 1
Packit d03632
  ok 2
Packit d03632
  ok 3
Packit d03632
Packit d03632
or this if false
Packit d03632
Packit d03632
  ok
Packit d03632
  ok
Packit d03632
  ok
Packit d03632
Packit d03632
Most useful when you can't depend on the test output order, such as
Packit d03632
when threads or forking is involved.
Packit d03632
Packit d03632
Test::Harness will accept either, but avoid mixing the two styles.
Packit d03632
Packit d03632
Defaults to on.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub use_numbers {
Packit d03632
    my($self, $use_nums) = @_;
Packit d03632
Packit d03632
    if( defined $use_nums ) {
Packit d03632
        $self->{Use_Nums} = $use_nums;
Packit d03632
    }
Packit d03632
    return $self->{Use_Nums};
Packit d03632
}
Packit d03632
Packit d03632
=item B<no_header>
Packit d03632
Packit d03632
    $Test->no_header($no_header);
Packit d03632
Packit d03632
If set to true, no "1..N" header will be printed.
Packit d03632
Packit d03632
=item B<no_ending>
Packit d03632
Packit d03632
    $Test->no_ending($no_ending);
Packit d03632
Packit d03632
Normally, Test::Builder does some extra diagnostics when the test
Packit d03632
ends.  It also changes the exit code as described below.
Packit d03632
Packit d03632
If this is true, none of that will be done.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub no_header {
Packit d03632
    my($self, $no_header) = @_;
Packit d03632
Packit d03632
    if( defined $no_header ) {
Packit d03632
        $self->{No_Header} = $no_header;
Packit d03632
    }
Packit d03632
    return $self->{No_Header};
Packit d03632
}
Packit d03632
Packit d03632
sub no_ending {
Packit d03632
    my($self, $no_ending) = @_;
Packit d03632
Packit d03632
    if( defined $no_ending ) {
Packit d03632
        $self->{No_Ending} = $no_ending;
Packit d03632
    }
Packit d03632
    return $self->{No_Ending};
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
=head2 Output
Packit d03632
Packit d03632
Controlling where the test output goes.
Packit d03632
Packit d03632
It's ok for your test to change where STDOUT and STDERR point to,
Packit d03632
Test::Builder's default output settings will not be affected.
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<diag>
Packit d03632
Packit d03632
    $Test->diag(@msgs);
Packit d03632
Packit d03632
Prints out the given @msgs.  Like C<print>, arguments are simply
Packit d03632
appended together.
Packit d03632
Packit d03632
Normally, it uses the failure_output() handle, but if this is for a
Packit d03632
TODO test, the todo_output() handle is used.
Packit d03632
Packit d03632
Output will be indented and marked with a # so as not to interfere
Packit d03632
with test output.  A newline will be put on the end if there isn't one
Packit d03632
already.
Packit d03632
Packit d03632
We encourage using this rather than calling print directly.
Packit d03632
Packit d03632
Returns false.  Why?  Because diag() is often used in conjunction with
Packit d03632
a failing test (C<ok() || diag()>) it "passes through" the failure.
Packit d03632
Packit d03632
    return ok(...) || diag(...);
Packit d03632
Packit d03632
=for blame transfer
Packit d03632
Mark Fowler <mark@twoshortplanks.com>
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub diag {
Packit d03632
    my($self, @msgs) = @_;
Packit d03632
    return unless @msgs;
Packit d03632
Packit d03632
    # Prevent printing headers when compiling (i.e. -c)
Packit d03632
    return if $^C;
Packit d03632
Packit d03632
    # Smash args together like print does.
Packit d03632
    # Convert undef to 'undef' so its readable.
Packit d03632
    my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
Packit d03632
Packit d03632
    # Escape each line with a #.
Packit d03632
    $msg =~ s/^/# /gm;
Packit d03632
Packit d03632
    # Stick a newline on the end if it needs it.
Packit d03632
    $msg .= "\n" unless $msg =~ /\n\Z/;
Packit d03632
Packit d03632
    local $Level = $Level + 1;
Packit d03632
    $self->_print_diag($msg);
Packit d03632
Packit d03632
    return 0;
Packit d03632
}
Packit d03632
Packit d03632
=begin _private
Packit d03632
Packit d03632
=item B<_print>
Packit d03632
Packit d03632
    $Test->_print(@msgs);
Packit d03632
Packit d03632
Prints to the output() filehandle.
Packit d03632
Packit d03632
=end _private
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub _print {
Packit d03632
    my($self, @msgs) = @_;
Packit d03632
Packit d03632
    # Prevent printing headers when only compiling.  Mostly for when
Packit d03632
    # tests are deparsed with B::Deparse
Packit d03632
    return if $^C;
Packit d03632
Packit d03632
    my $msg = join '', @msgs;
Packit d03632
Packit d03632
    local($\, $", $,) = (undef, ' ', '');
Packit d03632
    my $fh = $self->output;
Packit d03632
Packit d03632
    # Escape each line after the first with a # so we don't
Packit d03632
    # confuse Test::Harness.
Packit d03632
    $msg =~ s/\n(.)/\n# $1/sg;
Packit d03632
Packit d03632
    # Stick a newline on the end if it needs it.
Packit d03632
    $msg .= "\n" unless $msg =~ /\n\Z/;
Packit d03632
Packit d03632
    print $fh $msg;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<_print_diag>
Packit d03632
Packit d03632
    $Test->_print_diag(@msg);
Packit d03632
Packit d03632
Like _print, but prints to the current diagnostic filehandle.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub _print_diag {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    local($\, $", $,) = (undef, ' ', '');
Packit d03632
    my $fh = $self->todo ? $self->todo_output : $self->failure_output;
Packit d03632
    print $fh @_;
Packit d03632
}    
Packit d03632
Packit d03632
=item B<output>
Packit d03632
Packit d03632
    $Test->output($fh);
Packit d03632
    $Test->output($file);
Packit d03632
Packit d03632
Where normal "ok/not ok" test output should go.
Packit d03632
Packit d03632
Defaults to STDOUT.
Packit d03632
Packit d03632
=item B<failure_output>
Packit d03632
Packit d03632
    $Test->failure_output($fh);
Packit d03632
    $Test->failure_output($file);
Packit d03632
Packit d03632
Where diagnostic output on test failures and diag() should go.
Packit d03632
Packit d03632
Defaults to STDERR.
Packit d03632
Packit d03632
=item B<todo_output>
Packit d03632
Packit d03632
    $Test->todo_output($fh);
Packit d03632
    $Test->todo_output($file);
Packit d03632
Packit d03632
Where diagnostics about todo test failures and diag() should go.
Packit d03632
Packit d03632
Defaults to STDOUT.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub output {
Packit d03632
    my($self, $fh) = @_;
Packit d03632
Packit d03632
    if( defined $fh ) {
Packit d03632
        $self->{Out_FH} = _new_fh($fh);
Packit d03632
    }
Packit d03632
    return $self->{Out_FH};
Packit d03632
}
Packit d03632
Packit d03632
sub failure_output {
Packit d03632
    my($self, $fh) = @_;
Packit d03632
Packit d03632
    if( defined $fh ) {
Packit d03632
        $self->{Fail_FH} = _new_fh($fh);
Packit d03632
    }
Packit d03632
    return $self->{Fail_FH};
Packit d03632
}
Packit d03632
Packit d03632
sub todo_output {
Packit d03632
    my($self, $fh) = @_;
Packit d03632
Packit d03632
    if( defined $fh ) {
Packit d03632
        $self->{Todo_FH} = _new_fh($fh);
Packit d03632
    }
Packit d03632
    return $self->{Todo_FH};
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
sub _new_fh {
Packit d03632
    my($file_or_fh) = shift;
Packit d03632
Packit d03632
    my $fh;
Packit d03632
    if( _is_fh($file_or_fh) ) {
Packit d03632
        $fh = $file_or_fh;
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        $fh = do { local *FH };
Packit d03632
        open $fh, ">$file_or_fh" or 
Packit d03632
            die "Can't open test output log $file_or_fh: $!";
Packit d03632
	_autoflush($fh);
Packit d03632
    }
Packit d03632
Packit d03632
    return $fh;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
sub _is_fh {
Packit d03632
    my $maybe_fh = shift;
Packit d03632
Packit d03632
    return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob
Packit d03632
Packit d03632
    return UNIVERSAL::isa($maybe_fh,               'GLOB')       ||
Packit d03632
           UNIVERSAL::isa($maybe_fh,               'IO::Handle') ||
Packit d03632
Packit d03632
           # 5.5.4's tied() and can() doesn't like getting undef
Packit d03632
           UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE');
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
sub _autoflush {
Packit d03632
    my($fh) = shift;
Packit d03632
    my $old_fh = select $fh;
Packit d03632
    $| = 1;
Packit d03632
    select $old_fh;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
sub _dup_stdhandles {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    $self->_open_testhandles;
Packit d03632
Packit d03632
    # Set everything to unbuffered else plain prints to STDOUT will
Packit d03632
    # come out in the wrong order from our own prints.
Packit d03632
    _autoflush(\*TESTOUT);
Packit d03632
    _autoflush(\*STDOUT);
Packit d03632
    _autoflush(\*TESTERR);
Packit d03632
    _autoflush(\*STDERR);
Packit d03632
Packit d03632
    $self->output(\*TESTOUT);
Packit d03632
    $self->failure_output(\*TESTERR);
Packit d03632
    $self->todo_output(\*TESTOUT);
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
my $Opened_Testhandles = 0;
Packit d03632
sub _open_testhandles {
Packit d03632
    return if $Opened_Testhandles;
Packit d03632
    # We dup STDOUT and STDERR so people can change them in their
Packit d03632
    # test suites while still getting normal test output.
Packit d03632
    open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT:  $!";
Packit d03632
    open(TESTERR, ">&STDERR") or die "Can't dup STDERR:  $!";
Packit d03632
    $Opened_Testhandles = 1;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
Packit d03632
=head2 Test Status and Info
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<current_test>
Packit d03632
Packit d03632
    my $curr_test = $Test->current_test;
Packit d03632
    $Test->current_test($num);
Packit d03632
Packit d03632
Gets/sets the current test number we're on.  You usually shouldn't
Packit d03632
have to set this.
Packit d03632
Packit d03632
If set forward, the details of the missing tests are filled in as 'unknown'.
Packit d03632
if set backward, the details of the intervening tests are deleted.  You
Packit d03632
can erase history if you really want to.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub current_test {
Packit d03632
    my($self, $num) = @_;
Packit d03632
Packit d03632
    lock($self->{Curr_Test});
Packit d03632
    if( defined $num ) {
Packit d03632
        unless( $self->{Have_Plan} ) {
Packit d03632
            require Carp;
Packit d03632
            Carp::croak("Can't change the current test number without a plan!");
Packit d03632
        }
Packit d03632
Packit d03632
        $self->{Curr_Test} = $num;
Packit d03632
Packit d03632
        # If the test counter is being pushed forward fill in the details.
Packit d03632
        my $test_results = $self->{Test_Results};
Packit d03632
        if( $num > @$test_results ) {
Packit d03632
            my $start = @$test_results ? @$test_results : 0;
Packit d03632
            for ($start..$num-1) {
Packit d03632
                $test_results->[$_] = &share({
Packit d03632
                    'ok'      => 1, 
Packit d03632
                    actual_ok => undef, 
Packit d03632
                    reason    => 'incrementing test number', 
Packit d03632
                    type      => 'unknown', 
Packit d03632
                    name      => undef 
Packit d03632
                });
Packit d03632
            }
Packit d03632
        }
Packit d03632
        # If backward, wipe history.  Its their funeral.
Packit d03632
        elsif( $num < @$test_results ) {
Packit d03632
            $#{$test_results} = $num - 1;
Packit d03632
        }
Packit d03632
    }
Packit d03632
    return $self->{Curr_Test};
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=item B<summary>
Packit d03632
Packit d03632
    my @tests = $Test->summary;
Packit d03632
Packit d03632
A simple summary of the tests so far.  True for pass, false for fail.
Packit d03632
This is a logical pass/fail, so todos are passes.
Packit d03632
Packit d03632
Of course, test #1 is $tests[0], etc...
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub summary {
Packit d03632
    my($self) = shift;
Packit d03632
Packit d03632
    return map { $_->{'ok'} } @{ $self->{Test_Results} };
Packit d03632
}
Packit d03632
Packit d03632
=item B<details>
Packit d03632
Packit d03632
    my @tests = $Test->details;
Packit d03632
Packit d03632
Like summary(), but with a lot more detail.
Packit d03632
Packit d03632
    $tests[$test_num - 1] = 
Packit d03632
            { 'ok'       => is the test considered a pass?
Packit d03632
              actual_ok  => did it literally say 'ok'?
Packit d03632
              name       => name of the test (if any)
Packit d03632
              type       => type of test (if any, see below).
Packit d03632
              reason     => reason for the above (if any)
Packit d03632
            };
Packit d03632
Packit d03632
'ok' is true if Test::Harness will consider the test to be a pass.
Packit d03632
Packit d03632
'actual_ok' is a reflection of whether or not the test literally
Packit d03632
printed 'ok' or 'not ok'.  This is for examining the result of 'todo'
Packit d03632
tests.  
Packit d03632
Packit d03632
'name' is the name of the test.
Packit d03632
Packit d03632
'type' indicates if it was a special test.  Normal tests have a type
Packit d03632
of ''.  Type can be one of the following:
Packit d03632
Packit d03632
    skip        see skip()
Packit d03632
    todo        see todo()
Packit d03632
    todo_skip   see todo_skip()
Packit d03632
    unknown     see below
Packit d03632
Packit d03632
Sometimes the Test::Builder test counter is incremented without it
Packit d03632
printing any test output, for example, when current_test() is changed.
Packit d03632
In these cases, Test::Builder doesn't know the result of the test, so
Packit d03632
it's type is 'unkown'.  These details for these tests are filled in.
Packit d03632
They are considered ok, but the name and actual_ok is left undef.
Packit d03632
Packit d03632
For example "not ok 23 - hole count # TODO insufficient donuts" would
Packit d03632
result in this structure:
Packit d03632
Packit d03632
    $tests[22] =    # 23 - 1, since arrays start from 0.
Packit d03632
      { ok        => 1,   # logically, the test passed since it's todo
Packit d03632
        actual_ok => 0,   # in absolute terms, it failed
Packit d03632
        name      => 'hole count',
Packit d03632
        type      => 'todo',
Packit d03632
        reason    => 'insufficient donuts'
Packit d03632
      };
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub details {
Packit d03632
    my $self = shift;
Packit d03632
    return @{ $self->{Test_Results} };
Packit d03632
}
Packit d03632
Packit d03632
=item B<todo>
Packit d03632
Packit d03632
    my $todo_reason = $Test->todo;
Packit d03632
    my $todo_reason = $Test->todo($pack);
Packit d03632
Packit d03632
todo() looks for a $TODO variable in your tests.  If set, all tests
Packit d03632
will be considered 'todo' (see Test::More and Test::Harness for
Packit d03632
details).  Returns the reason (ie. the value of $TODO) if running as
Packit d03632
todo tests, false otherwise.
Packit d03632
Packit d03632
todo() is about finding the right package to look for $TODO in.  It
Packit d03632
uses the exported_to() package to find it.  If that's not set, it's
Packit d03632
pretty good at guessing the right package to look at based on $Level.
Packit d03632
Packit d03632
Sometimes there is some confusion about where todo() should be looking
Packit d03632
for the $TODO variable.  If you want to be sure, tell it explicitly
Packit d03632
what $pack to use.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub todo {
Packit d03632
    my($self, $pack) = @_;
Packit d03632
Packit d03632
    $pack = $pack || $self->exported_to || $self->caller($Level);
Packit d03632
    return 0 unless $pack;
Packit d03632
Packit d03632
    no strict 'refs';
Packit d03632
    return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
Packit d03632
                                     : 0;
Packit d03632
}
Packit d03632
Packit d03632
=item B<caller>
Packit d03632
Packit d03632
    my $package = $Test->caller;
Packit d03632
    my($pack, $file, $line) = $Test->caller;
Packit d03632
    my($pack, $file, $line) = $Test->caller($height);
Packit d03632
Packit d03632
Like the normal caller(), except it reports according to your level().
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub caller {
Packit d03632
    my($self, $height) = @_;
Packit d03632
    $height ||= 0;
Packit d03632
Packit d03632
    my @caller = CORE::caller($self->level + $height + 1);
Packit d03632
    return wantarray ? @caller : $caller[0];
Packit d03632
}
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
=begin _private
Packit d03632
Packit d03632
=over 4
Packit d03632
Packit d03632
=item B<_sanity_check>
Packit d03632
Packit d03632
  $self->_sanity_check();
Packit d03632
Packit d03632
Runs a bunch of end of test sanity checks to make sure reality came
Packit d03632
through ok.  If anything is wrong it will die with a fairly friendly
Packit d03632
error message.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
#'#
Packit d03632
sub _sanity_check {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    _whoa($self->{Curr_Test} < 0,  'Says here you ran a negative number of tests!');
Packit d03632
    _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, 
Packit d03632
          'Somehow your tests ran without a plan!');
Packit d03632
    _whoa($self->{Curr_Test} != @{ $self->{Test_Results} },
Packit d03632
          'Somehow you got a different number of results than tests ran!');
Packit d03632
}
Packit d03632
Packit d03632
=item B<_whoa>
Packit d03632
Packit d03632
  _whoa($check, $description);
Packit d03632
Packit d03632
A sanity check, similar to assert().  If the $check is true, something
Packit d03632
has gone horribly wrong.  It will die with the given $description and
Packit d03632
a note to contact the author.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub _whoa {
Packit d03632
    my($check, $desc) = @_;
Packit d03632
    if( $check ) {
Packit d03632
        die <
Packit d03632
WHOA!  $desc
Packit d03632
This should never happen!  Please contact the author immediately!
Packit d03632
WHOA
Packit d03632
    }
Packit d03632
}
Packit d03632
Packit d03632
=item B<_my_exit>
Packit d03632
Packit d03632
  _my_exit($exit_num);
Packit d03632
Packit d03632
Perl seems to have some trouble with exiting inside an END block.  5.005_03
Packit d03632
and 5.6.1 both seem to do odd things.  Instead, this function edits $?
Packit d03632
directly.  It should ONLY be called from inside an END block.  It
Packit d03632
doesn't actually exit, that's your job.
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
sub _my_exit {
Packit d03632
    $? = $_[0];
Packit d03632
Packit d03632
    return 1;
Packit d03632
}
Packit d03632
Packit d03632
Packit d03632
=back
Packit d03632
Packit d03632
=end _private
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
$SIG{__DIE__} = sub {
Packit d03632
    # We don't want to muck with death in an eval, but $^S isn't
Packit d03632
    # totally reliable.  5.005_03 and 5.6.1 both do the wrong thing
Packit d03632
    # with it.  Instead, we use caller.  This also means it runs under
Packit d03632
    # 5.004!
Packit d03632
    my $in_eval = 0;
Packit d03632
    for( my $stack = 1;  my $sub = (CORE::caller($stack))[3];  $stack++ ) {
Packit d03632
        $in_eval = 1 if $sub =~ /^\(eval\)/;
Packit d03632
    }
Packit d03632
    $Test->{Test_Died} = 1 unless $in_eval;
Packit d03632
};
Packit d03632
Packit d03632
sub _ending {
Packit d03632
    my $self = shift;
Packit d03632
Packit d03632
    $self->_sanity_check();
Packit d03632
Packit d03632
    # Don't bother with an ending if this is a forked copy.  Only the parent
Packit d03632
    # should do the ending.
Packit d03632
    # Exit if plan() was never called.  This is so "require Test::Simple" 
Packit d03632
    # doesn't puke.
Packit d03632
    if( ($self->{Original_Pid} != $$) or
Packit d03632
	(!$self->{Have_Plan} && !$self->{Test_Died}) )
Packit d03632
    {
Packit d03632
	_my_exit($?);
Packit d03632
	return;
Packit d03632
    }
Packit d03632
Packit d03632
    # Figure out if we passed or failed and print helpful messages.
Packit d03632
    my $test_results = $self->{Test_Results};
Packit d03632
    if( @$test_results ) {
Packit d03632
        # The plan?  We have no plan.
Packit d03632
        if( $self->{No_Plan} ) {
Packit d03632
            $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header;
Packit d03632
            $self->{Expected_Tests} = $self->{Curr_Test};
Packit d03632
        }
Packit d03632
Packit d03632
        # Auto-extended arrays and elements which aren't explicitly
Packit d03632
        # filled in with a shared reference will puke under 5.8.0
Packit d03632
        # ithreads.  So we have to fill them in by hand. :(
Packit d03632
        my $empty_result = &share({});
Packit d03632
        for my $idx ( 0..$self->{Expected_Tests}-1 ) {
Packit d03632
            $test_results->[$idx] = $empty_result
Packit d03632
              unless defined $test_results->[$idx];
Packit d03632
        }
Packit d03632
Packit d03632
        my $num_failed = grep !$_->{'ok'}, 
Packit d03632
                              @{$test_results}[0..$self->{Expected_Tests}-1];
Packit d03632
        $num_failed += abs($self->{Expected_Tests} - @$test_results);
Packit d03632
Packit d03632
        if( $self->{Curr_Test} < $self->{Expected_Tests} ) {
Packit d03632
            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
Packit d03632
            $self->diag(<<"FAIL");
Packit d03632
Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}.
Packit d03632
FAIL
Packit d03632
        }
Packit d03632
        elsif( $self->{Curr_Test} > $self->{Expected_Tests} ) {
Packit d03632
            my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
Packit d03632
            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
Packit d03632
            $self->diag(<<"FAIL");
Packit d03632
Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra.
Packit d03632
FAIL
Packit d03632
        }
Packit d03632
        elsif ( $num_failed ) {
Packit d03632
            my $s = $num_failed == 1 ? '' : 's';
Packit d03632
            $self->diag(<<"FAIL");
Packit d03632
Looks like you failed $num_failed test$s of $self->{Expected_Tests}.
Packit d03632
FAIL
Packit d03632
        }
Packit d03632
Packit d03632
        if( $self->{Test_Died} ) {
Packit d03632
            $self->diag(<<"FAIL");
Packit d03632
Looks like your test died just after $self->{Curr_Test}.
Packit d03632
FAIL
Packit d03632
Packit d03632
            _my_exit( 255 ) && return;
Packit d03632
        }
Packit d03632
Packit d03632
        _my_exit( $num_failed <= 254 ? $num_failed : 254  ) && return;
Packit d03632
    }
Packit d03632
    elsif ( $self->{Skip_All} ) {
Packit d03632
        _my_exit( 0 ) && return;
Packit d03632
    }
Packit d03632
    elsif ( $self->{Test_Died} ) {
Packit d03632
        $self->diag(<<'FAIL');
Packit d03632
Looks like your test died before it could output anything.
Packit d03632
FAIL
Packit d03632
        _my_exit( 255 ) && return;
Packit d03632
    }
Packit d03632
    else {
Packit d03632
        $self->diag("No tests run!\n");
Packit d03632
        _my_exit( 255 ) && return;
Packit d03632
    }
Packit d03632
}
Packit d03632
Packit d03632
END {
Packit d03632
    $Test->_ending if defined $Test and !$Test->no_ending;
Packit d03632
}
Packit d03632
Packit d03632
=head1 EXIT CODES
Packit d03632
Packit d03632
If all your tests passed, Test::Builder will exit with zero (which is
Packit d03632
normal).  If anything failed it will exit with how many failed.  If
Packit d03632
you run less (or more) tests than you planned, the missing (or extras)
Packit d03632
will be considered failures.  If no tests were ever run Test::Builder
Packit d03632
will throw a warning and exit with 255.  If the test died, even after
Packit d03632
having successfully completed all its tests, it will still be
Packit d03632
considered a failure and will exit with 255.
Packit d03632
Packit d03632
So the exit codes are...
Packit d03632
Packit d03632
    0                   all tests successful
Packit d03632
    255                 test died
Packit d03632
    any other number    how many failed (including missing or extras)
Packit d03632
Packit d03632
If you fail more than 254 tests, it will be reported as 254.
Packit d03632
Packit d03632
Packit d03632
=head1 THREADS
Packit d03632
Packit d03632
In perl 5.8.0 and later, Test::Builder is thread-safe.  The test
Packit d03632
number is shared amongst all threads.  This means if one thread sets
Packit d03632
the test number using current_test() they will all be effected.
Packit d03632
Packit d03632
Test::Builder is only thread-aware if threads.pm is loaded I<before>
Packit d03632
Test::Builder.
Packit d03632
Packit d03632
=head1 EXAMPLES
Packit d03632
Packit d03632
CPAN can provide the best examples.  Test::Simple, Test::More,
Packit d03632
Test::Exception and Test::Differences all use Test::Builder.
Packit d03632
Packit d03632
=head1 SEE ALSO
Packit d03632
Packit d03632
Test::Simple, Test::More, Test::Harness
Packit d03632
Packit d03632
=head1 AUTHORS
Packit d03632
Packit d03632
Original code by chromatic, maintained by Michael G Schwern
Packit d03632
E<lt>schwern@pobox.comE<gt>
Packit d03632
Packit d03632
=head1 COPYRIGHT
Packit d03632
Packit d03632
Copyright 2002, 2004 by chromatic E<lt>chromatic@wgz.orgE<gt> and
Packit d03632
                        Michael G Schwern E<lt>schwern@pobox.comE<gt>.
Packit d03632
Packit d03632
This program is free software; you can redistribute it and/or 
Packit d03632
modify it under the same terms as Perl itself.
Packit d03632
Packit d03632
See F<http://www.perl.com/perl/misc/Artistic.html>
Packit d03632
Packit d03632
=cut
Packit d03632
Packit d03632
1;