#!/usr/bin/perl -w use strict; # Generate a string with random length lines sub GenerateUnevenLines() { my $text = ""; for(my $i = 0; $i < 256; $i++) { for(my $j = 0; $j < 256; $j++) { $text .= int(rand 20); } $text .= "\n"; } return $text; } # Input texts my @pieces = ( '', (join '', (map {($_ x 64) . "\n"} ('A'..'Z'))), (join '', (map {"$_\n"} (1..65536))), GenerateUnevenLines() ); # Generate input file name sub InputFile($) { my ($index) = @_; return "test_input_vertical_$index.txt"; } # Write input files to disk sub CreateInputFiles() { for(my $i = 0; $i <= $#pieces; $i++) { my $file_name = InputFile($i); open my $file, "> $file_name" or die $!; print $file $pieces[$i]; close $file; } } # Generate expected test results sub GenerateOutput() { my @expected_output = (); foreach my $i (@pieces) { foreach my $j (@pieces) { push @expected_output, $i . $j; } } return @expected_output; } # Convert end of line sequences in output lines, and return it as a # single string. sub JoinLines($) { my ($lines) = @_; foreach my $i (@$lines) { $i =~ s/[\r\n]+$/\n/s; } return join '', @$lines; } # Run tests sub TestAll($) { my ($prog) = @_; # Run program for all input combinations my @actual_output = (); for(my $i = 0; $i <= $#pieces; $i++) { my $i_file = InputFile($i); for(my $j = 0; $j <= $#pieces; $j++) { # Try using file inputs my $j_file = InputFile($j); my @output = `$prog $i_file $j_file`; if( $? != 0 ) { die "Command failed: $?\n"; } my $output_from_files = JoinLines(\@output); push @actual_output, $output_from_files; # Try using pipe inputs @output = `cat $i_file | $prog - $j_file`; my $output_from_pipe = JoinLines(\@output); if( $output_from_pipe ne $output_from_files ) { die "Error handing pipe input 1\n"; } @output = `cat $j_file | $prog $i_file -`; $output_from_pipe = JoinLines(\@output); if( $output_from_pipe ne $output_from_files ) { die "Error handing pipe input 2\n"; } if( $i_file eq $j_file ) { @output = `cat $i_file | $prog - -`; $output_from_pipe = JoinLines(\@output); if( $output_from_pipe ne $output_from_files ) { die "Error handing pipe input 1 + 2\n"; } } } } # Compare outputs my @expected_output = GenerateOutput(); for(my $i = 0; $i <= $#expected_output; $i++) { if( $expected_output[$i] ne $actual_output[$i] ) { die "Output mismatched for $i:\n" . "Expected:\n" . $expected_output[$i] . "Actual:\n" . $actual_output[$i]; } } } die "$0 \n" unless $#ARGV == 0; CreateInputFiles(); TestAll($ARGV[0]); # Success exit 0;