1#							-*- Autotest -*-
2
3AT_BANNER([M4sugar.])
4
5# Copyright (C) 2000, 2001, 2002, 2005, 2006 Free Software Foundation, Inc.
6#
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2, or (at your option)
10# any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20# 02110-1301, USA.
21
22
23# AT_CHECK_M4SUGAR_TEXT(CODE, STDOUT, STDERR)
24# -------------------------------------------
25# Check that m4sugar CODE expands to STDOUT and emits STDERR.
26m4_define([AT_CHECK_M4SUGAR_TEXT],
27[
28AT_DATA_M4SUGAR([script.4s],
29[[m4_init
30m4_divert_push(0)[]dnl
31]$1[[]dnl
32m4_divert_pop(0)
33]])
34
35AT_CHECK_M4SUGAR([-o-],, [$2], [$3])
36])# AT_CHECK_M4SUGAR_TEXT
37
38
39# Order of the tests:
40# - m4_warn
41#
42# - m4_require
43# uses warn/error code.
44#
45# - m4_text_wrap
46
47## --------- ##
48## m4_warn.  ##
49## --------- ##
50
51AT_SETUP([m4@&t@_warn])
52
53# m4_text_wrap is used to display the help strings.  Also, check that
54# commas are not swallowed.  This can easily happen because of
55# m4-listification.
56
57# FIXME: For the time being we use -f to make sure we do issue the
58# warnings.  But maybe autom4te should handle that by itself?
59
60AT_DATA_M4SUGAR([script.4s],
61[[m4_init
62m4_defun([cross_warning], [m4_warn([cross],  [cross])])
63
64m4_divert([0])dnl
65m4_warn([obsolete],  [obsolete])dnl
66cross_warning[]dnl
67m4_warn([syntax], [syntax])dnl
68]])
69
70AT_CHECK_M4SUGAR([-o-], 0, [],
71[script.4s:7: warning: syntax
72])
73
74AT_CHECK_M4SUGAR([-o- -Wall -f], 0, [],
75[script.4s:5: warning: obsolete
76script.4s:6: warning: cross
77script.4s:2: cross_warning is expanded from...
78script.4s:6: the top level
79script.4s:7: warning: syntax
80])
81
82AT_CHECK_M4SUGAR([-o- -Wnone,cross -f], 0, [],
83[script.4s:6: warning: cross
84script.4s:2: cross_warning is expanded from...
85script.4s:6: the top level
86])
87
88AT_CHECK_M4SUGAR([-o- -Wnone,cross,error -f], 1, [],
89[[script.4s:6: warning: cross
90script.4s:2: cross_warning is expanded from...
91script.4s:6: the top level
92]])
93
94AT_CLEANUP
95
96
97## --------------------------- ##
98## m4_require: error message.  ##
99## --------------------------- ##
100
101AT_SETUP([m4@&t@_require: error message])
102
103AT_DATA_M4SUGAR([script.4s],
104[[m4_defun([foo], [FOO])
105m4_require([foo])
106]])
107
108AT_CHECK_M4SUGAR([], 1, [],
109[[script.4s:2: error: m4@&t@_require(foo): cannot be used outside of an m4_defun'd macro
110script.4s:2: the top level
111autom4te: m4 failed with exit status: 1
112]])
113AT_CLEANUP
114
115
116## ----------------------------------- ##
117## m4_require: circular dependencies.  ##
118## ----------------------------------- ##
119
120AT_SETUP([m4@&t@_require: circular dependencies])
121
122# m4_text_wrap is used to display the help strings.  Also, check that
123# commas are not swallowed.  This can easily happen because of
124# m4-listification.
125
126AT_DATA_M4SUGAR([script.4s],
127[[m4_defun([foo], [m4_require([bar])])
128
129m4_defun([bar], [m4_require([foo])])
130
131m4_defun([baz], [m4_require([foo])])
132
133m4_init
134m4_divert([0])dnl
135baz
136]])
137
138AT_CHECK_M4SUGAR([], 1, [],
139[[script.4s:9: error: m4@&t@_require: circular dependency of foo
140script.4s:3: bar is expanded from...
141script.4s:1: foo is expanded from...
142script.4s:5: baz is expanded from...
143script.4s:9: the top level
144autom4te: m4 failed with exit status: 1
145]])
146AT_CLEANUP
147
148
149## -------------- ##
150## m4_text_wrap.  ##
151## -------------- ##
152
153AT_SETUP([m4@&t@_text_wrap])
154
155# m4_text_wrap is used to display the help strings.  Also, check that
156# commas are not swallowed.  This can easily happen because of
157# m4-listification.
158
159AT_DATA_M4SUGAR([script.4s],
160[[m4_divert([0])dnl
161m4_text_wrap([Short string */], [   ], [/* ], 20)
162
163m4_text_wrap([Much longer string */], [   ], [/* ], 20)
164
165m4_text_wrap([Short doc.], [          ], [  --short ], 30)
166
167m4_text_wrap([Short doc.], [          ], [  --too-wide], 30)
168
169m4_text_wrap([Super long documentation.], [          ], [  --too-wide], 30)
170
171m4_text_wrap([First, second  , third, [,quoted]])
172]])
173
174AT_DATA([expout],
175[[/* Short string */
176
177/* Much longer
178   string */
179
180  --short Short doc.
181
182  --too-wide
183          Short doc.
184
185  --too-wide
186          Super long
187          documentation.
188
189First, second , third, [,quoted]
190]])
191
192AT_CHECK_M4SUGAR([-o-], 0, [expout])
193
194AT_CLEANUP
195
196## ------------------------------ ##
197## Standard regular expressions.  ##
198## ------------------------------ ##
199
200AT_SETUP([Standard regular expressions])
201
202# AT_CHECK_M4RE(RE-NAME, TEXT, INTENT = `ok' | `')
203# ------------------------------------------------
204# Check whether RE-NAME (a macro whose definition is a regular expression)
205# matches TEXT.  INTENT = `ok' if the match should succeed or else empty.
206m4_define([AT_CHECK_M4RE],
207[AT_CHECK_M4SUGAR_TEXT(
208[[m4_bregexp([$2], ^m4_defn([$1])$, [ok])
209]], [$3
210])])
211
212AT_CHECK_M4RE([m4_re_word], [ab9_c], [ok])
213AT_CHECK_M4RE([m4_re_word], [_9abc], [ok])
214AT_CHECK_M4RE([m4_re_word], [9ab_c])
215
216AT_CHECK_M4RE([m4_re_string], [ab9_c], [ok])
217AT_CHECK_M4RE([m4_re_string], [_9abc], [ok])
218AT_CHECK_M4RE([m4_re_string], [9ab_c], [ok])
219AT_CHECK_M4RE([m4_re_string], [9a@_c])
220
221AT_CLEANUP
222
223## ---------- ##
224## M4 Loops.  ##
225## ---------- ##
226
227AT_SETUP([M4 loops])
228
229AT_CHECK_M4SUGAR_TEXT([[dnl
230m4_define([myvar], [outer value])dnl
231m4_for([myvar], 1, 3, 1, [ myvar])
232m4_for([myvar], 1, 3,  , [ myvar])
233m4_for([myvar], 3, 1,-1, [ myvar])
234m4_for([myvar], 3, 1,  , [ myvar])
235m4_for([myvar], 1, 3, 2, [ myvar])
236m4_for([myvar], 3, 1,-2, [ myvar])
237m4_for([myvar],-1,-3,-2, [ myvar])
238m4_for([myvar],-3,-1, 2, [ myvar])
239dnl Make sure we recalculate the bounds correctly:
240m4_for([myvar], 1, 3, 3, [ myvar])
241m4_for([myvar], 1, 6, 3, [ myvar])
242m4_for([myvar],22,-7,-5, [ myvar])
243m4_for([myvar],-2,-7,-4, [ myvar])
244m4_for([myvar],-7,-2, 4, [ myvar])
245dnl Make sure we are not exposed to division truncation:
246m4_for([myvar], 2, 5, 2, [ myvar])
247m4_for([myvar],-5,-2, 2, [ myvar])
248m4_for([myvar], 5, 2,-2, [ myvar])
249m4_for([myvar],-2,-5,-2, [ myvar])
250dnl Make sure we do not divide by zero:
251m4_for([myvar], 1, 1,  , [ myvar])
252m4_for([myvar], 1, 1,+2, [ myvar])
253m4_for([myvar], 1, 1,-2, [ myvar])
254dnl Make sure we do not loop endlessly
255m4_for([myval], 1, 1, 0, [ myval])
256dnl Make sure to properly parenthesize
257m4_for([myvar], 3-5, -2+8, , [ myvar])
258m4_for([myvar], -2+8, 3-5, , [ myvar])
259m4_for([myvar], 8, 16, 3 * 2, [ myvar])
260m4_for([myvar], 8, 16, -3 * -2, [ myvar])
261m4_for([myvar], [2<<2], [2<<3], [-3 * (-2)], [ myvar])
262m4_foreach([myvar], [[a], [b, c], [d], [e
263],[f]], [ myvar|])
264m4_foreach_w([myvar], [a  b c, d,e f
265g], [ myvar|])
266myvar
267]],
268[[ 1 2 3
269 1 2 3
270 3 2 1
271 3 2 1
272 1 3
273 3 1
274 -1 -3
275 -3 -1
276 1
277 1 4
278 22 17 12 7 2 -3
279 -2 -6
280 -7 -3
281 2 4
282 -5 -3
283 5 3
284 -2 -4
285 1
286 1
287 1
288 1
289 -2 -1 0 1 2 3 4 5 6
290 6 5 4 3 2 1 0 -1 -2
291 8 14
292 8 14
293 8 14
294 a| b, c| d| e
295| f|
296 a| b| c,| d,e| f| g|
297outer value
298]], [])
299
300AT_DATA_M4SUGAR([script.4s],
301[[m4_init
302m4_divert([0])dnl
303m4_for([myvar], 1, 3,-1, [ myvar])
304]])
305
306AT_CHECK_M4SUGAR([], 1, [],
307[[script.4s:3: error: assert failed: -1 > 0
308script.4s:3: the top level
309autom4te: m4 failed with exit status: 1
310]])
311
312AT_DATA_M4SUGAR([script.4s],
313[[m4_init
314m4_divert([0])dnl
315m4_for([myvar], 1, 2, 0, [ myvar])
316]])
317
318AT_CHECK_M4SUGAR([], 1, [],
319[[script.4s:3: error: assert failed: 0 > 0
320script.4s:3: the top level
321autom4te: m4 failed with exit status: 1
322]])
323
324AT_DATA_M4SUGAR([script.4s],
325[[m4_init
326m4_divert([0])dnl
327m4_for([myvar], 2, 1, 0, [ myvar])
328]])
329
330AT_CHECK_M4SUGAR([], 1, [],
331[[script.4s:3: error: assert failed: 0 < 0
332script.4s:3: the top level
333autom4te: m4 failed with exit status: 1
334]])
335AT_CLEANUP
336