blob: aad7f0d073e7987837f9ac7b0ddcb5f14092bb66 [file] [log] [blame]
# 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 <http://www.gnu.org/licenses/>.
# 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])