1#!perl
2
3use Config;
4use Cwd;
5use strict;
6BEGIN {
7    require './test.pl';
8}
9
10$| = 1;
11
12my $cwdb = my $cwd = cwd();
13$cwd =~ s,\\,/,g;
14$cwdb =~ s,/,\\,g;
15
16my $testdir = "t e s t";
17my $exename = "showav";
18my $plxname = "showargv";
19
20my $exe = "$testdir/$exename";
21my $exex = $exe . ".exe";
22(my $exeb = $exe) =~ s,/,\\,g;
23my $exebx = $exeb . ".exe";
24
25my $bat = "$testdir/$plxname";
26my $batx = $bat . ".bat";
27(my $batb = $bat) =~ s,/,\\,g;
28my $batbx = $batb . ".bat";
29
30my $cmdx = $bat . ".cmd";
31my $cmdb = $batb;
32my $cmdbx = $cmdb . ".cmd";
33
34my @commands = (
35  $exe,
36  $exex,
37  $exeb,
38  $exebx,
39  "./$exe",
40  "./$exex",
41  ".\\$exeb",
42  ".\\$exebx",
43  "$cwd/$exe",
44  "$cwd/$exex",
45  "$cwdb\\$exeb",
46  "$cwdb\\$exebx",
47  $bat,
48  $batx,
49  $batb,
50  $batbx,
51  "./$bat",
52  "./$batx",
53  ".\\$batb",
54  ".\\$batbx",
55  "$cwd/$bat",
56  "$cwd/$batx",
57  "$cwdb\\$batb",
58  "$cwdb\\$batbx",
59  $cmdx,
60  $cmdbx,
61  "./$cmdx",
62  ".\\$cmdbx",
63  "$cwd/$cmdx",
64  "$cwdb\\$cmdbx",
65  [$^X, $batx],
66  [$^X, $batbx],
67  [$^X, "./$batx"],
68  [$^X, ".\\$batbx"],
69  [$^X, "$cwd/$batx"],
70  [$^X, "$cwdb\\$batbx"],
71);
72
73my @av = (
74  undef,
75  "",
76  " ",
77  "abc",
78  "a b\tc",
79  "\tabc",
80  "abc\t",
81  " abc\t",
82  "\ta b c ",
83  ["\ta b c ", ""],
84  ["\ta b c ", " "],
85  ["", "\ta b c ", "abc"],
86  [" ", "\ta b c ", "abc"],
87  ['" "', 'a" "b" "c', "abc"],
88);
89
90print "1.." . (@commands * @av * 3) . "\n";
91for my $cmds (@commands) {
92    for my $args (@av) {
93	my @all_args;
94	my @cmds = defined($cmds) ? (ref($cmds) ? @$cmds : $cmds) : ();
95	my @args = defined($args) ? (ref($args) ? @$args : $args) : ();
96	note "####### [@cmds]";
97	print "<", join('><',
98			$cmds[$#cmds],
99			map { my $x = $_; $x =~ s/"//g; $x } @args),
100	      ">\n";
101	if (system(@cmds,@args) != 0) {
102	    print "Failed, status($?)\n";
103	    if ($Config{ccflags} =~ /\bDDEBUGGING\b/) {
104		print "Running again in debug mode\n";
105		$^D = 1; # -Dp
106		system(@cmds,@args);
107	    }
108	}
109	$^D = 0;
110	my $cmdstr = join " ", map { /\s|^$/ && !/\"/
111				    ? qq["$_"] : $_ } @cmds, @args;
112	note "####### '$cmdstr'";
113	if (system($cmdstr) != 0) {
114	    print "Failed, status($?)\n";
115	    if ($Config{ccflags} =~ /\bDDEBUGGING\b/) {
116		print "Running again in debug mode\n";
117		$^D = 1; # -Dp
118		system($cmdstr);
119	    }
120	}
121	$^D = 0;
122
123	note "# pipe [".join(";", @cmds, @args). "]";
124	if (open my $io, "-|", @cmds, @args) {
125	    print <$io>;
126	    close $io;
127	}
128	else {
129	    print STDERR "Failed pipe open [",join(";", @cmds, @args),"]: $!\n";
130	}
131    }
132}
133