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
|
#! @PERL@ -w
# -*- perl -*-
# @configure_input@
require 5.002;
use strict;
use POSIX qw (assert);
BEGIN { push @INC, '@srcdir@' if '@srcdir@' ne '.'; }
use Test;
$| = 1;
my $xx = $ARGV[0];
print <<EOF;
#! /bin/sh
# This script was generated automatically by build-script.
case \$# in
0) xx='$xx';;
*) xx="\$1";;
esac
test "\$VERBOSE" && echo=echo || echo=:
\$echo testing program: \$xx
errors=0
test "\$srcdir" || srcdir=.
test "\$VERBOSE" && \$xx --version 2> /dev/null
EOF
{
my %seen;
my $test_vector;
foreach $test_vector (@Test::t)
{
my ($test_name, $flags, $in_spec, $expected, $e_ret_code, $rest) =
@{$test_vector};
assert (defined $e_ret_code && !defined $rest);
assert (!ref $test_name);
assert (!ref $flags);
assert (!ref $expected);
assert (!ref $e_ret_code);
die "$0: $.: duplicate test name \`$test_name'\n"
if (defined $seen{$test_name});
$seen{$test_name} = 1;
}
}
my $test_vector;
foreach $test_vector (@Test::t)
{
my ($test_name, $flags, $in_spec, $expected, $e_ret_code)
= @{$test_vector};
my @in_file;
if (ref $in_spec)
{
assert (ref $in_spec eq 'ARRAY');
my $i = 0;
my $file_spec;
foreach $file_spec (@$in_spec)
{
# A file spec may be a string or a reference.
# If it's a string, that string is to be the contents of a
# generated (by this script) file with name derived from the
# name of this test.
# If it's a reference, then it must be the name of an existing
# file.
if (ref $file_spec)
{
assert (ref $file_spec eq 'SCALAR');
my $existing_file = $$file_spec;
# FIXME: make sure $existing_file exists somewhere.
push (@in_file, $existing_file);
}
else
{
++$i;
my $file_contents = $file_spec;
my $gen_file = "t$test_name.in$i";
push (@in_file, $gen_file);
open (IN, ">$gen_file") || die "$0: $gen_file: $!\n";
print IN $file_contents;
close (IN) || die "$0: $gen_file: $!\n";
}
}
}
else
{
my $file_contents = $in_spec;
my $gen_file = "t$test_name.in";
push (@in_file, $gen_file);
open (IN, ">$gen_file") || die "$0: $gen_file: $!\n";
print IN $file_contents;
close (IN) || die "$0: $gen_file: $!\n";
}
my $in1 = "t$test_name.in1";
my $in2 = "t$test_name.in2";
my $exp_name = "t$test_name.exp";
my $out = "t$test_name.out";
open (EXP, ">$exp_name") || die "$0: $exp_name: $!\n";
print EXP $expected;
close (EXP) || die "$0: $exp_name: $!\n";
my $err_output = "t$test_name.err";
my @srcdir_rel_in_file;
my $f;
foreach $f (@in_file)
{
push (@srcdir_rel_in_file, "\$srcdir/$f")
}
my $cmd = "\$xx $flags " . join (' ', @srcdir_rel_in_file)
. " > $out 2> $err_output";
$exp_name = "\$srcdir/$exp_name";
print <<EOF ;
$cmd
code=\$?
if test \$code != $e_ret_code ; then
\$echo Test $test_name failed: $xx return code \$code differs from expected value $e_ret_code 1>&2
errors=`expr \$errors + 1`
else
cmp $out $exp_name
case \$? in
0) if test "\$VERBOSE" ; then \$echo passed $test_name; fi ;; # equal files
1) \$echo Test $test_name failed: files $out and $exp_name differ 1>&2;
errors=`expr \$errors + 1` ;;
2) \$echo Test $test_name may have failed. 1>&2;
\$echo The command \"cmp $out $exp_name\" failed. 1>&2 ;
errors=`expr \$errors + 1` ;;
esac
fi
test -s $err_output || rm -f $err_output
EOF
}
print <<EOF2 ;
if test \$errors = 0 ; then
\$echo Passed all tests. 1>&2
else
\$echo Failed \$errors tests. 1>&2
fi
test \$errors = 0 || errors=1
exit \$errors
EOF2
|