Home | History | Annotate | Line # | Download | only in test
run_test.sh revision 1.1.1.11
      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
    312