#!/usr/bin/perl # Test the --debug feature # Copyright (C) 2018-2020 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use File::stat; (my $program_name = $0) =~ s|.*/||; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; my $prog = 'sed'; print "PATH = $ENV{PATH}\n"; =pod This list contains a template for the tests. Two 'foreach' loops below add the '{IN/OUT}' hash entries of typical coreutils tests, adds single-quotes around the sed program, and adds the --debug command line option. NOTE: test names with "_" character will be checked with NULL input, but not with non-empty input (eg. to avoid executing external programs). =cut my @Tests = ( ## Test parsing of SED commands, without any execution ['c0', '=' ], ['c1', ':FOO' ], ['c2', '{=}' ], ['c3', '#FOO' ], ['c4', 'aFOO' ], ['c5', 'b' ], ['c6', 'bx;:x' ], ['c7', 'cFOO' ], ['c8', 'D' ], ['c9', 'd' ], ['c10_', 'e' ], ['c11_', 'ew' ], ['c12', 'F' ], ['c13', 'G' ], ['c14', 'g' ], ['c15', 'H' ], ['c16', 'h' ], ['c17', 'iFOO' ], ['c18', 'l' ], ['c19', 'l3' ], ['c20', 'N' ], ['c21', 'n' ], ['c22', 'P' ], ['c23', 'p' ], ['c24', 'Q' ], ['c25_', 'Q3' ], ['c26', 'q' ], ['c27_', 'q3' ], ['c28', 'Rx' ], ['c29', 'rx' ], ['c30', 's/x//' ], ['c31', 'T' ], ['c32', 'Tx;:x' ], ['c33', 't' ], ['c34', 'tx;:x' ], ['c35', 'v' ], ['c36', 'Wx' ], ['c37', 'wx' ], ['c38', 'x' ], ['c39', 'y/x/y/' ], ['c40', 'z' ], ['c41', '' ], ## Test parsing of SED addresses, without any execution ['a0', '1=' ], ['a1', '1!=' ], ['a2', '1,2=' ], ['a3', '1,2!=' ], ['a4', '$=' ], ['a5', '$!=' ], ['a6', '1~3=' ], ['a7', '1~3=' ], ['a8', '50~0=' ], ['a9', '/foo/=' ], ['a10', '/foo/!=' ], ['a11', '\@foo@=' ], ['a12', '0,/foo/=' ], ['a13', '1,/foo/=' ], ['a14', '/foo/,1=' ], ['a15', '1,+10=' ], ['a16', '1,~10=' ], ['a17', '/foo/,+10='], ['a18', '/foo/,~10='], ## Test strings with special characters ['s1', '/\\a/=' ], ['s2', '/\\b/=' ], ['s3', '/\\f/=' ], ['s4', '/\\r/=' ], ['s5', '/\\t/=' ], ['s6', '/\\v/=' ], ['s7', '/\\n/=' ], ['s8', '/\\\\/=' ], ['s9', '/\x01/=' ], ['s10','/\//=' ], ## Address Regex variations ['r0', '/a/= ; //=' ], ['r1', '/a/I=' ], ['r2', '/a/M=' ], ['r3', '/a/IM=' ], ## substitute variations ['t0', 's/a/b/' ], ['t1', 's/a/b/g' ], ['t2', 's/a/b/i' ], ['t3', 's/a/b/I' ], ['t4', 's/a/b/m' ], ['t5', 's/a/b/M' ], ['t6', 's/a/b/wX' ], ['t7', 's/a/b/p' ], ['t8', 's/a/b/e' ], ['t9', 's/a/b/3' ], ['t10','s/a/b/iMg5p'], ['t20','s/\\(a\\)/\\1/' ], ['t21','s/a/\\Ua/' ], ['t22','s/a/\\ua/' ], ['t23','s/a/\\La/' ], ['t24','s/a/\\la/' ], ['t25','s/a/\\U\\Ea/' ], ['t26','s/a/&/' ], ## Some special cases ['l1', 'a\\' ], ['l2', 'c\\' ], ['l3', 'i\\' ], ['l4', 's/[0-9]/&/' ], # report matched regex register ['l5', 'n;N;D' ], # n/N/D with patterns containing \n. ['l6', 'n;n;n;n;n' ], # n causing end-of-cycle ['l7', 's/^/a/' ], # zero-length regex match ['l8', 's/\\($\\)/a/' ], # zero-length regex match ); foreach my $t (@Tests) { my $name = shift @$t; my $cmd = shift @$t; # Add "--debug" and single-quotes around the sed program. $cmd = "--debug '" . $cmd . "'"; unshift @$t, $cmd; unshift @$t, $name; # Add the typical coreutils hash entries. # With empty input, the sed program will be printed (due to --debug), # but not executed. push @$t, {IN=>''}; push @$t, {OUT=>''}; push @$t, {OUT_SUBST=>'s/.*//s'}; } # Repeat the tests with some input, to test --debug during execution. # Discard the output, the exact debug output is not set in stone. my @xtests; Test: foreach my $t (@Tests) { # Remove the '{IN}' hash my @newt = grep { ! ( ref $_ eq 'HASH' && exists $_->{IN} ) } @$t; next if $newt[0] =~ /_/; # Rename the test (add "x_" prefix, for execution) $newt[0] = 'x_' . $newt[0]; # Add non-empty input. push @newt, {IN=>"1\n2\n3\n4\n"}; push @xtests, \@newt; } push @Tests, @xtests; my $save_temps = $ENV{SAVE_TEMPS}; my $verbose = $ENV{VERBOSE}; my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); exit $fail;