-dnl Copyright © 2021-2023 Nick Bowler
+dnl Copyright © 2021-2024 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.
AT_BANNER([Script tests])
-AT_SETUP([gen-options.awk])
-AT_KEYWORDS([gen-options awk script scripts])
+AT_SETUP([bake-config.awk])
+AT_KEYWORDS([bake-config awk script scripts])
+
+AT_DATA([cfg.h],
+[[#define hello world
+/* #undef HAVE_STUFF */
+#define HAVE_OTHER_STUFF 1
+/* #undef HAVE_CRAZY_STUFF */
+]])
-AT_DATA([options.def],
+AT_DATA([lib.h],
+[[#if HAVE_STUFF
+# define foo hello__
+#elif HAVE_CRAZY_STUFF
+# define foo hello
+#elif HAVE_OTHER_STUFF
+# define foo __hello
+#endif
+]])
+
+AT_CHECK([$AWK -f "$srcdir/scripts/bake-config.awk" cfg.h lib.h], [0],
+[[#if 0 /* HAVE_STUFF */
+# define foo hello__
+#elif 0 /* HAVE_CRAZY_STUFF */
+# define foo world /* hello */
+#elif 1 /* HAVE_OTHER_STUFF */
+# define foo __hello
+#endif
+]])
+
+AT_CLEANUP
+
+m4_define([TEST_GEN_OPTIONS],
+[AT_KEYWORDS([gen-options awk script scripts])dnl
+AT_DATA([m4_default([$2], [options.def])], [$1])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-options.awk" dnl
+<m4_default([$2], [options.def]) >options.h])])
+
+m4_define([TEST_GEN_OPTIONS_SAMPLE],
[[--option-only
--option-with-val (5)
--option-with-flagval (&x, 5)
--flagval
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-options.awk" <options.def >options.h])
+AT_SETUP([gen-options.awk])
+TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
AT_DATA([context.h],
[[struct option { const char *name; int has_arg; int *flag; int val; };
return 0;
}
]])
-AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [], [ignore])
+AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT],
+ [0], [], [ignore])
# test 1: long option names and help text
AT_DATA([test1.c],
}
]])
-# pick out interesting bits from the definitions file
-sed -n '/^-/s/^.*--\([[^\= @<:@]]*\).*$/\1/p' options.def >options
-sed -n '/^-/{
- s/[[^=]]*\(=[[^@:>@ ]]*\).*$/\1/
- s/^[[^=]].*//
- s/^=//
- p
-}' options.def >argnames
-
-AS_ECHO(["-"]) | sed -n '1s/^-.*//p
-1,/^-/d
-t clear
-:clear
-s/^-.*//p
-t
-s/^#.*//
-s/^ *//
-t next
-:next
-N
-s/\n-.*//
-t done
-s/\n#.*//
-s/\n */\n/g
-t next
-:done
-s/"/\\\\"/g
-s/[[^\n]][[^\n]]*/\\"&\\"/g
-s/^\n*//
-s/\n*$//
-s/\n\n*/ /g
-p
-' options.def - >helptext
-
-exec 3<options 4<argnames 5<helptext 6>expout
-while read opt <&3 && read arg <&4 && read help <&5; do
- if test ${arg:+y}; then
- AS_ECHO(["--$opt=$arg"]) >&6
- else
- AS_ECHO(["--$opt"]) >&6
- fi
- eval "set x $help"; shift
- for arg
- do
- AS_ECHO(["$arg"]) >&6
- done
-done
-exec 3<&- 4<&- 5<&- 6>&-
+AT_DATA([lopthelp.awk],
+[[/^#/ { next }
+/^-/ {
+ if ($1 !~ /^--/)
+ $1 = $2;
+ if (sub(/\@:>@$/, "", $1))
+ sub(/\@<:@/, "", $1);
+
+ print $1;
+ next;
+}
+
+{ sub(/^[ \t]*/, ""); }
+/./ { print; }
+]])
-AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT],
+$AWK -f lopthelp.awk options.def >expout
+AT_CHECK([$CC -o test1$EXEEXT test1.c 1>&2 && ./test1$EXEEXT],
[0], [expout], [ignore])
# test 2: short option string
if (SOPT_STRING[i+1] != ':')
putchar('\n');
}
+ return 0;
}
]])
-sed -n '/^-/{
- s/=.*/:/
- s/[[@<:@]]/:/
- s/^-\([[^-]]\)[[^:]]*/\1/p
- s/^-.*//p
-}' options.def >sopts
+AT_DATA([soptstr.awk],
+[[/^-/ {
+ if ($1 ~ /^--/)
+ next;
-exec 3<options 4<sopts 5>expout
-while read lopt <&3 && read sopt <&4; do
- if test ${sopt:+y}; then
- AS_ECHO(["--$lopt $sopt"]) >&5
- fi
-done
-exec 3<&- 4<&- 5>&-
+ sopt = substr($1, 2, 1);
+ arg = sub(/\@:>@$/, "", $2);
+ arg += sub(/\@<:@?=.*$/, "", $2);
-AT_CHECK([$CC -o test2$EXEEXT test2.c && ./test2$EXEEXT],
+ print $2 " " sopt substr("::", 1, arg);
+}
+]])
+
+$AWK -f soptstr.awk options.def >expout
+AT_CHECK([$CC -o test2$EXEEXT test2.c 1>&2 && ./test2$EXEEXT],
[0], [expout], [ignore])
+AT_CLEANUP
+
+AT_SETUP([gen-options.awk xgettext annotation])
+TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
+
# Check that all help strings are translatable
-sed 's/\([[^\\]]\\\)" /\1\\n\\" /g' helptext >help-po
-exec 3<options 4<argnames 5<help-po 6>expected.po
-while read opt <&3 && read arg <&4 && read help <&5; do
- if test ${arg:+y}; then
- AS_ECHO(["msgctxt \"$opt\" msgid \"$arg\""]) >&6
- fi
- AS_ECHO(["msgctxt \"$opt\" msgid${help:+ }$help"]) >&6
-done
-exec 3<&- 4<&- 5<&- 6>&-
+AT_DATA([messages.awk],
+[[BEGIN { lines = -1; }
+END { output(); }
+
+/^#/ { next }
+/^-/ {
+ output();
+ if ($1 !~ /^--/)
+ $1 = $2;
+
+ tmp=$1;
+ arg="";
+ if (sub(/\@<:@?=.*/, "", $1)) {
+ arg = substr(tmp, index(tmp, "=")+1);
+ sub(/\@:>@$/, "", arg);
+ }
+
+ sub(/^--/, "", $1);
+ ctxt=("msgctxt \"" $1 "\" msgid");
+
+ if (arg)
+ print ctxt, ("\"" arg "\"");
+ next;
+}
+
+{ sub(/^[ \t]*/, ""); }
+/./ {
+ gsub(/"/, "\\\"", $0);
+ help[lines++] = $0;
+}
+
+function output(i)
+{
+ if (lines >= 0) {
+ printf "%s", ctxt;
+ for (i = 0; i < lines; i++) {
+ nl = (i+1 < lines ? "\\n" : "");
+ printf(" \"%s%s\"", help[i], nl);
+ }
+ print "";
+ }
+
+ lines = 0;
+}
+]])
+dnl Antique versions of xgettext which predate the pgettext/msgctx feature
+dnl will produce an output po file with no msgctx lines. So try to spot
+dnl that and skip the test with such versions.
AT_CHECK([xgettext --keyword=PN_:1c,2 options.h
- test -f messages.po || exit 77])
+ test -f messages.po || exit 77
+ grep msgid messages.po >/dev/null &&
+ { grep msgctx messages.po >/dev/null || exit 77; }])
-LC_ALL=C sort expected.po >expout
+$AWK -f messages.awk options.def | LC_ALL=C sort >expout
AT_CHECK([sed -n '/^msgctxt/{
t next
:next
AT_CLEANUP
AT_SETUP([gen-options.awk packed format])
-AT_KEYWORDS([gen-options awk script scripts])
AT_DATA([test.c], [[#include <stdio.h>
struct option { const char *name; int has_arg; int *flag; int val; };
else
printf("'%c'\n", o.val);
}
+ return 0;
}
]])
-AT_DATA([single.dat],
-[[--single-option
-]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-options.awk" <single.dat >options.h])
-AT_CHECK([$CC -o single$EXEEXT test.c && ./single$EXEEXT], [0],
+TEST_GEN_OPTIONS([[--single-option
+]], [single.dat])
+AT_CHECK([$CC -o single$EXEEXT test.c 1>&2 && ./single$EXEEXT], [0],
[[0
--single-option, 0, 0
-]])
+]], [ignore])
-AT_DATA([16bit.dat],
-[[-a, --the-first-option
+TEST_GEN_OPTIONS([[-a, --the-first-option
-b, --the-second-option=ARG
-c, --the-third-option[=ARG]
-d, --the-fourth-option
-]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-options.awk" <16bit.dat >options.h])
-AT_CHECK([$CC -o 16bit$EXEEXT test.c && ./16bit$EXEEXT], [0],
+]], [16bit.dat])
+AT_CHECK([$CC -o 16bit$EXEEXT test.c 1>&2 && ./16bit$EXEEXT], [0],
[[2
--the-first-option, 0, 'a'
--the-second-option, 1, 'b'
--the-third-option, 2, 'c'
--the-fourth-option, 0, 'd'
-]])
+]], [ignore])
AT_CLEANUP
\ leading whitespace
&j oneline
# with a comment
+&k with nontrivial whitespace
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test.def >test.h])
+AT_CHECK([$AWK -f "$srcdir/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"
+{ cat <<'EOF'
+#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>&-
+EOF
+while read id; do AS_ECHO([' printf("%s\n---\n", strtab+'"$id"');']); done
+AS_ECHO([' return 0;'])
+AS_ECHO(['}'])
+} <identifiers >test0.c
-AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [---
+AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0], [---
world
---
hello world
---
oneline
---
+with nontrivial whitespace
+---
], [ignore])
AT_CLEANUP
AT_DATA([test0.def],
[[&hello hello
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test0.def >test0.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
AT_DATA([test1.def],
[[@nozero
&hello hello
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test1.def >test1.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
AT_DATA([test.c],
[[#include <stdio.h>
#include HEADER
int main(void) { printf("%d %s\n", hello, strtab+hello); return 0; }
]])
-AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c && ./test0$EXEEXT],
- [0], [[0 hello
+AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c 1>&2 &&
+ ./test0$EXEEXT], [0], [[0 hello
+]], [ignore])
+AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c 1>&2 &&
+ ./test1$EXEEXT], [0], [[1 hello
+]], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([gen-strtab.awk @macro option])
+AT_KEYWORDS([gen-strtab awk script scripts])
+
+AT_DATA([test0.def],
+[[@macro
+&foo foobar
+&bar bar
+&baz baz
]])
-AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c && ./test1$EXEEXT],
- [0], [[1 hello
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
+
+AT_DATA([test0.c],
+[[#include <stdio.h>
+extern const char strtab[];
+#include "test0.h"
+
+int main(void)
+{
+ static const char mystrtab[] = STRTAB_INITIALIZER;
+ printf("%s\n%s\n%s\n", mystrtab+foo, mystrtab+bar, mystrtab+baz);
+ return 0;
+}
]])
+AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
+[[foobar
+bar
+baz
+]], [ignore])
AT_CLEANUP
&b world
&c goodbye
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test0.def >test0.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
AT_CHECK([sed -n -f l10n.sed test0.h | LC_ALL=C sort], [0],
[["goodbye"
"hello world"
&&b world
&&c goodbye
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test1.def >test1.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
AT_CHECK([sed -n -f l10n.sed test1.h], [0],
[["hello world"
]])
}
]])
-AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c && ./test0$EXEEXT],
- [0], [[hello world world goodbye
-]])
+AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c 1>&2 &&
+ ./test0$EXEEXT], [0], [[hello world world goodbye
+]], [ignore])
-AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c && ./test1$EXEEXT],
- [0], [[hello world world goodbye
-]])
+AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c 1>&2 &&
+ ./test1$EXEEXT], [0], [[hello world world goodbye
+]], [ignore])
AT_CLEANUP
# comment
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <tree.def >tree.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
AT_DATA([test0.c],
[[#include "tree.h"
}
]])
sed '/^#/d' tree.def >expout
-AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [expout])
+AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT],
+ [0], [expout], [ignore])
AT_CLEANUP
e 1
f 2
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <tree.def >tree.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
AT_DATA([test0.c],
[[float tree_strtab = 0;
for (i = 0; i < sizeof root / sizeof root[0]; i++) {
printf("%d, %d\n", root[i].num, root[i].offset);
}
+ return 0;
}
]])
-AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0],
+AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
[[1, 3
2, 6
0, 0
1, 0
2, 0
0, 0
-]])
+]], [ignore])
AT_DATA([flat.def],
[[FLAT
c 3
@nostrtab
]])
-AT_CHECK([$AWK -f "$builddir/scripts/gen-tree.awk" <flat.def >flat.h])
+AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <flat.def >flat.h])
sed -e 's/tree\.h/flat.h/' -e 's/ROOT/FLAT/' test0.c >test1.c
-AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT], [0],
+AT_CHECK([$CC -o test1$EXEEXT test1.c 1>&2 && ./test1$EXEEXT], [0],
[[1, 0
2, 0
3, 0
0, 0
-]])
+]], [ignore])
AT_CLEANUP
AT_SETUP([join.awk])
AT_KEYWORDS([join awk script scripts])
-JOIN="$AWK -f $builddir/scripts/join.awk --"
+JOIN="$AWK -f $srcdir/scripts/join.awk --"
AT_DATA([a],
[[1 a
m4_divert_push([PREPARE_TESTS])dnl
test_fix_ltdl () {
$PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
- $PERL -f "$srcdir/scripts/fix-ltdl.pl" "$@"
+ $PERL "$srcdir/scripts/fix-ltdl.pl" "$@"
}
test_fix_gnulib () {
$PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
- $PERL -f "$srcdir/scripts/fix-gnulib.pl" "$@"
+ $PERL "$srcdir/scripts/fix-gnulib.pl" "$@"
}
test_gnulib_mk () {
echo;
for arg
do
- sed -n -f - "$srcdir/tests/data/gnulib.mk" <<EOF
-/^## begin gnulib module $arg/,/^## end gnulib module $arg/p
-EOF
+ sed -n -e \
+ "/^## begin gnulib module $arg/,/^## end gnulib module $arg/p" \
+ "$srcdir/tests/data/gnulib.mk"
done
}
m4_divert_pop([PREPARE_TESTS])
AT_SETUP([fix-gnulib.pl SED_HEADER variables])
+AT_KEYWORDS([fix-gnulib perl script scripts])
test_gnulib_mk gen-header >test.mk.in
AT_CHECK([grep SED_HEADER test.mk.in >expout || exit 99])
AT_CLEANUP
-AT_SETUP([fix-gnulib.pl %reldir% substitution])
-
-test_gnulib_mk sys_types >test.mk.in
-AT_CHECK([grep '%reldir%' test.mk.in >/dev/null || exit 99])
-
-sed -n -f - test.mk.in >expout <<'EOF'
-${G;p;b}
-/^## begin gnulib/,/^## end gnulib/!b
-/^#/{p;b}
-s|(srcdir)|(top_srcdir)|
-s|%reldir%|lib|
-s|BUILT_SOURCES|gnulib_core_headers|
-s|sys[[/_]]|lib/&|g
-/^MOSTLYCLEANFILES/{h;b}
-p
-EOF
-
-AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
-sed -n -e '/^## begin gnulib/,/^## end gnulib/p' \
- -e '/CLEANFILES/p' test.mk],
-[0], [expout])
-
-AT_CLEANUP
-
AT_SETUP([fix-gnulib.pl warning removal])
+AT_KEYWORDS([fix-gnulib perl script scripts])
AT_DATA([test.mk.in], [[
## test begin
AT_CLEANUP
AT_SETUP([fix-gnulib.pl header directory creation])
+AT_KEYWORDS([fix-gnulib perl script scripts])
-AT_DATA([extract.sed],
-[[/AM_V_GEN/b ok
-/gl_V_at/b ok
-s/:.*/:/
-h
-b
-:ok
-s/'//g
-x
-G
-p
-n
-s/[)].*/)/
-p
+AT_DATA([extract.awk],
+[[$0 !~ /^\t/ && $1 ~ /:$/ {
+ target=$1;
+
+ for (i = 2; i <= NF; i++) {
+ if ($i ~ /am__dirstamp/)
+ target = target " " $i;
+ }
+
+ next;
+}
+
+target != "" && sub(/[$][({](AM_V_GEN|gl_V_at)[})].*$/, "[OK]") {
+ print target, $1;
+}
+
+{ target=""; }
]])
test_gnulib_mk alloca-opt sys_types stddef >test.mk.in
AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
-sed -n -f extract.sed test.mk], [0],
-[[lib/alloca.h:
- $(AM_V_GEN)$(MKDIR_P) lib
- $(AM_V_at)
-lib/sys/types.h:
- $(AM_V_GEN)$(MKDIR_P) lib/sys
- $(AM_V_at)
-lib/stddef.h:
- $(AM_V_GEN)$(MKDIR_P) lib
- $(AM_V_at)
+$AWK -f extract.awk test.mk], [0],
+[[lib/alloca.h: lib/$(am__dirstamp) [OK]
+lib/sys/types.h: lib/sys/$(am__dirstamp) [OK]
+lib/stddef.h: lib/$(am__dirstamp) [OK]
]])
AT_CLEANUP
])])
AT_SETUP([fix-ltdl.pl LIBOBJ mangling (<automake-1.16)])
+AT_KEYWORDS([fix-ltdl perl script scripts])
TEST_FIND_AUTOMAKE([default 1.10 1.11 1.12 1.13 1.14 1.15],
[AS_VERSION_COMPARE(["$amver"], [1.16], [], [continue], [continue])])
AT_CLEANUP
AT_SETUP([fix-ltdl.pl LIBOBJ mangling (>=automake-1.16)])
+AT_KEYWORDS([fix-ltdl perl script scripts])
TEST_FIND_AUTOMAKE([default 1.16 1.17 1.18 1.19],
[AS_VERSION_COMPARE(["$amver"], [1.16], [continue])])