Pb
view release on metacpan or search on metacpan
t/Test/Pb/Bin.pm view on Meta::CPAN
package Test::Pb::Bin;
use 5.14.0;
use autodie ':all';
use Exporter 'import';
our @EXPORT = qw< pb_basecmd pb_run pb_run_interactive check_output check_error _slurp %ERRNO >;
use Test::Most;
use Errno ();
use File::Temp qw< tempdir >;
use File::Path qw< make_path >;
use File::Spec;
use File::Basename;
my $TMPDIR = tempdir( TMPDIR => 1, CLEANUP => 1 );
my $BASE;
# this is how PerlX::bash does it
{
my $devnull = File::Spec->devnull;
my $msg = 'successful';
`bash -c "echo $msg" 2>$devnull` eq "$msg\n" or plan skip_all => "no bash available!";
}
# This helps us avoid errors in non-English locales. See
# https://github.com/barefootcoder/leadpipe/issues/2 for the discussion which led to this. Thx to
# Slaven ReziÄ (a.k.a. SREZIC, a.k.a. eserte) for the suggestion.
our %ERRNO =
(
ENOENT => do { $! = Errno::ENOENT; "$!" }, # No such file or directory
);
# helpers
# poor man's slurp, compressed, mostly courtesy of:
# https://www.perl.com/article/21/2013/4/21/Read-an-entire-file-into-a-string/
sub _slurp { return undef unless -r "$_[0]"; local @ARGV=shift; local $/ unless wantarray; <> }
# testing stuff
sub pb_basecmd
{
my ($name, $cmd) = @_;
open my $out, ">$TMPDIR/$name";
say $out "#! $^X";
print $out $cmd;
close $out;
$BASE = "$TMPDIR/$name";
chmod 0700, $BASE;
return $BASE;
}
sub pb_flowpm
{
my ($name, $file) = @_;
my $pmname = $name =~ s{::}{/}gr . '.pm';
make_path(dirname($pmname));
open my $out, ">$TMPDIR/$pmname";
print $out $file;
close $out;
return "$TMPDIR/$pmname";
}
use Test::Trap qw< :output(systemsafe) >;
sub pb_run
{
my @args = @_;
trap { system($BASE, @args) };
return $trap;
}
sub pb_run_interactive
{
my $answers = pop;
my @args = @_;
die("answers must be all 'y' or 'n'") unless $answers =~ /^[yn]+$/;
$answers = join("\n", split(//, $answers));
trap { system("echo '$answers' | $BASE --interactive @args") };
return $trap;
}
sub _diag_trap
{
my ($trap, $testname) = @_;
diag "\nFailing test: $testname";
diag ''; $trap->diag_all_once;
diag "\n$BASE:\n", _slurp($BASE) =~ s/^(\t+)/' ' x length($1)/egmr =~ s/\t+#/ #/gr;
}
sub check_output
{
my $testname = pop;
( run in 1.668 second using v1.01-cache-2.11-cpan-364913b4093 )