]> git.saurik.com Git - bison.git/blame_incremental - tests/local.at
Automate regression testing of the XML/XSLT implementation. Discussed
[bison.git] / tests / local.at
... / ...
CommitLineData
1# Process this -*- Autotest -*- file with autom4te.
2
3# Macros for the GNU Bison Test suite.
4# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19# We want a recent Autotest.
20m4_version_prereq([2.58])
21
22
23## ------------------------------- ##
24## Macros decoding Bison options. ##
25## ------------------------------- ##
26
27
28# AT_BISON_OPTION_PUSHDEFS([BISON-OPTIONS])
29# -----------------------------------------
30m4_define([AT_BISON_OPTION_PUSHDEFS],
31[_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])])
32
33
34# _AT_BISON_OPTION_PUSHDEFS($1, $2, [BISON-OPTIONS])
35# --------------------------------------------------
36# This macro works around the impossibility to define macros
37# inside macros, because issuing `[$1]' is not possible in M4 :(.
38# This sucks hard, GNU M4 should really provide M5 like $$1.
39m4_define([_AT_BISON_OPTION_PUSHDEFS],
40[m4_if([$1$2], $[1]$[2], [],
41 [m4_fatal([$0: Invalid arguments: $@])])dnl
42m4_pushdef([AT_SKEL_CC_IF],
43[m4_bmatch([$3], [%language "[Cc]\+\+"\|%skeleton "[a-z0-9]+\.cc"], [$1], [$2])])
44m4_pushdef([AT_GLR_IF],
45[m4_bmatch([$3], [%glr-parser\|%skeleton "glr\.], [$1], [$2])])
46m4_pushdef([AT_LALR1_CC_IF],
47[AT_SKEL_CC_IF([AT_GLR_IF([$2], [$1])], [$2])])
48m4_pushdef([AT_GLR_CC_IF],
49[AT_SKEL_CC_IF([AT_GLR_IF([$1], [$2])], [$2])])
50# Using yacc.c?
51m4_pushdef([AT_YACC_IF],
52[m4_bmatch([$3], [%language\|%glr-parser\|%skeleton], [$2], [$1])])
53m4_pushdef([AT_LEXPARAM_IF],
54[m4_bmatch([$3], [%lex-param], [$1], [$2])])
55m4_pushdef([AT_PARAM_IF],
56[m4_bmatch([$3], [%parse-param], [$1], [$2])])
57m4_pushdef([AT_LOCATION_IF],
58[m4_bmatch([$3], [%locations], [$1], [$2])])
59m4_pushdef([AT_PURE_IF],
60[m4_bmatch([$3], [%define *api\.pure\|%pure-parser],
61 [m4_bmatch([$3], [%define *api\.pure *"false"], [$2], [$1])],
62 [$2])])
63m4_pushdef([AT_PURE_AND_LOC_IF],
64[m4_bmatch([$3], [%locations], [AT_PURE_IF($@)], [$2])])
65m4_pushdef([AT_GLR_OR_PARAM_IF],
66[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])])
67m4_pushdef([AT_NAME_PREFIX],
68[m4_bmatch([$3], [%name-prefix ".*"],
69 [m4_bregexp([$3], [name-prefix "\([^"]*\)"], [\1])],
70 [yy])])
71# yyerror receives the location if %location & %pure & (%glr or %parse-param).
72m4_pushdef([AT_YYERROR_ARG_LOC_IF],
73[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
74 [$2])])
75# yyerror always sees the locations (when activated), except if
76# (yacc & pure & !param). FIXME: This is wrong. See the manual.
77m4_pushdef([AT_YYERROR_SEES_LOC_IF],
78[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
79 [$1])],
80 [$1])],
81 [$2])])
82
83# The interface is pure: either because %define api.pure, or because we
84# are using the C++ parsers.
85m4_pushdef([AT_PURE_LEX_IF],
86[AT_PURE_IF([$1],
87 [AT_SKEL_CC_IF([$1], [$2])])])
88
89AT_PURE_LEX_IF(
90[m4_pushdef([AT_LOC], [(*llocp)])
91 m4_pushdef([AT_VAL], [(*lvalp)])
92 m4_pushdef([AT_LEX_FORMALS],
93 [YYSTYPE *lvalp[]AT_LOCATION_IF([, YYLTYPE *llocp])])
94 m4_pushdef([AT_LEX_ARGS],
95 [lvalp[]AT_LOCATION_IF([, llocp])])
96 m4_pushdef([AT_USE_LEX_ARGS],
97 [(void) lvalp;AT_LOCATION_IF([(void) llocp])])
98 m4_pushdef([AT_LEX_PRE_FORMALS],
99 [AT_LEX_FORMALS, ])
100 m4_pushdef([AT_LEX_PRE_ARGS],
101 [AT_LEX_ARGS, ])
102],
103[m4_pushdef([AT_LOC], [(yylloc)])
104 m4_pushdef([AT_VAL], [(yylval)])
105 m4_pushdef([AT_LEX_FORMALS], [void])
106 m4_pushdef([AT_LEX_ARGS], [])
107 m4_pushdef([AT_USE_LEX_ARGS], [])
108 m4_pushdef([AT_LEX_PRE_FORMALS], [])
109 m4_pushdef([AT_LEX_PRE_ARGS], [])
110])
111])# _AT_BISON_OPTION_PUSHDEFS
112
113
114# AT_BISON_OPTION_POPDEFS
115# -----------------------
116m4_define([AT_BISON_OPTION_POPDEFS],
117[m4_popdef([AT_LEX_PRE_ARGS])
118m4_popdef([AT_LEX_PRE_FORMALS])
119m4_popdef([AT_USE_LEX_ARGS])
120m4_popdef([AT_LEX_ARGS])
121m4_popdef([AT_LEX_FORMALS])
122m4_popdef([AT_VAL])
123m4_popdef([AT_LOC])
124m4_popdef([AT_PURE_LEX_IF])
125m4_popdef([AT_YYERROR_SEES_LOC_IF])
126m4_popdef([AT_YYERROR_ARG_LOC_IF])
127m4_popdef([AT_NAME_PREFIX])
128m4_popdef([AT_GLR_OR_PARAM_IF])
129m4_popdef([AT_PURE_AND_LOC_IF])
130m4_popdef([AT_LOCATION_IF])
131m4_popdef([AT_PARAM_IF])
132m4_popdef([AT_LEXPARAM_IF])
133m4_popdef([AT_YACC_IF])
134m4_popdef([AT_GLR_IF])
135m4_popdef([AT_SKEL_CC_IF])
136m4_popdef([AT_GLR_CC_IF])
137m4_popdef([AT_LALR1_CC_IF])
138])# AT_BISON_OPTION_POPDEFS
139
140
141
142## -------------------------- ##
143## Generating Grammar Files. ##
144## -------------------------- ##
145
146
147# AT_DATA_GRAMMAR_PROLOGUE
148# ------------------------
149# The prologue that should be included in any grammar which parser is
150# meant to be compiled.
151m4_define([AT_DATA_GRAMMAR_PROLOGUE],
152[[%{
153#include <config.h>
154/* We don't need perfect functions for these tests. */
155#undef malloc
156#undef memcmp
157#undef realloc
158%}]
159])
160
161
162# AT_DATA_GRAMMAR(NAME, CONTENT)
163# ------------------------------
164# Generate the file NAME, which CONTENT is preceded by
165# AT_DATA_GRAMMAR_PROLOGUE.
166m4_define([AT_DATA_GRAMMAR],
167[AT_DATA([$1],
168[AT_DATA_GRAMMAR_PROLOGUE
169$2])
170])
171
172# AT_BISON_CHECK(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
173# -------------------------------------------------
174# Check Bison by invoking `bison BISON_ARGS'. OTHER_AT_CHECK_ARGS are the
175# usual remaining arguments to AT_CHECK: STATUS, STDOUT, etc.
176#
177# This macro or AT_BISON_CHECK_NO_XML should always be used whenever invoking
178# Bison in the test suite. For now it ensures that:
179#
180# 1. Valgrind doesn't report reachable memory when Bison is expected to have
181# a non-zero exit status since Bison doesn't always try to free all memory
182# in that case.
183#
184# 2. In the case of maintainer-xml-check, XML/XSLT output is compared with
185# --graph and --report=all output for every working grammar.
186m4_define([AT_BISON_CHECK],
187[m4_if(m4_quote($2), [0], [AT_BISON_CHECK_XML($@)],
188 m4_quote($2), [], [AT_BISON_CHECK_XML($@)])
189AT_BISON_CHECK_NO_XML($@)])
190
191# AT_BISON_CHECK_NO_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
192# --------------------------------------------------------
193# Same as AT_BISON_CHECK except don't perform XML/XSLT checks. This is useful
194# when a tortured grammar's XML is known to be too large for xsltproc to
195# handle.
196m4_define([AT_BISON_CHECK_NO_XML],
197[AT_CHECK(m4_if(m4_quote($2), [0], [], m4_quote($2), [], [],
198 [AT_QUELL_VALGRIND ])[[bison ]]$@)])
199
200# AT_BISON_CHECK_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
201# -----------------------------------------------------
202# Run AT_BISON_CHECK's XML/XSLT checks if $BISON_TEST_XML=1 and $XSLTPROC is
203# defined. It doesn't make sense to invoke this macro if Bison is expected to
204# have a non-zero exit status.
205m4_define([AT_BISON_CHECK_XML],
206[[if test x"$BISON_TEST_XML" = x1 && test x"$XSLTPROC" != x""; then]
207 mkdir xml-tests
208 m4_pushdef([AT_BISON_ARGS],
209 [m4_bpatsubsts([[$1]],
210 [--report(-file)?=[^][ ]*], [],
211 [--graph=[^][ ]*], [],
212 [--xml=[^][ ]*], [])])dnl
213 # Don't combine these Bison invocations since we want to be sure that
214 # --report=all isn't required to get the full XML file.
215 AT_CHECK([[bison --report=all --report-file=xml-tests/test.output \
216 --graph=xml-tests/test.dot ]]AT_BISON_ARGS,
217 [[0]], [ignore], [ignore])
218 AT_CHECK([[bison --xml=xml-tests/test.xml ]]AT_BISON_ARGS,
219 [[0]], [ignore], [ignore])
220 m4_popdef([AT_BISON_ARGS])dnl
221 cp xml-tests/test.output expout
222 AT_CHECK([[$XSLTPROC \
223 `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2text.xsl \
224 xml-tests/test.xml]], [[0]], [expout])
225 cp xml-tests/test.dot expout
226 AT_CHECK([[$XSLTPROC \
227 `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2dot.xsl \
228 xml-tests/test.xml]], [[0]], [expout])
229 rm -rf xml-tests expout
230[fi]])
231
232# AT_QUELL_VALGRIND
233# -----------------
234# Put this before a Bison invocation to keep Valgrind from complaining about
235# reachable memory.
236#
237# Do not quote invocations of this macro within the first argument of AT_CHECK.
238# The triple quoting below will cause test cases to fail if you do. If you do
239# so anyway but also decrease the quoting below to avoid that problem, AT_CHECK
240# will then fail to shell-escape its contents when attempting to print them.
241# The testsuite verbose output, at least, will be incorrect, but nothing may
242# fail to make sure you notice.
243m4_define([AT_QUELL_VALGRIND],
244[[[VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS;]]])
245
246## ------------------------ ##
247## Compiling C, C++ Files. ##
248## ------------------------ ##
249
250
251# AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c])
252# ----------------------------------------
253# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.',
254# assume that we are linking too; this is a hack.
255m4_define([AT_COMPILE],
256[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.c])[]m4_bmatch([$1], [[.]], [], [ $LIBS])],
257 0, [ignore], [ignore])])
258
259# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc])
260# --------------------------------------------
261# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.',
262# assume that we are linking too; this is a hack.
263# If the C++ compiler does not work, ignore the test.
264m4_define([AT_COMPILE_CXX],
265[AT_KEYWORDS(c++)
266AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore)
267AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.cc])[]m4_bmatch([$1], [[.]], [], [ $LIBS])],
268 0, [ignore], [ignore])])
269
270
271
272## ---------------------------- ##
273## Running a generated parser. ##
274## ---------------------------- ##
275
276# AT_PARSER_CHECK(COMMAND, EXIT-STATUS, EXPOUT, EXPERR, [PRE])
277# ------------------------------------------------------------
278# So that we can run `./testsuite PREPARSER='valgrind -q' for instance.
279m4_define([AT_PARSER_CHECK],
280[AT_CHECK([$5 $PREPARSER $1], [$2], [$3], [$4])])
281
282
283
284
285## ----------------------- ##
286## Launch the test suite. ##
287## ----------------------- ##
288
289AT_INIT
290
291AT_TESTED([bison])