X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Ftest.pl;h=36a12c32f9502dfb3d52ad77267f0d118b56b04c;hb=adb2fcba926db68009c2341ac4b91b44e6f7b720;hp=debce6ed1a5340e33fab3d4cace443587140a1ab;hpb=cf8feb78124b90756575c16fb087f9e129ee3a6d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/test.pl b/t/test.pl index debce6e..36a12c3 100644 --- a/t/test.pl +++ b/t/test.pl @@ -2,8 +2,10 @@ # t/test.pl - most of Test::More functionality without the fuss # +$Level = 1; my $test = 1; my $planned; +my $noplan; $TODO = 0; $NO_ENDING = 0; @@ -12,18 +14,27 @@ sub plan { my $n; if (@_ == 1) { $n = shift; + if ($n eq 'no_plan') { + undef $n; + $noplan = 1; + } } else { my %plan = @_; $n = $plan{tests}; } - print STDOUT "1..$n\n"; + print STDOUT "1..$n\n" unless $noplan; $planned = $n; } END { my $ran = $test - 1; - if (!$NO_ENDING && defined $planned && $planned != $ran) { - print STDERR "# Looks like you planned $planned tests but ran $ran.\n"; + if (!$NO_ENDING) { + if (defined $planned && $planned != $ran) { + print STDERR + "# Looks like you planned $planned tests but ran $ran.\n"; + } elsif ($noplan) { + print "1..$ran\n"; + } } } @@ -40,7 +51,7 @@ sub _diag { sub skip_all { if (@_) { - print STDOUT "1..0 - @_\n"; + print STDOUT "1..0 # Skipped: @_\n"; } else { print STDOUT "1..0\n"; } @@ -76,12 +87,12 @@ sub _ok { } sub _where { - my @caller = caller(1); + my @caller = caller($Level); return "at $caller[1] line $caller[2]"; } # DON'T use this for matches. Use like() instead. -sub ok { +sub ok ($@) { my ($pass, $name, @mess) = @_; _ok($pass, _where(), $name, @mess); } @@ -131,9 +142,18 @@ sub display { return @result; } -sub is { +sub is ($$@) { my ($got, $expected, $name, @mess) = @_; - my $pass = $got eq $expected; + + my $pass; + if( !defined $got || !defined $expected ) { + # undef only matches undef + $pass = !defined $got && !defined $expected; + } + else { + $pass = $got eq $expected; + } + unless ($pass) { unshift(@mess, "# got "._q($got)."\n", "# expected "._q($expected)."\n"); @@ -141,9 +161,18 @@ sub is { _ok($pass, _where(), $name, @mess); } -sub isnt { +sub isnt ($$@) { my ($got, $isnt, $name, @mess) = @_; - my $pass = $got ne $isnt; + + my $pass; + if( !defined $got || !defined $isnt ) { + # undef only matches undef + $pass = defined $got || defined $isnt; + } + else { + $pass = $got ne $isnt; + } + unless( $pass ) { unshift(@mess, "# it should not be "._q($got)."\n", "# but it is.\n"); @@ -151,7 +180,7 @@ sub isnt { _ok($pass, _where(), $name, @mess); } -sub cmp_ok { +sub cmp_ok ($$$@) { my($got, $type, $expected, $name, @mess) = @_; my $pass; @@ -184,7 +213,7 @@ sub cmp_ok { # otherwise $range is a fractional error. # Here $range must be numeric, >= 0 # Non numeric ranges might be a useful future extension. (eg %) -sub within { +sub within ($$$@) { my ($got, $expected, $range, $name, @mess) = @_; my $pass; if (!defined $got or !defined $expected or !defined $range) { @@ -216,21 +245,18 @@ sub within { } # Note: this isn't quite as fancy as Test::More::like(). -sub like { - my ($got, $expected, $name, @mess) = @_; + +sub like ($$@) { like_yn (0,@_) }; # 0 for - +sub unlike ($$@) { like_yn (1,@_) }; # 1 for un- + +sub like_yn ($$$@) { + my ($flip, $got, $expected, $name, @mess) = @_; my $pass; - if (ref $expected eq 'Regexp') { - $pass = $got =~ $expected; - unless ($pass) { - unshift(@mess, "# got '$got'\n", - "# expected /$expected/\n"); - } - } else { - $pass = $got =~ /$expected/; - unless ($pass) { - unshift(@mess, "# got '$got'\n", - "# expected /$expected/\n"); - } + $pass = $got =~ /$expected/ if !$flip; + $pass = $got !~ /$expected/ if $flip; + unless ($pass) { + unshift(@mess, "# got '$got'\n", + "# expected /$expected/\n"); } _ok($pass, _where(), $name, @mess); } @@ -265,10 +291,25 @@ sub skip { last SKIP; } +sub todo_skip { + my $why = shift; + my $n = @_ ? shift : 1; + + for (1..$n) { + print STDOUT "ok $test # TODO & SKIP: $why\n"; + $test++; + } + local $^W = 0; + last TODO; +} + sub eq_array { my ($ra, $rb) = @_; return 0 unless $#$ra == $#$rb; for my $i (0..$#$ra) { + next if !defined $ra->[$i] && !defined $rb->[$i]; + return 0 if !defined $ra->[$i]; + return 0 if !defined $rb->[$i]; return 0 unless $ra->[$i] eq $rb->[$i]; } return 1; @@ -302,7 +343,7 @@ sub eq_hash { !$fail; } -sub require_ok { +sub require_ok ($) { my ($require) = @_; eval < [ command-line switches ] # nolib => 1 # don't use -I../lib (included by default) # prog => one-liner (avoid quotes) +# progs => [ multi-liner (avoid quotes) ] # progfile => perl script # stdin => string to feed the stdin # stderr => redirect stderr to stdout @@ -345,12 +387,9 @@ sub _quote_args { } } -sub runperl { +sub _create_runperl { # Create the string to qx in runperl(). my %args = @_; - my $runperl = $^X; - if ($args{switches}) { - _quote_args(\$runperl, $args{switches}); - } + my $runperl = $^X =~ m/\s/ ? qq{"$^X"} : $^X; unless ($args{nolib}) { if ($is_macos) { $runperl .= ' -I::lib'; @@ -361,26 +400,60 @@ sub runperl { $runperl .= ' "-I../lib"'; # doublequotes because of VMS } } + if ($args{switches}) { + local $Level = 2; + die "test.pl:runperl(): 'switches' must be an ARRAYREF " . _where() + unless ref $args{switches} eq "ARRAY"; + _quote_args(\$runperl, $args{switches}); + } if (defined $args{prog}) { - if ($is_mswin || $is_netware || $is_vms) { - $runperl .= qq( -e ") . $args{prog} . qq("); - } - else { - $runperl .= qq( -e ') . $args{prog} . qq('); - } + die "test.pl:runperl(): both 'prog' and 'progs' cannot be used " . _where() + if defined $args{progs}; + $args{progs} = [$args{prog}] + } + if (defined $args{progs}) { + die "test.pl:runperl(): 'progs' must be an ARRAYREF " . _where() + unless ref $args{progs} eq "ARRAY"; + foreach my $prog (@{$args{progs}}) { + if ($is_mswin || $is_netware || $is_vms) { + $runperl .= qq ( -e "$prog" ); + } + else { + $runperl .= qq ( -e '$prog' ); + } + } } elsif (defined $args{progfile}) { $runperl .= qq( "$args{progfile}"); + } else { + # You probaby didn't want to be sucking in from the upstream stdin + die "test.pl:runperl(): none of prog, progs, progfile, args, " + . " switches or stdin specified" + unless defined $args{args} or defined $args{switches} + or defined $args{stdin}; } if (defined $args{stdin}) { - # so we don't try to put literal newlines and crs onto the - # command line. - $args{stdin} =~ s/\n/\\n/g; - $args{stdin} =~ s/\r/\\r/g; + # so we don't try to put literal newlines and crs onto the + # command line. + $args{stdin} =~ s/\n/\\n/g; + $args{stdin} =~ s/\r/\\r/g; if ($is_mswin || $is_netware || $is_vms) { $runperl = qq{$^X -e "print qq(} . $args{stdin} . q{)" | } . $runperl; } + elsif ($is_macos) { + # MacOS can only do two processes under MPW at once; + # the test itself is one; we can't do two more, so + # write to temp file + my $stdin = qq{$^X -e 'print qq(} . $args{stdin} . qq{)' > teststdin; }; + if ($args{verbose}) { + my $stdindisplay = $stdin; + $stdindisplay =~ s/\n/\n\#/g; + print STDERR "# $stdindisplay\n"; + } + `$stdin`; + $runperl .= q{ < teststdin }; + } else { $runperl = qq{$^X -e 'print qq(} . $args{stdin} . q{)' | } . $runperl; @@ -396,11 +469,19 @@ sub runperl { $runperldisplay =~ s/\n/\n\#/g; print STDERR "# $runperldisplay\n"; } + return $runperl; +} + +sub runperl { + die "test.pl:runperl() does not take a hashref" + if ref $_[0] and ref $_[0] eq 'HASH'; + my $runperl = &_create_runperl; my $result = `$runperl`; $result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these return $result; } +*run_perl = \&runperl; # Nice alias. sub DIE { print STDERR "# @_\n"; @@ -413,6 +494,9 @@ sub which_perl { unless (defined $Perl) { $Perl = $^X; + # VMS should have 'perl' aliased properly + return $Perl if $^O eq 'VMS'; + my $exe; eval "require Config; Config->import"; if ($@) { @@ -532,26 +616,28 @@ sub _fresh_perl { } # -# run_perl_is +# fresh_perl_is # # Combination of run_perl() and is(). # sub fresh_perl_is { my($prog, $expected, $runperl_args, $name) = @_; + local $Level = 2; _fresh_perl($prog, sub { @_ ? $_[0] eq $expected : $expected }, $runperl_args, $name); } # -# run_perl_like +# fresh_perl_like # # Combination of run_perl() and like(). # sub fresh_perl_like { my($prog, $expected, $runperl_args, $name) = @_; + local $Level = 2; _fresh_perl($prog, sub { @_ ? $_[0] =~ (ref $expected ? $expected : /$expected/) :