1 dnl Copyright © 2021-2022 Nick Bowler
3 dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
4 dnl This is free software: you are free to do what the fuck you want to.
5 dnl There is NO WARRANTY, to the extent permitted by law.
7 AT_BANNER([Script tests])
9 AT_SETUP([gen-options.awk])
10 AT_KEYWORDS([gen-options awk script scripts])
12 AT_DATA([options.def],
15 --option-with-flagval (&x, 5)
18 --option-with-optional-arg[=OPTIONAL]
21 -a, --option-with-sopt
23 -b, --option-with-sopt-and-arg=SOPTARG
24 -c, --option-with-sopt-and-optional-arg[=SOPTOPTIONAL]
25 --option-with-arg-and-val=ARGVAL (42)
26 --option-with-arg-and-flagval=ARGFLAGVAL (&a[1], 'x')
27 --option-with-optional-arg-and-val[=OPTIONALARGVAL] (54)
28 --option-with-optional-arg-and-flagval[=OPTIONALFLAGVAL] (0, 0)
31 that has a line randomly indented
40 AT_CHECK([$AWK -f "$builddir/scripts/gen-options.awk" <options.def >options.h])
43 [[struct option { const char *name; int has_arg; int *flag; int val; };
49 [[#include "context.h"
52 static const char sopts[] = SOPT_STRING;
53 static const struct option opts[] = { LOPTS_INITIALIZER, {0} };
60 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [], [ignore])
62 # test 1: long option names and help text
70 static const struct option opts[] = { LOPTS_INITIALIZER };
76 for (i = 0; i < sizeof opts / sizeof opts[0]; i++) {
77 struct lopt_help help = { "INVALID", "INVALID" };
79 if (!lopt_get_help(&opts[i], &help))
82 printf("--%s", opts[i].name);
84 printf("=%s", help.arg);
85 printf("\n%s", help.desc);
94 # pick out interesting bits from the definitions file
95 sed -n '/^-/s/^.*--\([[^\= @<:@]]*\).*$/\1/p' options.def >options
97 s/[[^=]]*\(=[[^@:>@ ]]*\).*$/\1/
101 }' options.def >argnames
103 AS_ECHO(["-"]) | sed -n '1s/^-.*//p
121 s/[[^\n]][[^\n]]*/\\"&\\"/g
126 ' options.def - >helptext
128 exec 3<options 4<argnames 5<helptext 6>expout
129 while read opt <&3 && read arg <&4 && read help <&5; do
130 if test ${arg:+y}; then
131 AS_ECHO(["--$opt=$arg"]) >&6
133 AS_ECHO(["--$opt"]) >&6
135 eval "set x $help"; shift
138 AS_ECHO(["$arg"]) >&6
141 exec 3<&- 4<&- 5<&- 6>&-
143 AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT],
144 [0], [expout], [ignore])
146 # test 2: short option string
156 struct option lopts[] = {LOPTS_INITIALIZER};
159 for (i = 0; i < sizeof SOPT_STRING - 1; i++) {
160 if (SOPT_STRING[i] != ':') {
161 for (j = 0; j < sizeof lopts / sizeof lopts[0]; j++) {
162 if (lopts[j].val == SOPT_STRING[i]) {
163 printf("--%s ", lopts[j].name);
168 putchar(SOPT_STRING[i]);
169 if (SOPT_STRING[i+1] != ':')
178 s/^-\([[^-]]\)[[^:]]*/\1/p
180 }' options.def >sopts
182 exec 3<options 4<sopts 5>expout
183 while read lopt <&3 && read sopt <&4; do
184 if test ${sopt:+y}; then
185 AS_ECHO(["--$lopt $sopt"]) >&5
190 AT_CHECK([$CC -o test2$EXEEXT test2.c && ./test2$EXEEXT],
191 [0], [expout], [ignore])
193 # Check that all help strings are translatable
194 sed 's/\([[^\\]]\\\)" /\1\\n\\" /g' helptext >help-po
195 exec 3<options 4<argnames 5<help-po 6>expected.po
196 while read opt <&3 && read arg <&4 && read help <&5; do
197 if test ${arg:+y}; then
198 AS_ECHO(["msgctxt \"$opt\" msgid \"$arg\""]) >&6
200 AS_ECHO(["msgctxt \"$opt\" msgid${help:+ }$help"]) >&6
202 exec 3<&- 4<&- 5<&- 6>&-
204 AT_CHECK([xgettext --keyword=PN_:1c,2 options.h
205 test -f messages.po || exit 77])
207 LC_ALL=C sort expected.po >expout
208 AT_CHECK([sed -n '/^msgctxt/{
219 }' messages.po | LC_ALL=C sort], [0], [expout])
223 AT_SETUP([gen-strtab.awk])
224 AT_KEYWORDS([gen-strtab awk script scripts])
249 AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test.def >test.h])
251 sed -n 's/^[[&]]\([[^ ]]*\).*/\1/p' test.def >identifiers
253 # test 0: sanity test
262 exec 3<identifiers 4>>test0.c
263 while read ident <&3; do
264 AS_ECHO([' printf("%s\n---\n", '"strtab+$ident);"]) >&4
266 AS_ECHO([' return 0;']) >&4
270 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [---
305 AT_SETUP([gen-tree.awk])
306 AT_KEYWORDS([gen-tree awk script scripts])
330 AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <tree.def >tree.h])
336 struct tree { unsigned id, subtree; };
338 static const struct tree tree0[] = {
341 static const struct tree tree1[] = {
345 void print_subtree(const struct tree *root, unsigned offset, int depth)
347 const struct tree *node;
349 for (node = &root[offset]; node->id; node++) {
350 printf("%*s%s", 2*depth, "", &tree_strtab[node->id]);
352 printf(", %s_OFFSET\n", &tree_strtab[node->id]);
353 print_subtree(root, node->subtree, depth+1);
363 print_subtree(tree0, 0, 1);
365 print_subtree(tree1, 0, 1);
370 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [expout])
374 # Test the gen-tree features that avoid creating string labels for nodes.
375 AT_SETUP([gen-tree.awk @nostrtab option])
376 AT_KEYWORDS([gen-tree awk script scripts])
388 AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <tree.def >tree.h])
391 [[float tree_strtab = 0;
400 static struct { int num, offset; } root[] = { ROOT_INITIALIZER };
405 for (i = 0; i < sizeof root / sizeof root[0]; i++) {
406 printf("%d, %d\n", root[i].num, root[i].offset);
411 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0],
430 AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <flat.def >flat.h])
432 sed -e 's/tree\.h/flat.h/' -e 's/ROOT/FLAT/' test0.c >test1.c
433 AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT], [0],
443 AT_KEYWORDS([join awk script scripts])
445 JOIN="$AWK -f $builddir/scripts/join.awk --"
472 AT_CHECK([$JOIN a b], [0],
483 AT_CHECK([$JOIN -v1 a b], [0],
491 AT_CHECK([$JOIN -v2 a b], [0],
498 AT_CHECK([$JOIN -v1 -v2 a b], [0],
510 AT_CHECK([$JOIN -a1 a b], [0],
526 AT_CHECK([$JOIN -a2 a b], [0],
541 AT_CHECK([$JOIN -a1 -a2 a b], [0],
561 AT_CHECK([$JOIN b a], [0],
572 AT_CHECK([$JOIN -v1 b a], [0],
579 AT_CHECK([$JOIN -v2 b a], [0],
587 AT_CHECK([$JOIN -v1 -v2 b a], [0],
599 AT_CHECK([$JOIN -a1 b a], [0],
614 AT_CHECK([$JOIN -a2 b a], [0],
630 AT_CHECK([$JOIN -a1 -a2 b a], [0],
650 AT_CHECK([echo wat | $JOIN -v1 - /dev/null], [0],
656 m4_divert_push([PREPARE_TESTS])dnl
658 $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
659 $PERL -f "$srcdir/scripts/fix-ltdl.pl" "$@"
662 $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
663 $PERL -f "$srcdir/scripts/fix-gnulib.pl" "$@"
669 sed -n -f - "$srcdir/tests/data/gnulib.mk" <<EOF
670 /^## begin gnulib module $arg/,/^## end gnulib module $arg/p
674 m4_divert_pop([PREPARE_TESTS])
676 AT_SETUP([fix-gnulib.pl SED_HEADER variables])
678 test_gnulib_mk gen-header >test.mk.in
679 AT_CHECK([grep SED_HEADER test.mk.in >expout || exit 99])
680 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
681 grep SED_HEADER test.mk], [0], [expout])
685 AT_SETUP([fix-gnulib.pl %reldir% substitution])
687 test_gnulib_mk sys_types >test.mk.in
688 AT_CHECK([grep '%reldir%' test.mk.in >/dev/null || exit 99])
690 sed -n -f - test.mk.in >expout <<'EOF'
692 /^## begin gnulib/,/^## end gnulib/!b
694 s|(srcdir)|(top_srcdir)|
696 s|BUILT_SOURCES|gnulib_core_headers|
698 /^MOSTLYCLEANFILES/{h;b}
702 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
703 sed -n -e '/^## begin gnulib/,/^## end gnulib/p' \
704 -e '/CLEANFILES/p' test.mk],
709 AT_SETUP([fix-gnulib.pl warning removal])
711 AT_DATA([test.mk.in], [[
713 noinst_LTLIBRARIES += libgnu.la
714 libgnu_la_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
715 noinst_LIBRARIES += libgnu.a
716 libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
719 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
720 sed -n '/^## test begin/,/^## test end/p' test.mk], [0], [## test begin
721 EXTRA_LTLIBRARIES += libgnu.la
722 EXTRA_LIBRARIES += libgnu.a
728 AT_SETUP([fix-gnulib.pl header directory creation])
730 AT_DATA([extract.sed],
746 test_gnulib_mk alloca-opt sys_types stddef >test.mk.in
747 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
748 sed -n -f extract.sed test.mk], [0],
750 $(AM_V_GEN)$(MKDIR_P) lib
753 $(AM_V_GEN)$(MKDIR_P) lib/sys
756 $(AM_V_GEN)$(MKDIR_P) lib
762 dnl TEST_FIND_AUTOMAKE_VER([to-check], [test-action])
764 dnl For each whitespace-separated version token in to-check, check if we can
765 dnl run the programs automake-VER and aclocal-VER. The special token 'default'
766 dnl also checks the unversioned automake and aclocal (or, if set in the
767 dnl environment, $AUTOMAKE and $ACLOCAL).
769 dnl Then test-action is expanded such that shell variables $ac and $am refer to
770 dnl the aclocal and automake programs, and $amver is the actual version
771 dnl reported by --version. The action should do nothing if the version is
772 dnl acceptable, or "continue" if the version is unacceptable.
774 dnl If an acceptable version is found, the AUTOMAKE and ACLOCAL environment
775 dnl variables are set accordingly. Otherwise, the test group is skipped.
776 m4_define([TEST_FIND_AUTOMAKE],
780 [default], [ac=${ACLOCAL-aclocal} am=${AUTOMAKE-automake}],
781 [ac=aclocal-$am; am=automake-$am])
782 amver=`$am --version | sed -n '1s/.* //p'`
783 acver=`$ac --version | sed -n '1s/.* //p'`
784 set x $amver $acver; shift; test x"$[]#" = x"2" || continue
785 test x"$amver" = x"$acver" || continue
789 AT_CHECK([$have_am || exit 77])
790 AUTOMAKE=$am; export AUTOMAKE
791 ACLOCAL=$ac; export ACLOCAL
792 AT_CHECK([$ACLOCAL --version && $AUTOMAKE --version], [0], [stdout])
795 m4_define([TEST_LTDL_LIBOBJ_MANGLING],
796 [TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign subdir-objects])
799 AC_SUBST([ltdl_LTLIBOBJS], [libltdl/test.lo])
800 AC_CONFIG_FILES([Makefile])
804 AT_DATA([ltdl.mk.in], [[
805 AM_CPPFLAGS += -DSTRING=\"helloworld\"
807 noinst_LTLIBRARIES = libltdl/libltdl.la
808 libltdl_libltdl_la_SOURCES = libltdl/ltdl.c
809 libltdl_libltdl_la_LIBADD = $(ltdl_LTLIBOBJS)
810 libltdl_libltdl_la_DEPENDENCIES = $(ltdl_LTLIBOBJS)
812 EXTRA_DIST += libltdl/test.c
814 AT_DATA([Makefile.am], [[AM_CPPFLAGS =
815 include $(top_srcdir)/ltdl.mk
816 AM_LIBTOOLFLAGS = --quiet
819 test_LDADD = libltdl/libltdl.la
820 all-local: ; @printf '%s\n' $(AM_CPPFLAGS)
822 AT_DATA([libltdl/test.c], [[#include <stdio.h>
823 int foo(void) { printf("%s\n", STRING); return 0; }
825 AT_DATA([libltdl/ltdl.c], [[int foo(void); int main(void) { return foo(); }
828 AT_CHECK([test_fix_ltdl -i ltdl.mk.in -o ltdl.mk])
829 libtoolize; TEST_AUTORECONF
830 TEST_CONFIGURE([--disable-shared])
831 AT_CHECK([make -s && ./test], [0], [
835 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (<automake-1.16)])
837 TEST_FIND_AUTOMAKE([default 1.10 1.11 1.12 1.13 1.14 1.15],
838 [AS_VERSION_COMPARE(["$amver"], [1.16], [], [continue], [continue])])
839 TEST_LTDL_LIBOBJ_MANGLING
843 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (>=automake-1.16)])
845 TEST_FIND_AUTOMAKE([default 1.16 1.17 1.18 1.19],
846 [AS_VERSION_COMPARE(["$amver"], [1.16], [continue])])
847 TEST_LTDL_LIBOBJ_MANGLING