Bump to 20230521
[platform/upstream/byacc.git] / test / run_test.sh
1 #!/bin/sh
2 # $Id: run_test.sh,v 1.37 2022/11/06 21:55:25 tom Exp $
3 # vi:ts=4 sw=4:
4
5 errors=0
6
7 # NEW is the file created by the testcase
8 # REF is the reference file against which to compare
9 test_diffs() {
10         # echo "...test_diffs $NEW vs $REF"
11         mv -f "$NEW" "${REF_DIR}/"
12         CMP=${REF_DIR}/${NEW}
13         if test ! -f "$CMP"
14         then
15                 echo "...not found $CMP"
16                 errors=1
17         else
18                 sed     -e "s,$NEW,$REF," \
19                         -e "s%$YACC_escaped%YACC%" \
20                         -e "s%^yacc\>%YACC%" \
21                         -e "s%YACC:.*option.*$%YACC: error message%" \
22                         -e "s%yacc:.*option.*$%YACC: error message%" \
23                         -e "s%^Usage: yacc\>%Usage: YACC%" \
24                         -e '/YYPATCH/s/[0-9][0-9]*/"yyyymmdd"/' \
25                         -e '/#define YYPATCH/s/PATCH/CHECK/' \
26                         -e 's,#line \([1-9][0-9]*\) "'"$REF_DIR"'/,#line \1 ",' \
27                         -e 's,#line \([1-9][0-9]*\) "'"$TEST_DIR"'/,#line \1 ",' \
28                         -e 's/^typedef \(short\|long\) YYINT;$/typedef int YYINT;/' \
29                         -e 's,\(YACC:.* line [0-9][0-9]* of "\)'"$TEST_DIR/"',\1./,' \
30                         < "$CMP" >"$tmpfile" \
31                         && mv "$tmpfile" "$CMP"
32                 if test ! -f "$REF"
33                 then
34                         mv "$CMP" "$REF"
35                         echo "...saved $REF"
36                 elif ( cmp -s "$REF" "$CMP" )
37                 then
38                         echo "...ok $REF"
39                         rm -f "$CMP"
40                 else
41                         echo "...diff $REF"
42                         diff -c "$REF" "$CMP"
43                         errors=1
44                 fi
45         fi
46 }
47
48 test_flags() {
49         echo "** testing flags $*"
50         root=$1
51         ROOT=test-$root
52         shift 1
53         $YACC "$@" >"$ROOT.output" 2>"$ROOT.error"
54         for type in .output .error
55         do
56                 NEW=$ROOT$type
57                 REF=$REF_DIR/$root$type
58                 test_diffs
59         done
60 }
61
62 test_stdin() {
63         echo "** testing stdin $*"
64         root=$1
65         ROOT=test-$root
66         shift 1
67         opts="$1"
68         shift 1
69         code=`echo "$1"|sed -e 's/y$/c/' -e "s,${TEST_DIR}/,,"`
70         if test "x$opts" = "x-"
71         then
72                 $YACC -o "$ROOT.$code" $opts <$1 >"$ROOT.output" 2>"$ROOT.error"
73         else
74                 $YACC -o "$ROOT.$code" $opts  $1 >"$ROOT.output" 2>"$ROOT.error"
75         fi
76         for type in .output .error .$code
77         do
78                 NEW=$ROOT$type
79                 REF=$REF_DIR/$root$type
80                 test_diffs
81         done
82 }
83
84 test_defines() {
85         echo "** testing defines $*"
86         root=$1
87         ROOT=test-$root
88         shift 1
89         opts=
90         while test $# != 1
91         do
92                 opts="$opts $1"
93                 shift 1
94         done
95         head=`echo "$1"|sed -e 's/y$/h/' -e "s,${TEST_DIR}/,,"`
96         code=`echo "$1"|sed -e 's/y$/c/' -e "s,${TEST_DIR}/,,"`
97         $YACC $opts -H "$ROOT.$head" $1 >"$ROOT.output" 2>"$ROOT.error"
98         for name in prefix.tab.c y.tab.c
99         do
100                 if test -f $name
101                 then
102                         mv "$name" "$ROOT.$code"
103                         break
104                 fi
105         done
106         for name in .output .error .$head .$code
107         do
108                 NEW=$ROOT$name
109                 REF=$REF_DIR/$root$name
110                 test_diffs
111         done
112 }
113
114 if test $# = 1
115 then
116         PROG_DIR=`pwd`
117         TEST_DIR=$1
118         PROG_DIR=`echo "$PROG_DIR" | sed -e 's/ /\\\\ /g'`
119         TEST_DIR=`echo "$TEST_DIR" | sed -e 's/ /\\\\ /g'`
120 else
121         PROG_DIR=..
122         TEST_DIR=.
123 fi
124
125 YACC=$PROG_DIR/yacc
126 YACC_escaped=`echo "$PROG_DIR/yacc" | sed -e 's/\./\\\./g'`
127
128 tmpfile=temp$$
129
130 : "${FGREP:=grep -F}"
131 ifBTYACC=`$FGREP -l 'define YYBTYACC' $PROG_DIR/config.h > /dev/null; test $? != 0; echo $?`
132
133 if test "$ifBTYACC" = 0; then
134         REF_DIR=${TEST_DIR}/yacc
135 else
136         REF_DIR=${TEST_DIR}/btyacc
137 fi
138
139 rm -f ${REF_DIR}/test-*
140
141 echo "** `date`"
142
143 # Tests which do not need files
144 MYFILE=nosuchfile
145 test_flags help -z
146 test_flags big_b -B
147 test_flags big_l -L
148
149 # Test attempts to read non-existent file
150 rm -f $MYFILE.*
151 test_flags nostdin - $MYFILE.y
152 test_flags no_opts -- $MYFILE.y
153
154 # Test attempts to write to readonly file
155 touch $MYFILE.y
156
157 touch $MYFILE.c
158 chmod 444 $MYFILE.*
159 test_flags no_b_opt   -b
160 test_flags no_b_opt1  -bBASE -o $MYFILE.c $MYFILE.y
161
162 touch $MYFILE.c
163 chmod 444 $MYFILE.*
164 test_flags no_p_opt   -p
165 test_flags no_p_opt1  -pBASE -o $MYFILE.c $MYFILE.y
166 rm -f BASE$MYFILE.c
167
168 touch $MYFILE.dot
169 chmod 444 $MYFILE.*
170 test_flags no_graph   -g -o $MYFILE.c $MYFILE.y
171 rm -f $MYFILE.dot
172
173 touch $MYFILE.output
174 chmod 444 $MYFILE.*
175 test_flags no_verbose -v -o $MYFILE.c $MYFILE.y
176 test_flags no_output  -o $MYFILE.output $MYFILE.y
177 test_flags no_output1  -o$MYFILE.output $MYFILE.y
178 test_flags no_output2  -o
179 rm -f $MYFILE.output
180
181 touch $MYFILE.h
182 chmod 444 $MYFILE.*
183 test_flags no_defines -d -o $MYFILE.c $MYFILE.y
184 rm -f $MYFILE.h
185
186 touch $MYFILE.i
187 chmod 444 $MYFILE.*
188 test_flags no_include -i -o $MYFILE.c $MYFILE.y
189 rm -f $MYFILE.i
190
191 touch $MYFILE.code.c
192 chmod 444 $MYFILE.*
193 test_flags no_code_c -r -o $MYFILE.c $MYFILE.y
194 rm -f $MYFILE.code.c
195
196 rm -f $MYFILE.*
197
198 # Test special cases
199 test_stdin stdin1 - ${TEST_DIR}/calc.y
200 test_stdin stdin2 -- ${TEST_DIR}/calc.y
201
202 test_defines defines1 ${TEST_DIR}/calc.y
203 test_defines defines2 -d ${TEST_DIR}/calc.y
204 test_defines defines3 -b prefix ${TEST_DIR}/calc.y
205
206 for input in "${TEST_DIR}"/*.y
207 do
208         case $input in
209         test-*)
210                 echo "?? ignored $input"
211                 ;;
212         *)
213                 root=`basename "$input" .y`
214                 ROOT="test-$root"
215                 prefix=`echo "${root}_" | sed -e 's/[.]/_/g'`
216
217                 OPTS=
218                 OPT2=
219                 OOPT=
220                 TYPE=".error .output .tab.c .tab.h"
221                 case $input in
222                 ${TEST_DIR}/btyacc_*)
223                         if test "$ifBTYACC" = 0; then continue; fi
224                         OPTS="$OPTS -B"
225                         prefix=`echo "$prefix" | sed -e 's/^btyacc_//'`
226                         ;;
227                 ${TEST_DIR}/grammar*)
228                         OPTS="$OPTS -g"
229                         TYPE="$TYPE .dot"
230                         ;;
231                 ${TEST_DIR}/code_debug*)
232                         OPTS="$OPTS -t -i"
233                         OOPT=rename_debug.c
234                         TYPE="$TYPE .i"
235                         prefix=
236                         ;;
237                 ${TEST_DIR}/code_*)
238                         OPTS="$OPTS -r"
239                         TYPE="$TYPE .code.c"
240                         prefix=`echo "$prefix" | sed -e 's/^code_//'`
241                         ;;
242                 ${TEST_DIR}/pure_*)
243                         OPTS="$OPTS -P"
244                         prefix=`echo "$prefix" | sed -e 's/^pure_//'`
245                         ;;
246                 ${TEST_DIR}/quote_*)
247                         OPT2="-s"
248                         ;;
249                 ${TEST_DIR}/inherit*|\
250                 ${TEST_DIR}/err_inherit*)
251                         if test "$ifBTYACC" = 0; then continue; fi
252                         ;;
253                 esac
254
255                 echo "** testing $input"
256
257                 test -n "$prefix" && prefix="-p $prefix"
258
259                 for opt2 in "" $OPT2
260                 do
261                         output=$OOPT
262                         if test -n "$output"
263                         then
264                                 output="-o $output"
265                                 error=`basename "$OOPT" .c`.error
266                         else
267                                 error=${ROOT}${opt2}.error
268                         fi
269
270                         $YACC $OPTS $opt2 -v -d $output $prefix -b "$ROOT${opt2}" "$input" 2>"$error"
271                         for type in $TYPE
272                         do
273                                 REF=${REF_DIR}/${root}${opt2}${type}
274
275                                 # handle renaming due to "-o" option
276                                 if test -n "$OOPT"
277                                 then
278                                         case $type in
279                                         *.tab.c)
280                                                 type=.c
281                                                 ;;
282                                         *.tab.h)
283                                                 type=.h
284                                                 ;;
285                                         *)
286                                                 ;;
287                                         esac
288                                         NEW=`basename "$OOPT" .c`${type}
289                                         case $NEW in
290                                         test-*)
291                                                 ;;
292                                         *)
293                                                 if test -f "$NEW"
294                                                 then
295                                                         REF=${REF_DIR}/$NEW
296                                                         mv "$NEW" "test-$NEW"
297                                                         NEW="test-$NEW"
298                                                 fi
299                                                 ;;
300                                         esac
301                                 else
302                                         NEW="${ROOT}${opt2}${type}"
303                                 fi
304                                 test_diffs
305                         done
306                 done
307                 ;;
308         esac
309 done
310
311 exit $errors