Full negative tests for macros.
[pspp] / tests / language / control / define.at
1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
3 dnl
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
8 dnl
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 dnl GNU nGeneral Public License for more details.
13 dnl
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 dnl
17 AT_BANNER([DEFINE])
18
19 m4_define([PSPP_CHECK_MACRO_EXPANSION],
20   [AT_SETUP([macro expansion - $1])
21    AT_KEYWORDS([m4_bpatsubst([$1], [!], [])])
22    AT_DATA([define.sps], [$2
23 DEBUG EXPAND.
24 $3
25 ])
26    AT_CAPTURE_FILE([define.sps])
27    AT_DATA([expout], [$4
28 ])
29    AT_CHECK([pspp --testing-mode define.sps | sed '/^$/d'], [$6], [expout])
30    AT_CLEANUP])
31
32 AT_SETUP([simple macro expansion])
33 AT_DATA([define.sps], [dnl
34 DEFINE !macro()
35 a b c d
36 e f g h.
37 i j k l
38 1,2,3,4.
39 5+6+7.
40 m(n,o).
41 "a" "b" "c" 'a' 'b' 'c'.
42 "x "" y".
43 !ENDDEFINE.
44 DEBUG EXPAND.
45 !macro
46 ])
47 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
48 a b c d e f g h.
49 i j k l 1, 2, 3, 4.
50 5 + 6 + 7.
51 m(n, o).
52 "a" "b" "c" 'a' 'b' 'c'.
53 "x "" y".
54 ])
55 AT_CLEANUP
56
57 PSPP_CHECK_MACRO_EXPANSION([one !TOKENS(1) positional argument],
58   [DEFINE !t1(!positional !tokens(1)) t1 (!1) !ENDDEFINE.],
59   [!t1 a.
60 !t1 b.
61 !t1 a b.],
62   [t1(a)
63 t1(b)
64 t1(a)
65 note: unexpanded token "b"])
66
67 AT_SETUP([macro expansion with positional arguments])
68 AT_DATA([define.sps], [dnl
69 DEFINE !title(!positional !tokens(1)) !1 !ENDDEFINE.
70 DEFINE !t1(!positional !tokens(1)) t1 (!1) !ENDDEFINE.
71 DEFINE !t2(!positional !tokens(2)) t2 (!1) !ENDDEFINE.
72
73 DEFINE !ce(!positional !charend('/')) ce (!1) !ENDDEFINE.
74 DEFINE !ce2(!positional !charend('(')
75            /!positional !charend(')'))
76 ce2 (!1, !2)
77 !ENDDEFINE.
78
79 DEFINE !e(!positional !enclose('{','}')) e (!1) !ENDDEFINE.
80
81 DEFINE !cmd(!positional !cmdend) cmd(!1) !ENDDEFINE.
82 DEFINE !cmd2(!positional !cmdend
83             /!positional !tokens(1))
84 cmd2(!1, !2)
85 !ENDDEFINE.
86
87 DEFINE !p(!positional !tokens(1)
88          /!positional !tokens(1)
89          /!positional !tokens(1))
90 p(!1, !2, !3)(!*)
91 !ENDDEFINE.
92
93 DEBUG EXPAND.
94 !title "!TOKENS(1) argument."
95 !t1 a.
96 !t1 b.
97 !t1 a b.
98
99 !title "!TOKENS(2) argument."
100 !t2 a b.
101 !t2 b c d.
102
103 !title "!CHAREND argument."
104 !ce/.
105 !ce x/.
106 !ce x y/.
107 !ce x y z/.
108
109 !title "Two !CHAREND arguments."
110 !ce2 x(y).
111 !ce2 1 2 3 4().
112
113 !title "!ENCLOSE argument."
114 !e {}.
115 !e {a}.
116 !e {a b}.
117
118 !title "!CMDEND argument."
119 !cmd 1 2 3 4.
120 !cmd2 5 6.
121 7.
122
123 !title "Three !TOKENS(1) arguments."
124 !p a b c.
125 !p 1 -2 -3.
126 ])
127 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
128 "!TOKENS(1) argument."
129
130 t1(a)
131
132 t1(b)
133
134 t1(a)
135
136 note: unexpanded token "b"
137
138 "!TOKENS(2) argument."
139
140 t2(a b)
141
142 t2(b c)
143
144 note: unexpanded token "d"
145
146 "!CHAREND argument."
147
148 ce( )
149
150 ce(x)
151
152 ce(x y)
153
154 ce(x y z)
155
156 "Two !CHAREND arguments."
157
158 ce2(x, y)
159
160 ce2(1 2 3 4, )
161
162 "!ENCLOSE argument."
163
164 e( )
165
166 e(a)
167
168 e(a b)
169
170 "!CMDEND argument."
171
172 cmd(1 2 3 4)
173
174 cmd2(5 6, 7)
175
176 "Three !TOKENS(1) arguments."
177
178 p(a, b, c) (a b c)
179
180 p(1, -2, -3) (1 -2 -3)
181 ])
182 AT_CLEANUP
183
184 AT_SETUP([macro expansion with positional arguments - negative])
185 AT_DATA([define.sps], [dnl
186 DEFINE !title(!positional !tokens(1)) !1 !ENDDEFINE.
187 DEFINE !p(!positional !tokens(1)
188          /!positional !tokens(1)
189          /!positional !tokens(1))
190 (!1, !2, !3)
191 !ENDDEFINE.
192
193 DEFINE !ce(!positional !charend('/')) ce(!1) !ENDDEFINE.
194
195 DEFINE !enc1(!positional !enclose('{', '}')) enc1(!1) !ENDDEFINE.
196 DEBUG EXPAND.
197 !title "Too few tokens for !TOKENS."
198 !p a b.
199 !p a.
200 !p.
201
202 !title "Missing charend delimiter."
203 !ce a b c.
204
205 !title "Missing start delimiter."
206 !enc1 a b c.
207
208 !title "Missing end delimiter."
209 !enc1{a b c.
210 ])
211 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
212 "Too few tokens for !TOKENS."
213
214 define.sps:13: error: DEBUG EXPAND: Unexpected end of command reading
215 argument !3 to macro !p.
216
217 note: unexpanded token "!p"
218
219 note: unexpanded token "a"
220
221 note: unexpanded token "b"
222
223 define.sps:14: error: DEBUG EXPAND: Unexpected end of command reading
224 argument !2 to macro !p.
225
226 note: unexpanded token "!p"
227
228 note: unexpanded token "a"
229
230 define.sps:15: error: DEBUG EXPAND: Unexpected end of command reading
231 argument !1 to macro !p.
232
233 note: unexpanded token "!p"
234
235 "Missing charend delimiter."
236
237 define.sps:18: error: DEBUG EXPAND: Unexpected end of command reading
238 argument !1 to macro !ce.
239
240 note: unexpanded token "!ce"
241
242 note: unexpanded token "a"
243
244 note: unexpanded token "b"
245
246 note: unexpanded token "c"
247
248 "Missing start delimiter."
249
250 define.sps:21: error: DEBUG EXPAND: Found `a' while expecting `{' reading
251 argument !1 to macro !enc1.
252
253 note: unexpanded token "!enc1"
254
255 note: unexpanded token "a"
256
257 note: unexpanded token "b"
258
259 note: unexpanded token "c"
260
261 "Missing end delimiter."
262
263 define.sps:24: error: DEBUG EXPAND: Unexpected end of command reading
264 argument !1 to macro !enc1.
265
266 note: unexpanded token "!enc1"
267
268 note: unexpanded token "{"
269
270 note: unexpanded token "a"
271
272 note: unexpanded token "b"
273
274 note: unexpanded token "c"
275 ])
276 AT_CLEANUP
277
278 AT_SETUP([keyword macro argument name with ! prefix])
279 AT_DATA([define.sps], [dnl
280 DEFINE !macro(!x=!TOKENS(1).
281 ])
282 AT_CHECK([pspp -O format=csv define.sps], [1], [dnl
283 "define.sps:1.15-1.16: error: DEFINE: Syntax error at `!x': Keyword macro parameter must be named in definition without ""!"" prefix."
284 ])
285 AT_CLEANUP
286
287 AT_SETUP([reserved macro keyword argument name])
288 AT_DATA([define.sps], [dnl
289 DEFINE !macro(if=!TOKENS(1).
290 ])
291 AT_CHECK([pspp -O format=csv define.sps], [1], [dnl
292 "define.sps:1.15-1.16: error: DEFINE: Syntax error at `if': Cannot use macro keyword ""if"" as an argument name."
293 ])
294 AT_CLEANUP
295
296 PSPP_CHECK_MACRO_EXPANSION([one !TOKENS(1) keyword argument],
297   [DEFINE !k(arg1 = !TOKENS(1)) k(!arg1) !ENDDEFINE.],
298   [!k arg1=x.
299 !k arg1=x y.
300 !k.],
301   [k(x)
302 k(x)
303 note: unexpanded token "y"
304 k( )])
305
306 PSPP_CHECK_MACRO_EXPANSION([one !TOKENS(1) keyword argument - negative],
307   [DEFINE !k(arg1 = !TOKENS(1)) k(!arg1) !ENDDEFINE.],
308   [!k arg1.
309 !k arg1=.], [dnl
310 define.sps:3: error: DEBUG EXPAND: Found `.' while expecting `=' reading
311 argument !arg1 to macro !k.
312 note: unexpanded token "!k"
313 note: unexpanded token "arg1"
314 define.sps:4: error: DEBUG EXPAND: Unexpected end of command reading argument !
315 arg1 to macro !k.
316 note: unexpanded token "!k"
317 note: unexpanded token "arg1"
318 note: unexpanded token "="], [1])
319
320 PSPP_CHECK_MACRO_EXPANSION([!CHAREND('/') keyword arguments], [dnl
321 DEFINE !k(arg1 = !CHAREND('/')
322          /arg2 = !CHAREND('/'))
323 k(!arg1, !arg2)
324 !ENDDEFINE.],
325   [!k arg1=x/ arg2=y/.
326 !k arg1=x/.
327 !k arg2=y/.
328 !k.],
329   [k(x, y)
330 k(x, )
331 k(, y)
332 k(, )])
333
334 PSPP_CHECK_MACRO_EXPANSION([!CHAREND('/') keyword arguments - negative], [dnl
335 DEFINE !k(arg1 = !CHAREND('/')
336          /arg2 = !CHAREND('/'))
337 k(!arg1, !arg2)
338 !ENDDEFINE.],
339   [!k arg1.
340 !k arg1=.
341 !k arg1=x.
342 !k arg1=x/ arg2=y.],
343   [define.sps:6: error: DEBUG EXPAND: Found `.' while expecting `=' reading
344 argument !arg1 to macro !k.
345 note: unexpanded token "!k"
346 note: unexpanded token "arg1"
347 define.sps:7: error: DEBUG EXPAND: Unexpected end of command reading argument !
348 arg1 to macro !k.
349 note: unexpanded token "!k"
350 note: unexpanded token "arg1"
351 note: unexpanded token "="
352 define.sps:8: error: DEBUG EXPAND: Unexpected end of command reading argument !
353 arg1 to macro !k.
354 note: unexpanded token "!k"
355 note: unexpanded token "arg1"
356 note: unexpanded token "="
357 note: unexpanded token "x"
358 define.sps:9: error: DEBUG EXPAND: Unexpected end of command reading argument !
359 arg2 to macro !k.
360 note: unexpanded token "!k"
361 note: unexpanded token "arg1"
362 note: unexpanded token "="
363 note: unexpanded token "x"
364 note: unexpanded token "/"
365 note: unexpanded token "arg2"
366 note: unexpanded token "="
367 note: unexpanded token "y"])
368
369 PSPP_CHECK_MACRO_EXPANSION([default keyword arguments],
370   [DEFINE !k(arg1 = !DEFAULT(a b c) !CMDEND) k(!arg1) !ENDDEFINE],
371   [!k arg1=x.
372 !k],
373   [k(x)
374 k(a b c)])
375
376 dnl Keep this test in sync with the examples for !BLANKS in the manual.
377 PSPP_CHECK_MACRO_EXPANSION([!BLANKS],
378   [DEFINE !b()
379 !BLANKS(0).
380 !QUOTE(!BLANKS(0)).
381 !BLANKS(1).
382 !QUOTE(!BLANKS(1)).
383 !BLANKS(2).
384 !QUOTE(!BLANKS(2)).
385 !BLANKS(5).
386 !QUOTE(!BLANKS(5)).
387 !ENDDEFINE],
388   [!b.],
389   [.
390 ''.
391 .
392 ' '.
393 .
394 '  '.
395 .
396 '     '.])
397
398 dnl Keep this test in sync with the examples for !CONCAT in the manual.
399 PSPP_CHECK_MACRO_EXPANSION([!CONCAT],
400   [DEFINE !c()
401 !CONCAT(x, y).
402 !CONCAT('x', 'y').
403 !CONCAT(12, 34).
404 !CONCAT(!NULL, 123).
405 !CONCAT(x, 0).
406 !CONCAT(x, 0, y).
407 !CONCAT(0, x).
408 !CONCAT(0, x, y).
409 !ENDDEFINE],
410   [!c.],
411   [xy.
412 xy.
413 1234.
414 123.
415 x0.
416 x0y.
417 0 x.
418 0 xy.])
419
420 dnl Keep this test in sync with the examples for !EVAL in the manual.
421 PSPP_CHECK_MACRO_EXPANSION([!EVAL],
422   [DEFINE !vars() a b c !ENDDEFINE.
423 DEFINE !e()
424 !vars.
425 !QUOTE(!vars).
426 !EVAL(!vars).
427 !QUOTE(!EVAL(!vars)).
428 !ENDDEFINE
429 DEFINE !e2(!positional !enclose('(',')'))
430 !1.
431 !QUOTE(!1).
432 !EVAL(!1).
433 !QUOTE(!EVAL(!1)).
434 !ENDDEFINE],
435   [!e.
436 !e2(!vars)],
437   [a b c.
438 '!vars'.
439 a b c.
440 'a b c'.
441 a b c.
442 '!vars'.
443 a b c.
444 'a b c'.])
445
446 dnl Keep this test in sync with the examples for !HEAD in the manual.
447 PSPP_CHECK_MACRO_EXPANSION([!HEAD],
448   [DEFINE !h()
449 !HEAD('a b c').
450 !HEAD('a').
451 !HEAD(!NULL).
452 !HEAD('').
453 !ENDDEFINE],
454   [!h.],
455   [a.
456 a.
457 .
458 .])
459
460 dnl Keep this test in sync with the examples for !TAIL in the manual.
461 PSPP_CHECK_MACRO_EXPANSION([!TAIL],
462   [DEFINE !t()
463 !TAIL('a b c').
464 !TAIL('a').
465 !TAIL(!NULL).
466 !TAIL('').
467 !ENDDEFINE],
468   [!t.],
469   [b c.
470 .
471 .
472 .])
473
474 dnl Keep this test in sync with the examples for !INDEX in the manual.
475 PSPP_CHECK_MACRO_EXPANSION([!INDEX],
476   [DEFINE !i()
477 !INDEX(banana, an).
478 !INDEX(banana, nan).
479 !INDEX(banana, apple).
480 !INDEX("banana", nan).
481 !INDEX("banana", "nan").
482 !INDEX(!UNQUOTE("banana"), !UNQUOTE("nan")).
483 !ENDDEFINE],
484   [!i.],
485   [2.
486 3.
487 0.
488 4.
489 0.
490 3.])
491
492 dnl Keep this test in sync with the examples for !LENGTH in the manual.
493 PSPP_CHECK_MACRO_EXPANSION([!LENGTH],
494   [DEFINE !l()
495 !LENGTH(123).
496 !LENGTH(123.00).
497 !LENGTH( 123 ).
498 !LENGTH("123").
499 !LENGTH(xyzzy).
500 !LENGTH("xyzzy").
501 !LENGTH("xy""zzy").
502 !LENGTH(!UNQUOTE("xyzzy")).
503 !LENGTH(!UNQUOTE("xy""zzy")).
504 !LENGTH(!NULL).
505 !ENDDEFINE.
506 DEFINE !la(!positional !enclose('(',')'))
507 !LENGTH(!1).
508 !ENDDEFINE.],
509   [!l.
510 !la(a b c).
511 !la().],
512   [3.
513 6.
514 3.
515 5.
516 5.
517 7.
518 9.
519 5.
520 6.
521 0.
522 5.
523 0.])
524
525 dnl Keep this test in sync with the examples for !SUBSTR in the manual.
526 PSPP_CHECK_MACRO_EXPANSION([!SUBSTR],
527   [DEFINE !s()
528 !SUBSTR(banana, 3).
529 !SUBSTR(banana, 3, 3).
530 !SUBSTR("banana", 1, 3).
531 !SUBSTR(!UNQUOTE("banana"), 3).
532 !SUBSTR("banana", 3, 3).
533 !SUBSTR(banana, 3, 0).
534 !SUBSTR(banana, 3, 10).
535 !SUBSTR(banana, 10, 3).
536 !ENDDEFINE.],
537   [!s.],
538   [define.sps:1-10: At `"ba' in the expansion of `!s',dnl "
539
540 define.sps:12: error: DEBUG EXPAND: Unterminated string constant.
541 nana.
542 nan.
543 .
544 nana.
545 ana.
546 .
547 nana.
548 .])
549
550 dnl Keep this test in sync with the examples for !UPCASE in the manual.
551 PSPP_CHECK_MACRO_EXPANSION([!UPCASE],
552   [DEFINE !u()
553 !UPCASE(freckle).
554 !UPCASE('freckle').
555 !UPCASE('a b c').
556 !UPCASE('A B C').
557 !ENDDEFINE.],
558   [!u.],
559   [FRECKLE.
560 FRECKLE.
561 A B C.
562 A B C.])
563
564
565 dnl !* is implemented separately inside and outside function arguments
566 dnl so this test makes sure to include both.
567 PSPP_CHECK_MACRO_EXPANSION([!*], [dnl
568 DEFINE !m(!POSITIONAL !TOKENS(1)
569          /!POSITIONAL !TOKENS(1))
570 !*/
571 !LENGTH(!*)/
572 !SUBSTR(!*, 3)/
573 !QUOTE(!*).
574 !ENDDEFINE.],
575   [!m 123 b
576 !m 2 3
577 !m '' 'b'.
578 ], [123 b / 5 / 3 b / '123 b'.
579 2 3 / 3 / 3 / '2 3'.
580 '' 'b' / 6 / 'b' / ''''' ''b'''.])
581
582 AT_SETUP([macro maximum nesting level (MNEST)])
583 AT_KEYWORDS([MNEST])
584 AT_DATA([define.sps], [dnl
585 DEFINE !macro()
586 !macro
587 !ENDDEFINE.
588 !macro.
589 ])
590 AT_CHECK([pspp -O format=csv define.sps], [1], [dnl
591 "define.sps:1-3: In the expansion of `!macro',
592 define.sps:1-3: inside the expansion of `!macro',
593 define.sps:1-3: inside the expansion of `!macro',
594 define.sps:1-3: inside the expansion of `!macro',
595 define.sps:1-3: inside the expansion of `!macro',
596 define.sps:1-3: inside the expansion of `!macro',
597 define.sps:1-3: inside the expansion of `!macro',
598 define.sps:1-3: inside the expansion of `!macro',
599 define.sps:1-3: inside the expansion of `!macro',
600 define.sps:1-3: inside the expansion of `!macro',
601 define.sps:1-3: inside the expansion of `!macro',
602 define.sps:1-3: inside the expansion of `!macro',
603 define.sps:1-3: inside the expansion of `!macro',
604 define.sps:1-3: inside the expansion of `!macro',
605 define.sps:1-3: inside the expansion of `!macro',
606 define.sps:1-3: inside the expansion of `!macro',
607 define.sps:1-3: inside the expansion of `!macro',
608 define.sps:1-3: inside the expansion of `!macro',
609 define.sps:1-3: inside the expansion of `!macro',
610 define.sps:1-3: inside the expansion of `!macro',
611 define.sps:1-3: inside the expansion of `!macro',
612 define.sps:1-3: inside the expansion of `!macro',
613 define.sps:1-3: inside the expansion of `!macro',
614 define.sps:1-3: inside the expansion of `!macro',
615 define.sps:1-3: inside the expansion of `!macro',
616 define.sps:1-3: inside the expansion of `!macro',
617 define.sps:1-3: inside the expansion of `!macro',
618 define.sps:1-3: inside the expansion of `!macro',
619 define.sps:1-3: inside the expansion of `!macro',
620 define.sps:1-3: inside the expansion of `!macro',
621 define.sps:1-3: inside the expansion of `!macro',
622 define.sps:1-3: inside the expansion of `!macro',
623 define.sps:1-3: inside the expansion of `!macro',
624 define.sps:1-3: inside the expansion of `!macro',
625 define.sps:1-3: inside the expansion of `!macro',
626 define.sps:1-3: inside the expansion of `!macro',
627 define.sps:1-3: inside the expansion of `!macro',
628 define.sps:1-3: inside the expansion of `!macro',
629 define.sps:1-3: inside the expansion of `!macro',
630 define.sps:1-3: inside the expansion of `!macro',
631 define.sps:1-3: inside the expansion of `!macro',
632 define.sps:1-3: inside the expansion of `!macro',
633 define.sps:1-3: inside the expansion of `!macro',
634 define.sps:1-3: inside the expansion of `!macro',
635 define.sps:1-3: inside the expansion of `!macro',
636 define.sps:1-3: inside the expansion of `!macro',
637 define.sps:1-3: inside the expansion of `!macro',
638 define.sps:1-3: inside the expansion of `!macro',
639 define.sps:1-3: inside the expansion of `!macro',
640 define.sps:1-3: inside the expansion of `!macro',
641 define.sps:1-3: inside the expansion of `!macro',
642 define.sps:4: error: DEFINE: Maximum nesting level 50 exceeded.  (Use SET MNEST to change the limit.)"
643
644 define.sps:4.1-4.6: error: Syntax error at `!macro' (in expansion of `!macro'): expecting command name.
645 ])
646 AT_CLEANUP
647
648 AT_SETUP([macro !IF condition])
649 AT_KEYWORDS([if])
650 for operators in \
651     '!eq !ne !lt !gt !le !ge' \
652     '  =  <>   <   >  <=  >='
653 do
654     set $operators
655     AS_BOX([$operators])
656     cat > define.sps <<EOF
657 DEFINE !test(!positional !tokens(1))
658 !if (!1 $1 1) !then true !else false !ifend
659 !if (!1 $2 1) !then true !else false !ifend
660 !if (!1 $3 1) !then true !else false !ifend
661 !if (!1 $4 1) !then true !else false !ifend
662 !if (!1 $5 1) !then true !else false !ifend
663 !if (!1 $6 1) !then true !else false !ifend.
664 !ENDDEFINE.
665 DEBUG EXPAND.
666 !test 0
667 !test 1
668 !test 2
669 !test '1'
670 !test 1.0
671 EOF
672     AT_CAPTURE_FILE([define.sps])
673     AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
674 false true true false true false.
675
676 true false false false true true.
677
678 false true false true false true.
679
680 true false false false true true.
681
682 false true false true false true.
683 ])
684 done
685 AT_CLEANUP
686
687 AT_SETUP([macro !IF condition -- case sensitivity])
688 AT_KEYWORDS([if])
689 for operators in \
690     '!eq !ne !lt !gt !le !ge' \
691     '  =  <>   <   >  <=  >='
692 do
693     set $operators
694     AS_BOX([$operators])
695     cat > define.sps <<EOF
696 DEFINE !test(!positional !tokens(1))
697 !if (!1 $1 a) !then true !else false !ifend
698 !if (!1 $1 A) !then true !else false !ifend
699 !if (!1 $2 a) !then true !else false !ifend
700 !if (!1 $2 A) !then true !else false !ifend
701 !if (!1 $3 a) !then true !else false !ifend
702 !if (!1 $3 A) !then true !else false !ifend
703 !if (!1 $4 a) !then true !else false !ifend
704 !if (!1 $4 A) !then true !else false !ifend
705 !if (!1 $5 a) !then true !else false !ifend
706 !if (!1 $5 A) !then true !else false !ifend
707 !if (!1 $6 a) !then true !else false !ifend
708 !if (!1 $6 A) !then true !else false !ifend
709 !if (!1 $1 !null) !then true !else false !ifend
710 !if (!1 $2 !null) !then true !else false !ifend.
711 !ENDDEFINE.
712 DEBUG EXPAND.
713 !test a
714 !test A
715 !test b
716 !test B
717 EOF
718     AT_CAPTURE_FILE([define.sps])
719     AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
720 true false false true false false false true true false true true false true.
721
722 false true true false true false false false true true false true false true.
723
724 false false true true false false true true false false true true false true.
725
726 false false true true true false false true true false false true false true.
727 ])
728 done
729 AT_CLEANUP
730
731 AT_SETUP([macro !IF condition -- logical operators])
732 AT_KEYWORDS([if])
733 for operators in \
734     '!and !or !not' \
735     '   &   |    ~'
736 do
737     set $operators
738     AS_BOX([$operators])
739     cat > define.sps <<EOF
740 DEFINE !test_binary(!positional !tokens(1)/!positional !tokens(1))
741 !if !1 $1 !2 !then true !else false !ifend
742 !if !1 $2 !2 !then true !else false !ifend.
743 !ENDDEFINE.
744
745 DEFINE !test_unary(!positional !tokens(1))
746 !if $3 !1 !then true !else false !ifend.
747 !ENDDEFINE.
748
749 * These are:
750   ((not A) and B) or C
751   not (A and B) or C
752   not A and (B or C)
753 DEFINE !test_prec(!pos !tokens(1)/!pos !tokens(1)/!pos !tokens(1))
754 !if $3 !1 $1 !2 $2 !3 !then true !else false !ifend
755 !if $3 (!1 $1 !2) $2 !3 !then true !else false !ifend
756 !if $3 !1 $1 (!2 $2 !3) !then true !else false !ifend
757 !ENDDEFINE.
758
759 DEBUG EXPAND.
760 !test_binary 0 0
761 !test_binary 0 1
762 !test_binary 1 0
763 !test_binary 1 1
764 !test_unary 0
765 !test_unary 1
766 !test_prec 0 0 0 !test_prec 0 0 1 !test_prec 0 1 0 !test_prec 0 1 1.
767 !test_prec 1 0 0 !test_prec 1 0 1 !test_prec 1 1 0 !test_prec 1 1 1.
768 EOF
769     AT_CAPTURE_FILE([define.sps])
770     AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
771 false false.
772
773 false true.
774
775 false true.
776
777 true true.
778
779 true.
780
781 false.
782
783 false true false
784 true true true
785 true true true
786 true true true
787
788 false true false
789 true true false
790 false false false
791 true true false
792 ])
793 done
794 AT_CLEANUP
795
796 AT_SETUP([macro !LET])
797 AT_KEYWORDS([let])
798 AT_DATA([define.sps], [dnl
799 DEFINE !macro(!POS !CMDEND)
800 !LET !v1 = !CONCAT('x',!1,'y')
801 !LET !v2 = !QUOTE(!v1)
802 !LET !v3 = (!LENGTH(!1) = 1)
803 !LET !v4 = (!SUBSTR(!1, 3) = !NULL)
804 v1=!v1.
805 v2=!v2.
806 v3=!v3.
807 v4=!v4.
808 !ENDDEFINE.
809 DEBUG EXPAND.
810 !macro 0.
811 !macro.
812 !macro xyzzy.
813 ])
814 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
815 v1 = x0y.
816 v2 = x0y.
817 v3 = 1.
818 v4 = 1.
819
820 v1 = xy.
821 v2 = xy.
822 v3 = 0.
823 v4 = 1.
824
825 v1 = xxyzzyy.
826 v2 = xxyzzyy.
827 v3 = 0.
828 v4 = 0.
829 ])
830 AT_CLEANUP
831
832 AT_SETUP([macro indexed !DO])
833 AT_KEYWORDS([index do])
834 AT_DATA([define.sps], [dnl
835 DEFINE !title(!POS !TOKENS(1)) !1. !ENDDEFINE.
836
837 DEFINE !for(!POS !TOKENS(1) / !POS !TOKENS(1))
838 !DO !var = !1 !TO !2 !var !DOEND.
839 !ENDDEFINE.
840
841 DEFINE !forby(!POS !TOKENS(1) / !POS !TOKENS(1) / !POS !TOKENS(1))
842 !DO !var = !1 !TO !2 !BY !3 !var !DOEND.
843 !ENDDEFINE.
844
845 DEBUG EXPAND.
846 !title "increasing".
847 !for 1 5.
848 !forby 1 5 1.
849 !forby 1 5 2.
850 !forby 1 5 2.5.
851 !forby 1 5 -1.
852
853 !title "decreasing".
854 !for 5 1.
855 !forby 5 1 1.
856 !forby 5 1 -1.
857 !forby 5 1 -2.
858 !forby 5 1 -3.
859
860 !title "non-integer".
861 !for 1.5 3.5.
862 ])
863 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
864 "increasing".
865
866 1 2 3 4 5.
867
868 1 2 3 4 5.
869
870 1 3 5.
871
872 1 3.5.
873
874 .
875
876 "decreasing".
877
878 .
879
880 .
881
882 5 4 3 2 1.
883
884 5 3 1.
885
886 5 2.
887
888 "non-integer".
889
890 1.5 2.5 3.5.
891 ])
892 AT_CLEANUP
893
894 AT_SETUP([macro !DO invalid variable names])
895 AT_KEYWORDS([index do])
896 AT_DATA([define.sps], [dnl
897 DEFINE !for(x=!TOKENS(1) / y=!TOKENS(1))
898 !DO !x = !x !TO !y !var !DOEND.
899 !ENDDEFINE.
900
901 DEFINE !for2(x=!TOKENS(1) / y=!TOKENS(1))
902 !DO !noexpand = !x !TO !y !var !DOEND.
903 !ENDDEFINE.
904
905 DEBUG EXPAND.
906 !for x=1 y=5.
907 !for2 x=1 y=5.
908 ])
909 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
910 define.sps:1-3: At `!x' in the expansion of `!for',
911 define.sps:10: error: DEBUG EXPAND: Cannot use argument name or macro keyword
912 as !DO variable.
913
914 !DO 1 = 1 !TO 5 !var !DOEND.
915
916 define.sps:5-7: At `!noexpand' in the expansion of `!for2',
917 define.sps:11: error: DEBUG EXPAND: Cannot use argument name or macro keyword
918 as !DO variable.
919
920 !DO !noexpand = 1 !TO 5 !var !DOEND.
921 ])
922 AT_CLEANUP
923
924 AT_SETUP([macro indexed !DO reaches MITERATE])
925 AT_KEYWORDS([index do])
926 AT_DATA([define.sps], [dnl
927 DEFINE !title(!POS !TOKENS(1)) !1. !ENDDEFINE.
928
929 DEFINE !for(!POS !TOKENS(1) / !POS !TOKENS(1))
930 !DO !var = !1 !TO !2 !var !DOEND.
931 !ENDDEFINE.
932
933 DEFINE !forby(!POS !TOKENS(1) / !POS !TOKENS(1) / !POS !TOKENS(1))
934 !DO !var = !1 !TO !2 !BY !3 !var !DOEND.
935 !ENDDEFINE.
936
937 SET MITERATE=3.
938 DEBUG EXPAND.
939 !title "increasing".
940 !for 1 5.
941 !forby 1 5 1.
942 !forby 1 5 2.
943 !forby 1 5 2.5.
944 !forby 1 5 -1.
945
946 !title "decreasing".
947 !for 5 1.
948 !forby 5 1 1.
949 !forby 5 1 -1.
950 !forby 5 1 -2.
951 !forby 5 1 -3.
952
953 !title "non-integer".
954 !for 1.5 3.5.
955 ])
956 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
957 "increasing".
958
959 define.sps:3-5: In the expansion of `!for',
960 define.sps:14: error: DEBUG EXPAND: Numerical !DO loop exceeded maximum number
961 of iterations 3.  (Use SET MITERATE to change the limit.)
962
963 1 2 3 4.
964
965 define.sps:7-9: In the expansion of `!forby',
966 define.sps:15: error: DEBUG EXPAND: Numerical !DO loop exceeded maximum number
967 of iterations 3.  (Use SET MITERATE to change the limit.)
968
969 1 2 3 4.
970
971 1 3 5.
972
973 1 3.5.
974
975 .
976
977 "decreasing".
978
979 .
980
981 .
982
983 define.sps:7-9: In the expansion of `!forby',
984 define.sps:23: error: DEBUG EXPAND: Numerical !DO loop exceeded maximum number
985 of iterations 3.  (Use SET MITERATE to change the limit.)
986
987 5 4 3 2.
988
989 5 3 1.
990
991 5 2.
992
993 "non-integer".
994
995 1.5 2.5 3.5.
996 ])
997 AT_CLEANUP
998
999 AT_SETUP([!BREAK with macro indexed !DO])
1000 AT_KEYWORDS([index do break])
1001 AT_DATA([define.sps], [dnl
1002 DEFINE !title(!POS !TOKENS(1)) !1. !ENDDEFINE.
1003
1004 DEFINE !for(!POS !TOKENS(1) / !POS !TOKENS(1) / !POS !TOKENS(1))
1005 !DO !var = !1 !TO !2
1006   !var
1007   !IF 1 !THEN
1008     !IF !var = !3 !THEN
1009       x
1010       !BREAK
1011       y
1012     !IFEND
1013     ,
1014   !IFEND
1015 !DOEND.
1016 !ENDDEFINE.
1017
1018 DEBUG EXPAND.
1019 !for 1 5 4.
1020 ])
1021 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
1022 1, 2, 3, 4 x.
1023 ])
1024 AT_CLEANUP
1025
1026 AT_SETUP([macro list !DO])
1027 AT_KEYWORDS([index do])
1028 AT_DATA([define.sps], [dnl
1029 DEFINE !for(!POS !CMDEND)
1030 (!DO !i !IN (!1) (!i) !DOEND).
1031 !ENDDEFINE.
1032
1033 DEBUG EXPAND.
1034 !for a b c.
1035 !for 'foo bar baz quux'.
1036 !for.
1037 ])
1038 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
1039 ( (a) (b) (c) ).
1040
1041 ( (foo) (bar) (baz) (quux) ).
1042
1043 ( ).
1044 ])
1045 AT_CLEANUP
1046
1047 AT_SETUP([macro list !DO reaches MITERATE])
1048 AT_KEYWORDS([index do])
1049 AT_DATA([define.sps], [dnl
1050 DEFINE !for(!POS !CMDEND)
1051 (!DO !i !IN (!1) (!i) !DOEND).
1052 !ENDDEFINE.
1053
1054 SET MITERATE=2.
1055 DEBUG EXPAND.
1056 !for a b c.
1057 !for 'foo bar baz quux'.
1058 !for.
1059 ])
1060 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1061 define.sps:1-3: In the expansion of `!for',
1062 define.sps:7: error: DEBUG EXPAND: !DO loop over list exceeded maximum number
1063 of iterations 2.  (Use SET MITERATE to change the limit.)
1064
1065 ( (a) (b) ).
1066
1067 define.sps:1-3: In the expansion of `!for',
1068 define.sps:8: error: DEBUG EXPAND: !DO loop over list exceeded maximum number
1069 of iterations 2.  (Use SET MITERATE to change the limit.)
1070
1071 ( (foo) (bar) ).
1072
1073 ( ).
1074 ])
1075 AT_CLEANUP
1076
1077 AT_SETUP([!BREAK with macro list !DO])
1078 AT_KEYWORDS([index break do])
1079 AT_DATA([define.sps], [dnl
1080 DEFINE !for(!POS !TOKENS(1) / !POS !CMDEND)
1081 (!DO !i !IN (!2)
1082   (!i)
1083   !IF 1 !THEN
1084     !IF !i = !1 !THEN
1085       x
1086       !BREAK
1087       y
1088     !IFEND
1089     ,
1090   !IFEND
1091 !DOEND).
1092 !ENDDEFINE.
1093
1094 DEBUG EXPAND.
1095 !for d a b c.
1096 !for baz 'foo bar baz quux'.
1097 !for e.
1098 ])
1099 AT_CHECK([pspp --testing-mode define.sps], [0], [dnl
1100 ( (a), (b), (c), ).
1101
1102 ( (foo), (bar), (baz)x).
1103
1104 ( ).
1105 ])
1106 AT_CLEANUP
1107
1108 AT_SETUP([macro !LET])
1109 AT_DATA([define.sps], [dnl
1110 DEFINE !macro(!pos !enclose('(',')'))
1111 !LET !x=!1
1112 !LET !y=!QUOTE(!1)
1113 !LET !z=(!y="abc")
1114 !y !z
1115 !ENDDEFINE.
1116
1117 DEBUG EXPAND.
1118 !macro(1+2).
1119 !macro(abc).
1120 ])
1121 AT_CHECK([pspp --testing-mode define.sps -O format=csv], [0], [dnl
1122 1 + 2 0
1123
1124 abc 1
1125 ])
1126 AT_CLEANUP
1127
1128 AT_SETUP([macro !LET invalid variable names])
1129 AT_DATA([define.sps], [dnl
1130 DEFINE !macro(x=!tokens(1))
1131 !LET !x=!x
1132 !ENDDEFINE.
1133
1134 DEFINE !macro2()
1135 !LET !do=x
1136 !ENDDEFINE.
1137
1138 DEBUG EXPAND.
1139 !macro x=1.
1140 !macro2.
1141 ])
1142 AT_CHECK([pspp --testing-mode define.sps -O format=csv], [1], [dnl
1143 "define.sps:1-3: At `!x' in the expansion of `!macro',
1144 define.sps:10: error: DEBUG EXPAND: Cannot use argument name or macro keyword ""!x"" as !LET variable."
1145
1146 !LET 1 = 1
1147
1148 "define.sps:5-7: At `!do' in the expansion of `!macro2',
1149 define.sps:11: error: DEBUG EXPAND: Cannot use argument name or macro keyword ""!do"" as !LET variable."
1150
1151 "define.sps:5-7: At `=' in the expansion of `!macro2',
1152 define.sps:11: error: DEBUG EXPAND: Expected macro variable name following !DO."
1153
1154 !LET !do = x
1155 ])
1156 AT_CLEANUP
1157
1158 AT_SETUP([BEGIN DATA inside a macro])
1159 AT_DATA([define.sps], [dnl
1160 DEFINE !macro()
1161 DATA LIST NOTABLE /x 1.
1162 BEGIN DATA
1163 1
1164 2
1165 3
1166 END DATA.
1167 LIST.
1168 !ENDDEFINE.
1169
1170 !macro
1171 ])
1172 AT_CHECK([pspp define.sps -O format=csv], [0], [dnl
1173 Table: Data List
1174 x
1175 1
1176 2
1177 3
1178 ])
1179 AT_CLEANUP
1180
1181 AT_SETUP([TITLE and SUBTITLE with macros])
1182 AT_KEYWORDS([macro])
1183 for command in TITLE SUBTITLE; do
1184     cat >title.sps <<EOF
1185 DEFINE !paste(!POS !TOKENS(1) / !POS !TOKENS(1))
1186 !CONCAT(!1,!2)
1187 !ENDDEFINE.
1188 $command prefix !paste foo bar suffix.
1189 SHOW $command.
1190 EOF
1191     cat >expout <<EOF
1192 title.sps:5: note: SHOW: $command is prefix foobar suffix.
1193 EOF
1194     AT_CHECK([pspp -O format=csv title.sps], [0], [expout])
1195 done
1196 AT_CLEANUP
1197
1198 AT_SETUP([error message within macro expansion])
1199 AT_DATA([define.sps], [dnl
1200 DEFINE !vars(!POS !TOKENS(1)) a b C !ENDDEFINE.
1201 DATA LIST NOTABLE /a b 1-2.
1202 COMPUTE x = !vars x.
1203 ])
1204 AT_CHECK([pspp -O format=csv define.sps], [1], [dnl
1205 define.sps:3.13-3.19: error: COMPUTE: Syntax error at `b' (in expansion of `!vars x'): expecting end of command.
1206 ])
1207 AT_CLEANUP
1208
1209 dnl A macro with keyword arguments needs a token of lookahead
1210 dnl to find out whether another keyword is present.  Test that
1211 dnl this special case works OK.
1212 AT_SETUP([macro calls in each others' lookahead])
1213 AT_DATA([define.sps], [dnl
1214 DEFINE !k(x=!DEFAULT(0) !TOKENS(1)/y=!DEFAULT(0) !TOKENS(1))
1215 (x=!x)(y=!y)
1216 !ENDDEFINE.
1217 DEBUG EXPAND.
1218 !k
1219 !k x=1
1220 !k y=2
1221 !k y=2 x=1
1222 !k x=1 y=2.
1223 ])
1224 AT_CHECK([pspp -O format=csv define.sps --testing-mode], [0], [dnl
1225 (x = 0) (y = 0)
1226
1227 (x = 1) (y = 0)
1228
1229 (x = 0) (y = 2)
1230 (x = 1) (y = 2)
1231
1232 (x = 1) (y = 2)
1233 ])
1234 AT_CLEANUP
1235
1236 AT_SETUP([bad token in macro body])
1237 AT_DATA([define.sps], [dnl
1238 DEFINE !x()
1239 x'123'
1240 !ENDDEFINE.
1241 ])
1242 AT_CHECK([pspp define.sps], [1], [dnl
1243 define.sps:3: error: DEFINE: String of hex digits has 3 characters, which is
1244 not a multiple of 2.
1245 ])
1246 AT_CLEANUP
1247
1248 AT_SETUP([generic macro function syntax errors])
1249 AT_DATA([define.sps], [dnl
1250 DEFINE !a() !SUBSTR !ENDDEFINE.
1251 DEFINE !b() !SUBSTR x !ENDDEFINE.
1252 DEFINE !c() !SUBSTR(1,2,3,4) !ENDDEFINE.
1253 DEFINE !d() !SUBSTR(1x) !ENDDEFINE.
1254 DEFINE !e() !SUBSTR(1 !ENDDEFINE.
1255 dnl )
1256 DEBUG EXPAND.
1257 !a.
1258 !b.
1259 !c.
1260 !d.
1261 !e.
1262 ])
1263 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1264 define.sps:1: In the expansion of `!a',
1265 define.sps:7: error: DEBUG EXPAND: `(' expected following !SUBSTR.
1266
1267 !SUBSTR
1268
1269 define.sps:2: At `x' in the expansion of `!b',
1270 define.sps:8: error: DEBUG EXPAND: `(' expected following !SUBSTR.
1271
1272 !SUBSTR x
1273
1274 define.sps:3: At `)' in the expansion of `!c',
1275 define.sps:9: error: DEBUG EXPAND: Wrong number of arguments to macro
1276 function !SUBSTR.
1277
1278 !SUBSTR(1, 2, 3, 4)
1279
1280 define.sps:4: At `x' in the expansion of `!d',
1281 define.sps:10: error: DEBUG EXPAND: `,' or `)' expected in call to macro
1282 function !SUBSTR.
1283
1284 !SUBSTR(1 x)
1285
1286 define.sps:5: In the expansion of `!e',
1287 define.sps:11: error: DEBUG EXPAND: Missing `)' in call to macro function !
1288 SUBSTR.
1289
1290 !SUBSTR(1
1291 ])
1292 AT_CLEANUP
1293
1294 AT_SETUP([specific macro function syntax errors])
1295 AT_DATA([define.sps], [dnl
1296 DEFINE !a() !BLANKS(x). !ENDDEFINE.
1297 DEFINE !b() !SUBSTR(x, y). !ENDDEFINE.
1298 DEFINE !c() !SUBSTR(x, 1, z). !ENDDEFINE.
1299 DEBUG EXPAND.
1300 !a.
1301 !b.
1302 !c.
1303 ])
1304 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1305 define.sps:1: In the expansion of `!a',
1306 define.sps:5: error: DEBUG EXPAND: Argument to !BLANKS must be non-negative
1307 integer (not "x").
1308
1309 !BLANKS(x).
1310
1311 define.sps:2: In the expansion of `!b',
1312 define.sps:6: error: DEBUG EXPAND: Second argument of !SUBSTR must be positive
1313 integer (not "y").
1314
1315 !SUBSTR(x, y).
1316
1317 define.sps:3: In the expansion of `!c',
1318 define.sps:7: error: DEBUG EXPAND: Third argument of !SUBSTR must be non-
1319 negative integer (not "z").
1320
1321 !SUBSTR(x, 1, z).
1322 ])
1323 AT_CLEANUP
1324
1325 AT_SETUP([macro expression errors])
1326 AT_DATA([define.sps], [dnl
1327 DEFINE !a() !LET !x = (1. !ENDDEFINE dnl )
1328
1329 DEFINE !b() !DO !x = x. !ENDDEFINE.
1330 DEFINE !c() !LET !x = (). !ENDDEFINE.
1331 DEBUG EXPAND.
1332 !a.
1333 !b.
1334 !c.
1335 ])
1336 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1337 define.sps:1-2: At `.' in the expansion of `!a',
1338 define.sps:5: error: DEBUG EXPAND: Expecting ')' in macro expression.
1339
1340 !LET !x = (1.
1341
1342 At `x' in the expansion of `!DO',
1343 define.sps:2: inside the expansion of `!b',
1344 define.sps:6: error: DEBUG EXPAND: Macro expression must evaluate to a number
1345 (not "x").
1346
1347 !DO !x = x.
1348
1349 define.sps:3: At `)' in the expansion of `!c',
1350 define.sps:7: error: DEBUG EXPAND: Expecting literal or function invocation in
1351 macro expression.
1352
1353 !LET !x = ( ).
1354 ])
1355 AT_CLEANUP
1356
1357 AT_SETUP([macro !IF errors])
1358 AT_KEYWORDS([IF])
1359 AT_DATA([define.sps], [dnl
1360 DEFINE !a() !IF 1 !ENDDEFINE.
1361 DEFINE !b() !IF 1 !THEN !ENDDEFINE.
1362 DEFINE !c() !IF 1 !THEN !ELSE !ENDDEFINE.
1363 DEBUG EXPAND.
1364 !a.
1365 !b.
1366 !c.
1367 ])
1368 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1369 define.sps:1: In the expansion of `!a',
1370 define.sps:5: error: DEBUG EXPAND: !THEN expected in macro !IF construct.
1371
1372 !IF 1
1373
1374 define.sps:2: In the expansion of `!b',
1375 define.sps:6: error: DEBUG EXPAND: !ELSE or !IFEND expected in macro !IF
1376 construct.
1377
1378 !IF 1 !THEN
1379
1380 define.sps:3: In the expansion of `!c',
1381 define.sps:7: error: DEBUG EXPAND: !IFEND expected in macro !IF construct.
1382
1383 !IF 1 !THEN !ELSE
1384 ])
1385 AT_CLEANUP
1386
1387 AT_SETUP([macro !LET errors])
1388 AT_KEYWORDS([LET])
1389 AT_DATA([define.sps], [dnl
1390 DEFINE !a() !LET !ENDDEFINE.
1391 DEFINE !b() !LET 0 !ENDDEFINE.
1392 DEFINE !c() !LET !x !ENDDEFINE.
1393 DEFINE !d() !LET !x y !ENDDEFINE.
1394 DEBUG EXPAND.
1395 !a.
1396 !b.
1397 !c.
1398 !d.
1399 ])
1400 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1401 define.sps:1: In the expansion of `!a',
1402 define.sps:6: error: DEBUG EXPAND: Expected macro variable name following !LET.
1403
1404 !LET
1405
1406 define.sps:2: At `0' in the expansion of `!b',
1407 define.sps:7: error: DEBUG EXPAND: Expected macro variable name following !LET.
1408
1409 !LET 0
1410
1411 define.sps:3: In the expansion of `!c',
1412 define.sps:8: error: DEBUG EXPAND: Expected `=' following !LET.
1413
1414 !LET !x
1415
1416 define.sps:4: At `y' in the expansion of `!d',
1417 define.sps:9: error: DEBUG EXPAND: Expected `=' following !LET.
1418
1419 !LET !x y
1420 ])
1421 AT_CLEANUP
1422
1423 AT_SETUP([macro !DO errors])
1424 AT_KEYWORDS([DO])
1425 AT_DATA([define.sps], [dnl
1426 DEFINE !a() !DO !ENDDEFINE.
1427 DEFINE !b() !DO 0 !ENDDEFINE.
1428 DEFINE !c() !DO !x !ENDDEFINE.
1429 DEFINE !d() !DO !x !in (x) !ENDDEFINE.
1430 DEFINE !e() !DO !x = x. !ENDDEFINE.
1431 DEFINE !f() !DO !x = 5 x !ENDDEFINE.
1432 DEFINE !g() !DO !x = 5 !TO 6 !BY 0 !ENDDEFINE.
1433 DEFINE !h() !DO !x !ENDDEFINE.
1434 DEFINE !i() !DO !x 0 !ENDDEFINE.
1435 DEFINE !j() !BREAK !ENDDEFINE.
1436 DEBUG EXPAND.
1437 !a.
1438 !b.
1439 !c.
1440 !d.
1441 !e.
1442 !f.
1443 !g.
1444 !h.
1445 !i.
1446 !j.
1447 ])
1448 AT_CHECK([pspp --testing-mode define.sps], [1], [dnl
1449 define.sps:1: In the expansion of `!a',
1450 define.sps:12: error: DEBUG EXPAND: Expected macro variable name following !DO.
1451
1452 !DO
1453
1454 define.sps:2: At `0' in the expansion of `!b',
1455 define.sps:13: error: DEBUG EXPAND: Expected macro variable name following !DO.
1456
1457 !DO 0
1458
1459 define.sps:3: In the expansion of `!c',
1460 define.sps:14: error: DEBUG EXPAND: Expected `=' or !IN in !DO loop.
1461
1462 !DO !x
1463
1464 define.sps:4: In the expansion of `!d',
1465 define.sps:15: error: DEBUG EXPAND: Missing !DOEND.
1466
1467 !DO !x !in(x)
1468
1469 At `x' in the expansion of `!DO',
1470 define.sps:5: inside the expansion of `!e',
1471 define.sps:16: error: DEBUG EXPAND: Macro expression must evaluate to a number
1472 (not "x").
1473
1474 !DO !x = x.
1475
1476 define.sps:6: At `x' in the expansion of `!f',
1477 define.sps:17: error: DEBUG EXPAND: Expected !TO in numerical !DO loop.
1478
1479 !DO !x = 5 x
1480
1481 define.sps:7: In the expansion of `!g',
1482 define.sps:18: error: DEBUG EXPAND: !BY value cannot be zero.
1483
1484 !DO !x = 5 !TO 6 !BY 0
1485
1486 define.sps:8: In the expansion of `!h',
1487 define.sps:19: error: DEBUG EXPAND: Expected `=' or !IN in !DO loop.
1488
1489 !DO !x
1490
1491 define.sps:9: At `0' in the expansion of `!i',
1492 define.sps:20: error: DEBUG EXPAND: Expected `=' or !IN in !DO loop.
1493
1494 !DO !x 0
1495
1496 define.sps:10: At `!BREAK' in the expansion of `!j',
1497 define.sps:21: error: DEBUG EXPAND: !BREAK outside !DO.
1498
1499 !BREAK
1500 ])
1501 AT_CLEANUP
1502