* lib/m4sugar/m4sh.m4 (AS_DIRNAME_EXPR): Use AS_REQUIRE.

* tests/tools.at (AT_DATA_FORBIDDEN): Rename/move/duplicate to...
* tests/atspecific.m4 (AT_DATA_M4SUGAR, AT_DATA_M4SH): here.
* tests/tools.at, tests/m4sh.at: Use it.
* tests/m4sh.at: Don't rely on Autoconf macros.
(DIRNAME_TEST): Also exercise the expr variant.
* tests/m4sugar.at, tests/atspecific.m4 (AT_CHECK_M4SUGAR): The
preferred M4sugar extension is now `.4s'.
* tests/README: Remove.
This commit is contained in:
Akim Demaille 2001-10-08 08:21:54 +00:00
parent 201baaa8df
commit 0717332aed
7 changed files with 119 additions and 174 deletions

View File

@ -1,3 +1,15 @@
2001-10-08 Akim Demaille <akim@epita.fr>
* lib/m4sugar/m4sh.m4 (AS_DIRNAME_EXPR): Use AS_REQUIRE.
* tests/tools.at (AT_DATA_FORBIDDEN): Rename/move/duplicate to...
* tests/atspecific.m4 (AT_DATA_M4SUGAR, AT_DATA_M4SH): here.
* tests/tools.at, tests/m4sh.at: Use it.
* tests/m4sh.at: Don't rely on Autoconf macros.
(DIRNAME_TEST): Also exercise the expr variant.
* tests/m4sugar.at, tests/atspecific.m4 (AT_CHECK_M4SUGAR): The
preferred M4sugar extension is now `.4s'.
* tests/README: Remove.
2001-10-08 Akim Demaille <akim@epita.fr>
* lib/m4sugar/m4sugar.m4 (m4_provide_ifelse): Rename as...

View File

@ -388,13 +388,8 @@ m4_define([AS_ERROR],
# a silly length limit that causes expr to fail if the matched
# substring is longer than 120 bytes. So fall back on echo|sed if
# expr fails.
#
# FIXME: Please note the following m4_require is quite wrong: if the first
# occurrence of AS_DIRNAME_EXPR is in a backquoted expression, the
# shell will be lost. We might have to introduce diversions for
# setting up an M4sh script: required macros will then be expanded there.
m4_defun([AS_DIRNAME_EXPR],
[m4_require([_AS_EXPR_PREPARE])dnl
[AS_REQUIRE([_AS_EXPR_PREPARE])dnl
$as_expr X[]$1 : 'X\(.*[[^/]]\)//*[[^/][^/]]*/*$' \| \
X[]$1 : 'X\(//\)[[^/]]' \| \
X[]$1 : 'X\(//\)$' \| \

View File

@ -1,78 +0,0 @@
-*- outline -*-
This directory holds the M4sugar, M4sh and Autoconf test suites.
Here are a few rules on how to write tests.
* Order of the tests
It is extremely important to pay attention to the order of the tests.
There are basically two philosophies: (i) test earlier the most
critical features (hence hurried users will at least check those), or
(ii) test earlier the primitives.
For having tried both, I definitely recommend (ii). In practice users
will run the whole test suite even if it's long. And if they don't,
there will be enough other users who will do the job.
But also in practice some problems in the core of project can be
responsible for an incredible number of failures. Then the problems
at the origin will be hidden by the consequences. If dependencies are
properly ordered in the test suite (test features which depend upon
other features *after* having checked the latter), basically you'll
just have to pay attention to the first failures. BTW, it also makes
`./testsuite -e' much more useful.
* Write tests!
Don't let you be bitten three times by the same dog! When you spent a
significant amount of time tracking the failure of feature in some
more primitive problem, immediately write a test for the latter.
If you track down several bugs down to the same origin, write a test
especially for it.
Of course in both cases, more primitive tests will be run beforehand.
Write your test and have it failed before your fixing, and succeeding
after. This usually means having at hand two copies of the source
tree, one running the test suite to have it fail, and the other to
have the same testsuite succeed.
* Autoconf
** Use of `exit'
Don't directly `exit 1' or `exit 77', rather use `AC_MSG_ERROR'.
First of all because when we have to read the test suite logs we are
happy to know why `configure' exited thanks to the error
message. Secondly, because `configure' traps the `exit' and pretty
many shells fail to set $? to 77 when trapping `exit 77'. This
results in the test suite not being able to check the exit status.
** AC_MSG_ERROR
Of course, since macro names are forbidden in `configure', if you
really want to mention the macro name, you'll have to do without
including `A?_' in the output.
-----
Copyright 2000 Free Software Foundation, Inc.
This file is part of GNU Autoconf.
GNU Autoconf 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.
GNU Autoconf 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 autoconf; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.

View File

@ -1,5 +1,4 @@
# M4 macros used in building Autoconf test suites. -*- Autotest -*-
# Copyright 2000, 2001 Free Software Foundation, Inc.
# Copyright 2000, 2001 Free Software Foundation, Inc.
@ -19,18 +18,43 @@
# 02111-1307, USA.
## ------------------------------------ ##
## Macros specialized in testing M4sh. ##
## ------------------------------------ ##
## ----------------- ##
## Testing M4sugar. ##
## ----------------- ##
# AT_DATA_M4SUGAR(FILENAME, CONTENTS)
# --------------------------------
# Escape the invalid tokens with @&t@.
m4_define([AT_DATA_M4SUGAR],
[AT_DATA([$1],
[m4_patsubst(m4_patsubst([[$2]], [\(m4\)_], [\1@&t@_]),
[dnl], [d@&t@nl])])])
# AT_CHECK_M4SUGAR(FLAGS, [EXIT-STATUS = 0], STDOUT, STDERR)
# ----------------------------------------------------------
m4_define([AT_CHECK_M4SUGAR],
[AT_CLEANUP_FILES([script.4s script autom4te.cache])dnl
AT_CHECK([autom4te --language=m4sugar script.s4g -o script $1],
AT_CHECK([autom4te --language=m4sugar script.4s -o script $1],
m4_default([$2], [0]), [$3], [$4])])
## -------------- ##
## Testing M4sh. ##
## -------------- ##
# AT_DATA_M4SH(FILENAME, CONTENTS)
# --------------------------------
# Escape the invalid tokens with @&t@.
m4_define([AT_DATA_M4SH],
[AT_DATA([$1],
[m4_patsubst(m4_patsubst([[$2]], [\(m4\|AS\)_], [\1@&t@_]),
[dnl], [d@&t@nl])])])
# AT_CHECK_M4SH(FLAGS, [EXIT-STATUS = 0], STDOUT, STDERR)
# -------------------------------------------------------
m4_define([AT_CHECK_M4SH],
@ -39,9 +63,10 @@ AT_CHECK([autom4te --language=m4sh script.as -o script $1],
m4_default([$2], [0]), [$3], [$4])])
## ---------------------------------------- ##
## Macros specialized in testing Autoconf. ##
## ---------------------------------------- ##
## ------------------ ##
## Testing Autoconf. ##
## ------------------ ##
# AT_CONFIGURE_AC(BODY)

View File

@ -42,18 +42,15 @@ AT_SETUP([LINENO])
# 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],
[[AS@&t@_INIT
m4@&t@_divert_push([0])d@&t@nl
m4@&t@_wrap([m4@&t@_divert_pop([0])[]])d@&t@nl
#! /bin/sh
[AT_DATA_M4SH([$1],
[[AS_INIT
if $2; then
AS@&t@_UNSET([LINENO])
AS_UNSET([LINENO])
fi
AS@&t@_SHELL_SANITIZE
AS_SHELL_SANITIZE
echo "Line: $3"
grep 'Line: .*$4' $[0] >/dev/null ||
AS@&t@_ERROR([cannot find original script])
AS_ERROR([cannot find original script])
exit 0
]])
])# AT_DATA_LINENO
@ -89,24 +86,29 @@ AT_CHECK([sh test/test-2], 0, [expout])
AT_CLEANUP(reference test test-1.lineno test-2.lineno)
## ----------------------------- ##
## AS_DIRNAME & AS_DIRNAME_SED. ##
## ----------------------------- ##
## ------------ ##
## AS_DIRNAME. ##
## ------------ ##
# Build nested dirs.
m4_pattern_allow([^AS_DIRNAME(_SED)?$])
AT_SETUP([[AS_DIRNAME & AS_DIRNAME_SED]])
AT_SETUP([[AS@&t@_DIRNAME]])
AT_DATA([configure.ac],
[[AS@&t@_INIT
_AS@&t@_EXPR_PREPARE
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" ||
echo "dirname($1) = $dir instead of $2" >&2
if test "$as_expr" != false; then
dir=`AS_DIRNAME_EXPR([$1])`
test "$dir" = "$2" ||
echo "dirname_expr($1) = $dir instead of $2" >&2
fi
dir=`AS_DIRNAME_SED([$1])`
test "$dir" = "$2" ||
echo "dirname_sed($1) = $dir instead of $2" >&2])
@ -137,25 +139,22 @@ DIRNAME_TEST([../../2//3/], [../../2])
AS_EXIT(0)
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK_M4SH
AT_CHECK([script])
AT_CLEANUP(configure)
AT_CLEANUP
## ------------------------------- ##
## AS_BASENAME & AS_BASENAME_SED. ##
## ------------------------------- ##
## ------------- ##
## AS_BASENAME. ##
## ------------- ##
# Build nested dirs.
m4_pattern_allow([^AS_BASENAME(_SED)?$])
AT_SETUP([[AS_BASENAME & AS_BASENAME_SED]])
AT_SETUP([[AS@&t@_BASENAME]])
AT_DATA([configure.ac],
[[AS@&t@_INIT
_AS@&t@_EXPR_PREPARE
AT_DATA_M4SH([script.as],
[[AS_INIT
m4_define([BASENAME_TEST],
[base=`AS_BASENAME([$1])`
@ -197,10 +196,10 @@ BASENAME_TEST([./1/a.c/], [a.c])
AS_EXIT(0)
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK_M4SH
AT_CHECK([script])
AT_CLEANUP(configure)
AT_CLEANUP
@ -209,29 +208,28 @@ AT_CLEANUP(configure)
## ------------ ##
# Build nested dirs.
m4_pattern_allow([^AS_MKDIR_P$])
AT_SETUP([[AS_MKDIR_P]])
AT_SETUP([[AS@&t@_MKDIR_P]])
AT_DATA([configure.ac],
[[AS@&t@_INIT
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" ||
AC_MSG_ERROR([$pwd/1/2/3/4/5/6 has not been properly created])
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 ||
AC_MSG_ERROR([a/b/c/d/e/f has not been properly created])
AS_ERROR([a/b/c/d/e/f has not been properly created])
AS_EXIT(0)
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK_M4SH
AT_CHECK([script])
AT_CLEANUP(configure 1 a)
AT_CLEANUP(1 a)
@ -245,20 +243,20 @@ AT_CLEANUP(configure 1 a)
AT_SETUP([Negated classes in globbing])
AT_DATA([configure.ac],
[[AS@&t@_INIT
AT_DATA_M4SH([script.as],
[[AS_INIT
case 'with!two!bangs' in
*[[!a-z]]*) ;;
*) AC_MSG_ERROR([[`*[!a-z]*' didn't match `with!two!bangs']]);;
*) AS_ERROR([[`*[!a-z]*' didn't match `with!two!bangs']]);;
esac
case without in
*[[!a-z]]*) AC_MSG_ERROR([[`*[!a-z]*' matched `without']]);;
*[[!a-z]]*) AS_ERROR([[`*[!a-z]*' matched `without']]);;
esac
]])
AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE
AT_CHECK_M4SH
AT_CHECK([script])
AT_CLEANUP

View File

@ -32,8 +32,7 @@ AT_BANNER([M4sugar.])
## m4_warn. ##
## --------- ##
m4_pattern_allow([^m4_warn$])
AT_SETUP([[m4_warn]])
AT_SETUP([[m4@&t@_warn]])
# m4_text_wrap is used to display the help strings. Also, check that
# commas are not swallowed. This can easily happen because of
@ -42,29 +41,29 @@ AT_SETUP([[m4_warn]])
# FIXME: For the time being we use -f to make sure we do issue the
# warnings. But maybe autom4te should handle that by itself?
AT_DATA([script.s4g],
AT_DATA_M4SUGAR([script.4s],
[[m4_warn([foo], [foo])
m4_warn([bar], [bar])
m4_warn([syntax], [syntax])
]])
AT_CHECK_M4SUGAR([-o-], 0, [],
[script.s4g:3: warning: syntax
[script.4s:3: warning: syntax
])
AT_CHECK_M4SUGAR([-o- -Wall -f], 0, [],
[script.s4g:1: warning: foo
script.s4g:2: warning: bar
script.s4g:3: warning: syntax
[script.4s:1: warning: foo
script.4s:2: warning: bar
script.4s:3: warning: syntax
])
AT_CHECK_M4SUGAR([-o- -Wnone,bar -f], 0, [],
[script.s4g:2: warning: bar
[script.4s:2: warning: bar
])
AT_CHECK_M4SUGAR([-o- -Wnone,bar,error -f], 1, [],
[script.s4g:2: error: bar
script.s4g:2: the top level
[script.4s:2: error: bar
script.4s:2: the top level
])
AT_CLEANUP
@ -74,14 +73,13 @@ AT_CLEANUP
## m4_require: circular dependencies. ##
## ----------------------------------- ##
m4_pattern_allow([^m4_(require|defun|init)$])
AT_SETUP([[m4_require: circular dependencies]])
AT_SETUP([[m4@&t@_require: circular dependencies]])
# m4_text_wrap is used to display the help strings. Also, check that
# commas are not swallowed. This can easily happen because of
# m4-listification.
AT_DATA([script.s4g],
AT_DATA_M4SUGAR([script.4s],
[[m4_defun([foo],
[m4_require([bar])])
@ -95,17 +93,18 @@ m4_init
baz
]])
AT_CHECK_M4SUGAR([], 1, [],
[[script.s4g:11: error: m4_require: circular dependency of foo
script.s4g:11: foo is required by...
script.s4g:5: bar is expanded from...
script.s4g:11: bar is required by...
script.s4g:2: foo is expanded from...
script.s4g:11: foo is required by...
script.s4g:8: baz is expanded from...
script.s4g:11: the top level
AT_DATA_M4SUGAR([experr],
[[script.4s:11: error: m4_require: circular dependency of foo
script.4s:11: foo is required by...
script.4s:5: bar is expanded from...
script.4s:11: bar is required by...
script.4s:2: foo is expanded from...
script.4s:11: foo is required by...
script.4s:8: baz is expanded from...
script.4s:11: the top level
]])
AT_CHECK_M4SUGAR([], 1, [], experr)
AT_CLEANUP
@ -113,15 +112,14 @@ AT_CLEANUP
## m4_text_wrap. ##
## -------------- ##
m4_pattern_allow([^m4_text_wrap$])
AT_SETUP([[m4_text_wrap]])
AT_SETUP([[m4@&t@_text_wrap]])
# m4_text_wrap is used to display the help strings. Also, check that
# commas are not swallowed. This can easily happen because of
# m4-listification.
AT_DATA([script.s4g],
[[m4@&t@_divert_push([0])m4@&t@_wrap([m4@&t@_divert_pop([0])])d@&t@nl
AT_DATA_M4SUGAR([script.4s],
[[m4_divert_push([0])m4_wrap([m4_divert_pop([0])])dnl
m4_text_wrap([Short string */], [ ], [/* ], 20)
m4_text_wrap([Much longer string */], [ ], [/* ], 20)

View File

@ -236,17 +236,12 @@ AT_CLEANUP
## autoconf: forbidden tokens. ##
## ---------------------------- ##
# AT_DATA_FORBIDDEN(FILENAME, CONTENTS)
# -------------------------------------
# Escape the invalid tokens with @&t@.
m4_define([AT_DATA_FORBIDDEN],
[AT_DATA([$1], [m4_patsubst([$2], [\(m4\|AS\)_], [\1@&t@_])])])
# autoconf: forbidden tokens, basic
# ---------------------------------
AT_SETUP([autoconf: forbidden tokens, basic])
AT_DATA_FORBIDDEN([configure.ac],
AT_DATA_M4SH([configure.ac],
[[AS_INIT
m4_foo
_m4_bar
@ -255,7 +250,7 @@ _AS_BAR
[d@&t@nl]
]])
AT_DATA_FORBIDDEN([experr],
AT_DATA_M4SH([experr],
[[configure.ac:2: error: possibly undefined macro: m4_foo
configure.ac:3: error: possibly undefined macro: _m4_bar
configure.ac:4: error: possibly undefined macro: AS_FOO
@ -272,7 +267,7 @@ AT_CLEANUP
# --------------------------------------
AT_SETUP([autoconf: forbidden tokens, exceptions])
AT_DATA_FORBIDDEN([configure.ac],
AT_DATA_M4SH([configure.ac],
[[AS_INIT
# This is allowed in spite of the name.
@ -294,7 +289,7 @@ BAS_DEFINE
It would be very bad if Autoconf forgot to expand [AS_]INIT!
]])
AT_DATA_FORBIDDEN([experr],
AT_DATA_M4SH([experr],
[[configure.ac:1: error: possibly undefined macro: AS_INIT
configure.ac:7: error: possibly undefined macro: AS_ALLOWED_NOT
configure.ac:10: error: possibly undefined macro: FORBIDDEN