autoconf/tests/m4sh.at

636 lines
17 KiB
Plaintext
Raw Normal View History

# -*- Autotest -*-
AT_BANNER([M4sh.])
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
# Foundation, Inc.
#
# This program 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 2, or (at your option)
# any later version.
#
# This program 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, write to the Free Software
2005-05-14 15:00:38 +08:00
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
## ---------------- ##
## LINENO support. ##
## ---------------- ##
AT_SETUP([LINENO])
2002-04-22 19:15:35 +08:00
# We cannot unset LINENO with Zsh, yet this test case relies on
# unsetting LINENO to compare its result when (i) LINENO is supported
# and when (ii) it is not.
# So just skip if the shell is ZSH.
2002-04-22 20:18:36 +08:00
AT_CHECK([test -n "${ZSH_VERSION+set}" && exit 77], ignore)
2002-04-22 19:15:35 +08:00
# AT_DATA_LINENO(FILE-NAME,
# UNSET-LINENO = true | false, COUNTER, COUNTER-RE)
# ----------------------------------------------------------------
# Produce the FILE-NAME M4sh script which uses the COUNTER LINENO or
# _oline_, which we can recognized via COUNTER-RE. Unset LINENO is
# UNSET-LINENO.
#
# Use COUNTER, COUNTER-RE = [__LINENO__], [LINENO]
# or = [__OLINE__], [_oline__]
#
# instead of the obvious $LINENO and __oline__, because they would
# be replaced in the test suite itself, even before creating these
# scripts. For the same reason, grep for LINENO and _oline__ (sic).
#
# UNSET-LINENO is a shell condition to make sure the scripts have the
# same number of lines in the output, so that their outputs be identical.
m4_define([AT_DATA_LINENO],
[AT_DATA([$1.tas],
[[AS@&t@_INIT
if $2; then
AS@&t@_UNSET([LINENO])
fi
_AS@&t@_PREPARE
echo "Line: $3"
grep 'Line: .*$4' $[0] >/dev/null ||
AS@&t@_ERROR([cannot find original script])
exit 0
]])
# If occurrences of $LINENO or __oline__ were wanted, create them.
sed 's/__LINENO__/$''LINENO/g;s/__OLINE__/__''oline__/g' $1.tas >$1.as
AT_CHECK([autom4te -l m4sh $1.as -o $1])
])# AT_DATA_LINENO
# `_oline_', once processed and ran, produces our reference.
2002-04-21 15:25:20 +08:00
# We check that we find ourselves by looking at a string which is
# available only in the original script: `_oline_'.
AT_DATA_LINENO([reference], [false], [__OLINE__], [_oline__])
AT_CHECK([./reference], 0, [stdout])
# The reference:
mv stdout expout
# Now using a maybe-functioning LINENO, with different call conventions.
# Be sure to be out of the PATH.
AT_CHECK([mkdir test || exit 77])
AT_DATA_LINENO([test/test-1], [false], [__LINENO__], [LINENO])
AT_CHECK([./test/test-1], 0, [expout])
AT_CHECK([(PATH=test$PATH_SEPARATOR$PATH; export PATH; exec test-1)],
0, [expout])
AT_CHECK([sh ./test/test-1], 0, [expout])
# Now using a disabled LINENO, with different call conventions.
AT_DATA_LINENO([test/test-2], [true], [__LINENO__], [LINENO])
AT_CHECK([./test/test-2], 0, [expout])
AT_CHECK([(PATH=test$PATH_SEPARATOR$PATH; export PATH; exec test-2)],
0, [expout])
AT_CHECK([sh ./test/test-2], 0, [expout])
AT_CLEANUP
## ------------ ##
## AS_DIRNAME. ##
## ------------ ##
# Build nested dirs.
AT_SETUP([AS@&t@_DIRNAME])
AT_DATA_M4SH([script.as],
[[AS_INIT
# The EXPR variant is allowed to fail if `expr' was considered as too
# weak for us, in which case `as_expr=false'.
m4_define([DIRNAME_TEST],
[dir=`AS_DIRNAME([$1])`
test "$dir" = "$2" || (test -n "$3" && test "$dir" = "$3") ||
echo "dirname($1) = $dir instead of $2" >&2
if test "$as_expr" != false; then
dir=`AS_DIRNAME_EXPR([$1])`
test "$dir" = "$2" || (test -n "$3" && test "$dir" = "$3") ||
echo "dirname_expr($1) = $dir instead of $2" >&2
fi
dir=`AS_DIRNAME_SED([$1])`
test "$dir" = "$2" ||
test "$dir" = "$2" || (test -n "$3" && test "$dir" = "$3") ||
echo "dirname_sed($1) = $dir instead of $2" >&2])
DIRNAME_TEST([/], [/])
DIRNAME_TEST([//], [//], [/])
DIRNAME_TEST([///], [/])
DIRNAME_TEST([//1], [//], [/])
DIRNAME_TEST([/1], [/])
DIRNAME_TEST([./1], [.])
DIRNAME_TEST([../../2], [../..])
DIRNAME_TEST([//1/], [//], [/])
DIRNAME_TEST([/1/], [/])
DIRNAME_TEST([./1/], [.])
DIRNAME_TEST([../../2], [../..])
DIRNAME_TEST([//1/3], [//1])
DIRNAME_TEST([/1/3], [/1])
DIRNAME_TEST([./1/3], [./1])
DIRNAME_TEST([../../2/3], [../../2])
DIRNAME_TEST([//1/3///], [//1])
DIRNAME_TEST([/1/3///], [/1])
DIRNAME_TEST([./1/3///], [./1])
DIRNAME_TEST([../../2/3///], [../../2])
DIRNAME_TEST([//1//3/], [//1])
DIRNAME_TEST([/1//3/], [/1])
DIRNAME_TEST([./1//3/], [./1])
DIRNAME_TEST([../../2//3/], [../../2])
AS_EXIT(0)
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ------------- ##
## AS_BASENAME. ##
## ------------- ##
# Build nested dirs.
AT_SETUP([AS@&t@_BASENAME])
AT_DATA_M4SH([script.as],
[[AS_INIT
m4_define([BASENAME_TEST],
[base=`AS_BASENAME([$1])`
test "$base" = "$2" ||
echo "basename($1) = $base instead of $2" >&2
base=`AS_BASENAME_SED([$1])`
test "$base" = "$2" ||
echo "basename_sed($1) = $base instead of $2" >&2])
BASENAME_TEST([//1], [1])
BASENAME_TEST([/1], [1])
BASENAME_TEST([./1], [1])
BASENAME_TEST([../../2], [2])
BASENAME_TEST([//1/], [1])
BASENAME_TEST([/1/], [1])
BASENAME_TEST([./1/], [1])
BASENAME_TEST([../../2], [2])
BASENAME_TEST([//1/3], [3])
BASENAME_TEST([/1/3], [3])
BASENAME_TEST([./1/3], [3])
BASENAME_TEST([../../2/3], [3])
BASENAME_TEST([//1/3///], [3])
BASENAME_TEST([/1/3///], [3])
BASENAME_TEST([./1/3///], [3])
BASENAME_TEST([../../2/3///], [3])
BASENAME_TEST([//1//3/], [3])
BASENAME_TEST([/1//3/], [3])
BASENAME_TEST([./1//3/], [3])
BASENAME_TEST([a.c], [a.c])
BASENAME_TEST([a.c/], [a.c])
BASENAME_TEST([/a.c/], [a.c])
BASENAME_TEST([/1/a.c], [a.c])
BASENAME_TEST([/1/a.c/], [a.c])
BASENAME_TEST([/1/../a.c], [a.c])
BASENAME_TEST([/1/../a.c/], [a.c])
BASENAME_TEST([./1/a.c], [a.c])
BASENAME_TEST([./1/a.c/], [a.c])
AS_EXIT(0)
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ------------ ##
## AS_MKDIR_P. ##
## ------------ ##
# Build nested dirs.
AT_SETUP([AS@&t@_MKDIR_P])
AT_DATA_M4SH([script.as],
[[AS_INIT
pwd=`pwd`
set -e
# Absolute
AS_MKDIR_P(["$pwd/1/2/3/4/5/6"])
test -d "$pwd/1/2/3/4/5/6" ||
AS_ERROR([$pwd/1/2/3/4/5/6 has not been properly created])
# Relative
AS_MKDIR_P(["a/b/c/d/e/f"])
test -d a/b/c/d/e/f ||
AS_ERROR([a/b/c/d/e/f has not been properly created])
AS_EXIT(0)
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## -------------------- ##
## AS_VERSION_COMPARE. ##
## -------------------- ##
# Build nested dirs.
AT_SETUP([AS@&t@_VERSION_COMPARE])
AT_DATA_M4SH([script.as],
[[AS_INIT
m4_define([VERSION_COMPARE_TEST],
[AS_VERSION_COMPARE([$1], [$3], [result='<'], [result='='], [result='>'])
test "X$result" = "X$2" ||
AS_ERROR([version $1 $result $3; should be $1 $2 $3])
m4_if([$1], <,
[AS_VERSION_COMPARE([$3], [$1], [result='<'], [result='='], [result='>'])
test "X$result" = "X>" ||
AS_ERROR([version $3 $result $1; should be $3 > $1])])])
VERSION_COMPARE_TEST([], =, [])
VERSION_COMPARE_TEST([1.0], =, [1.0])
VERSION_COMPARE_TEST([alpha-1.0], =, [alpha-1.0])
# These tests are taken from libc/string/tst-svc.expect.
tst_svc_expect='
000 001 00 00a 01 01a 0 0a 2.8 2.8-0.4 20 21 22 212 CP037 CP345 CP1257
foo foo-0.4 foo-0.4a foo-0.4b foo-0.5 foo-0.10.5 foo-3.01 foo-3.0
foo-3.0.0 foo-3.0.1 foo-3.2 foo-3.10 foo00 foo0
'
test1=''
for test2 in $tst_svc_expect; do
VERSION_COMPARE_TEST([$test1], <, [$test2])
test1=$test2
done
AS_EXIT(0)
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ----------------------------- ##
## Negated classes in globbing. ##
## ----------------------------- ##
# It is known that `[^...]' is not universally supported, but it is
# unknown for `[!...]'.
AT_SETUP([Negated classes in globbing])
AT_DATA_M4SH([script.as],
[[AS_INIT
case 'with!two!bangs' in
*[[!a-z]]*) ;;
*) AS_ERROR([[`*[!a-z]*' didn't match `with!two!bangs']]);;
esac
case without in
*[[!a-z]]*) AS_ERROR([[`*[!a-z]*' matched `without']]);;
esac
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ------------------- ##
## Functions Support. ##
## ------------------- ##
# Hypothesis: the shell we are running, after having checked for
# $LINENO support, supports functions.
AT_SETUP([Functions Support])
AT_DATA_M4SH([script.as],
[[AS_INIT
_AS_LINENO_PREPARE
func_return () {
(exit $1)
}
func_success () {
func_return 0
}
func_failure () {
func_return 1
}
if func_success; then
if func_failure; then
AS_ERROR([func_failure passed])
fi
else
AS_ERROR([func_success failed])
fi
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ------------------------------ ##
## Functions and return Support. ##
## ------------------------------ ##
# Hypothesis: the shell we are running, after having checked for
# $LINENO support, supports functions, and the `return' keyword.
AT_SETUP([Functions and return Support])
AT_DATA_M4SH([script.as],
[[AS_INIT
_AS_LINENO_PREPARE
func_success () {
return 0
}
func_failure () {
return 1
}
if func_success; then
if func_failure; then
AS_ERROR([func_failure passed])
fi
else
AS_ERROR([func_success failed])
fi
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## ------------------------------------ ##
## AS_REQUIRE_SHELL_FN and m4_require. ##
## ------------------------------------ ##
# Hypothesis: M4sh expands the requirements of AS_REQUIRE_SHELL_FN
# in the main diversion, and not in M4SH-INIT.
AT_SETUP([AS@&t@_REQUIRE_SHELL_FN and m4@&t@_require])
AT_DATA_M4SH([script.as], [[dnl
AS_INIT
m4_defun([in_m4_sh_init], still_in_m4sh_init=yes)
m4_defun([not_in_m4_sh_init], still_in_m4sh_init=no)
m4_defun([error_if_emitted_in_m4sh_init], [
if test x$still_in_m4sh_init = xyes; then
AS_ERROR([requirement emitted in M4SH-INIT])
fi
])
m4_defun([TEST_FUNC_BODY], [
m4_require([error_if_emitted_in_m4sh_init])
: echo in shell function, with parameter = [$]1
])
m4_defun([test_init], [
AS_REQUIRE([in_m4_sh_init])
AS_REQUIRE_SHELL_FN([test_func], [TEST_FUNC_BODY])
AS_REQUIRE([not_in_m4_sh_init])
])
test_init
test_func parameter1
]])
AT_CHECK_M4SH
AT_CHECK([./script])
AT_CLEANUP
## -------------- ##
## AS_HELP_STRING ##
## -------------- ##
# I'm not totally certain that we want to enforce the defaults here,
# but at least it is being tested.
AT_SETUP([AS@&t@_HELP_STRING])
AT_DATA_M4SH([script.as],
[[AS_INIT
_AS_LINENO_PREPARE
echo "AS_HELP_STRING([--an-option],[some text])"
echo "AS_HELP_STRING([--another-much-longer-option],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--fooT=barT], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@12345678901], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789012], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890123], [foo bar])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@12345678901],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789012],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890123],
[some other text which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@12345678901],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@123456789012],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
echo "AS_HELP_STRING([--foo@<][:@=bar@:][>@1234567890123],
[some other @<][:@ex@:][>@ which should wrap at our default of 80 characters.])"
]])
AT_CHECK_M4SH
AT_CHECK([./script], [0],
[[ --an-option some text
--another-much-longer-option
some other text which should wrap at our default of
80 characters.
--fooT=barT foo bar
--foo[=bar] foo bar
--foo[=bar]123456789 foo bar
--foo[=bar]1234567890 foo bar
--foo[=bar]12345678901 foo bar
--foo[=bar]123456789012 foo bar
--foo[=bar]1234567890123
foo bar
--foo[=bar] some other text which should wrap at our default of
80 characters.
--foo[=bar]123456789 some other text which should wrap at our default of
80 characters.
--foo[=bar]1234567890 some other text which should wrap at our default of
80 characters.
--foo[=bar]12345678901 some other text which should wrap at our default of
80 characters.
--foo[=bar]123456789012 some other text which should wrap at our default of
80 characters.
--foo[=bar]1234567890123
some other text which should wrap at our default of
80 characters.
--foo[=bar] some other [ex] which should wrap at our default of
80 characters.
--foo[=bar]123456789 some other [ex] which should wrap at our default of
80 characters.
--foo[=bar]1234567890 some other [ex] which should wrap at our default of
80 characters.
--foo[=bar]12345678901 some other [ex] which should wrap at our default of
80 characters.
--foo[=bar]123456789012 some other [ex] which should wrap at our default of
80 characters.
--foo[=bar]1234567890123
some other [ex] which should wrap at our default of
80 characters.
]])
AT_CLEANUP
## ------------------- ##
## AS_IF and AS_CASE. ##
## ------------------- ##
AT_SETUP([AS@&t@_IF and AS@&t@_CASE])
AT_DATA_M4SH([script.as], [[dnl
AS_INIT
# Syntax checks: cope with empty arguments.
AS_IF([:], [], [echo wrong])
AS_IF([:], [echo one], [echo wrong])
AS_IF([false], [echo wrong], [echo two])
AS_IF([false], [echo wrong])
# n-ary version
AS_IF([false], [echo wrong],
[:], [echo three])
AS_IF([false], [echo wrong],
[:], [echo four],
[echo wrong])
AS_IF([false], [echo wrong],
[false], [echo wrong])
AS_IF([false], [echo wrong],
[false], [echo wrong],
[echo five])
AS_IF([false], [echo wrong],
[false], [echo wrong],
[:], [echo six],
[echo wrong])
AS_CASE([foo])
AS_CASE([foo], [echo seven])
AS_CASE([foo],
[foo], [echo eight],
[echo wrong])
AS_CASE([foo],
[foo], [echo nine],
[*], [echo wrong])
AS_CASE([foo],
[bar], [echo wrong],
[foo], [echo ten],
[*], [echo wrong])
# check that require works correctly
m4_for([n], 1, 9, [],
[m4_defun([FOO]n, [foo]n[=]n)dnl
m4_defun([BAR]n,
[m4_require([FOO]]n[)dnl
bar]n[=]n)[]dnl
])
AS_IF([:], [BAR1])
echo "foo1=$foo1 bar1=$bar1"
AS_IF([:], [], [BAR2])
echo "foo2=$foo2 bar2=$bar2"
AS_IF([false], [BAR3])
echo "foo3=$foo3 bar3=$bar3"
AS_IF([false], [], [BAR4])
echo "foo4=$foo4 bar4=$bar4"
AS_CASE([x], [x], [BAR5])
echo "foo5=$foo5 bar5=$bar5"
AS_CASE([x], [y], [BAR6])
echo "foo6=$foo6 bar6=$bar6"
AS_CASE([x],
[x], [:],
[BAR7])
echo "foo7=$foo7 bar7=$bar7"
AS_CASE([x],
[y], [:],
[BAR8])
echo "foo8=$foo8 bar8=$bar8"
AS_CASE([x],
[y], [:],
[x], [BAR9])
echo "foo9=$foo9 bar9=$bar9"
]])
AT_CHECK_M4SH
AT_CHECK([./script], [0], [[one
two
three
four
five
six
seven
eight
nine
ten
foo1=1 bar1=1
foo2=2 bar2=
foo3=3 bar3=
foo4=4 bar4=4
foo5=5 bar5=5
foo6=6 bar6=
foo7=7 bar7=
foo8=8 bar8=8
foo9=9 bar9=9
]])
AT_CLEANUP