Import c99types.h and related probes from cdecl99.
[dxcommon.git] / tests / scripts.at
blob046fa218e5a70fa0abfa367464d50a3d87f5a9e5
1 # Copyright © 2021-2024 Nick Bowler
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
16 AT_BANNER([Script tests])
18 m4_define([TEST_DUMP_PO],
19 [[sed -n '/^msg[ic][td][x ]/{
20 t next
21 :next
23 s/\nmsgstr.*//
24 t done
25 s/\s*""//
26 s/\n/ /
27 t next
28 :done
30 }' messages.po | LC_ALL=C sort]])
32 AT_SETUP([bake-config.awk])
33 AT_KEYWORDS([bake-config awk script scripts])
35 AT_DATA([cfg.h],
36 [[#define hello world
37 /* #undef HAVE_STUFF */
38 #define HAVE_OTHER_STUFF 1
39 /* #undef HAVE_CRAZY_STUFF */
40 ]])
42 AT_DATA([lib.h],
43 [[#if HAVE_STUFF
44 #  define foo hello__
45 #elif HAVE_CRAZY_STUFF
46 #  define foo hello
47 #elif HAVE_OTHER_STUFF
48 #  define foo __hello
49 #endif
50 ]])
52 AT_CHECK([$AWK -f "$srcdir/scripts/bake-config.awk" cfg.h lib.h], [0],
53 [[#if 0 /* HAVE_STUFF */
54 #  define foo hello__
55 #elif 0 /* HAVE_CRAZY_STUFF */
56 #  define foo world /* hello */
57 #elif 1 /* HAVE_OTHER_STUFF */
58 #  define foo __hello
59 #endif
60 ]])
62 AT_CLEANUP
64 m4_define([TEST_GEN_OPTIONS],
65 [AT_KEYWORDS([gen-options awk script scripts])dnl
66 AT_DATA([m4_default([$2], [options.def])], [$1])
67 AT_CHECK([$AWK -f "$srcdir/scripts/gen-options.awk" dnl
68 <m4_default([$2], [options.def]) >options.h])])
70 m4_define([TEST_GEN_OPTIONS_SAMPLE],
71 [[--option-only
72 --option-with-val (5)
73 --option-with-flagval (&x, 5)
74 --option-with-arg=ARG
75 some "text" goes here
76 --option-with-optional-arg[=OPTIONAL]
78 hello
79 -a, --option-with-sopt
81 -b, --option-with-sopt-and-arg=SOPTARG
82 -c, --option-with-sopt-and-optional-arg[=SOPTOPTIONAL]
83 --option-with-arg-and-val=ARGVAL (42)
84 --option-with-arg-and-flagval=ARGFLAGVAL (&a[1], 'x')
85 --option-with-optional-arg-and-val[=OPTIONALARGVAL] (54)
86 --option-with-optional-arg-and-flagval[=OPTIONALFLAGVAL] (0, 0)
87 --with-sopt
88 Here is a help string
89     that has a line randomly indented
90 # with a comment
91     @&t@
92 and a blank line
93 --with-arg=ARG
94 do stuff with ARG
95 --flagval
96 ]])
98 AT_SETUP([gen-options.awk])
99 TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
101 AT_DATA([context.h],
102 [[struct option { const char *name; int has_arg; int *flag; int val; };
103 int x, a[5];
106 # test 0: sanity test
107 AT_DATA([test0.c],
108 [[#include "context.h"
109 #include "options.h"
111 static const char sopts[] = SOPT_STRING;
112 static const struct option opts[] = { LOPTS_INITIALIZER, {0} };
114 int main(void)
116   return 0;
119 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT],
120   [0], [], [ignore])
122 # test 1: long option names and help text
123 AT_DATA([test1.c],
124 [[#include <stdio.h>
125 #include <stdlib.h>
127 #include "context.h"
128 #include "options.h"
130 static const struct option opts[] = { LOPTS_INITIALIZER };
132 int main(void)
134   unsigned i;
136   for (i = 0; i < sizeof opts / sizeof opts[0]; i++) {
137     struct lopt_help help = { "INVALID", "INVALID" };
139     if (!lopt_get_help(&opts[i], &help))
140       return EXIT_FAILURE;
142     printf("--%s", opts[i].name);
143     if (opts[i].has_arg)
144       printf("=%s", help.arg);
145     printf("\n%s", help.desc);
146     if (help.desc[0])
147       putchar('\n');
148   }
150   return 0;
154 AT_DATA([lopthelp.awk],
155 [[/^#/ { next }
156 /^-/ {
157   if ($1 !~ /^--/)
158     $1 = $2;
159   if (sub(/\@:>@$/, "", $1))
160     sub(/\@<:@/, "", $1);
162   print $1;
163   next;
166 { sub(/^[ \t]*/, ""); }
167 /./ { print; }
170 $AWK -f lopthelp.awk options.def >expout
171 AT_CHECK([$CC -o test1$EXEEXT test1.c 1>&2 && ./test1$EXEEXT],
172   [0], [expout], [ignore])
174 # test 2: short option string
175 AT_DATA([test2.c],
176 [[#include <stdio.h>
177 #include <stdlib.h>
179 #include "context.h"
180 #include "options.h"
182 int main(void)
184   struct option lopts[] = {LOPTS_INITIALIZER};
185   unsigned i, j;
187   for (i = 0; i < sizeof SOPT_STRING - 1; i++) {
188     if (SOPT_STRING[i] != ':') {
189       for (j = 0; j < sizeof lopts / sizeof lopts[0]; j++) {
190         if (lopts[j].val == SOPT_STRING[i]) {
191           printf("--%s ", lopts[j].name);
192           break;
193         }
194       }
195     }
196     putchar(SOPT_STRING[i]);
197     if (SOPT_STRING[i+1] != ':')
198       putchar('\n');
199   }
200   return 0;
204 AT_DATA([soptstr.awk],
205 [[/^-/ {
206   if ($1 ~ /^--/)
207     next;
209   sopt = substr($1, 2, 1);
210   arg = sub(/\@:>@$/, "", $2);
211   arg += sub(/\@<:@?=.*$/, "", $2);
213   print $2 " " sopt substr("::", 1, arg);
217 $AWK -f soptstr.awk options.def >expout
218 AT_CHECK([$CC -o test2$EXEEXT test2.c 1>&2 && ./test2$EXEEXT],
219   [0], [expout], [ignore])
221 AT_CLEANUP
223 AT_SETUP([gen-options.awk xgettext annotation])
224 TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
226 # Check that all help strings are translatable
227 AT_DATA([messages.awk],
228 [[BEGIN { lines = -1; }
229 END { output(); }
231 /^#/ { next }
232 /^-/ {
233   output();
234   if ($1 !~ /^--/)
235     $1 = $2;
237   tmp=$1;
238   arg="";
239   if (sub(/\@<:@?=.*/, "", $1)) {
240     arg = substr(tmp, index(tmp, "=")+1);
241     sub(/\@:>@$/, "", arg);
242   }
244   sub(/^--/, "", $1);
245   ctxt=("msgctxt \"" $1 "\" msgid");
247   if (arg)
248     print ctxt, ("\"" arg "\"");
249   next;
252 { sub(/^[ \t]*/, ""); }
253 /./ {
254   gsub(/"/, "\\\"", $0);
255   help[lines++] = $0;
258 function output(i)
260   if (lines >= 0) {
261     printf "%s", (lines > 0 ? "msgid" : ctxt);
262     for (i = 0; i < lines; i++) {
263       nl = (i+1 < lines ? "\\n" : "");
264       printf(" \"%s%s\"", help[i], nl);
265     }
266     print "";
267   }
269   lines = 0;
273 dnl Antique versions of xgettext which predate the pgettext/msgctx feature
274 dnl will produce an output po file with no msgctx lines.  So try to spot
275 dnl that and skip the test with such versions.
276 AT_CHECK([xgettext --omit-header options.h
277   test -f messages.po || exit 77
278   grep msgid messages.po >/dev/null &&
279     { grep msgctx messages.po >/dev/null || exit 77; }])
281 $AWK -f messages.awk options.def | LC_ALL=C sort >expout
282 AT_CHECK([TEST_DUMP_PO], [0], [expout])
284 AT_CLEANUP
286 AT_SETUP([gen-options.awk packed format])
288 AT_DATA([test.c], [[#include <stdio.h>
289 struct option { const char *name; int has_arg; int *flag; int val; };
291 #include "options.h"
293 static unsigned opts[] = { LOPTS_PACKED_INITIALIZER };
295 int main(void)
297   unsigned i;
298   int x =
299 #if !LOPT_PACK_BITS
300   0
301 #elif LOPT_PACK_BITS <= 8
302   1
303 #elif LOPT_PACK_BITS <= 16
304   2
305 #elif LOPT_PACK_BITS <= 32
306   3
307 #else
308 #  error too big
309 #endif
310   ;
311   printf("%d\n", x);
312   for (i = 0; i < sizeof opts / sizeof opts[0]; i++) {
313     struct option o;
315     LOPT_UNPACK(o, opts[i]);
316     printf("--%s, %d, ", o.name, o.has_arg);
317     if (o.val > UCHAR_MAX)
318       printf("%d\n", o.val - UCHAR_MAX - 1);
319     else
320       printf("'%c'\n", o.val);
321   }
322   return 0;
326 TEST_GEN_OPTIONS([[--single-option
327 ]], [single.dat])
328 AT_CHECK([$CC -o single$EXEEXT test.c 1>&2 && ./single$EXEEXT], [0],
330 --single-option, 0, 0
331 ]], [ignore])
333 TEST_GEN_OPTIONS([[-a, --the-first-option
334 -b, --the-second-option=ARG
335 -c, --the-third-option[=ARG]
336 -d, --the-fourth-option
337 ]], [16bit.dat])
338 AT_CHECK([$CC -o 16bit$EXEEXT test.c 1>&2 && ./16bit$EXEEXT], [0],
340 --the-first-option, 0, 'a'
341 --the-second-option, 1, 'b'
342 --the-third-option, 2, 'c'
343 --the-fourth-option, 0, 'd'
344 ]], [ignore])
346 AT_CLEANUP
348 AT_SETUP([gen-strtab.awk])
349 AT_KEYWORDS([gen-strtab awk script scripts])
351 AT_DATA([test.def],
353 &a world
355 hello world
357 hello
358 world
359 &d world\n
361 \\not a newline
363 \not a newline
364 &g inline
365 continued
366 &h    no\
367 newline\
369 \   leading whitespace
370 &j oneline
371 # with a comment
372 &k    with   nontrivial   whitespace
375 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test.def >test.h])
377 sed -n 's/^[[&]]\([[^ ]]*\).*/\1/p' test.def >identifiers
379 # test 0: sanity test
380 { cat <<'EOF'
381 #include "test.h"
382 #include <stdio.h>
384 int main(void)
386   printf("---\n");
388 while read id; do AS_ECHO(['  printf("%s\n---\n", strtab+'"$id"');']); done
389 AS_ECHO(['  return 0;'])
390 AS_ECHO(['}'])
391 } <identifiers >test0.c
393 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0], [---
394 world
396 hello world
399 hello
400 world
403 world
406 \not a newline
410 ot a newline
413 inline
414 continued
417 nonewline
419    leading whitespace
422 oneline
424 with   nontrivial   whitespace
426 ], [ignore])
428 AT_CLEANUP
430 AT_SETUP([gen-strtab.awk @nozero option])
431 AT_KEYWORDS([gen-strtab awk script scripts])
433 AT_DATA([test0.def],
434 [[&hello hello
435 &empty
437 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
439 AT_DATA([test1.def],
440 [[@nozero
441 &hello hello
442 &empty
444 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
446 AT_DATA([test.c],
447 [[#include <stdio.h>
448 #include HEADER
449 int main(void) {
450   printf("%d \"%s\"\n", hello, strtab+hello);
451   printf("%d \"%s\"\n", empty, strtab+empty);
452   printf("%d %d\n", (int)sizeof strtab, STRTAB_MAX_OFFSET);
453   return 0;
456 AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c 1>&2 &&
457   ./test0$EXEEXT], [0], [[0 "hello"
458 5 ""
459 6 5
460 ]], [ignore])
461 AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c 1>&2 &&
462   ./test1$EXEEXT], [0], [[1 "hello"
463 6 ""
464 7 6
465 ]], [ignore])
467 AT_CLEANUP
469 AT_SETUP([gen-strtab.awk @macro option])
470 AT_KEYWORDS([gen-strtab awk script scripts])
472 AT_DATA([test0.def],
473 [[@macro
474 &foo foobar
475 &bar bar
476 &baz baz
478 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
480 AT_DATA([test0.c],
481 [[#include <stdio.h>
482 char strtab[1];
483 #include "test0.h"
485 int main(void)
487   static const char mystrtab[] = STRTAB_INITIALIZER;
488   printf("%s\n%s\n%s\n", mystrtab+foo, mystrtab+bar, mystrtab+baz);
489   return 0;
492 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
493 [[foobar
496 ]], [ignore])
498 AT_CLEANUP
500 AT_SETUP([gen-strtab.awk l10n options])
501 AT_KEYWORDS([gen-strtab awk script scripts])
503 AT_DATA([xgettext.sed], dnl (
504 [[/^#/b
505 s/.*gettext(\([^)]*\)).*/msgid \1\
506 msgstr ""/p
509 AT_DATA([test0.def],
510 [[&a hello world
511 &b world
512 &c goodbye
514 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
515 AT_CHECK([rm -f messages.po; xgettext --omit-header test0.h
516 test -f messages.po || sed -n -f xgettext.sed test0.h >messages.po
517 TEST_DUMP_PO], [0],
518 [[msgid "goodbye"
519 msgid "hello world"
520 msgid "world"
521 ]], [ignore])
523 AT_DATA([test1.def],
524 [[&a hello world
525 &&b world
526 &&c goodbye
528 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
529 AT_CHECK([rm -f messages.po; xgettext --omit-header test1.h
530 test -f messages.po || sed -n -f xgettext.sed test1.h >messages.po
531 TEST_DUMP_PO], [0],
532 [[msgid "hello world"
533 ]], [ignore])
535 AT_DATA([test.c],
536 [[#include <stdio.h>
537 #include HEADER
539 int main(void)
541   printf("%s %s %s\n", strtab+a, strtab+b, strtab+c);
542   return 0;
546 AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c 1>&2 &&
547   ./test0$EXEEXT], [0], [[hello world world goodbye
548 ]], [ignore])
550 AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c 1>&2 &&
551   ./test1$EXEEXT], [0], [[hello world world goodbye
552 ]], [ignore])
554 AT_CLEANUP
556 AT_SETUP([gen-strtab.awk numeric strings])
557 AT_KEYWORDS([gen-strtab awk script scripts])
559 AT_DATA([test0.def],
560 [[@macro
561 &&A 43
562 &&B 44
563 &&C 45
565 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
567 AT_DATA([test0.c],
568 [[#include <stdio.h>
569 char strtab[1];
570 #include "test0.h"
572 int main(void)
574   static const char mystrtab[16] = STRTAB_INITIALIZER;
575   printf("%s\n%s\n%s\n", mystrtab+A, mystrtab+B, mystrtab+C);
576   return 0;
579 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
580 [[43
583 ]], [ignore])
585 AT_CLEANUP
587 AT_SETUP([gen-strtab.awk numeric escapes])
588 AT_KEYWORDS([gen-strtab awk script scripts])
590 AT_DATA([test0.def],
591 [[@macro
592 &&A \1
593 &&B \01
594 &&C \001
595 &&D \x1
596 &&E \x01
597 &&F \x001
599 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
601 AT_DATA([test0.c],
602 [[#include <stdio.h>
603 char strtab[1];
604 #include "test0.h"
606 int main(void)
608   static const char mystrtab[] = STRTAB_INITIALIZER;
610   printf("%d\n", (int)sizeof mystrtab);
611   printf("%d %d %d %d %d %d\n", A, B, C, D, E, F);
612   printf("%d\n", mystrtab[0] == 1);
613   return 0;
616 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
618 0 0 0 0 0 0
620 ]], [ignore])
622 AT_DATA([test1.def],
623 [[@macro
624 &&A \1
625 &&B \120
626 &&C \xff
627 &&D \x50
629 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
631 AT_DATA([test1.c],
632 [[#include <stdio.h>
633 char strtab[1];
634 #include "test1.h"
636 int main(void)
638   static const char mystrtab[] = STRTAB_INITIALIZER;
640   printf("%d\n", (int)sizeof mystrtab);
641   printf("%d%d %d%d %d%d\n", mystrtab[A] == '\1', mystrtab[A+1] == 0,
642                              mystrtab[B] == '\120', mystrtab[B+1] == 0,
643                              mystrtab[C] == '\377', mystrtab[C+1] == 0);
644   printf("%d\n", B == D);
645   return 0;
648 AT_CHECK([$CC -o test1$EXEEXT test1.c 1>&2 && ./test1$EXEEXT], [0],
650 11 11 11
652 ]], [ignore])
654 AT_CLEANUP
656 AT_SETUP([gen-tree.awk])
657 AT_KEYWORDS([gen-tree awk script scripts])
659 AT_DATA([tree.def],
660 [[# comment
661 ROOT0
662   r0a, r0a_OFFSET
663     r0b, r0b_OFFSET
664       r0c
665     r0d
666   r0e, r0e_OFFSET
667     r0f
668     r0g
669 # comment
670 ROOT1
671   r1a, r1a_OFFSET
672     r1b, r1b_OFFSET
673       r1b
674       r1e
675       r1b
676   r1c, r1c_OFFSET
677     r1d, r1d_OFFSET
678       r1e
679       r1b
680       r1e
681 # comment
684 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
686 AT_DATA([test0.c],
687 [[#include "tree.h"
688 #include <stdio.h>
690 struct tree { unsigned id, subtree; };
692 static const struct tree tree0[] = {
693   ROOT0_INITIALIZER
695 static const struct tree tree1[] = {
696   ROOT1_INITIALIZER
699 void print_subtree(const struct tree *root, unsigned offset, int depth)
701   const struct tree *node;
703   for (node = &root[offset]; node->id; node++) {
704     printf("%*s%s", 2*depth, "", &tree_strtab[node->id]);
705     if (node->subtree) {
706       printf(", %s_OFFSET\n", &tree_strtab[node->id]);
707       print_subtree(root, node->subtree, depth+1);
708     } else {
709       putchar('\n');
710     }
711   }
714 int main(void)
716   printf("ROOT0\n");
717   print_subtree(tree0, 0, 1);
718   printf("ROOT1\n");
719   print_subtree(tree1, 0, 1);
720   return 0;
723 sed '/^#/d' tree.def >expout
724 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT],
725   [0], [expout], [ignore])
727 AT_CLEANUP
729 # Test the gen-tree features that avoid creating string labels for nodes.
730 AT_SETUP([gen-tree.awk @nostrtab option])
731 AT_KEYWORDS([gen-tree awk script scripts])
733 AT_DATA([tree.def],
734 [[@nostrtab
735 ROOT
736  a 1, a_OFFSET
737   b 1
738   c 2
739  d 2, d_OFFSET
740   e 1
741   f 2
743 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
745 AT_DATA([test0.c],
746 [[float tree_strtab = 0;
747 #define a []
748 #define b []
749 #define c []
750 #define e []
751 #define f []
752 #include "tree.h"
753 #include <stdio.h>
755 static struct { int num, offset; } root[] = { ROOT_INITIALIZER };
757 int main(void)
759   unsigned i;
760   for (i = 0; i < sizeof root / sizeof root[0]; i++) {
761     printf("%d, %d\n", root[i].num, root[i].offset);
762   }
763   return 0;
767 AT_CHECK([$CC -o test0$EXEEXT test0.c 1>&2 && ./test0$EXEEXT], [0],
768 [[1, 3
769 2, 6
770 0, 0
771 1, 0
772 2, 0
773 0, 0
774 1, 0
775 2, 0
776 0, 0
777 ]], [ignore])
779 AT_DATA([flat.def],
780 [[FLAT
781  a 1
782  b 2
783  c 3
784 @nostrtab
786 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <flat.def >flat.h])
788 sed -e 's/tree\.h/flat.h/' -e 's/ROOT/FLAT/' test0.c >test1.c
789 AT_CHECK([$CC -o test1$EXEEXT test1.c 1>&2 && ./test1$EXEEXT], [0],
790 [[1, 0
791 2, 0
792 3, 0
793 0, 0
794 ]], [ignore])
796 AT_CLEANUP
798 AT_SETUP([join.awk])
799 AT_KEYWORDS([join awk script scripts])
801 JOIN="$AWK -f $srcdir/scripts/join.awk --"
803 AT_DATA([a],
804 [[1 a
805 3 a1 x
806 3 a2 x
807 5 a
808 6 a
809 8 a1 x
810 8 a2 x
811 9 a1
812 9 a2
813 9 a3
816 AT_DATA([b],
817 [[2 b
818 2 b
819 3 b y
820 4 b
821 6 b1 y
822 6 b2 y
823 7 b
824 8 b1 y
825 8 b2 y
828 AT_CHECK([$JOIN a b], [0],
829 [[3 a1 x b y
830 3 a2 x b y
831 6 a b1 y
832 6 a b2 y
833 8 a1 x b1 y
834 8 a1 x b2 y
835 8 a2 x b1 y
836 8 a2 x b2 y
839 AT_CHECK([$JOIN -v1 a b], [0],
840 [[1 a
841 5 a
842 9 a1
843 9 a2
844 9 a3
847 AT_CHECK([$JOIN -v2 a b], [0],
848 [[2 b
849 2 b
850 4 b
851 7 b
854 AT_CHECK([$JOIN -v1 -v2 a b], [0],
855 [[1 a
856 2 b
857 2 b
858 4 b
859 5 a
860 7 b
861 9 a1
862 9 a2
863 9 a3
866 AT_CHECK([$JOIN -a1 a b], [0],
867 [[1 a
868 3 a1 x b y
869 3 a2 x b y
870 5 a
871 6 a b1 y
872 6 a b2 y
873 8 a1 x b1 y
874 8 a1 x b2 y
875 8 a2 x b1 y
876 8 a2 x b2 y
877 9 a1
878 9 a2
879 9 a3
882 AT_CHECK([$JOIN -a2 a b], [0],
883 [[2 b
884 2 b
885 3 a1 x b y
886 3 a2 x b y
887 4 b
888 6 a b1 y
889 6 a b2 y
890 7 b
891 8 a1 x b1 y
892 8 a1 x b2 y
893 8 a2 x b1 y
894 8 a2 x b2 y
897 AT_CHECK([$JOIN -a1 -a2 a b], [0],
898 [[1 a
899 2 b
900 2 b
901 3 a1 x b y
902 3 a2 x b y
903 4 b
904 5 a
905 6 a b1 y
906 6 a b2 y
907 7 b
908 8 a1 x b1 y
909 8 a1 x b2 y
910 8 a2 x b1 y
911 8 a2 x b2 y
912 9 a1
913 9 a2
914 9 a3
917 AT_CHECK([$JOIN b a], [0],
918 [[3 b y a1 x
919 3 b y a2 x
920 6 b1 y a
921 6 b2 y a
922 8 b1 y a1 x
923 8 b1 y a2 x
924 8 b2 y a1 x
925 8 b2 y a2 x
928 AT_CHECK([$JOIN -v1 b a], [0],
929 [[2 b
930 2 b
931 4 b
932 7 b
935 AT_CHECK([$JOIN -v2 b a], [0],
936 [[1 a
937 5 a
938 9 a1
939 9 a2
940 9 a3
943 AT_CHECK([$JOIN -v1 -v2 b a], [0],
944 [[1 a
945 2 b
946 2 b
947 4 b
948 5 a
949 7 b
950 9 a1
951 9 a2
952 9 a3
955 AT_CHECK([$JOIN -a1 b a], [0],
956 [[2 b
957 2 b
958 3 b y a1 x
959 3 b y a2 x
960 4 b
961 6 b1 y a
962 6 b2 y a
963 7 b
964 8 b1 y a1 x
965 8 b1 y a2 x
966 8 b2 y a1 x
967 8 b2 y a2 x
970 AT_CHECK([$JOIN -a2 b a], [0],
971 [[1 a
972 3 b y a1 x
973 3 b y a2 x
974 5 a
975 6 b1 y a
976 6 b2 y a
977 8 b1 y a1 x
978 8 b1 y a2 x
979 8 b2 y a1 x
980 8 b2 y a2 x
981 9 a1
982 9 a2
983 9 a3
986 AT_CHECK([$JOIN -a1 -a2 b a], [0],
987 [[1 a
988 2 b
989 2 b
990 3 b y a1 x
991 3 b y a2 x
992 4 b
993 5 a
994 6 b1 y a
995 6 b2 y a
996 7 b
997 8 b1 y a1 x
998 8 b1 y a2 x
999 8 b2 y a1 x
1000 8 b2 y a2 x
1001 9 a1
1002 9 a2
1003 9 a3
1006 AT_CHECK([echo wat | $JOIN -v1 - /dev/null], [0],
1007 [[wat
1010 AT_CLEANUP
1012 m4_divert_push([PREPARE_TESTS])dnl
1013 test_fix_ltdl () {
1014   $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
1015   $PERL "$srcdir/scripts/fix-ltdl.pl" "$@"
1017 test_fix_gnulib () {
1018   $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
1019   $PERL "$srcdir/scripts/fix-gnulib.pl" "$@"
1021 test_gnulib_mk () {
1022   echo;
1023   for arg
1024   do
1025     sed -n -e \
1026       "/^## begin gnulib module $arg/,/^## end   gnulib module $arg/p" \
1027       "$srcdir/tests/data/gnulib.mk"
1028   done
1030 m4_divert_pop([PREPARE_TESTS])
1032 AT_SETUP([fix-gnulib.pl SED_HEADER variables])
1033 AT_KEYWORDS([fix-gnulib perl script scripts])
1035 test_gnulib_mk gen-header >test.mk.in
1036 AT_CHECK([grep SED_HEADER test.mk.in >expout || exit 99])
1037 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
1038 grep SED_HEADER test.mk], [0], [expout])
1040 AT_CLEANUP
1042 AT_SETUP([fix-gnulib.pl warning removal])
1043 AT_KEYWORDS([fix-gnulib perl script scripts])
1045 AT_DATA([test.mk.in], [[
1046 ## test begin
1047 noinst_LTLIBRARIES += libgnu.la
1048 libgnu_la_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
1049 noinst_LIBRARIES += libgnu.a
1050 libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
1051 ## test end
1053 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
1054 sed -n '/^## test begin/,/^## test end/p' test.mk], [0], [## test begin
1055 EXTRA_LTLIBRARIES += libgnu.la
1056 EXTRA_LIBRARIES += libgnu.a
1057 ## test end
1060 AT_CLEANUP
1062 AT_SETUP([fix-gnulib.pl header directory creation])
1063 AT_KEYWORDS([fix-gnulib perl script scripts])
1065 AT_DATA([extract.awk],
1066 [[$0 !~ /^\t/ && $1 ~ /:$/ {
1067   target=$1;
1069   for (i = 2; i <= NF; i++) {
1070     if ($i ~ /am__dirstamp/)
1071       target = target " " $i;
1072   }
1074   next;
1077 target != "" && sub(/[$][({](AM_V_GEN|gl_V_at)[})].*$/, "[OK]") {
1078   print target, $1;
1081 { target=""; }
1084 test_gnulib_mk alloca-opt sys_types stddef >test.mk.in
1085 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
1086 $AWK -f extract.awk test.mk
1087 grep '^EXTRA_PROGRAMS' test.mk | LC_ALL=C sort
1088 $AWK '$[1] ~ /dirstamp_SOURCES/ { print $[1]; }' test.mk | LC_ALL=C sort], [0],
1089 [[lib/alloca.h: lib/$(am__dirstamp) [OK]
1090 lib/sys/types.h: lib/sys/$(am__dirstamp) [OK]
1091 lib/stddef.h: lib/$(am__dirstamp) [OK]
1092 EXTRA_PROGRAMS += lib/gl-dirstamp
1093 EXTRA_PROGRAMS += lib/sys/gl-dirstamp
1094 lib_gl_dirstamp_SOURCES
1095 lib_sys_gl_dirstamp_SOURCES
1098 AT_CLEANUP
1100 dnl TEST_FIND_AUTOMAKE_VER([to-check], [test-action])
1102 dnl For each whitespace-separated version token in to-check, check if we can
1103 dnl run the programs automake-VER and aclocal-VER.  The special token 'default'
1104 dnl also checks the unversioned automake and aclocal (or, if set in the
1105 dnl environment, $AUTOMAKE and $ACLOCAL).
1107 dnl Then test-action is expanded such that shell variables $ac and $am refer to
1108 dnl the aclocal and automake programs, and $amver is the actual version
1109 dnl reported by --version.  The action should do nothing if the version is
1110 dnl acceptable, or "continue" if the version is unacceptable.
1112 dnl If an acceptable version is found, the AUTOMAKE and ACLOCAL environment
1113 dnl variables are set accordingly.  Otherwise, the test group is skipped.
1114 m4_define([TEST_FIND_AUTOMAKE],
1115 [have_am=false
1116 for am in $1; do
1117   AS_CASE([$am],
1118     [default], [ac=${ACLOCAL-aclocal} am=${AUTOMAKE-automake}],
1119     [ac=aclocal-$am; am=automake-$am])
1120   amver=`$am --version | sed -n '1s/.* //p'`
1121   acver=`$ac --version | sed -n '1s/.* //p'`
1122   set x $amver $acver; shift; test x"$[]#" = x"2" || continue
1123   test x"$amver" = x"$acver" || continue
1124   $2
1125   have_am=:; break
1126 done
1127 AT_CHECK([$have_am || exit 77])
1128 AUTOMAKE=$am; export AUTOMAKE
1129 ACLOCAL=$ac; export ACLOCAL
1130 AT_CHECK([$ACLOCAL --version && $AUTOMAKE --version], [0], [stdout])
1133 m4_define([TEST_LTDL_LIBOBJ_MANGLING],
1134 [TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign subdir-objects])
1135 AC_PROG_CC
1136 LT_INIT
1137 AC_SUBST([ltdl_LTLIBOBJS], [libltdl/test.lo])
1138 AC_CONFIG_FILES([Makefile])
1141 mkdir libltdl
1142 AT_DATA([ltdl.mk.in], [[
1143 AM_CPPFLAGS += -DSTRING=\"helloworld\"
1145 noinst_LTLIBRARIES = libltdl/libltdl.la
1146 libltdl_libltdl_la_SOURCES = libltdl/ltdl.c
1147 libltdl_libltdl_la_LIBADD = $(ltdl_LTLIBOBJS)
1148 libltdl_libltdl_la_DEPENDENCIES = $(ltdl_LTLIBOBJS)
1150 EXTRA_DIST += libltdl/test.c
1152 AT_DATA([Makefile.am], [[AM_CPPFLAGS =
1153 include $(top_srcdir)/ltdl.mk
1154 AM_LIBTOOLFLAGS = --quiet
1155 bin_PROGRAMS = test
1156 test_SOURCES =
1157 test_LDADD = libltdl/libltdl.la
1158 all-local: ; @printf '%s\n' $(AM_CPPFLAGS)
1160 AT_DATA([libltdl/test.c], [[#include <stdio.h>
1161 int foo(void) { printf("%s\n", STRING); return 0; }
1163 AT_DATA([libltdl/ltdl.c], [[int foo(void); int main(void) { return foo(); }
1166 AT_CHECK([test_fix_ltdl -i ltdl.mk.in -o ltdl.mk])
1167 libtoolize; TEST_AUTORECONF
1168 TEST_CONFIGURE([--disable-shared])
1169 AT_CHECK([make -s && ./test], [0], [
1170 helloworld
1171 ])])
1173 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (<automake-1.16)])
1174 AT_KEYWORDS([fix-ltdl perl script scripts])
1176 TEST_FIND_AUTOMAKE([default 1.10 1.11 1.12 1.13 1.14 1.15],
1177   [AS_VERSION_COMPARE(["$amver"], [1.16], [], [continue], [continue])])
1178 TEST_LTDL_LIBOBJ_MANGLING
1180 AT_CLEANUP
1182 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (>=automake-1.16)])
1183 AT_KEYWORDS([fix-ltdl perl script scripts])
1185 TEST_FIND_AUTOMAKE([default 1.16 1.17 1.18 1.19],
1186   [AS_VERSION_COMPARE(["$amver"], [1.16], [continue])])
1187 TEST_LTDL_LIBOBJ_MANGLING
1189 AT_CLEANUP