+dnl Copyright © 2021-2022 Nick Bowler
+dnl
+dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+dnl This is free software: you are free to do what the fuck you want to.
+dnl There is NO WARRANTY, to the extent permitted by law.
+
AT_BANNER([Script tests])
AT_SETUP([gen-options.awk])
}' messages.po | LC_ALL=C sort], [0], [expout])
AT_CLEANUP
+
+AT_SETUP([gen-strtab.awk])
+
+AT_DATA([test.def],
+[[
+&a world
+&b
+hello world
+&c
+hello
+world
+&d world\n
+&e
+\\not a newline
+&f
+\not a newline
+&g inline
+continued
+&h no\
+newline\
+&i
+\ leading whitespace
+&j oneline
+# with a comment
+]])
+
+AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test.def >test.h])
+
+sed -n 's/^[[&]]\([[^ ]]*\).*/\1/p' test.def >identifiers
+
+# test 0: sanity test
+AT_DATA([test0.c],
+[[#include "test.h"
+#include <stdio.h>
+
+int main(void)
+{
+ printf("---\n");
+]])
+exec 3<identifiers 4>>test0.c
+while read ident <&3; do
+ AS_ECHO([' printf("%s\n---\n", '"strtab+$ident);"]) >&4
+done
+AS_ECHO([' return 0;']) >&4
+AS_ECHO(['}']) >&4
+exec 3<&- 4>&-
+
+AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [---
+world
+---
+hello world
+
+---
+hello
+world
+
+---
+world
+
+---
+\not a newline
+
+---
+
+ot a newline
+
+---
+inline
+continued
+
+---
+nonewline
+---
+ leading whitespace
+
+---
+oneline
+---
+], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([gen-tree.awk])
+AT_DATA([tree.def],
+[[ROOT0
+ r0a, r0a_OFFSET
+ r0b, r0b_OFFSET
+ r0c
+ r0d
+ r0e, r0e_OFFSET
+ r0f
+ r0g
+ROOT1
+ r1a, r1a_OFFSET
+ r1b, r1b_OFFSET
+ r1b
+ r1e
+ r1b
+ r1c, r1c_OFFSET
+ r1d, r1d_OFFSET
+ r1e
+ r1b
+ r1e
+]])
+
+AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <tree.def >tree.h])
+
+AT_DATA([test0.c],
+[[#include "tree.h"
+#include <stdio.h>
+
+struct tree { unsigned id, subtree; };
+
+static const struct tree tree0[] = {
+ ROOT0_INITIALIZER
+};
+static const struct tree tree1[] = {
+ ROOT1_INITIALIZER
+};
+
+void print_subtree(const struct tree *root, unsigned offset, int depth)
+{
+ const struct tree *node;
+
+ for (node = &root[offset]; node->id; node++) {
+ printf("%*s%s", 2*depth, "", &tree_strtab[node->id]);
+ if (node->subtree) {
+ printf(", %s_OFFSET\n", &tree_strtab[node->id]);
+ print_subtree(root, node->subtree, depth+1);
+ } else {
+ putchar('\n');
+ }
+ }
+}
+
+int main(void)
+{
+ printf("ROOT0\n");
+ print_subtree(tree0, 0, 1);
+ printf("ROOT1\n");
+ print_subtree(tree1, 0, 1);
+}
+]])
+cp tree.def expout
+AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [expout])
+
+AT_CLEANUP
+
+AT_SETUP([join.awk])
+
+JOIN="$AWK -f $builddir/scripts/join.awk --"
+
+AT_DATA([a],
+[[1 a
+3 a1 x
+3 a2 x
+5 a
+6 a
+8 a1 x
+8 a2 x
+9 a1
+9 a2
+9 a3
+]])
+
+AT_DATA([b],
+[[2 b
+2 b
+3 b y
+4 b
+6 b1 y
+6 b2 y
+7 b
+8 b1 y
+8 b2 y
+]])
+
+AT_CHECK([$JOIN a b], [0],
+[[3 a1 x b y
+3 a2 x b y
+6 a b1 y
+6 a b2 y
+8 a1 x b1 y
+8 a1 x b2 y
+8 a2 x b1 y
+8 a2 x b2 y
+]])
+
+AT_CHECK([$JOIN -v1 a b], [0],
+[[1 a
+5 a
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -v2 a b], [0],
+[[2 b
+2 b
+4 b
+7 b
+]])
+
+AT_CHECK([$JOIN -v1 -v2 a b], [0],
+[[1 a
+2 b
+2 b
+4 b
+5 a
+7 b
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -a1 a b], [0],
+[[1 a
+3 a1 x b y
+3 a2 x b y
+5 a
+6 a b1 y
+6 a b2 y
+8 a1 x b1 y
+8 a1 x b2 y
+8 a2 x b1 y
+8 a2 x b2 y
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -a2 a b], [0],
+[[2 b
+2 b
+3 a1 x b y
+3 a2 x b y
+4 b
+6 a b1 y
+6 a b2 y
+7 b
+8 a1 x b1 y
+8 a1 x b2 y
+8 a2 x b1 y
+8 a2 x b2 y
+]])
+
+AT_CHECK([$JOIN -a1 -a2 a b], [0],
+[[1 a
+2 b
+2 b
+3 a1 x b y
+3 a2 x b y
+4 b
+5 a
+6 a b1 y
+6 a b2 y
+7 b
+8 a1 x b1 y
+8 a1 x b2 y
+8 a2 x b1 y
+8 a2 x b2 y
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN b a], [0],
+[[3 b y a1 x
+3 b y a2 x
+6 b1 y a
+6 b2 y a
+8 b1 y a1 x
+8 b1 y a2 x
+8 b2 y a1 x
+8 b2 y a2 x
+]])
+
+AT_CHECK([$JOIN -v1 b a], [0],
+[[2 b
+2 b
+4 b
+7 b
+]])
+
+AT_CHECK([$JOIN -v2 b a], [0],
+[[1 a
+5 a
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -v1 -v2 b a], [0],
+[[1 a
+2 b
+2 b
+4 b
+5 a
+7 b
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -a1 b a], [0],
+[[2 b
+2 b
+3 b y a1 x
+3 b y a2 x
+4 b
+6 b1 y a
+6 b2 y a
+7 b
+8 b1 y a1 x
+8 b1 y a2 x
+8 b2 y a1 x
+8 b2 y a2 x
+]])
+
+AT_CHECK([$JOIN -a2 b a], [0],
+[[1 a
+3 b y a1 x
+3 b y a2 x
+5 a
+6 b1 y a
+6 b2 y a
+8 b1 y a1 x
+8 b1 y a2 x
+8 b2 y a1 x
+8 b2 y a2 x
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([$JOIN -a1 -a2 b a], [0],
+[[1 a
+2 b
+2 b
+3 b y a1 x
+3 b y a2 x
+4 b
+5 a
+6 b1 y a
+6 b2 y a
+7 b
+8 b1 y a1 x
+8 b1 y a2 x
+8 b2 y a1 x
+8 b2 y a2 x
+9 a1
+9 a2
+9 a3
+]])
+
+AT_CHECK([echo wat | $JOIN -v1 - /dev/null], [0],
+[[wat
+]])
+
+AT_CLEANUP