configury: ensure m4 is built before calling help2man on it.
[m4/ericb.git] / tests / modules.at
blobf5d28b70dc658222e7abe90bdf5803fe55e9c288
1 # Hand crafted tests for GNU M4.                               -*- Autotest -*-
2 # Copyright (C) 2001, 2006-2008, 2010, 2013-2014 Free Software
3 # Foundation, Inc.
5 # This file is part of GNU M4.
7 # GNU M4 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 3 of the License, or
10 # (at your option) any later version.
12 # GNU M4 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.
17 # You should have received a copy of the GNU General Public License
18 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 AT_BANNER([Module support.])
24 ## --------- ##
25 ## modfreeze ##
26 ## --------- ##
28 AT_SETUP([Freezing modules])
29 AT_KEYWORDS([frozen])
30 AT_CHECK_DYNAMIC_MODULE
32 AT_DATA([[frozen.m4]],
33 [[divert(1)dnl
34 define(`test', `local::`test'')dnl
35 define(`test1', defn(`test'))dnl
36 ->test
37 include(`modtest')
38 define(`test2', defn(`test'))dnl
39 ->test
40 include(`shadow')
41 define(`test3', defn(`test'))dnl
42 ->test
43 ]])
45 AT_DATA([[unfrozen.m4]],
46 [[undivert(1)dnl
47 test1
48 test2
49 test3
50 ]])
52 # First generate the `expout' ouput by running over the sources before
53 # freezing.
54 AT_CHECK_M4([-I "$abs_builddir" frozen.m4 unfrozen.m4],
55             [0], [stdout], [stderr])
57 mv stdout expout
58 mv stderr experr
60 # Now freeze the first source file.
61 AT_CHECK_M4([-I "$abs_builddir" -F frozen.m4f frozen.m4],
62             [0], [], [ignore])
64 # Now rerun the original sequence, but using the frozen file.
65 AT_CHECK_M4([-I "$abs_builddir" -R frozen.m4f unfrozen.m4],
66             [0], [expout], [experr])
68 AT_CLEANUP([frozen.m4f])
71 ## ---------------------------- ##
72 ## Exercising the test module.  ##
73 ## ---------------------------- ##
75 # AT_CHECK_M4_MODTEST(TITLE, ENV-VARS, M4-OPTIONS)
76 # ------------------------------------------------
77 # Add a test named TITLE, running m4 with either ENV-VARS in the environment
78 # or M4-OPTIONS set to pick up test modules.
79 m4_define([AT_CHECK_M4_MODTEST],
80 [AT_SETUP([$1])
81 AT_CHECK_DYNAMIC_MODULE
83 AT_DATA([input.m4],
84 [[test
85 Dumpdef: dumpdef(`test').
86 include(`modtest')
87 test
88 Dumpdef: dumpdef(`test').
89 ]])
91 dnl Fortunately, all tests within AT_SETUP are in the same subshell, so
92 dnl setting the environment now will impact the AT_CHECK_M4, but not
93 dnl carry over to the next AT_SETUP.
94 m4_ifval([$2], [$2
95 export m4_substr([$2], [0], m4_index([$2], [=]))])
97 AT_CHECK_M4([$3 input.m4], [0],
98 [[test
99 Dumpdef: .
101 Test module called.
102 Dumpdef: .
104 [[m4:input.m4:2: warning: dumpdef: undefined macro 'test'
105 Test module loaded.
106 test:   <test>
109 AT_CLEANUP
114 AT_CHECK_M4_MODTEST([--include: absolute path],
115                     [], [-I "$abs_builddir"])
117 AT_CHECK_M4_MODTEST([--include: relative path],
118                     [], [-I "$top_build_prefix/tests"])
120 AT_CHECK_M4_MODTEST([M4PATH: absolute path],
121                     [M4PATH="$abs_builddir:"], [])
123 AT_CHECK_M4_MODTEST([M4PATH: relative path],
124                     [M4PATH="$top_build_prefix/tests:"], [])
128 ## ------ ##
129 ## shadow ##
130 ## ------ ##
132 AT_SETUP([modules: shadow])
133 AT_CHECK_DYNAMIC_MODULE
135 AT_DATA([[input.m4]],
136 [[# no modules loaded yet
137 test
138 shadow
140 # define our own macros for `test' and `shadow'
141 define(`test', `local::`test'')
142 define(`shadow', `local::`shadow'')
143 test
144 shadow
146 # module Shadow defines `shadow' and `test' macros
147 include(`shadow')
148 dumpdef(`test')
149 dumpdef(`shadow')
150 test
151 shadow
153 # save the definition of `test' from the Shadow module
154 define(`Shadow::test', defn(`test'))
156 # module Modtest also defines a `test' macro
157 include(`modtest')
158 dumpdef(`test')
159 dumpdef(`shadow')
160 test
161 shadow
163 # Reloading Shadow shouldn't affect anything
164 include(`shadow')
165 dumpdef(`test')
166 dumpdef(`shadow')
167 test
168 shadow
171 AT_DATA([[expout]],
172 [[# no modules loaded yet
173 test
174 shadow
176 # define our own macros for `test' and `shadow'
179 local::test
180 local::shadow
182 # module Shadow defines `shadow' and `test' macros
183 Shadow module loaded.
186 Shadow::test called.
187 Shadow::shadow called.
189 # save the definition of `test' from the Shadow module
192 # module Modtest also defines a `test' macro
196 Test module called.
197 Shadow::shadow called.
199 # Reloading Shadow shouldn't affect anything
203 Test module called.
204 Shadow::shadow called.
207 AT_DATA([[experr]],
208 [[test: <test>
209 shadow: <shadow>
210 Test module loaded.
211 test:   <test>
212 shadow: <shadow>
213 test:   <test>
214 shadow: <shadow>
217 AT_CHECK_M4([-I "$abs_builddir" input.m4], [0],
218             [expout], [experr])
220 AT_CLEANUP
224 ## ----------------------- ##
225 ## module symbol importing ##
226 ## ----------------------- ##
228 # Importing a symbol from a not yet loaded module
230 # This test is ugly, because we need to canonicalize strerror strings
231 # to match our test.  So we save STDERR to a file, and run another check
232 # which edits that file and compares it to the canonical STDERR output
233 # from the first command:
235 AT_SETUP([modules: importing])
236 AT_CHECK_DYNAMIC_MODULE
238 AT_DATA([[input.m4]],
239 [[import
240 include(`import')
241 import
242 import
243 symbol_fail
244 module_fail
247 AT_DATA([[expout]],
248 [[import
250 import::import called.
251 import::import called.
252 import::symbol_fail called.
255 AT_DATA([[experr]],
256 [[Test module loaded.
258 TRUE
260 TRUE
261 m4:input.m4:5: cannot load symbol `no_such' from module `modtest'
262 m4:input.m4:6: cannot open module `no_such'
265 ls "$abs_builddir"
267 AT_CHECK_M4([-I "$abs_builddir" input.m4],
268             [1], [expout], [experr])
270 AT_CLEANUP
274 ## ------------------- ##
275 ## text module symbols ##
276 ## ------------------- ##
278 # Support text macros with requested numbers of parameters.
280 AT_SETUP([modules: text])
281 AT_CHECK_DYNAMIC_MODULE
283 AT_DATA([input.m4],
284 [[__test__
285 __test__(1)
286 __test__(1,2)
287 onearg
288 onearg(1)
289 onearg(1,2)
290 manyargs
291 manyargs(1)
292 manyargs(1,2)
295 AT_CHECK_M4([-I "$abs_builddir" modtest input.m4], [0],
296 [[modtest
297 modtest
298 modtest
305 ]], [[Test module loaded.
306 m4:input.m4:2: warning: __test__: extra arguments ignored: 1 > 0
307 m4:input.m4:3: warning: __test__: extra arguments ignored: 2 > 0
308 m4:input.m4:4: warning: onearg: too few arguments: 0 < 1
309 m4:input.m4:6: warning: onearg: extra arguments ignored: 2 > 1
312 AT_CLEANUP
315 ## -------------------- ##
316 ## trace module symbols ##
317 ## -------------------- ##
319 # The trace bit should not be lost if a builtin is unloaded from
320 # memory and then redefined by a subsequent load.
322 AT_SETUP([modules: trace])
323 AT_CHECK_DYNAMIC_MODULE
325 AT_DATA([[input.m4]],
326 [[test
327 include(`shadow')
328 test
329 include(`shadow')
330 test
333 AT_DATA([[expout]],
334 [[test
335 Shadow module loaded.
336 Shadow::test called.
338 Shadow::test called.
341 AT_DATA([[experr]],
342 [[m4trace: -1- test -> `Shadow::`test' called.'
343 m4trace: -1- test -> `Shadow::`test' called.'
347 AT_CHECK_M4([-I "$abs_builddir" -t test input.m4],
348             [0], [expout], [experr])
350 AT_CLEANUP