# Process with autom4te to create an -*- Autotest -*- test suite. # Test suite for GNU M4. # Copyright (C) 2001, 2006-2010, 2013-2014 Free Software Foundation, # Inc. # This file is part of GNU M4. # # GNU M4 is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GNU M4 is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # We need a recent Autotest. m4_version_prereq([2.63b-41]) # Default to testing "m4 -b", but allow overrides. dnl This uses knowledge of undocumented autotest internals; hopefully dnl it isn't too much of a problem. FIXME: Help autoconf document dnl proper usage of HELP_OTHER, at_write_fail, and at_tested (or better dnl yet, add AT_FOO macros that wrap these internal details). m4_divert_text([HELP_OTHER], [cat <<\_ATEOF || at_write_fail=1 The environment variable `M4' controls which binary is tested, default `m4 -b'. _ATEOF]) m4_divert_text([PREPARE_TESTS], [[if test "${M4+set}" = set; then case $M4 in *[\\/]* ) at_tested= ;; * ) at_tested=`set x $M4; echo $2` ;; esac else M4='m4 -b' fi]]) # AT_CHECK_M4(ARGS, [EXIT-STATUS = 0], [STDOUT = `'], [STDERR = `'], # [STDIN = `/dev/null'], [INHIBIT-D]) # ------------------------------------------------------------------ # Run m4 with ARGS, and stdin redirected from STDIN, or with stdin closed # if STDIN is `-'. ARGS may redirect stdout and/or stderr, but should # not redirect stdin. Expect EXIT-STATUS, with output matching STDOUT and # STDERR as in AT_CHECK. If STDERR is specified, normalize the observed # error output. Unless INHIBIT-D is specified, add -d prior to ARGS. # # When testing an uninstalled wrapper, tests/m4 is on the path, but invokes # src/m4, which may itself be a libtool wrapper. Also, some platforms # choose to display argv[0] differently: # path/to/lt-m4:file:line: message # or m4.exe:file:line: message # to m4:file:line # # When testing closed file descriptors, the message is platform-dependent: # m4: error closing file: Bad file number # to m4: error closing file: Bad file descriptor # # When tracing modules, the module name is platform-dependent: # m4debug: module gnu: opening file `gnu.so' # or m4debug: module gnu: opening file `gnu.a' # to m4debug: module gnu: opening file # # When testing modules, a failed module name is platform-dependent: # m4:input.m4:7: cannot open module `no_such': no_such.so: cannot open shared object file: No such file or directory # or m4:input.m4:7: cannot open module `no_such': can't open the module # to m4:input.m4:7: cannot open module `no_such' # # When encountering command line option errors, the error message is # platform-dependent, but contains " option ": # m4: unrecognized option `--diversions=1' # glibc 2.6 # or m4: unrecognized option '--diversions=1' # glibc 2.11 # or m4: unknown option -- --diversions # BSD # or m4: option '--debu' is ambiguous # glibc 2.11 # or m4: ambiguous option -- --debu # BSD # to m4: bad option m4_define([AT_CHECK_M4], [AT_CHECK([$M4 m4_ifval([$6], [], [-d ])$1 ]m4_if([$5], [-], [<&-], [< m4_default([$5], [/dev/null])]), [$2], [$3], m4_case([$4], [], [], [ignore], [ignore], [stderr])) m4_case([$4], [], [], [ignore], [], [AT_CHECK([[$SED 's/^[^:]*[lt-]*m4[.ex]*:/m4:/ /^m4debug: module/s/opening file.*/opening file/ s/\(cannot open module [^:]*\):.*/\1/ s/Bad file number/Bad file descriptor/ s/^m4:.* option .*/m4: bad option/ ' stderr >&2]], [0], [], [$4])]) ]) # M4_ONE_MEG_DEFN # --------------- # emit a code snippet for use in AT_DATA that will define a macro `f' to # consist of 1M bytes of newlines. With that in place, it is then easy # to use divert and invoke `f' in the test file to force diversions to # spill into a temporary file. m4_define([M4_ONE_MEG_DEFN], [pushdef(`diversion', divnum)divert(-1) define(`f', ` ') define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) define(`f', defn(`f')defn(`f')) divert(diversion)popdef(`diversion')]) # AT_TEST_M4(TITLE, INPUT, [STDOUT = `'], [STDERR = `']) # ------------------------------------------------------ # Run m4 on INPUT, expecting a success. m4_define([AT_TEST_M4], [AT_SETUP([$1]) AT_DATA([[input.m4]], [$2]) AT_CHECK_M4([[input.m4]], 0, [$3], [$4]) AT_CLEANUP ]) # We use `dnl' in zillions of places... m4_pattern_allow([^dnl$]) # We exercise m4. AT_TESTED([m4]) # AT_CHECK_DYNAMIC_MODULE # ----------------------- # Add keyword `module' to the test, and skip the test if dynamic # modules were disabled at configure time. m4_define([AT_CHECK_DYNAMIC_MODULE], [AT_KEYWORDS([module]) AT_CHECK([if test "x$DYNAMIC_MODULES" = xno ; then echo Dynamic module support not detected, skipping this test. exit 77 fi])]) # AT_CHECK_GMP # ----------------------- # Add keyword `gmp' to the test, and skip the test if the use of GMP # was disabled at configure time. m4_define([AT_CHECK_GMP], [AT_KEYWORDS([gmp]) AT_CHECK([if test "x$USE_GMP" = xno ; then echo libgmp support not detected, skipping this test. exit 77 fi])]) ## ----------- ## ## The suite. ## ## ----------- ## AT_INIT # Macro definitions, uses, tracing etc. m4_include([macros.at]) # Torturing builtins. m4_include([builtins.at]) # Options. m4_include([options.at]) # Frozen files. m4_include([freeze.at]) # Hand crafted tests. m4_include([others.at]) # Torturing the modules support. m4_include([modules.at]) # From the documention. m4_include([generated.at])