@@@ man wip
[mLib] / test / tests.at
CommitLineData
b64eb60f
MW
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###--------------------------------------------------------------------------
e63124bc 28### Preliminaries.
b64eb60f 29
e63124bc
MW
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], [ ])])])])
b64eb60f 34
e63124bc
MW
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])])
b64eb60f
MW
48
49dnl test_parse(TY, IN, OUT)
50m4_define([test_parse], [
51AT_DATA([tv],
52[;;; -*-conf-*-
db2bf411 53@<:@copy-$1@:>@
b64eb60f 54$1 = $2
e63124bc 55@show = t
b64eb60f 56])
e63124bc 57check_template([BUILDDIR/t/tvec.t -fh tv], [0],
c91413e6 58[left_pad([matched $1], [21]) = $3
db2bf411 59copy-$1: ok
e63124bc 60PASSED all 1 test in 1 group
b64eb60f
MW
61])])
62
63dnl test_parserr(TY, IN, LNO, ERR)
64m4_define([test_parserr], [
65AT_DATA([tv],
66[;;; -*-conf-*-
db2bf411 67@<:@copy-$1@:>@
b64eb60f 68$1 = $2
b64eb60f 69])
e63124bc 70check_template([BUILDDIR/t/tvec.t -fh tv], [2],
31d0247c
MW
71[tv:$3: ERROR: $4
72tv:={N:\d+}: ERROR: required register `$1' not set in test `copy-$1'
814e42ff
MW
73tv:={N:\d+}: `copy-$1' skipped: erroneous test data
74copy-$1 skipped
75PASSED 0 tests (1 skipped) in 0 groups (1 skipped)
e63124bc
MW
76ERRORS found in input; tests may not have run correctly
77],
31d0247c
MW
78[tvec.t: tv:$3: ERROR: $4
79tvec.t: tv:={N:\d+}: ERROR: required register `$1' not set in test `copy-$1'
b64eb60f
MW
80])])
81
e63124bc 82###--------------------------------------------------------------------------
b64eb60f 83AT_SETUP(tvec type-int)
e63124bc
MW
84
85test_parse([int], [4], [4 ; = 0x04 = '\x04'])
86test_parse([int], [ 17; comment], [17 ; = 0x11 = '\x11'])
87
88test_parse([int], [0x234], [564 ; = 0x0234])
67b5031e 89test_parse([int], [0o33], [27 ; = 0x1b = @%:@escape = '\e'])
e63124bc
MW
90
91test_parse([int], [ +192], [192 ; = 0xc0 = '\xc0'])
92test_parse([int], [ -192], [-192 ; = -0xc0])
93
3efcfd2d
MW
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], [],
67b5031e 127 [3], [syntax error: expected signed integer but found @%:@eol])
3efcfd2d
MW
128
129test_parserr([int], [123456],
130 [3], [integer 123456 out of range (must be in @<:@-32768 .. 32767@:>@)])
e63124bc 131
b64eb60f
MW
132AT_CLEANUP
133
e63124bc 134###--------------------------------------------------------------------------
b64eb60f 135AT_SETUP(tvec type-uint)
e63124bc
MW
136
137test_parse([uint], [4], [4 ; = 0x04 = '\x04'])
138test_parse([uint], [ 17; comment], [17 ; = 0x11 = '\x11'])
139
67b5031e
MW
140test_parse([uint], [0], [0 ; = 0x00 = @%:@nul = '\0'])
141
3efcfd2d 142test_parse([uint], [012345], [12345 ; = 0x3039])
e63124bc 143test_parse([uint], [0x234], [564 ; = 0x0234])
67b5031e 144test_parse([uint], [0o33], [27 ; = 0x1b = @%:@escape = '\e'])
3efcfd2d
MW
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], [],
67b5031e 182 [3], [syntax error: expected unsigned integer but found @%:@eol])
3efcfd2d
MW
183
184test_parserr([uint], [123456],
185 [3], [integer 123456 out of range (must be in @<:@0 .. 65535@:>@)])
e63124bc 186
b64eb60f
MW
187AT_CLEANUP
188
e63124bc
MW
189###--------------------------------------------------------------------------
190AT_SETUP([tvec type-float])
191
3efcfd2d
MW
192test_parse([float], [0.0], [0])
193test_parse([float], [-0.0], [-0])
194
e63124bc
MW
195test_parse([float], [1.234], [1.234])
196
67b5031e
MW
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
e63124bc
MW
204AT_CLEANUP
205
206###--------------------------------------------------------------------------
b64eb60f 207AT_SETUP([tvec type-enum])
e63124bc
MW
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:@<:@^>@:>@*}>])
b64eb60f 219test_parse([penum], [@%:@nil], [@%:@nil])
e63124bc
MW
220
221AT_CLEANUP
222
223###--------------------------------------------------------------------------
67b5031e
MW
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]) # "
c81c35df 237test_parse([char], [@%:@], ['@%:@' ; = 35 = 0x23])
67b5031e
MW
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 `;'])
67b5031e
MW
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###--------------------------------------------------------------------------
c81c35df
MW
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@
67b5031e
MW
293 bar ], ["foo bar"])
294
c81c35df 295test_parse([text], [foo @%:@nul bar], ["foo\{0}bar"])
67b5031e 296
c81c35df
MW
297test_parse([text], ["f" !repeat 2 { o } "bar"], [foobar])
298test_parse([text], ["{"!repeat 5{"abc"}"}"], ["{abcabcabcabcabc}"])
67b5031e 299
c81c35df 300test_parse([text], [!hex "f" 6f "o"], [foo])
67b5031e 301
c81c35df 302test_parse([text], ["foo\n"], ["foo\n"])
67b5031e 303
c81c35df 304test_parse([text], [foo\
67b5031e
MW
305bar], [
306 "foo\n"
307 "bar"])
c81c35df 308test_parse([text], ["foo\
67b5031e 309bar"], [foobar])
c81c35df 310test_parse([text], ["foo" @%:@newline "bar" @%:@newline], [
67b5031e
MW
311 "foo\n"
312 "bar\n"])
313
c81c35df 314test_parserr([text], [],
67b5031e 315 [4], [syntax error: expected string but found @%:@eof])
c81c35df
MW
316test_parse([text], [""], [""])
317test_parse([text], [''], [""])
67b5031e 318
c81c35df 319test_parse([text], ["f\x{6f}o"], [foo])
67b5031e
MW
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
c81c35df
MW
351test_parserr([text], [],
352 [4], [syntax error: expected string but found @%:@eof])
67b5031e
MW
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
adec5584
MW
365test_parse([buffer], [16], [16 B ; = 16 = 0x10])
366test_parse([buffer], [16;?], [16 B ; = 16 = 0x10])
367test_parse([buffer], [16 ;?], [16 B ; = 16 = 0x10])
368test_parse([buffer], [16384], [16 kB ; = 16384 = 0x4000])
369test_parse([buffer], [16777216], [16 MB ; = 16777216 = 0x01000000])
370test_parse([buffer], [16k], [16 kB ; = 16384 = 0x4000])
371test_parse([buffer], [16k;?], [16 kB ; = 16384 = 0x4000])
372test_parse([buffer], [16k ;?], [16 kB ; = 16384 = 0x4000])
373test_parse([buffer], [16 k], [16 kB ; = 16384 = 0x4000])
374test_parse([buffer], [16 k;?], [16 kB ; = 16384 = 0x4000])
375test_parse([buffer], [16 k ;?], [16 kB ; = 16384 = 0x4000])
376test_parse([buffer], [16kB], [16 kB ; = 16384 = 0x4000])
377test_parse([buffer], [16kB;?], [16 kB ; = 16384 = 0x4000])
378test_parse([buffer], [16kB ;?], [16 kB ; = 16384 = 0x4000])
379test_parse([buffer], [16 kB], [16 kB ; = 16384 = 0x4000])
380test_parse([buffer], [16 kB;?], [16 kB ; = 16384 = 0x4000])
381test_parse([buffer], [16 kB ;?], [16 kB ; = 16384 = 0x4000])
382
383test_parse([buffer], [16777216@4096+17],
384 [16 MB @ 4 kB + 17 B ; = 16777216 @ 4096 + 17 = 0x01000000 @ 0x1000 + 0x11])
67b5031e
MW
385
386test_parserr([buffer], [16!], [3], [invalid buffer length `16!'])
387test_parserr([buffer], [16 !], [3], [invalid buffer length `16 !'])
388test_parserr([buffer], [16 k!], [3], [invalid buffer length `16 k!'])
389test_parserr([buffer], [16 kB!], [3], [invalid buffer length `16 kB!'])
390test_parserr([buffer], [16 kB !],
adec5584 391 [3], [syntax error: expected `@' but found `!'])
67b5031e
MW
392test_parserr([buffer], [16 EB], [3], [buffer length `16 EB' out of range])
393
394AT_CLEANUP
395
396###--------------------------------------------------------------------------
c91413e6
MW
397AT_SETUP([tvec remote])
398
399AT_DATA([tv],
400[;;; -*-conf-*-
401
402@<:@crash@:>@
403
404crash = t
405x = 1
406z = 0
407@progress = %RUN
408@exit = killed | SIGABRT
409
410crash = nil
411x = 0
412z = 0
413@reconnect = skip
414
415crash = nil
416x = 1
417z = 1
418
419crash = nil
420x = 1
421z = 1
422@progress = %DONE
423@exit = running
424])
425check_template([BUILDDIR/t/tvec.t -fh tv], [0],
426[tv:11: `crash' skipped: no connection
427crash: ok (1 skipped)
c81c35df
MW
428PASSED ={N:\d+} tests (1 skipped) in 1 group
429])
430
431AT_CLEANUP
432
433###--------------------------------------------------------------------------
434AT_SETUP([tvec timeout])
435
436AT_DATA([tv],
437[;;; -*-conf-*-
438
439@<:@sleep@:>@
440
441time = 0.5
442z = 0
443@progress = %RUN
444@exit = killed | SIGALRM
445
446time = 0.125
447z = 1
448])
449check_template([BUILDDIR/t/tvec.t -fh tv], [0],
450[sleep: ok
451PASSED all ={N:\d+} tests in 1 group
c91413e6
MW
452])
453
454AT_CLEANUP
455
456###--------------------------------------------------------------------------
e63124bc
MW
457AT_SETUP([tvec serialize])
458
459AT_DATA([tv],
db2bf411 460[@<:@multi@:>@
e63124bc
MW
461
462int = -2
463uint = 7
3efcfd2d 464float = @%:@nan
e63124bc
MW
465fltish = 0.1
466char = x
467ienum = greater
468uenum = banana
469fenum = tau
470penum = alice
471flags = red-fg | white-bg | bright
c81c35df 472text = "Hello, world!"
e63124bc
MW
473bytes =
474 2923be84 e16cd6ae 529049f1 f1bbe9eb
475 b3a6db3c 870c3e99 245e0d1c 06b747de
476 b3124dc8 43bb8ba6 1f035a7d 0938251f
477 5dd4cbfc 96f5453b 130d890a 1cdbae32
478 209a50ee 407836fd 124932f6 9e7d49dc
479 ad4f14f2 444066d0 6bc430b7 323ba122
480 f622919d e18b1fda b0ca9902 b9729d49
481 2c807ec5 99d5e980 b2eac9cc 53bf67d6
3efcfd2d 482@show = t
e63124bc
MW
483])
484AT_CHECK([BUILDDIR/t/tvec.t -fh tv], [0], [ignore])
485
b64eb60f
MW
486AT_CLEANUP
487
488###----- That's all, folks --------------------------------------------------