diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-05-13 23:28:36 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-05-13 23:28:36 +0300 |
commit | e8cc15b01976d2c35751e82f2f045b45415293f9 (patch) | |
tree | 5a98c1fb70dc642a61ab35cff84112d2b380082d /tests/testsuite.at | |
parent | 8ec236b000a6b17488dda64587eaeb81db84bdf3 (diff) | |
download | sciteco-e8cc15b01976d2c35751e82f2f045b45415293f9.tar.gz |
revised test suite: got rid of most escaping for the TECO code snippets
* Test cases where hard to read since there was a layer of shell and M4 escaping -- sometimes
with the help of quadrigraphs -- to preserve the original TECO characters.
* We introduced TE_CHECK() and TE_CHECK_CMDLINE() M4 macros which care about shell escaping
automatically.
* If all TECO code is double quoted with [[ and ]], single square and round brackets
are preserved as well.
* Only in case of using *unbalanced* single square brackets, you have to take action
and add `![!` or `!]!` TECO comments to balance them out.
This is still better than quadrigraphs.
* The $ESCAPE and $RUBOUT environment variables are replaced by equivalent
M4 macros, so they can be used with TE_CHECK_CMDLINE().
* Other references to shell variables have been resolved by exporting them
into the environment (as in the case of $srcdir) or by introducing
new M4 macros (TE_MAXINTxx, TE_MININTxx).
* The $WORDS_EXAMPLE variable has been got rid of by writing it into a temporary
file instead. There is some redundancy -- in principle an M4 macro could have also been used.
* This leaves only 6 remaining usages of AT_CHECK() for invoking SciTECO,
mainly for testing opener.tes, where we have to pass in command line arguments.
In theory most of them could be avoided as well by preparing the unnamed buffer appropriately.
However the way that command line parameters are passed will be changed sooner or later.
* This uses GNU M4 extensions, but Autoconf requires that anyway.
Diffstat (limited to 'tests/testsuite.at')
-rw-r--r-- | tests/testsuite.at | 328 |
1 files changed, 176 insertions, 152 deletions
diff --git a/tests/testsuite.at b/tests/testsuite.at index d770232..294bb5e 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -2,7 +2,7 @@ AT_INIT AT_COLOR_TESTS # Will usually be called as -# make chek TESTSUITEFLAGS=--valgrind +# make check TESTSUITEFLAGS=--valgrind AT_ARG_OPTION([valgrind], AS_HELP_STRING([--valgrind], [Run tests under Valgrind (memcheck)])) @@ -12,151 +12,175 @@ AT_ARG_OPTION([valgrind], # idiom "(0/0)" to enforce a "Division by zero" error # whenever we want to fail. # -# NOTE: Square brackets are the current quote characters for M4 but -# often required in TECO code as well. -# We therefore use double brackets [[ ... ]] -# (translated to [ ... ]) in simple cases where balanced -# brackets are required in TECO code as well and -# quadrigraphs (@<:@ and @:>@) in all other cases. -# Single round brackets also have to be replaced with the -# quadrigraphs @{:@ and @:}@. -# -# FIXME: Can we use changequote() to simplify that or will it -# confuse all of Autotest's macros? -# We might also write new M4 macros that care about -# shell escaping (or writing out all test cases into files). +# NOTE: By convention, we double quote the SciTECO test case +# snippets, ie. put them between [[ and ]]. +# The advantage is that single brackets are preserved and do not +# have to be written as quadrigraphs. +# Single brackets must still be balanced, so if you need an unbalanced +# opening or closing bracket, you can add a ![! or !]! TECO comment +# to balance the braces from the viewpoint of M4. +# Round braces are preserved and do not have to be balanced. +# Most test cases can use the TE_CHECK() macro below, which takes +# care of escaping shell constructs. +# Effectively, you can put arbitrary TECO code into TE_CHECK([[...]]) +# calls and only have to take additional actions in case of unbalanced +# square brackets. + +m4_define([TE_CHECK], [ + AT_CHECK([$SCITECO --eval ']m4_bpatsubst([[$1]], ['], ['\\''])['], [$2], [$3], [$4]) +]) +m4_define([TE_CHECK_CMDLINE], [ + AT_CHECK([$SCITECO --no-profile --fake-cmdline ']m4_bpatsubst([[$1]], ['], ['\\''])['], [$2], [$3], [$4]) +]) + +# Control characters for testing immediate editing commands with TE_CHECK_CMDLINE(). +# Often, we can use {...} for testing rubout, but sometimes this is not enough. +# Theoretically, we could directly embed control codes, but for the time being +# I am trying to keep non-TECO sources clean of non-printable characters. +m4_define([TE_ESCAPE], [m4_format([%c], 27)]) +m4_define([TE_RUBOUT], [m4_format([%c], 8)]) +m4_define([TE_RUBOUT_WORD], [m4_format([%c], 23)]) AT_BANNER([Language features]) AT_SETUP([Number stack]) -AT_CHECK([$SCITECO -e "2%a,%a - 3\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[2%a,%a - 3"N(0/0)']], 0, ignore, ignore) # It's not quite clear what would be the best semantics for comma: # a) Superfluous commas as in ",," or "(1,)" should be an error. # b) Superfluous commas should be ignored which is effectively what we do now. # Even then it might be advisable to treat (1,) like (1). # c) The empty "list" element is equivalent to 0, so # "1,,2" is equivalent to "1,0,2" and (1,) to (1,0). -AT_CHECK([$SCITECO -e "(1,) \"~|(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "1,(2)=="], 0, ignore, ignore) +TE_CHECK([[(1,) "~|(0/0)']], 0, ignore, ignore) +TE_CHECK([[1,(2)==]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Radix]) -AT_CHECK([$SCITECO -e "0^R"], 1, ignore, ignore) -AT_CHECK([$SCITECO -e "0U.^R"], 1, ignore, ignore) -AT_CHECK([$SCITECO -e "23 (2^R)\^D .-5\"N(0/0)"], 0, ignore, ignore) +TE_CHECK([[0^R]], 1, ignore, ignore) +TE_CHECK([[0U.^R]], 1, ignore, ignore) +TE_CHECK([[23 (2^R)\^D .-5"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Exponentiation]) -AT_CHECK([$SCITECO -e "-1^*0 - (-1)\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "-1^*-5 - (-1)\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "0^*-5="], 1, ignore, ignore) -AT_CHECK([$SCITECO -e "0^*0 - 1\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "1^*-5 - 1\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "2^*-5 - 0\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[-1^*0 - (-1)"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[-1^*-5 - (-1)"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[0^*-5=]], 1, ignore, ignore) +TE_CHECK([[0^*0 - 1"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[1^*-5 - 1"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[2^*-5 - 0"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Missing left operand]) -AT_CHECK([$SCITECO -e '+23='], 1, ignore, ignore) +TE_CHECK([[+23=]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Operator precedence]) -AT_CHECK([$SCITECO -e "(10-2-3)-5\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "(1-6*5)+29\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "(1-6*5-1)+30\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "(1-6*5-1*2*2)+33\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[(10-2-3)-5"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[(1-6*5)+29"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[(1-6*5-1)+30"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[(1-6*5-1*2*2)+33"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Modifiers]) -AT_CHECK([$SCITECO -e '@:W$ :@W$'], 0, ignore, ignore) +TE_CHECK([[@:W$ :@W$]], 0, ignore, ignore) # Detect invalid modifiers -AT_CHECK([$SCITECO -e '@J'], 1, ignore, ignore) -AT_CHECK([$SCITECO -e ': '], 1, ignore, ignore) -AT_CHECK([$SCITECO -e '::C$'], 1, ignore, ignore) +TE_CHECK([[@J]], 1, ignore, ignore) +TE_CHECK([[: ]], 1, ignore, ignore) +TE_CHECK([[::C$]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Closing loops at the correct macro level]) -AT_CHECK([$SCITECO -e '@^Ua{>} <Ma'], 1, ignore, ignore) +TE_CHECK([[@^Ua{>} <Ma]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Braces in loops]) -AT_CHECK([$SCITECO -e "1<23@{:@42>"], 1, ignore, ignore) -AT_CHECK([$SCITECO -e "1<23(1;)> \"~|(0/0)'"], 0, ignore, ignore) +TE_CHECK([[1<23(42>]], 1, ignore, ignore) +TE_CHECK([[1<23(1;)> "~|(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Pass-through loops]) # NOTE: This requires the <=>, so that values get consumed from the stack. # More elegant would be a command for popping exactly one argument like <:$>. -AT_CHECK([$SCITECO -e "1,2,3,-1:<\"~1;'%a=> Qa-6\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "1,2,3,-1:<\"~1;'%a= F>(0/0)> Qa-6\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "3<%a:>-3\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "3<%a :F>(0/0):>-3\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[1,2,3,-1:<"~1;'%a=> Qa-6"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[1,2,3,-1:<"~1;'%a= F>(0/0)> Qa-6"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[3<%a:>-3"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[3<%a :F>(0/0):>-3"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([String arguments]) -AT_CHECK([$SCITECO -e $'Ifoo^Q\e(0/0)\e'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '@I"foo^Q"(0/0)"'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '@I{foo{bar}foo^Q{(0/0)}'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '@Ia^EQa(0/0)a'], 0, ignore, ignore) +TE_CHECK([[Ifoo^Q]]TE_ESCAPE[[(0/0)]]TE_ESCAPE, 0, ignore, ignore) +TE_CHECK([[@I"foo^Q"(0/0)"]], 0, ignore, ignore) +TE_CHECK([[@I{foo{bar}foo^Q{(0/0)}]], 0, ignore, ignore) +TE_CHECK([[@Ia^EQa(0/0)a]], 0, ignore, ignore) # TODO: String building characters AT_CLEANUP AT_SETUP([Q-Register definitions]) -AT_CHECK([$SCITECO -e '0Ua'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U.a'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U.^X'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U#ab'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U.#ab'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U[[AB]]'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U.[[AB]]'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '0U[[AB^Q@:>@(0/0)]]'], 0, ignore, ignore) +TE_CHECK([[0Ua]], 0, ignore, ignore) +TE_CHECK([[0U.a]], 0, ignore, ignore) +TE_CHECK([[0U.^X]], 0, ignore, ignore) +TE_CHECK([[0U#ab]], 0, ignore, ignore) +TE_CHECK([[0U.#ab]], 0, ignore, ignore) +TE_CHECK([[0U[AB] ]], 0, ignore, ignore) +TE_CHECK([[0U.[AB] ]], 0, ignore, ignore) +TE_CHECK([[] ]], 0, ignore, ignore) # TODO: String building in Q-Register definitions AT_CLEANUP AT_SETUP([Copy, append and cut to Q-Registers]) -AT_CHECK([$SCITECO -e "@I/12^J123/J Xa :Xa L-:@Xa :Qa-9\"N(0/0)' Z-3\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/ABCDE/ 1,4Xa 0,3:Xa 3,5:@Xa :Qa-8\"N(0/0)' Z-3\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@I/12^J123/J Xa :Xa L-:@Xa :Qa-9"N(0/0)' Z-3"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/ABCDE/ 1,4Xa 0,3:Xa 3,5:@Xa :Qa-8"N(0/0)' Z-3"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Q-Register stack]) -AT_CHECK([$SCITECO -e "[[a 23Ub ]]b Qb\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[ [a 23Ub ]b Qb"N(0/0)']], 0, ignore, ignore) # FG will temporarily change the working directory to tests/testsuite.dir. -AT_CHECK([$SCITECO -e "[[\$ @FG'..' ]]\$ :Q\$-1Q\$-^^r\"=(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "[[: @I/XXX/ ]]: .\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[ [$ @FG'..' ]$ :Q$-1Q$-^^r"=(0/0)']], 0, ignore, ignore) +TE_CHECK([[ [: @I/XXX/ ]: ."N(0/0)']], 0, ignore, ignore) AT_CLEANUP +m4_define([TE_MAXINT32], [2147483647]) +m4_define([TE_MININT32], [-2147483648]) +m4_define([TE_MAXINT64], [9223372036854775807]) +m4_define([TE_MININT64], [-9223372036854775808]) + AT_SETUP([Formatting numbers]) # MAXINT32/MININT32: should always work. -AT_CHECK([$SCITECO -e "$MAXINT32\\ J::@S/$MAXINT32/\"F(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "$MININT32\\ J::@S/$MININT32/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK(TE_MAXINT32[[\ J::@S/]]TE_MAXINT32[[/"F(0/0)']], 0, ignore, ignore) +TE_CHECK(TE_MININT32[[\ J::@S/]]TE_MININT32[[/"F(0/0)']], 0, ignore, ignore) AT_SKIP_IF([test $TECO_INTEGER -lt 64]) -AT_CHECK([$SCITECO -e "$MAXINT64\\ J::@S/$MAXINT64/\"F(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "$MININT64\\ J::@S/$MININT64/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK(TE_MAXINT64[[\ J::@S/]]TE_MAXINT64[[/"F(0/0)']], 0, ignore, ignore) +TE_CHECK(TE_MININT64[[\ J::@S/]]TE_MININT64[[/"F(0/0)']], 0, ignore, ignore) AT_CLEANUP # This should always work, at least on systems with a two's complement # representation of negative integers. # We will probably never meet anything else, but at least we check. AT_SETUP([Integer comparisons]) -AT_CHECK([$SCITECO -e "($MAXINT32)-($MAXINT32)\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "($MININT32)-($MININT32)\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[(]]TE_MAXINT32[[)-(]]TE_MAXINT32[[)"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[(]]TE_MININT32[[)-(]]TE_MININT32[[)"N(0/0)']], 0, ignore, ignore) AT_SKIP_IF([test $TECO_INTEGER -lt 64]) -AT_CHECK([$SCITECO -e "($MAXINT64)-($MAXINT64)\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "($MININT64)-($MININT64)\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[(]]TE_MAXINT64[[)-(]]TE_MAXINT64[[)"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[(]]TE_MININT64[[)-(]]TE_MININT64[[)"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Convert between line and glyph positions]) -AT_CHECK([$SCITECO -e "@I/1^J2^J3/J 2^QC :^Q-3\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@I/1^J2^J3/J 2^QC :^Q-3"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Moving by words]) -AT_CHECK([$SCITECO -e "3J 2W @P .-17\"N(0/0)'" "$WORDS_EXAMPLE"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/foo ^J bar/ JW @W .-Z\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "Z-4J 3P .-12\"N(0/0)'" "$WORDS_EXAMPLE"], 0, ignore, ignore) +AT_DATA([words-example.txt], [[navigating (words is useful +]]) +TE_CHECK([[@EB'words-example.txt' 3J 2W @P .-17"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/foo ^J bar/ JW @W .-Z"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@EB'words-example.txt' Z-4J 3P .-12"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Deleting words]) -AT_CHECK([$SCITECO -e "3J 2V .-3\"N(0/0)' @V Z-11\"N(0/0)'" "$WORDS_EXAMPLE"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "Z-4J 2Y .-18\"N(0/0)' 2C @Y Z-19\"N(0/0)'" "$WORDS_EXAMPLE"], 0, ignore, ignore) +AT_DATA([words-example.txt], [[navigating (words is useful +]]) +TE_CHECK([[@EB'words-example.txt' 3J 2V .-3"N(0/0)' @V Z-11"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@EB'words-example.txt' Z-4J 2Y .-18"N(0/0)' 2C @Y Z-19"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Searches]) @@ -164,73 +188,73 @@ AT_SETUP([Searches]) # by a 2nd character. It can be quoted, but cannot be written as Caret+E. # You also cannot search for a single ASCII 5 using Caret+E. # 2 additional ^Q are translated to a single ^Q and interpreted at the search-pattern layer. -AT_CHECK([$SCITECO -e "@I/^Q\05/ J @:S/^Q^Q^Q\05/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK(m4_format([[@I/^Q%c/ J @:S/^Q^Q^Q%c/"F(0/0)']], 5, 5), 0, ignore, ignore) # Canse-sensitive search -AT_CHECK([$SCITECO -e "@I/XXX/J -^X @:S/xxx/\"S(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@I/XXX/J -^X @:S/xxx/"S(0/0)']], 0, ignore, ignore) # Search mode should be local to the macro frame. -AT_CHECK([$SCITECO -e "-^X @^Um{^X} Mm-0\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/XYZ/ J ::@S/X/\"F(0/0)' H::@S/Z/\"S(0/0)'"], 0, ignore, ignore) +TE_CHECK([[-^X @^Um{^X} Mm-0"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/XYZ/ J ::@S/X/"F(0/0)' H::@S/Z/"S(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Search and insertion ranges]) -AT_CHECK([$SCITECO -e "@I/XXYYZZ/^SC .\"N(0/0)' C @S/YY/^YU1U0 Q0-2\"N(0/0)' Q1-4\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/XXYYZZ/J @S/XX^E[[^EMY]]/ 1^YXa :Qa-2\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@I/XXYYZZ/^SC ."N(0/0)' C @S/YY/^YU1U0 Q0-2"N(0/0)' Q1-4"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/XXYYZZ/J @S/XX^E[^EMY]/ 1^YXa :Qa-2"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Editing local registers in macro calls]) -AT_CHECK([$SCITECO -e '@^Ua{@EQ.x//} :Ma @^U.x/FOO/'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '@^Ua{@EQ.x//} Ma @^U.x/FOO/'], 1, ignore, ignore) -AT_CHECK([$SCITECO -e '@^Ua{@EQ.x// Mb Q*U*} Ma'], 0, ignore, ignore) +TE_CHECK([[@^Ua{@EQ.x//} :Ma @^U.x/FOO/]], 0, ignore, ignore) +TE_CHECK([[@^Ua{@EQ.x//} Ma @^U.x/FOO/]], 1, ignore, ignore) +TE_CHECK([[@^Ua{@EQ.x// Mb Q*U*} Ma]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Loading files into Q-Registers]) -AT_CHECK([$SCITECO -e "@I/../ @EW/loadqreg.txt/ @EQa/loadqreg.txt/ :Qa-2\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@I/../ @EW/loadqreg.txt/ @EQa/loadqreg.txt/ :Qa-2"N(0/0)']], 0, ignore, ignore) # Does the same as FG..$. Afterwards, the parent directory should be shorter. -AT_CHECK([$SCITECO -e ":Q\$Ul @EQ\$/loadqreg.txt/ :Q\$-Ql+1\">(0/0)'"], 0, ignore, ignore) +TE_CHECK([[:Q$Ul @EQ$/loadqreg.txt/ :Q$-Ql+1">(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Saving Q-Registers contents to files]) -AT_CHECK([$SCITECO -e "@^Ua/test/ @E%a/saveqreg.txt/ @EB/saveqreg.txt/ Z-4\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@E%\$/saveqreg.txt/ @EB/saveqreg.txt/ Z-:Q\$\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@^Ua/test/ @E%a/saveqreg.txt/ @EB/saveqreg.txt/ Z-4"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@E%$/saveqreg.txt/ @EB/saveqreg.txt/ Z-:Q$"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([8-bit cleanliness]) -AT_CHECK([$SCITECO -e "0@I//J 0A\"N(0/0)' :@S/^@/\"F(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@EQa//0EE 1U*0EE 0:@EUa/f^@^@/ :Qa-4\"N(0/0)' Ga Z-4\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "0EE 129@I// -A-129\"N(0/0)' HXa @EQa// EE\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -8e "129@:^Ua// 0Qa-129\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "1EE 167Ua @I/^EUa/ .-1\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -8e "194Ua Qa@I//J :@S/^EUa/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK([[0@I//J 0A"N(0/0)' :@S/^@/"F(0/0)']], 0, ignore, ignore) +TE_CHECK([[@EQa//0EE 1U*0EE 0:@EUa/f^@^@/ :Qa-4"N(0/0)' Ga Z-4"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[0EE 129@I// -A-129"N(0/0)' HXa @EQa// EE"N(0/0)']], 0, ignore, ignore) +AT_CHECK([[$SCITECO -8e "129@:^Ua// 0Qa-129\"N(0/0)'"]], 0, ignore, ignore) +TE_CHECK([[1EE 167Ua @I/^EUa/ .-1"N(0/0)']], 0, ignore, ignore) +AT_CHECK([[$SCITECO -8e "194Ua Qa@I//J :@S/^EUa/\"F(0/0)'"]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Unicode]) -AT_CHECK([$SCITECO -e "8594@I/Здравствуй, мир!/ Z-17\"N(0/0)' J0A-8594\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "8594@^Ua/Здравствуй, мир!/ :Qa-17\"N(0/0)' 0Qa-8594\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/Здравствуй, мир!/ JW .-12\"N(0/0)' ^E-22\"N(0/0)' 204:EE .-12\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@I/TEST/ @EW/юникод.txt/"], 0, ignore, ignore) -AT_CHECK([test -f юникод.txt], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "^^ß-223\"N(0/0) 23Uъ Q[Ъ]-23\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@O/метка/ !метка!"], 0, ignore, ignore) +TE_CHECK([[8594@I/Здравствуй, мир!/ Z-17"N(0/0)' J0A-8594"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[8594@^Ua/Здравствуй, мир!/ :Qa-17"N(0/0)' 0Qa-8594"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/Здравствуй, мир!/ JW .-12"N(0/0)' ^E-22"N(0/0)' 204:EE .-12"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@I/TEST/ @EW/юникод.txt/]], 0, ignore, ignore) +AT_CHECK([[test -f юникод.txt]], 0, ignore, ignore) +TE_CHECK([[^^ß-223"N(0/0)' 23Uъ Q[Ъ]-23"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[@O/метка/ !метка!]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Automatic EOL normalization]) -AT_CHECK([$SCITECO -e "@EB'${srcdir}/autoeol-input.txt' EL-2\"N(0/0)' 2LR 13@I'' 0EL @EW'autoeol-sciteco.txt'"], +TE_CHECK([[@EB'^EQ[$srcdir]/autoeol-input.txt' EL-2"N(0/0)' 2LR 13@I'' 0EL @EW'autoeol-sciteco.txt']], 0, ignore, ignore) -AT_CHECK([cmp autoeol-sciteco.txt ${srcdir}/autoeol-output.txt], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@EB'autoeol-sciteco.txt' EL-0\"N(0/0)' 2EL @EW''"], 0, ignore, ignore) -AT_CHECK([cmp autoeol-sciteco.txt ${srcdir}/autoeol-input.txt], 0, ignore, ignore) +AT_CHECK([[cmp autoeol-sciteco.txt ${srcdir}/autoeol-output.txt]], 0, ignore, ignore) +TE_CHECK([[@EB'autoeol-sciteco.txt' EL-0"N(0/0)' 2EL @EW'']], 0, ignore, ignore) +AT_CHECK([[cmp autoeol-sciteco.txt ${srcdir}/autoeol-input.txt]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Memory limiting]) -AT_CHECK([$SCITECO -e "50*1000*1000,2EJ <@<:@a>"], 1, ignore, ignore) +TE_CHECK([[50*1000*1000,2EJ <[a> !]!]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Execute external command]) # TODO: It would be a better test to generate a random number of bytes. # Unfortunately, neither $RANDOM, shuf nor jot are portable. # So we have to wait until SciTECO supports a random number generator. -AT_CHECK([$SCITECO -e "@EC'dd if=/dev/zero bs=512 count=1' Z= Z-512\"N(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "0,128ED @EC'dd if=/dev/zero bs=512 count=1' Z= Z-512\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[@EC'dd if=/dev/zero bs=512 count=1' Z= Z-512"N(0/0)']], 0, ignore, ignore) +TE_CHECK([[0,128ED @EC'dd if=/dev/zero bs=512 count=1' Z= Z-512"N(0/0)']], 0, ignore, ignore) AT_CLEANUP # @@ -243,15 +267,15 @@ AT_CLEANUP # AT_SETUP([Rub out with immediate editing commands]) # Must rub out @, but not the colon from the Q-Reg specification. -AT_CHECK([$SCITECO_CMDLINE "Q:@I/XXX/ ${RUBOUT_WORD}{Z-2\"N(0/0)'}"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[Q:@I/XXX/ ]]TE_RUBOUT_WORD[[{Z-2"N(0/0)'}]], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) # Should not rub out @ and : characters. -AT_CHECK([$SCITECO_CMDLINE "@I/ @:foo ${RUBOUT_WORD}/ Z-3\"N(0/0)'"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[@I/ @:foo ]]TE_RUBOUT_WORD[[/ Z-3"N(0/0)']], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Command-line termination while editing replacement register]) -AT_CHECK([$SCITECO_CMDLINE '{$$}'], 0, ignore, stderr) +TE_CHECK_CMDLINE([[{$$}]], 0, ignore, stderr) AT_FAIL_IF([! $GREP "^Error:" stderr]) AT_CLEANUP @@ -261,67 +285,67 @@ AT_SETUP([Command line opener]) AT_DATA([data.123], [0123456789 9876543210 ]) -AT_CHECK([$SCITECO -e "@EM'^EQ[[\$SCITECOPATH]]/opener.tes' M[[opener]] -EF .-13\"N(0/0)'" +2,3 data.123], 0, ignore, ignore) -AT_CHECK([$SCITECO -e "@EM'^EQ[[\$SCITECOPATH]]/opener.tes' M[[opener]] -EF .-11\"N(0/0)'" data.123:2], 0, ignore, ignore) +AT_CHECK([[$SCITECO -e "@EM'^EQ[\$SCITECOPATH]/opener.tes' M[opener] -EF .-13\"N(0/0)'" +2,3 data.123]], 0, ignore, ignore) +AT_CHECK([[$SCITECO -e "@EM'^EQ[\$SCITECOPATH]/opener.tes' M[opener] -EF .-11\"N(0/0)'" data.123:2]], 0, ignore, ignore) # `-S` stops processing of special arguments -AT_CHECK([$SCITECO -e "@EM'^EQ[[\$SCITECOPATH]]/opener.tes' M[[opener]] -EF EJ-2\"N(0/0)'" -S +1 data.123], 0, ignore, ignore) +AT_CHECK([[$SCITECO -e "@EM'^EQ[\$SCITECOPATH]/opener.tes' M[opener] -EF EJ-2\"N(0/0)'" -S +1 data.123]], 0, ignore, ignore) AT_CLEANUP AT_BANNER([Regression Tests]) AT_SETUP([Glob patterns with character classes]) # Also checks closing brackets as part of the character set. -AT_CHECK([$SCITECO -e ":@EN/*.[[@:>@ch]]/foo.h/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK([[![! :@EN/*.[]ch]/foo.h/"F(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Glob patterns with unclosed trailing brackets]) -AT_CHECK([$SCITECO -e ":@EN/*.@<:@h/foo.@<:@h/\"F(0/0)'"], 0, ignore, ignore) +TE_CHECK([[:@EN/*.[h/foo.[h/"F(0/0)' !]]!]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Searching with large counts]) # Even though the search will be unsuccessful, it will not be considered # a proper error, so the process return code is still 0. -AT_CHECK([$SCITECO -e "2147483647@S/foo/"], 0, ignore, ignore) +TE_CHECK([[2147483647@S/foo/]], 0, ignore, ignore) # Will always break the memory limit which is considered an error. -AT_CHECK([$SCITECO -e "-2147483648@S/foo/"], 1, ignore, ignore) +TE_CHECK([[-2147483648@S/foo/]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Search on new empty document]) -AT_CHECK([$SCITECO -e ":@S/foo/\"S(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e ":@N/foo/\"S(0/0)'"], 0, ignore, ignore) +TE_CHECK([[:@S/foo/"S(0/0)']], 0, ignore, ignore) +TE_CHECK([[:@N/foo/"S(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Search for one of characters in uninitialized Q-Register]) # Register "a" exists, but it's string part is yet uninitialized. -AT_CHECK([$SCITECO -e ":@S/^EGa/\"S(0/0)'"], 0, ignore, ignore) +TE_CHECK([[:@S/^EGa/"S(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Search accesses wrong Q-Register table]) -AT_CHECK([$SCITECO -e '@^U.#xx/123/ @^Um{:@S/^EG.#xx/$} :Mm Mm'], 1, ignore, ignore) +TE_CHECK([[@^U.#xx/123/ @^Um{:@S/^EG.#xx/$} :Mm Mm]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Memory limiting during spawning]) # This might result in an OOM if memory limiting is not working -AT_CHECK([$SCITECO -e "50*1000*1000,2EJ 0,128ED @EC'dd if=/dev/zero'"], 1, ignore, ignore) +TE_CHECK([[50*1000*1000,2EJ 0,128ED @EC'dd if=/dev/zero']], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Memory limiting during file reading]) -AT_CHECK([dd if=/dev/zero of=big-file.txt bs=1000 count=50000], 0, ignore, ignore) -AT_CHECK([$SCITECO -8e "50*1000*1000,2EJ @EB'big-file.txt'"], 1, ignore, ignore) +AT_CHECK([[dd if=/dev/zero of=big-file.txt bs=1000 count=50000]], 0, ignore, ignore) +AT_CHECK([[$SCITECO -8e '50*1000*1000,2EJ @EB"big-file.txt"']], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Q-Register stack cleanup]) -AT_CHECK([$SCITECO -e '@<:@a'], 0, ignore, ignore) +TE_CHECK([[ [a !]!]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Uninitialized "_"-register]) -AT_CHECK([$SCITECO -e ":@S//\"S(0/0)'"], 0, ignore, ignore) -AT_CHECK([$SCITECO -e ":@EN///\"S(0/0)'"], 0, ignore, ignore) +TE_CHECK([[:@S//"S(0/0)']], 0, ignore, ignore) +TE_CHECK([[:@EN///"S(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Uninitialized Q-Register in string building]) -AT_CHECK([$SCITECO -e '@I/^E@a/'], 0, ignore, ignore) -AT_CHECK([$SCITECO -e '@I/^ENa/'], 0, ignore, ignore) +TE_CHECK([[@I/^E@a/]], 0, ignore, ignore) +TE_CHECK([[@I/^ENa/]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Setting special Q-Registers with EU]) @@ -329,36 +353,36 @@ AT_SETUP([Setting special Q-Registers with EU]) # should not influence the clipboard (and it's not in Curses anyway). # # Should fail, but not crash -AT_CHECK([$SCITECO -e '@EU*""'], 1, ignore, ignore) -AT_CHECK([$SCITECO -e '@EU$"."'], 0, ignore, ignore) +TE_CHECK([[@EU*""]], 1, ignore, ignore) +TE_CHECK([[@EU$"."]], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Empty help topic]) -AT_CHECK([$SCITECO -e '@?//'], 1, ignore, ignore) +TE_CHECK([[@?//]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Empty lexer name]) -AT_CHECK([$SCITECO -e '@ES/SETILEXER//'], 1, ignore, ignore) +TE_CHECK([[@ES/SETILEXER//]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Empty command string]) -AT_CHECK([$SCITECO -e '@EC//'], 1, ignore, ignore) -AT_CHECK([$SCITECO -e '@EGa//'], 1, ignore, ignore) +TE_CHECK([[@EC//]], 1, ignore, ignore) +TE_CHECK([[@EGa//]], 1, ignore, ignore) AT_CLEANUP AT_SETUP([Jump to beginning of macro]) -AT_CHECK([$SCITECO -e "%a-2\"< F< ' Qa-2\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[%a-2"< F< ' Qa-2"N(0/0)']], 0, ignore, ignore) AT_CLEANUP AT_SETUP([Gotos and labels]) # Not a label redefinition, there must not even be a warning. -AT_CHECK([$SCITECO -e '2<!foo!>'], 0, ignore, stderr) +TE_CHECK([[2<!foo!>]], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Warning:" stderr]) # Will print a warning about label redefinition, though... -AT_CHECK([$SCITECO -e "!foo! Qa\"S^C' !foo! Qa\"S(0/0)' -Ua @O/foo/"], 0, ignore, ignore) +TE_CHECK([[!foo! Qa"S^C' !foo! Qa"S(0/0)' -Ua @O/foo/]], 0, ignore, ignore) # This should not leak memory or cause memory corruptions when running under # Valgrind or Asan: -AT_CHECK([$SCITECO_CMDLINE "!foo!{-5D}"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[!foo!{-5D}]], 0, ignore, stderr) AT_CLEANUP # @@ -366,37 +390,37 @@ AT_CLEANUP # See above for rules. # AT_SETUP([Rub out string append]) -AT_CHECK([$SCITECO_CMDLINE "@I/XXX/ H:Xa{-4D} :Qa-0\"N(0/0)'"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[@I/XXX/ H:Xa{-4D} :Qa-0"N(0/0)']], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Rub out of empty forward kill]) -AT_CHECK([$SCITECO_CMDLINE "@I/F/ J @I/X/ @FK/F/{-6D} Z-2\"N(0/0)'"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[@I/F/ J @I/X/ @FK/F/{-6D} Z-2"N(0/0)']], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Rub out Q-Register specifications]) # This was causing memory corruptions, that would at least show up under Valgrind. -AT_CHECK([$SCITECO_CMDLINE "GaGb{-4D}"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[GaGb{-4D}]], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Restore flags after rub out]) # Must throw an error if the @ flag is restored properly. -AT_CHECK([$SCITECO_CMDLINE '0@W{-D}C'], 0, ignore, stderr) +TE_CHECK_CMDLINE([[0@W{-D}C]], 0, ignore, stderr) AT_FAIL_IF([! $GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Rub out stack operations in macro calls]) # This was causing memory corruptions, that would at least show up under Valgrind. -AT_CHECK([$SCITECO_CMDLINE '@^Um{[[.a]].b}Mm{-2D}'], 0, ignore, stderr) +TE_CHECK_CMDLINE([[@^Um{[.a].b}Mm{-2D}]], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) -AT_CHECK([$SCITECO_CMDLINE '[[.a@^Um{]].b}Mm{-2D}'], 0, ignore, stderr) +TE_CHECK_CMDLINE([[[.a@^Um{].b}Mm{-2D}]], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP AT_SETUP([Searches from macro calls]) -AT_CHECK([$SCITECO_CMDLINE "@^Um{:@S/XXX/} :Mm\"S(0/0)' Mm\"S(0/0)'"], 0, ignore, stderr) +TE_CHECK_CMDLINE([[@^Um{:@S/XXX/} :Mm"S(0/0)' Mm"S(0/0)']], 0, ignore, stderr) AT_FAIL_IF([$GREP "^Error:" stderr]) AT_CLEANUP @@ -407,14 +431,14 @@ AT_SETUP([Number stack]) # will be replaced with proper number parser states, which will also allow for # floating point constants. # With the current parser, it is hard to even interpret the following code correctly... -AT_CHECK([$SCITECO -e "(12)3 - 3\"N(0/0)'"], 0, ignore, ignore) +TE_CHECK([[(12)3 - 3"N(0/0)']], 0, ignore, ignore) AT_XFAIL_IF(true) AT_CLEANUP AT_SETUP([Dangling Else/End-If]) # Should throw syntax errors. -AT_CHECK([$SCITECO -e "'"], 1, ignore, ignore) -AT_CHECK([$SCITECO -e "| (0/0) '"], 1, ignore, ignore) +TE_CHECK([[']], 1, ignore, ignore) +TE_CHECK([[| (0/0) ']], 1, ignore, ignore) AT_XFAIL_IF(true) AT_CLEANUP @@ -425,7 +449,7 @@ AT_CLEANUP ## Should no longer dump core. ## It could fail because the memory limit is exceeed, ## but not in this case since the match string isn't too large. -#AT_CHECK([$SCITECO -e '100000<@I"X">J @S"^EM^X"'], 0, ignore, ignore) +#TE_CHECK([[100000<@I"X">J @S"^EM^X"]], 0, ignore, ignore) #AT_XFAIL_IF(true) #AT_CLEANUP @@ -433,13 +457,13 @@ AT_SETUP([Recursion overflow]) # Should no longer dump core. # It could fail because the memory limit is exceeed, # but not in this case since we limit the recursion. -AT_CHECK([$SCITECO -e "@^Um{U.a Q.a-100000\"<%.aMm'} 0Mm"], 0, ignore, ignore) +TE_CHECK([[@^Um{U.a Q.a-100000"<%.aMm'} 0Mm]], 0, ignore, ignore) AT_XFAIL_IF(true) AT_CLEANUP AT_SETUP([Rub out from empty string argument]) # Should rub out the modifiers as well. -AT_CHECK([$SCITECO_CMDLINE ":@^Ua/${RUBOUT_WORD}{Z\"N(0/0)'}"], 0, ignore, stderr) -AT_CHECK([$GREP "^Error:" stderr], 0, ignore ignore) +TE_CHECK_CMDLINE([[:@^Ua/]]TE_RUBOUT_WORD[[{Z"N(0/0)'}]], 0, ignore, stderr) +AT_CHECK([[$GREP "^Error:" stderr]], 0, ignore ignore) AT_XFAIL_IF(true) AT_CLEANUP |