my $planned;
$TODO = 0;
+$NO_ENDING = 0;
sub plan {
my $n;
my %plan = @_;
$n = $plan{tests};
}
- print "1..$n\n";
+ print STDOUT "1..$n\n";
$planned = $n;
}
END {
my $ran = $test - 1;
- if (defined $planned && $planned != $ran) {
- print "# Looks like you planned $planned tests but ran $ran.\n";
+ if (!$NO_ENDING && defined $planned && $planned != $ran) {
+ print STDOUT "# Looks like you planned $planned tests but ran $ran.\n";
}
}
sub skip_all {
if (@_) {
- print "1..0 - @_\n";
+ print STDOUT "1..0 - @_\n";
} else {
- print "1..0\n";
+ print STDOUT "1..0\n";
}
exit(0);
}
# VMS will avenge.
my $out;
if ($name) {
+ # escape out '#' or it will interfere with '# skip' and such
+ $name =~ s/#/\\#/g;
$out = $pass ? "ok $test - $name" : "not ok $test - $name";
} else {
$out = $pass ? "ok $test" : "not ok $test";
}
$out .= " # TODO $TODO" if $TODO;
- print "$out\n";
+ print STDOUT "$out\n";
unless ($pass) {
- print "# Failed $where\n";
+ print STDOUT "# Failed $where\n";
}
# Ensure that the message is properly escaped.
- print map { /^#/ ? "$_\n" : "# $_\n" }
- map { split /\n/ } @mess if @mess;
+ print STDOUT map { /^#/ ? "$_\n" : "# $_\n" }
+ map { split /\n/ } @mess if @mess;
$test++;
_ok(0, _where(), @_);
}
+sub curr_test {
+ return $test;
+}
+
sub next_test {
$test++
}
my $why = shift;
my $n = @_ ? shift : 1;
for (1..$n) {
- print "ok $test # skip: $why\n";
+ print STDOUT "ok $test # skip: $why\n";
$test++;
}
local $^W = 0;
# stdin => string to feed the stdin
# stderr => redirect stderr to stdout
# args => [ command-line arguments to the perl program ]
+# verbose => print the command line
my $is_mswin = $^O eq 'MSWin32';
my $is_netware = $^O eq 'NetWare';
my $is_macos = $^O eq 'MacOS';
my $is_vms = $^O eq 'VMS';
+sub _quote_args {
+ my ($runperl, $args) = @_;
+
+ foreach (@$args) {
+ # In VMS protect with doublequotes because otherwise
+ # DCL will lowercase -- unless already doublequoted.
+ $_ = q(").$_.q(") if $is_vms && !/^\"/;
+ $$runperl .= ' ' . $_;
+ }
+}
+
sub runperl {
my %args = @_;
my $runperl = $^X;
- if (defined $args{switches}) {
- $runperl .= ' ' . join ' ', map qq("$_"), @{ $args{switches} };
+ if ($args{switches}) {
+ _quote_args(\$runperl, $args{switches});
}
- unless (defined $args{nolib}) {
- if ($is_macos && $args{stderr}) {
- $runperl .= ' -I::lib -MMac::err=unix';
+ unless ($args{nolib}) {
+ if ($is_macos) {
+ $runperl .= ' -I::lib';
+ # Use UNIX style error messages instead of MPW style.
+ $runperl .= ' -MMac::err=unix' if $args{stderr};
}
else {
- $runperl .= ' "-I../lib"';
+ $runperl .= ' "-I../lib"'; # doublequotes because of VMS
}
}
if (defined $args{prog}) {
$runperl .= qq( "$args{progfile}");
}
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;
+
if ($is_mswin || $is_netware || $is_vms) {
- $runperl = qq{$^X -e "print q(} .
+ $runperl = qq{$^X -e "print qq(} .
$args{stdin} . q{)" | } . $runperl;
}
else {
- $runperl = qq{$^X -e 'print q(} .
+ $runperl = qq{$^X -e 'print qq(} .
$args{stdin} . q{)' | } . $runperl;
}
}
if (defined $args{args}) {
- $runperl .= ' ' . join ' ', map qq("$_"), @{ $args{args} };
+ _quote_args(\$runperl, $args{args});
+ }
+ $runperl .= ' 2>&1' if $args{stderr} && !$is_macos;
+ $runperl .= " \xB3 Dev:Null" if !$args{stderr} && $is_macos;
+ if ($args{verbose}) {
+ my $runperldisplay = $runperl;
+ $runperldisplay =~ s/\n/\n\#/g;
+ print STDOUT "# $runperldisplay\n";
}
- $runperl .= ' 2>&1' if $args{stderr} && !$is_macos;
- $runperl .= " \xB3 Dev:Null" if !defined $args{stderr} && $is_macos;
my $result = `$runperl`;
$result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these
return $result;
}
+
+sub BAILOUT {
+ print STDOUT "Bail out! @_\n";
+ exit;
+}
+
+
+# A way to display scalars containing control characters and Unicode.
+sub display {
+ map { join("", map { $_ > 255 ? sprintf("\\x{%x}", $_) : chr($_) =~ /[[:cntrl:]]/ ? sprintf("\\%03o", $_) : chr($_) } unpack("U*", $_)) } @_;
+}
+
+
+# A somewhat safer version of the sometimes wrong $^X.
+my $Perl;
+sub which_perl {
+ unless (defined $Perl) {
+ $Perl = $^X;
+
+ my $exe;
+ eval "require Config; Config->import";
+ if ($@) {
+ warn "test.pl had problems loading Config: $@";
+ $exe = '';
+ } else {
+ $exe = $Config{_exe};
+ }
+
+ # This doesn't absolutize the path: beware of future chdirs().
+ # We could do File::Spec->abs2rel() but that does getcwd()s,
+ # which is a bit heavyweight to do here.
+
+ if ($Perl =~ /^perl\Q$exe\E$/i) {
+ my $perl = "perl$exe";
+ eval "require File::Spec";
+ if ($@) {
+ warn "test.pl had problems loading File::Spec: $@";
+ $Perl = "./$perl";
+ } else {
+ $Perl = File::Spec->catfile(File::Spec->curdir(), $perl);
+ }
+ }
+
+ # Its like this. stat on Cygwin treats 'perl' to mean 'perl.exe'
+ # but open does not. This can get confusing, so to be safe we
+ # always put the .exe on the end on Cygwin.
+ $Perl .= $exe if $^O eq 'cygwin' && $Perl !~ /\Q$exe\E$/;
+
+ warn "which_perl: cannot find $Perl from $^X" unless -f $Perl;
+
+ # For subcommands to use.
+ $ENV{PERLEXE} = $Perl;
+ }
+ return $Perl;
+}
+
1;