Use the new import feature of Ragel for bringing in defines from the parser
[ragel.git] / test / runtests
blob9dd7acf0d1ed674367d2e2c436ad1197fb30a567
1 #!/bin/bash
4 # Copyright 2006 Adrian Thurston <thurston@cs.queensu.ca>
7 # This file is part of Ragel.
9 # Ragel is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2 of the License, or
12 # (at your option) any later version.
14 # Ragel is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with Ragel; if not, write to the Free Software
21 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 while getopts "gcnmleT:F:G:P:CDJ" opt; do
24 case $opt in
25 T|F|G|P)
26 genflags="$genflags -$opt$OPTARG"
27 options="$options -$opt$OPTARG"
29 n|m|l|e)
30 minflags="$minflags -$opt"
31 options="$options -$opt"
33 c)
34 compile_only="true"
35 options="$options -$opt"
37 g)
38 allow_generated="true"
40 C|D|J|R)
41 langflags="$langflags -$opt"
43 esac
44 done
46 [ -z "$minflags" ] && minflags="-n -m -l -e"
47 [ -z "$genflags" ] && genflags="-T0 -T1 -F0 -F1 -G0 -G1 -G2"
48 [ -z "$langflags" ] && langflags="-C -D -J -R"
50 shift $((OPTIND - 1));
52 [ -z "$*" ] && set -- *.rl
54 config=../common/config.h
55 ragel=../ragel/ragel
57 cxx_compiler=`sed '/^#define CXX/s/#define CXX *//p;d' $config`
58 c_compiler=`sed '/^#define CC/s/#define CC *//p;d' $config`
59 objc_compiler=`sed '/^#define GOBJC/s/#define GOBJC *//p;d' $config`
60 d_compiler=`sed '/^#define GDC/s/#define GDC *//p;d' $config`
61 java_compiler=`sed '/#define JAVAC/s/#define JAVAC *//p;d' $config`
62 txl_engine=`sed '/^#define TXL/s/#define TXL *//p;d' $config`
63 ruby_engine=`sed '/^#define RUBY/s/#define RUBY *//p;d' $config`
65 function test_error
67 exit 1;
70 for test_case; do
71 root=${test_case%.rl};
73 if ! [ -f "$test_case" ]; then
74 echo "runtests: not a file: $test_case"; >&2
75 exit 1;
78 # Check if we should ignore the test case
79 ignore=`sed '/@IGNORE:/s/^.*: *//p;d' $test_case`
80 if [ "$ignore" = yes ]; then
81 continue;
84 # If the generated flag is given make sure that the test case is generated.
85 is_generated=`sed '/@GENERATED:/s/^.*: *//p;d' $test_case`
86 if [ "$is_generated" = yes ] && [ "$allow_generated" != true ]; then
87 continue;
90 expected_out=$root.exp;
91 sed '1,/_____OUTPUT_____/d;$d' $test_case > $expected_out
93 lang=`sed '/@LANG:/s/^.*: *//p;d' $test_case`
94 if [ -z "$lang" ]; then
95 echo "$test_case: language unset"; >&2
96 exit 1;
99 case $lang in
100 c++)
101 codegen=../rlgen-cd/rlgen-cd;
102 code_suffix=cpp;
103 compiler=$cxx_compiler;
104 lang_opt=-C;
105 cflags="-pedantic -ansi -Wall -O3"
108 codegen=../rlgen-cd/rlgen-cd;
109 code_suffix=d;
110 compiler=$d_compiler;
111 lang_opt=-D;
112 cflags="-Wall -O3"
115 codegen=../rlgen-cd/rlgen-cd;
116 code_suffix=c;
117 compiler=$c_compiler;
118 lang_opt=-C;
119 cflags="-pedantic -ansi -Wall -O3"
121 obj-c)
122 codegen=../rlgen-cd/rlgen-cd;
123 code_suffix=m;
124 compiler=$objc_compiler
125 lang_opt=-C;
126 cflags="-Wall -O3 -fno-strict-aliasing -lobjc"
128 java)
129 codegen=../rlgen-java/rlgen-java;
130 code_suffix=java;
131 compiler=$java_compiler
132 lang_opt=-J;
133 cflags=""
135 ruby)
136 codegen=../rlgen-ruby/rlgen-ruby;
137 code_suffix=rb;
138 compiler=$ruby_engine
139 lang_opt=-R;
140 cflags=""
142 indep)
143 # If we have no compiler for the source program then skip it.
144 [ -z "$txl_engine" ] && continue
145 for lang in c d java; do
146 case $lang in
147 c) lf="-C";;
148 d) lf="-D";;
149 java) lf="-J";;
150 esac
152 echo "$langflags" | grep -e $lf >/dev/null || continue
154 targ=${root}_$lang.rl
155 echo "./langtrans_$lang.sh $test_case > $targ"
156 if ! ./langtrans_$lang.sh $test_case > $targ; then
157 test_error
159 echo "./runtests -g $options $targ"
160 if ! ./runtests -g $options $targ; then
161 test_error
163 done
164 continue;
167 echo "$test_case: unknown language type $lang" >&2
168 exit 1;
170 esac
172 # Make sure that we are interested in the host language.
173 echo "$langflags" | grep -e $lang_opt >/dev/null || continue
175 code_src=$root.$code_suffix;
176 binary=$root.bin;
177 output=$root.out;
179 # If we have no compiler for the source program then skip it.
180 [ -z "$compiler" ] && continue
182 additional_cflags=`sed '/@CFLAGS:/s/^.*: *//p;d' $test_case`
183 [ -n "$additional_cflags" ] && cflags="$cflags $additional_cflags"
185 allow_minflags=`sed '/@ALLOW_MINFLAGS:/s/^.*: *//p;d' $test_case`
186 [ -z "$allow_minflags" ] && allow_minflags="-n -m -l -e"
188 allow_genflags=`sed '/@ALLOW_GENFLAGS:/s/^.*: *//p;d' $test_case`
189 [ -z "$allow_genflags" ] && allow_genflags="-T0 -T1 -F0 -F1 -G0 -G1 -G2"
192 for min_opt in $minflags; do
193 for gen_opt in $genflags; do
194 echo "$allow_minflags" | grep -e $min_opt >/dev/null || continue
196 grep_gen_opt=${gen_opt}
197 split_iters=${gen_opt#-P}
198 if test $split_iters != $gen_opt; then
199 grep_gen_opt="-P";
201 echo "$allow_genflags" | grep -e $grep_gen_opt >/dev/null || continue
203 if [ $lang == "java" ] || [ $lang == "ruby" ]; then
204 be_gen_opt=""
205 else
206 be_gen_opt=$gen_opt
209 echo "$ragel $min_opt $lang_opt $test_case | $codegen $be_gen_opt -o $code_src"
210 if ! $ragel $min_opt $lang_opt $test_case | $codegen $be_gen_opt -o $code_src; then
211 test_error;
214 split_objs=""
215 if test $split_iters != "$gen_opt"; then
216 n=0;
217 while test $n -lt $split_iters; do
218 part_root=${root}_`awk 'BEGIN {
219 width = 0;
220 high = '$split_iters' - 1;
221 while ( high > 0 ) {
222 width = width + 1;
223 high = int(high / 10);
225 suffFormat = "%" width "." width "d\n";
226 printf( suffFormat, '$n' );
227 exit 0;
229 part_src=${part_root}.c
230 part_bin=${part_root}.o
231 echo "$compiler -c $cflags -o $part_bin $part_src"
232 if ! $compiler -c $cflags -o $part_bin $part_src; then
233 test_error;
235 split_objs="$split_objs $part_bin"
236 n=$((n+1))
237 done
240 out_args=""
241 [ $lang != java ] && out_args="-o ${binary}";
243 # Ruby doesn't need to be compiled.
244 if [ $lang != ruby ]; then
245 echo "$compiler ${cflags} ${out_args} ${code_src}"
246 if ! $compiler ${cflags} ${out_args} ${code_src}; then
247 test_error;
251 if [ "$compile_only" != "true" ]; then
252 echo -n "running $root ... ";
254 exec_cmd=./$binary
255 [ $lang = java ] && exec_cmd="java $root"
256 [ $lang = ruby ] && exec_cmd="ruby ${code_src}"
258 $exec_cmd 2>&1 > $output;
259 if diff $expected_out $output > /dev/null; then
260 echo "passed";
261 else
262 echo "FAILED";
263 test_error;
266 done
267 done
268 done