1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
use File::Next ();
use App::Ack ();
sub prep_environment {
delete @ENV{qw( ACK_OPTIONS ACKRC ACK_PAGER )};
}
# capture stderr output into this file
my $catcherr_file = 'stderr.log';
sub is_win32 {
return $^O =~ /Win32/;
}
# capture-stderr is executing ack-standalone and storing the stderr output in
# $catcherr_file in a portable way.
#
# The quoting of command line arguments depends on the OS
sub build_command_line {
my @args = @_;
if ( is_win32() ) {
for ( @args ) {
s/(\\+)$/$1$1/; # Double all trailing backslashes
s/"/\\"/g; # Backslash all quotes
$_ = qq("$_");
}
}
else {
@args = map { quotemeta $_ } @args;
}
return "$^X -T ./capture-stderr $catcherr_file ./ack-standalone @args";
}
sub slurp {
my $iter = shift;
my @files;
while ( defined ( my $file = $iter->() ) ) {
push( @files, $file );
}
return @files;
}
sub run_ack {
my @args = @_;
my ($stdout, $stderr) = run_ack_with_stderr( @args );
if ( $TODO ) {
fail( q{Automatically fail stderr check for TODO tests.} );
}
else {
is( scalar @{$stderr}, 0, 'Should have no output to stderr' )
or diag( join( "\n", "STDERR:", @{$stderr} ) );
}
return @{$stdout};
}
sub run_ack_with_stderr {
my @args = @_;
my @stdout;
my @stderr;
if ( !grep { $_ =~ /^--(no)?env$/ } @args ) {
unshift( @args, '--noenv' );
}
my $cmd = build_command_line( @args );
@stdout = `$cmd`;
open( CATCHERR, '<', $catcherr_file );
while( <CATCHERR> ) {
push( @stderr, $_ );
}
close CATCHERR;
unlink $catcherr_file;
chomp @stdout;
chomp @stderr;
return ( \@stdout, \@stderr );
}
sub pipe_into_ack {
my $input = shift;
my @args = @_;
my $cmd = build_command_line( @args );
$cmd = "$^X -pe1 $input | $cmd";
my @results = `$cmd`;
chomp @results;
unlink $catcherr_file;
return @results;
}
# Use this one if order is important
sub lists_match {
my @actual = @{+shift};
my @expected = @{+shift};
my $msg = shift;
# Normalize all the paths
for my $path ( @expected, @actual ) {
$path = File::Next::reslash( $path ); ## no critic (Variables::ProhibitPackageVars)
}
local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic
eval 'use Test::Differences';
if ( !$@ ) {
return eq_or_diff( [@actual], [@expected], $msg );
}
else {
return is_deeply( [@actual], [@expected], $msg );
}
}
sub ack_lists_match {
my $args = shift;
my $expected = shift;
my $message = shift;
my @args = @{$args};
my @results = run_ack( @args );
my $ok = lists_match( \@results, $expected, $message );
$ok or diag( join( ' ', '$ ack', @args ) );
return $ok;
}
# Use this one if you don't care about order of the lines
sub sets_match {
my @actual = @{+shift};
my @expected = @{+shift};
my $msg = shift;
local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic
return lists_match( [sort @actual], [sort @expected], $msg );
}
sub ack_sets_match {
my $args = shift;
my $expected = shift;
my $message = shift;
my @args = @{$args};
my @results = run_ack( @args );
my $ok = sets_match( \@results, $expected, $message );
$ok or diag( join( ' ', '$ ack', @args ) );
return $ok;
}
sub is_filetype {
my $filename = shift;
my $wanted_type = shift;
for my $maybe_type ( App::Ack::filetypes( $filename ) ) {
return 1 if $maybe_type eq $wanted_type;
}
return;
}
1;
|