@@@ tvec setvar
[mLib] / test / tests.at
... / ...
CommitLineData
1### -*-autotest-*-
2###
3### Test script for test machinery
4###
5### (c) 2023 Straylight/Edgeware
6###
7
8###----- Licensing notice ---------------------------------------------------
9###
10### This file is part of the mLib utilities library.
11###
12### mLib is free software; you can redistribute it and/or modify
13### it under the terms of the GNU Library General Public License as
14### published by the Free Software Foundation; either version 2 of the
15### License, or (at your option) any later version.
16###
17### mLib is distributed in the hope that it will be useful,
18### but WITHOUT ANY WARRANTY; without even the implied warranty of
19### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20### GNU Library General Public License for more details.
21###
22### You should have received a copy of the GNU Library General Public
23### License along with mLib; if not, write to the Free
24### Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25### MA 02111-1307, USA.
26
27###--------------------------------------------------------------------------
28### Preliminaries.
29
30dnl padding_string(STRING, N, [PAD])
31m4_define([padding_string],
32[m4_if([m4_expr([m4_len([$1]) > $2])], [1], [],
33[m4_for([i], m4_len([$1]), [($2) - 1], [1], [m4_default([$3], [ ])])])])
34
35dnl left_pad(STRING, N, [PAD])
36dnl right_pad(STRING, N, [PAD])
37m4_define([left_pad], [padding_string([$1], [$2], [$3])$1])
38m4_define([right_pad], [$1[]padding_string([$1], [$2], [$3])])
39
40dnl check_template(CMD, RC, STDOUT, STDERR)
41m4_define([check_template], [
42AT_CHECK([$1], [$2], [stdout], [stderr-nolog])
43AT_DATA([expout.tpl], [$3])
44$PYTHON $abs_srcdir/template-canonify expout.tpl stdout expout stdout.found
45AT_DATA([experr.tpl], [$4])
46$PYTHON $abs_srcdir/template-canonify experr.tpl stderr experr stderr.found
47AT_CHECK([cat stdout.found; cat stderr.found >&2], [0], [expout], [experr])])
48
49dnl test_parse(TY, IN, OUT)
50m4_define([test_parse], [
51AT_DATA([tv],
52[;;; -*-conf-*-
53@<:@copy-$1@:>@
54$1 = $2
55@show = t
56])
57check_template([BUILDDIR/t/tvec.t -fh tv], [0],
58[left_pad([matched $1], [21]) = $3
59copy-$1: ok
60PASSED all 1 test in 1 group
61])])
62
63dnl test_parserr(TY, IN, LNO, ERR)
64m4_define([test_parserr], [
65AT_DATA([tv],
66[;;; -*-conf-*-
67@<:@copy-$1@:>@
68$1 = $2
69])
70check_template([BUILDDIR/t/tvec.t -fh tv], [2],
71[tv:$3: ERROR: $4
72tv:={N:\d+}: ERROR: required register `$1' not set in test `copy-$1'
73tv:={N:\d+}: `copy-$1' skipped: erroneous test data
74copy-$1 skipped
75PASSED 0 tests (1 skipped) in 0 groups (1 skipped)
76ERRORS found in input; tests may not have run correctly
77],
78[tvec.t: tv:$3: ERROR: $4
79tvec.t: tv:={N:\d+}: ERROR: required register `$1' not set in test `copy-$1'
80])])
81
82###--------------------------------------------------------------------------
83AT_SETUP(tvec type-int)
84
85test_parse([int], [4], [4 ; = 0x04 = '\x04'])
86test_parse([int], [ 17; comment], [17 ; = 0x11 = '\x11'])
87
88test_parse([int], [0x234], [564 ; = 0x0234])
89test_parse([int], [0o33], [27 ; = 0x1b = @%:@escape = '\e'])
90
91test_parse([int], [ +192], [192 ; = 0xc0 = '\xc0'])
92test_parse([int], [ -192], [-192 ; = -0xc0])
93
94test_parserr([int], [17 : badness],
95 [3], [syntax error: expected end-of-line but found `:'])
96test_parserr([int], [17: badness],
97 [3], [syntax error: expected end-of-line but found `:'])
98
99test_parserr([int], [-_1],
100 [3], [invalid signed integer `-_1'])
101test_parserr([int], [+1234_],
102 [3], [syntax error: expected end-of-line but found `_'])
103test_parse([int], [-1234_5], [-12345 ; = -0x3039])
104test_parserr([int], [+0x_abc],
105 [3], [syntax error: expected end-of-line but found `x'])
106test_parse([int], [-0xa_bc], [-2748 ; = -0x0abc])
107test_parserr([int], [-0xab__c],
108 [3], [syntax error: expected end-of-line but found `_'])
109test_parserr([int], [+010r1234],
110 [3], [syntax error: expected end-of-line but found `r'])
111test_parserr([int], [-1_0r1234],
112 [3], [syntax error: expected end-of-line but found `r'])
113
114test_parserr([int], [xyzzy],
115 [3], [invalid signed integer `xyzzy'])
116test_parserr([int], [-splat],
117 [3], [invalid signed integer `-splat'])
118test_parserr([int], [- 1],
119 [3], [invalid signed integer `-'])
120
121test_parserr([int], [0xq],
122 [3], [syntax error: expected end-of-line but found `x'])
123test_parserr([int], [0x],
124 [3], [syntax error: expected end-of-line but found `x'])
125
126test_parserr([int], [],
127 [3], [syntax error: expected signed integer but found @%:@eol])
128
129test_parserr([int], [123456],
130 [3], [integer 123456 out of range (must be in @<:@-32768 .. 32767@:>@)])
131
132AT_CLEANUP
133
134###--------------------------------------------------------------------------
135AT_SETUP(tvec type-uint)
136
137test_parse([uint], [4], [4 ; = 0x04 = '\x04'])
138test_parse([uint], [ 17; comment], [17 ; = 0x11 = '\x11'])
139
140test_parse([uint], [0], [0 ; = 0x00 = @%:@nul = '\0'])
141
142test_parse([uint], [012345], [12345 ; = 0x3039])
143test_parse([uint], [0x234], [564 ; = 0x0234])
144test_parse([uint], [0o33], [27 ; = 0x1b = @%:@escape = '\e'])
145test_parse([uint], [0b1011_1101], [189 ; = 0xbd = '\xbd'])
146test_parse([uint], [12r123], [171 ; = 0xab = '\xab'])
147
148test_parserr([uint], [17 : badness],
149 [3], [syntax error: expected end-of-line but found `:'])
150test_parserr([uint], [17: badness],
151 [3], [syntax error: expected end-of-line but found `:'])
152
153test_parserr([uint], [_1],
154 [3], [invalid unsigned integer `_1'])
155test_parserr([uint], [1234_],
156 [3], [syntax error: expected end-of-line but found `_'])
157test_parse([uint], [1234_5], [12345 ; = 0x3039])
158test_parserr([uint], [0x_abcd],
159 [3], [syntax error: expected end-of-line but found `x'])
160test_parse([uint], [0xa_bcd], [43981 ; = 0xabcd])
161test_parserr([uint], [0xab__cd],
162 [3], [syntax error: expected end-of-line but found `_'])
163test_parserr([uint], [010r1234],
164 [3], [syntax error: expected end-of-line but found `r'])
165test_parserr([uint], [1_0r1234],
166 [3], [syntax error: expected end-of-line but found `r'])
167
168test_parserr([uint], [ +192],
169 [3], [invalid unsigned integer `+192'])
170test_parserr([uint], [ -192],
171 [3], [invalid unsigned integer `-192'])
172
173test_parserr([uint], [xyzzy],
174 [3], [invalid unsigned integer `xyzzy'])
175
176test_parserr([uint], [0xq],
177 [3], [syntax error: expected end-of-line but found `x'])
178test_parserr([uint], [0x],
179 [3], [syntax error: expected end-of-line but found `x'])
180
181test_parserr([uint], [],
182 [3], [syntax error: expected unsigned integer but found @%:@eol])
183
184test_parserr([uint], [123456],
185 [3], [integer 123456 out of range (must be in @<:@0 .. 65535@:>@)])
186
187AT_CLEANUP
188
189###--------------------------------------------------------------------------
190AT_SETUP([tvec type-float])
191
192test_parse([float], [0.0], [0])
193test_parse([float], [-0.0], [-0])
194
195test_parse([float], [1.234], [1.234])
196
197test_parse([float], [@%:@nan], [@%:@nan])
198test_parse([float], [@%:@+inf], [@%:@+inf])
199test_parse([float], [@%:@inf], [@%:@+inf])
200test_parse([float], [+@%:@inf], [@%:@+inf])
201test_parse([float], [@%:@-inf], [@%:@-inf])
202test_parse([float], [-@%:@inf], [@%:@-inf])
203
204AT_CLEANUP
205
206###--------------------------------------------------------------------------
207AT_SETUP([tvec type-enum])
208
209test_parse([ienum], [less], [less ; = -1 = -0x01 = @%:@eof])
210test_parse([ienum], [+1], [greater ; = 1 = 0x01 = '\x01'])
211test_parse([ienum], [17], [17 ; = 0x11 = '\x11'])
212
213test_parse([uenum], [banana], [banana ; = 1 = 0x01 = '\x01'])
214test_parse([uenum], [clementine], [clementine ; = 2 = 0x02 = '\x02'])
215test_parse([uenum], [17], [17 ; = 0x11 = '\x11'])
216
217test_parse([penum], [carol], [carol ; = @%:@<actor ={ACTOR:@<:@^>@:>@*}>])
218test_parse([penum], [alice], [alice ; = @%:@<actor ={ACTOR:@<:@^>@:>@*}>])
219test_parse([penum], [@%:@nil], [@%:@nil])
220
221AT_CLEANUP
222
223###--------------------------------------------------------------------------
224AT_SETUP([tvec type-char])
225
226test_parse([char], [a], ['a' ; = 97 = 0x61])
227test_parse([char], [a;?], ['a' ; = 97 = 0x61])
228test_parse([char], [a ;?], ['a' ; = 97 = 0x61])
229test_parse([char], [\\], ['\\' ; = 92 = 0x5c])
230test_parse([char], ['], ['\'' ; = 39 = 0x27])
231test_parse([char], [\'], ['\'' ; = 39 = 0x27])
232test_parse([char], ["], ['"' ; = 34 = 0x22])
233test_parse([char], [';'], [';' ; = 59 = 0x3b])
234test_parse([char], [';';?], [';' ; = 59 = 0x3b])
235test_parse([char], [';' ;?], [';' ; = 59 = 0x3b])
236test_parse([char], [\"], ['"' ; = 34 = 0x22]) # "
237test_parse([char], [@%:@], ['@%:@' ; = 35 = 0x23])
238test_parse([char], ['@%:@'], ['@%:@' ; = 35 = 0x23])
239
240test_parse([char], [\n], [@%:@newline ; = '\n' = 10 = 0x0a])
241test_parse([char], [\x0a], [@%:@newline ; = '\n' = 10 = 0x0a])
242
243test_parse([char], [@%:@newline], [@%:@newline ; = '\n' = 10 = 0x0a])
244test_parse([char], [@%:@lf], [@%:@newline ; = '\n' = 10 = 0x0a])
245test_parse([char], [@%:@del;?], [@%:@delete ; = '\x7f' = 127 = 0x7f])
246test_parse([char], [@%:@space ;?], [' ' ; = 32 = 0x20])
247
248test_parse([char], [' '], [' ' ; = 32 = 0x20])
249test_parse([char], ['a'], ['a' ; = 97 = 0x61])
250test_parse([char], ['\n'], [@%:@newline ; = '\n' = 10 = 0x0a])
251test_parse([char], ['\12' ;?], [@%:@newline ; = '\n' = 10 = 0x0a])
252test_parse([char], ['\{12}' ;?], [@%:@newline ; = '\n' = 10 = 0x0a])
253test_parse([char], ['\x0a'], [@%:@newline ; = '\n' = 10 = 0x0a])
254test_parse([char], ['\x{0a}'], [@%:@newline ; = '\n' = 10 = 0x0a])
255
256test_parse([char], [@%:@eof], [@%:@eof ; = -1 = -0x01])
257test_parse([char], [@%:@eof], [@%:@eof ; = -1 = -0x01])
258
259test_parserr([char], [ ],
260 [3], [syntax error: expected character but found @%:@eol])
261test_parserr([char], [''],
262 [3], [syntax error: expected character but found `''])
263test_parserr([char], ['''],
264 [3], [syntax error: expected character but found `''])
265test_parserr([char], [;],
266 [3], [syntax error: expected character but found `;'])
267test_parserr([char], [';],
268 [3], [syntax error: expected `'' but found @%:@eol])
269test_parserr([char], [\],
270 [3], [syntax error: expected string escape but found @%:@eol])
271test_parserr([char], [\q],
272 [3], [syntax error: expected string escape but found `q'])
273test_parserr([char], ['\],
274 [3], [syntax error: expected string escape but found @%:@eol])
275test_parserr([char], [ab],
276 [3], [syntax error: expected end-of-line but found `b'])
277test_parserr([char], [\x{0a],
278 [3], [syntax error: expected `}' but found @%:@eol])
279test_parserr([char], [\{012],
280 [3], [syntax error: expected `}' but found @%:@eol])
281
282AT_CLEANUP
283
284###--------------------------------------------------------------------------
285AT_SETUP([tvec type-text])
286
287test_parse([text], [foo], [foo])
288test_parse([text], [foo bar], ["foo bar"])
289test_parse([text], [foo bar], ["foo bar"])
290test_parse([text], [foo "" bar], [foobar])
291test_parse([text], [ foo bar ], ["foo bar"])
292test_parse([text], [ foo @&t@
293 bar ], ["foo bar"])
294
295test_parse([text], [foo @%:@nul bar], ["foo\{0}bar"])
296
297test_parse([text], ["f" !repeat 2 { o } "bar"], [foobar])
298test_parse([text], ["{"!repeat 5{"abc"}"}"], ["{abcabcabcabcabc}"])
299
300test_parse([text], [!hex "f" 6f "o"], [foo])
301
302test_parse([text], ["foo\n"], ["foo\n"])
303
304test_parse([text], [foo\
305bar], [
306 "foo\n"
307 "bar"])
308test_parse([text], ["foo\
309bar"], [foobar])
310test_parse([text], ["foo" @%:@newline "bar" @%:@newline], [
311 "foo\n"
312 "bar\n"])
313
314test_parserr([text], [],
315 [4], [syntax error: expected string but found @%:@eof])
316test_parse([text], [""], [""])
317test_parse([text], [''], [""])
318
319test_parse([text], ["f\x{6f}o"], [foo])
320
321AT_CLEANUP
322
323###--------------------------------------------------------------------------
324AT_SETUP([tvec type-bytes])
325
326test_parse([bytes], [""], ["" ; empty])
327test_parse([bytes], [61], [61 ; a])
328test_parse([bytes], ["abc"], [616263 ; abc])
329test_parse([bytes], ["abcd"], [61626364 ; abcd])
330test_parse([bytes], ["abcde"], [61626364 65 ; abcde])
331
332test_parse([bytes], [!base64 YWJjZGVmZ2hpamtsbW5vcA==],
333 [61626364 65666768 696a6b6c 6d6e6f70 ; abcdefghijklmnop])
334test_parse([bytes],
335 [!base64 QUJDREVGR0hJSktMTU5PUGFiY2RlZmdo
336 a Wp rbG 1ub3A=],
337 [
338 41424344 45464748 494a4b4c 4d4e4f50 ; @<:@00@:>@ ABCDEFGHIJKLMNOP
339 61626364 65666768 696a6b6c 6d6e6f70 ; @<:@10@:>@ abcdefghijklmnop])
340
341test_parse([bytes], [6 1], [61 ; a])
342test_parserr([bytes], [6 "" 1],
343 [3], [invalid hex sequence end: Excess or nonzero padding bits])
344
345test_parse([bytes], [!base64 AA==], [00 ; .])
346test_parse([bytes], [!base64 AAA=], [0000 ; ..])
347test_parse([bytes], [!base64 AAAA], [000000 ; ...])
348test_parse([bytes], [!base64 AA], [00 ; .])
349test_parse([bytes], [!base64 AAA], [0000 ; ..])
350
351test_parserr([text], [],
352 [4], [syntax error: expected string but found @%:@eof])
353test_parserr([bytes], [0],
354 [4], [invalid hex sequence end: Excess or nonzero padding bits])
355test_parserr([bytes], [!base64 A],
356 [4], [invalid base64 sequence end: Excess or nonzero padding bits])
357test_parserr([bytes], [!base64 A=],
358 [3], [invalid base64 fragment `A=': Excess or nonzero padding bits])
359
360AT_CLEANUP
361
362###--------------------------------------------------------------------------
363AT_SETUP([tvec type-buffer])
364
365test_parse([buffer], [16], [16 B])
366test_parse([buffer], [16;?], [16 B])
367test_parse([buffer], [16 ;?], [16 B])
368test_parse([buffer], [16384], [16 kB])
369test_parse([buffer], [16777216], [16 MB])
370test_parse([buffer], [16k], [16 kB])
371test_parse([buffer], [16k;?], [16 kB])
372test_parse([buffer], [16k ;?], [16 kB])
373test_parse([buffer], [16 k], [16 kB])
374test_parse([buffer], [16 k;?], [16 kB])
375test_parse([buffer], [16 k ;?], [16 kB])
376test_parse([buffer], [16kB], [16 kB])
377test_parse([buffer], [16kB;?], [16 kB])
378test_parse([buffer], [16kB ;?], [16 kB])
379test_parse([buffer], [16 kB], [16 kB])
380test_parse([buffer], [16 kB;?], [16 kB])
381test_parse([buffer], [16 kB ;?], [16 kB])
382
383test_parserr([buffer], [16!], [3], [invalid buffer length `16!'])
384test_parserr([buffer], [16 !], [3], [invalid buffer length `16 !'])
385test_parserr([buffer], [16 k!], [3], [invalid buffer length `16 k!'])
386test_parserr([buffer], [16 kB!], [3], [invalid buffer length `16 kB!'])
387test_parserr([buffer], [16 kB !],
388 [3], [syntax error: expected end-of-line but found `!'])
389test_parserr([buffer], [16 EB], [3], [buffer length `16 EB' out of range])
390
391AT_CLEANUP
392
393###--------------------------------------------------------------------------
394AT_SETUP([tvec remote])
395
396AT_DATA([tv],
397[;;; -*-conf-*-
398
399@<:@crash@:>@
400
401crash = t
402x = 1
403z = 0
404@progress = %RUN
405@exit = killed | SIGABRT
406
407crash = nil
408x = 0
409z = 0
410@reconnect = skip
411
412crash = nil
413x = 1
414z = 1
415
416crash = nil
417x = 1
418z = 1
419@progress = %DONE
420@exit = running
421])
422check_template([BUILDDIR/t/tvec.t -fh tv], [0],
423[tv:11: `crash' skipped: no connection
424crash: ok (1 skipped)
425PASSED ={N:\d+} tests (1 skipped) in 1 group
426])
427
428AT_CLEANUP
429
430###--------------------------------------------------------------------------
431AT_SETUP([tvec timeout])
432
433AT_DATA([tv],
434[;;; -*-conf-*-
435
436@<:@sleep@:>@
437
438time = 0.5
439z = 0
440@progress = %RUN
441@exit = killed | SIGALRM
442
443time = 0.125
444z = 1
445])
446check_template([BUILDDIR/t/tvec.t -fh tv], [0],
447[sleep: ok
448PASSED all ={N:\d+} tests in 1 group
449])
450
451AT_CLEANUP
452
453###--------------------------------------------------------------------------
454AT_SETUP([tvec serialize])
455
456AT_DATA([tv],
457[@<:@multi@:>@
458
459int = -2
460uint = 7
461float = @%:@nan
462fltish = 0.1
463char = x
464ienum = greater
465uenum = banana
466fenum = tau
467penum = alice
468flags = red-fg | white-bg | bright
469text = "Hello, world!"
470bytes =
471 2923be84 e16cd6ae 529049f1 f1bbe9eb
472 b3a6db3c 870c3e99 245e0d1c 06b747de
473 b3124dc8 43bb8ba6 1f035a7d 0938251f
474 5dd4cbfc 96f5453b 130d890a 1cdbae32
475 209a50ee 407836fd 124932f6 9e7d49dc
476 ad4f14f2 444066d0 6bc430b7 323ba122
477 f622919d e18b1fda b0ca9902 b9729d49
478 2c807ec5 99d5e980 b2eac9cc 53bf67d6
479@show = t
480])
481AT_CHECK([BUILDDIR/t/tvec.t -fh tv], [0], [ignore])
482
483AT_CLEANUP
484
485###----- That's all, folks --------------------------------------------------