| # Hand crafted tests for GNU M4. -*- Autotest -*- |
| # Copyright (C) 2001, 2006, 2007, 2008 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/>. |
| |
| AT_BANNER([Options.]) |
| |
| |
| ## ------------------ ## |
| ## deprecated options ## |
| ## ------------------ ## |
| |
| AT_SETUP([deprecated options]) |
| |
| dnl -N/--diversions are no-ops since 1.4.x |
| AT_CHECK_M4([-N1 --diversions=1], [0], [], |
| [[m4: Warning: `-N' is deprecated |
| m4: Warning: `--diversions' is deprecated |
| ]]) |
| |
| dnl -H/--hashsize are no-ops since 2.0 |
| AT_CHECK_M4([-H1 --hashsize=1], [0], [], |
| [[m4: Warning: `-H' is deprecated |
| m4: Warning: `--hashsize' is deprecated |
| ]]) |
| |
| dnl -S/-T are no-ops for compatibility |
| AT_CHECK_M4([-S1 -T1], [0], [], |
| [[m4: Warning: `-S' is deprecated |
| m4: Warning: `-T' is deprecated |
| ]]) |
| |
| dnl -Bint can be confused with its no-op meaning in 1.4.x, but all other |
| dnl uses of -B or its long option are okay |
| AT_CHECK_M4([-B1], [0], [], |
| [[m4: Warning: recommend using `-B ./1' instead |
| ]]) |
| AT_CHECK_M4([-B./1 --prepend-include=1], [0], [], |
| [[]]) |
| |
| dnl --error-output is a misleading name |
| AT_CHECK_M4([--error-output=trace], [0], [], |
| [[m4: Warning: `--error-output' is deprecated, use `--debugfile' instead |
| ]]) |
| AT_CHECK([rm trace]) |
| |
| dnl -o will change meaning in the future |
| AT_CHECK_M4([-otrace], [0], [], |
| [[m4: Warning: `-o' is deprecated, use `--debugfile' instead |
| ]]) |
| AT_CHECK([rm trace]) |
| |
| dnl -e is an odd spelling for --interactive |
| AT_CHECK_M4([-e], [0], [], |
| [[m4: Warning: `-e' is deprecated, use `-i' instead |
| ]]) |
| |
| dnl --arglength is an older spelling for --debuglen |
| AT_CHECK_M4([--arglength=10], [0], [], |
| [[m4: Warning: `--arglength' is deprecated, use `--debuglen' instead |
| ]]) |
| |
| AT_CHECK_M4([--arglength=x], [1], [], |
| [[m4: Warning: `--arglength' is deprecated, use `--debuglen' instead |
| m4: invalid --arglength argument `x' |
| ]]) |
| |
| dnl --word-regexp from 1.4.x is no longer supported. Can't test for its |
| dnl alternate spelling -W, as that now means --warnings. |
| AT_CHECK_M4([[--word-regexp='[a-zA-Z0-9_]+']], [0], [], |
| [[m4: Warning: `--word-regexp' is deprecated |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------- ## |
| ## file names ## |
| ## ---------- ## |
| |
| AT_SETUP([file names]) |
| |
| dnl Check that all files are processed even after missing file |
| AT_DATA([in], [[hello world |
| ]]) |
| AT_CHECK_M4([oops in], [1], [[hello world |
| ]], [[m4: cannot open file `oops': No such file or directory |
| ]]) |
| |
| dnl Check that '-' means stdin, even if ./- exists. |
| AT_DATA([-], [[hi |
| ]]) |
| AT_CHECK_M4([-], [0]) |
| AT_CHECK_M4([- --], [0]) |
| AT_CHECK_M4([-- -], [0]) |
| AT_CHECK_M4([./-], [0], [[hi |
| ]]) |
| AT_CHECK_M4([./- --], [0], [[hi |
| ]]) |
| AT_CHECK_M4([-- ./-], [0], [[hi |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------- ## |
| ## option grouping ## |
| ## --------------- ## |
| |
| AT_SETUP([option grouping]) |
| |
| dnl this test group depends on correct settings of POSIXLY_CORRECT |
| if test -n "${POSIXLY_CORRECT+set}" ; then |
| (unset POSIXLY_CORRECT) >/dev/null 2>&1 || { |
| echo "Problem unsetting POSIXLY_CORRECT" |
| AT_CHECK([exit 77]) |
| } |
| unset POSIXLY_CORRECT |
| fi |
| |
| dnl This comes from the "Invoking m4" node; it was easier to write the |
| dnl test separately than to let generate.awk fiddle with it. |
| AT_DATA([a], [[foo 1 |
| m@&t@4_dnl() |
| ]]) |
| |
| AT_DATA([-d+f], [[hi |
| ]]) |
| |
| dnl First, run with GNU semantics |
| AT_CHECK_M4([-QPDfoo -d a -d+f], [0], [[ 1 |
| ]]) |
| |
| AT_CHECK_M4([-Q -P -D foo -d -d+f -- a], [0], [[ 1 |
| ]]) |
| |
| AT_CHECK_M4([-QPDfoo -d -- a -d+f], [0], [[ 1 |
| hi |
| ]]) |
| |
| AT_CHECK_M4([-Q -P -D foo -d ./a ./-d+f], [0], [[ 1 |
| hi |
| ]]) |
| |
| AT_CHECK_M4([--def foo --debug a], [0], [[ 1 |
| m@&t@4_dnl() |
| ]]) |
| |
| AT_CHECK_M4([--define=foo --debug= -- a], [0], [[ 1 |
| m@&t@4_dnl() |
| ]]) |
| |
| dnl Next, run with POSIX semantics |
| POSIXLY_CORRECT=1 |
| export POSIXLY_CORRECT |
| |
| AT_CHECK_M4([-QPDfoo -d a -d+f], [0], [[ 1 |
| ]]) |
| |
| AT_CHECK_M4([-Q -P -D foo -d -d+f -- ./a], [0], [[ 1 |
| ]]) |
| |
| AT_CHECK_M4([-QPDfoo -d -- a -d+f], [0], [[ 1 |
| hi |
| ]]) |
| |
| AT_CHECK_M4([-Q -P -D foo -d ./a ./-d+f], [0], [[ 1 |
| hi |
| ]]) |
| |
| AT_CHECK_M4([--def foo --debug a], [0], [[ 1 |
| m@&t@4_dnl() |
| ]]) |
| |
| AT_CHECK_M4([--define=foo --debug= -- a], [0], [[ 1 |
| m@&t@4_dnl() |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------- ## |
| ## POSIXLY_CORRECT ## |
| ## --------------- ## |
| |
| AT_SETUP([POSIXLY_CORRECT]) |
| |
| dnl this test group depends on correct settings of POSIXLY_CORRECT |
| if test -n "${POSIXLY_CORRECT+set}" ; then |
| (unset POSIXLY_CORRECT) >/dev/null 2>&1 || { |
| echo "Problem unsetting POSIXLY_CORRECT" |
| AT_CHECK([exit 77]) |
| } |
| unset POSIXLY_CORRECT |
| fi |
| |
| dnl By default, GNU extensions and warnings are enabled |
| AT_DATA([in], [[__line__ |
| dnl() |
| ]]) |
| AT_CHECK_M4([in], [0], [[1 |
| ]], [[m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| AT_CHECK_M4([in -g], [0], [[1 |
| ]], [[m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| AT_CHECK_M4([in -G], [0], [[__line__ |
| ]], [[m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| AT_CHECK_M4([in -W], [0], [[1 |
| ]], [[m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| AT_CHECK_M4([in -Q], [0], [[1 |
| ]]) |
| |
| dnl Next, run with POSIX semantics |
| POSIXLY_CORRECT=1 |
| export POSIXLY_CORRECT |
| |
| dnl POSIXLY_CORRECT implies -G -Q |
| AT_DATA([in], [[__line__ |
| dnl() |
| ]]) |
| AT_CHECK_M4([in], [0], [[__line__ |
| ]]) |
| AT_CHECK_M4([in -g], [0], [[1 |
| ]]) |
| AT_CHECK_M4([in -G], [0], [[__line__ |
| ]]) |
| AT_CHECK_M4([in -W], [0], [[__line__ |
| ]], [[m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| AT_CHECK_M4([in -Q], [0], [[__line__ |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------- ## |
| ## debugfile ## |
| ## --------- ## |
| |
| AT_SETUP([--debugfile]) |
| |
| dnl For a while, CVS m4 mistakenly sent debug output to stdout |
| dnl when stdout and stderr were the same file. |
| |
| AT_DATA([[in]], [[foo |
| ]]) |
| |
| AT_CHECK_M4([--debugfile=trace1 -tfoo -Dfoo=bar in 2>&1], [0], [[bar |
| ]]) |
| |
| AT_CHECK_M4([--debugfile=trace2 -tfoo -Dfoo=bar in], [0], [[bar |
| ]]) |
| |
| AT_CHECK([cmp trace1 trace2]) |
| |
| dnl m4 1.4.x mistakenly created the trace file. --help and --version |
| dnl should always override, even if they come later in the command line |
| AT_CHECK_M4([--debugfile=trace3 --help], [0], [ignore]) |
| AT_CHECK_M4([--debugfile=trace3 --version], [0], [ignore]) |
| AT_CHECK([test -f trace3], [1]) |
| |
| dnl check that trace file failure causes an error, but allows processing |
| AT_CHECK_M4([--debugfile=no_such_dir/trace -tfoo -Dfoo=bar in], [1], |
| [[bar |
| ]], [[m4: cannot set debug file `no_such_dir/trace': No such file or directory |
| m4trace: -1- foo -> `bar' |
| ]]) |
| |
| dnl check that empty trace file discards trace data |
| AT_CHECK_M4([--debugfile= -tfoo -Dfoo=bar in], [0], |
| [[bar |
| ]]) |
| |
| dnl check that all tracing gets diverted to the trace file. Don't use |
| dnl AT_CHECK_M4 on the first run, because sanitizing stderr breaks the |
| dnl comparison with the raw data in the trace file of the second run. |
| AT_CHECK([$M4 -dV in], [0], [[foo |
| ]], [stderr]) |
| mv stderr expout |
| AT_CHECK_M4([--debugfile=trace4 -dV in], [0], [[foo |
| ]]) |
| AT_CHECK([cat trace4], [0], [expout]) |
| |
| AT_CLEANUP |
| |
| |
| ## -------- ## |
| ## debuglen ## |
| ## -------- ## |
| |
| AT_SETUP([--debuglen]) |
| |
| dnl Check for argument validation. |
| |
| AT_DATA([in], |
| [[define(`echo', `$@')dnl |
| traceon(`echo')dnl |
| echo(`long string') |
| ]]) |
| |
| AT_CHECK_M4([--debuglen=-1 in], [1], [], |
| [[m4: invalid --debuglen argument `-1' |
| ]]) |
| |
| AT_CHECK_M4([--debuglen oops in], [1], [], |
| [[m4: invalid --debuglen argument `oops' |
| ]]) |
| |
| AT_CHECK_M4([-l 10oops in], [1], [], |
| [[m4: invalid suffix in -l argument `10oops' |
| ]]) |
| |
| dnl MiB is the suffix to implict 1, resulting in 1048576 |
| AT_CHECK_M4([-lMiB in], [0], [[long string |
| ]], [[m4trace: -1- echo(`long string') -> ``long string'' |
| ]]) |
| |
| dnl this assumes size_t is no bigger than 64 bits |
| AT_CHECK_M4([-l 123456789012345678901234567890 in], [1], [], |
| [[m4: -l argument `123456789012345678901234567890' too large |
| ]]) |
| AT_CHECK_M4([--debugl 123456789012345678901234567890 in], [1], [], |
| [[m4: --debuglen argument `123456789012345678901234567890' too large |
| ]]) |
| |
| dnl per POSIX guidelines, this is a decimal number 10, not octal 8 |
| AT_CHECK_M4([-l 010 in], [0], [[long string |
| ]], [[m4trace: -1- echo(`long strin...') -> ``long stri...' |
| ]]) |
| |
| AT_CHECK_M4([-l 3 in], [0], [[long string |
| ]], [[m4trace: -1- echo(`lon...') -> ``lo...' |
| ]]) |
| |
| AT_CHECK_M4([--debuglen=3 -l0 in], [0], [[long string |
| ]], [[m4trace: -1- echo(`long string') -> ``long string'' |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------- ## |
| ## debugmode ## |
| ## --------- ## |
| |
| AT_SETUP([--debugmode]) |
| |
| AT_DATA([[in]], |
| [[include(`nested')dnl |
| len(`abc') |
| ]]) |
| |
| AT_DATA([[nested]], |
| [[m4wrap(`divnum |
| ')dnl |
| ]]) |
| |
| dnl AT_CHECK_M4 starts life with -d. Make sure it looks like -daeq. |
| AT_CHECK_M4([-tlen in], [0], [[3 |
| 0 |
| ]], [[m4trace: -1- len(`abc') -> `3' |
| ]]) |
| |
| dnl Test all flags. |
| AT_CHECK_M4([-dV in], [0], [[3 |
| 0 |
| ]], [[m4debug: module m4: opening file |
| m4debug: module m4: init hook called |
| m4debug: module m4: opened |
| m4debug: module m4: builtins loaded |
| m4debug: module gnu: opening file |
| m4debug: module gnu: opened |
| m4debug: module gnu: builtins loaded |
| m4debug: module gnu: macros loaded |
| m4debug: path search for `in' found `in' |
| m4debug: input read from in |
| m4trace:in:1: -1- id 1: include ... = <include>{m4} |
| m4debug:in:1: path search for `nested' found `nested' |
| m4debug:in:1: input read from nested |
| m4trace:in:1: -1- id 1: include(`nested') -> <file: nested> |
| m4trace:nested:1: -1- id 2: m4wrap ... = <m4wrap>{m4} |
| m4trace:nested:1: -1- id 2: m4wrap(`divnum |
| ') -> `' |
| m4trace:nested:2: -1- id 3: dnl ... = <dnl>{m4} |
| m4trace:nested:2: -1- id 3: dnl -> `' |
| m4debug:nested:3: input reverted to in, line 1 |
| m4trace:in:1: -1- id 4: dnl ... = <dnl>{m4} |
| m4trace:in:1: -1- id 4: dnl -> `' |
| m4trace:in:2: -1- id 5: len ... = <len>{m4} |
| m4trace:in:2: -1- id 5: len(`abc') -> `3' |
| m4debug:in:3: input exhausted |
| m4debug: input from m4wrap recursion level 1 |
| m4trace:nested:1: -1- id 6: divnum ... = <divnum>{m4} |
| m4trace:nested:1: -1- id 6: divnum -> `0' |
| m4debug: input from m4wrap exhausted |
| m4debug: module gnu: symbols unloaded |
| m4debug: module gnu: finish hook called |
| m4debug: module gnu: closed |
| m4debug: module m4: symbols unloaded |
| m4debug: module m4: resident module not closed |
| ]]) |
| |
| dnl Test addition and subtraction of flags. |
| AT_CHECK_M4([--debug=-e --debugmode=+xt in], [0], [[3 |
| 0 |
| ]], [[m4trace: -1- id 1: include(`nested') |
| m4trace: -1- id 2: m4wrap(`divnum |
| ') |
| m4trace: -1- id 3: dnl |
| m4trace: -1- id 4: dnl |
| m4trace: -1- id 5: len(`abc') |
| m4trace: -1- id 6: divnum |
| ]]) |
| |
| dnl Test that shorter prefix is ambiguous. |
| AT_CHECK_M4([--debu], [1], [], [stderr]) |
| AT_CHECK([sed -e 's/Try.*--help/Try `m4 --help/' stderr], [0], |
| [[m4: option `--debu' is ambiguous |
| Try `m4 --help' for more information. |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------- ## |
| ## discard comments ## |
| ## ---------------- ## |
| |
| AT_SETUP([--discard-comments]) |
| |
| AT_DATA([[in]], |
| [[This is not a comment # but this is. |
| # This line should disappear completely. |
| This should not disappear. |
| changecom(`<!--', `-->') |
| html <!-- |
| comment |
| --> ends. |
| ]]) |
| |
| AT_CHECK_M4([-c in], [0], |
| [[This is not a comment This should not disappear. |
| |
| html ends. |
| ]]) |
| |
| dnl check that even when discarding, a comment must be terminated by EOF |
| AT_DATA([in], [[changecom(`/*', `*/')dnl |
| /* unterminated comment |
| ]]) |
| AT_CHECK_M4([--discard-comments in], [1], [], |
| [[m4:in:2: end of file in comment |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## -------------- ## |
| ## fatal warnings ## |
| ## -------------- ## |
| |
| AT_SETUP([--fatal-warnings]) |
| |
| AT_DATA([[in]], |
| [[dnl() |
| dnl() |
| dnl() |
| ]]) |
| |
| dnl By default, warnings don't affect exit status |
| AT_CHECK_M4([in], [0], [], |
| [[m4:in:1: Warning: dnl: extra arguments ignored: 1 > 0 |
| m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| m4:in:3: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| |
| dnl With one -E, exit status changes, but execution continues |
| AT_CHECK_M4([-E in], [1], [], |
| [[m4:in:1: Warning: dnl: extra arguments ignored: 1 > 0 |
| m4:in:2: Warning: dnl: extra arguments ignored: 1 > 0 |
| m4:in:3: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| |
| dnl With two -E, execution halts immediately |
| AT_CHECK_M4([--fatal-warnings --fatal-warnings in], [1], [], |
| [[m4:in:1: Warning: dnl: extra arguments ignored: 1 > 0 |
| ]]) |
| |
| dnl Exit status can't be affected if there were no warnings |
| AT_CHECK_M4([-EEQ in], [0]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------- ## |
| ## help and version ## |
| ## ---------------- ## |
| |
| AT_SETUP([--help and --version]) |
| |
| AT_CHECK_M4([--help], [0], [stdout]) |
| AT_CHECK([[sed -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]], |
| [0], [success |
| ]) |
| |
| AT_CHECK_M4([--version], [0], [stdout]) |
| AT_CHECK([[sed -n -e 's|There is NO WARRANTY.*|success|p' stdout]], |
| [0], [success |
| ]) |
| |
| dnl make sure option specified first takes precedence |
| AT_CHECK_M4([--help --version], [0], [stdout]) |
| AT_CHECK([[sed -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]], |
| [0], [success |
| ]) |
| |
| AT_CHECK_M4([--version --help], [0], [stdout]) |
| AT_CHECK([[sed -n -e 's|There is NO WARRANTY.*|success|p' stdout]], |
| [0], [success |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------ ## |
| ## import-environment ## |
| ## ------------------ ## |
| |
| AT_SETUP([--import-environment]) |
| |
| AT_DATA([[in]], |
| [[`TEST'=TEST |
| `ZAPPED'=ZAPPED |
| `OVERRIDE'=OVERRIDE |
| ]]) |
| |
| TEST='This is an environment variable' |
| export TEST |
| |
| ZAPPED='This is an environment variable which we will delete' |
| export ZAPPED |
| |
| OVERRIDE='This is an environment variable which we will change' |
| export OVERRIDE |
| |
| AT_CHECK_M4([--import-environment -UZAPPED -DOVERRIDE='It is changed.' in], |
| [0], [[TEST=This is an environment variable |
| ZAPPED=ZAPPED |
| OVERRIDE=It is changed. |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------- ## |
| ## nesting-limit ## |
| ## ------------- ## |
| |
| AT_SETUP([--nesting-limit]) |
| |
| dnl Check for argument validation. |
| |
| AT_DATA([in], |
| [[define(`echo', `$@')dnl |
| echo(echo(echo(echo(`nested string')))) |
| echo(echo(echo(echo(echo(echo(echo(echo(echo(`nested string'))))))))) |
| ]]) |
| |
| AT_CHECK_M4([--nesting-limit=-1 in], [1], [], |
| [[m4: invalid --nesting-limit argument `-1' |
| ]]) |
| |
| AT_CHECK_M4([--nesting-limit oops in], [1], [], |
| [[m4: invalid --nesting-limit argument `oops' |
| ]]) |
| |
| AT_CHECK_M4([-L 10oops in], [1], [], |
| [[m4: invalid suffix in -L argument `10oops' |
| ]]) |
| |
| dnl MiB is the suffix to implict 1, resulting in 1048576 |
| AT_CHECK_M4([-LMiB in], [0], [[nested string |
| nested string |
| ]]) |
| |
| dnl this assumes size_t is no bigger than 64 bits |
| AT_CHECK_M4([-L 123456789012345678901234567890 in], [1], [], |
| [[m4: -L argument `123456789012345678901234567890' too large |
| ]]) |
| AT_CHECK_M4([--nest 123456789012345678901234567890 in], [1], [], |
| [[m4: --nesting-limit argument `123456789012345678901234567890' too large |
| ]]) |
| |
| AT_CHECK_M4([-L 5 in], [1], [[nested string |
| ]], |
| [[m4:in:3: recursion limit of 5 exceeded, use -L<N> to change it |
| ]]) |
| |
| dnl per POSIX guidelines, this is a decimal number 10, not octal 8 |
| AT_CHECK_M4([-L 010 in], [0], [[nested string |
| nested string |
| ]]) |
| |
| AT_CHECK_M4([--nesting-limit=3 -L0 in], [0], [[nested string |
| nested string |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------- ## |
| ## prepend-include ## |
| ## --------------- ## |
| |
| AT_SETUP([--prepend-include]) |
| |
| dnl Lots of data to set up. |
| AT_DATA([[in]], |
| [[include(`foo')dnl |
| include(`bar')dnl |
| include(`bad')dnl |
| include(`blah')dnl |
| ]]) |
| |
| AT_CHECK([mkdir pre post]) |
| |
| AT_DATA([[pre/foo]], [[in pre/foo |
| ]]) |
| AT_DATA([[foo]], [[in ./foo |
| ]]) |
| AT_DATA([[bar]], [[in ./bar |
| ]]) |
| AT_DATA([[post/bar]], [[in post/bar |
| ]]) |
| AT_DATA([[post/blah]], [[in post/blah |
| ]]) |
| |
| dnl Make circular links in the subdirectories, to ensure that the error |
| dnl message when bad cannot be opened comes from the search in ., regardless |
| dnl of what else was searched. |
| AT_CHECK([ln -s bad pre/bad]) |
| AT_CHECK([ln -s bad post/bad]) |
| |
| dnl Finally, see that it all works. |
| AT_CHECK_M4([-I post -B pre in], [1], |
| [[in pre/foo |
| in ./bar |
| in post/blah |
| ]], [[m4:in:3: include: cannot open file `bad': No such file or directory |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------- ## |
| ## regexp-syntax ## |
| ## ------------- ## |
| |
| AT_SETUP([--regexp-syntax]) |
| |
| dnl test argument validation |
| |
| AT_DATA([[in]], [[regexp(`(', `(') |
| ]]) |
| |
| AT_CHECK_M4([--regexp-syntax=unknown in], [1], [], |
| [[m4: bad regexp syntax option: `unknown' |
| ]]) |
| |
| AT_CHECK_M4([--regexp-syntax= in], [0], [[0 |
| ]]) |
| |
| AT_CHECK_M4([-rEXTENDED in], [1], [[ |
| ]], [[m4:in:1: regexp: bad regular expression `(': Unmatched ( or \( |
| ]]) |
| |
| AT_CHECK_M4([-rgnu-m4 in], [0], [[0 |
| ]]) |
| |
| AT_CHECK_M4([-r"gnu M4" in], [0], [[0 |
| ]]) |
| |
| dnl Test behavior of -r intermixed with files |
| AT_CHECK_M4([-rEXTENDED in --regexp-syntax in], [1], [[ |
| 0 |
| ]], [[m4:in:1: regexp: bad regular expression `(': Unmatched ( or \( |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## ----- ## |
| ## safer ## |
| ## ----- ## |
| |
| AT_SETUP([--safer]) |
| |
| dnl with --safer, the debugfile macro is crippled, but --debugfile is not |
| AT_DATA([[in]], |
| [[define(`foo', `1')foo |
| debugfile(`trace2') |
| define(`foo', `2')foo |
| ]]) |
| |
| AT_CHECK_M4([--safer --debugfile trace1 -t foo in], [1], |
| [[1 |
| |
| 2 |
| ]], [[m4:in:2: debugfile: disabled by --safer |
| ]]) |
| |
| AT_CHECK([test -f trace2], [1]) |
| AT_CHECK([cat trace1], [0], |
| [[m4trace: -1- foo -> `1' |
| m4trace: -1- foo -> `2' |
| ]]) |
| |
| dnl make sure builtin cannot bypass --safer, and that mkstemp does not |
| dnl create file |
| AT_DATA([[in]], [[builtin(`mkstemp', `./fooXXXXXX') |
| ]]) |
| |
| AT_CHECK([echo foo*], [0], [foo* |
| ]) |
| |
| AT_CHECK_M4([--safer in], [1], [[ |
| ]], [[m4:in:1: mkstemp: disabled by --safer |
| ]]) |
| |
| AT_CHECK([echo foo*], [0], [foo* |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------- ## |
| ## syncoutput ## |
| ## ---------- ## |
| |
| AT_SETUP([--syncoutput]) |
| |
| dnl -s/--synclines implies --syncoutput=1 |
| AT_DATA([in], [[hi |
| ]]) |
| AT_CHECK_M4([-s in], [0], |
| [[#line 1 "in" |
| hi |
| ]]) |
| AT_CHECK_M4([--synclines in], [0], |
| [[#line 1 "in" |
| hi |
| ]]) |
| |
| dnl test intermixing option and files |
| AT_CHECK_M4([in --syncoutput=1 in --syncoutput in], [0], |
| [[hi |
| #line 1 "in" |
| hi |
| hi |
| ]]) |
| |
| dnl synclines should always start at the beginning of a line. |
| dnl this does not (yet) happen reliably when diversions do not |
| dnl always end in newline |
| AT_XFAIL_IF([:]) |
| AT_DATA([in.m4], [[divert(2)2divert(1)1 |
| dnl |
| undivert |
| ]]) |
| |
| AT_CHECK_M4([-s in.m4], [0], [[1 |
| #line 1 "stdin" |
| 2 |
| ]]) |
| |
| AT_CLEANUP |
| |
| |
| ## -------------------- ## |
| ## traceon and traceoff ## |
| ## -------------------- ## |
| |
| AT_SETUP([--traceon and --traceoff]) |
| |
| dnl test intermixing with files |
| AT_DATA([[in]], [[divnum |
| ]]) |
| AT_CHECK_M4([-d+x in --traceon=divnum in --traceoff=divnum in], [0], |
| [[0 |
| 0 |
| 0 |
| ]], [[m4trace: -1- id 2: divnum -> `0' |
| ]]) |
| |
| dnl test that --traceoff does not warn on untraced name |
| AT_CHECK_M4([--traceoff=unknown], [0]) |
| |
| AT_CLEANUP |