https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7988a2ac54da88240b632…
commit 7988a2ac54da88240b632d00c7597a7f6da13db9
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Mon Jul 27 19:29:59 2020 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sat Sep 26 17:51:07 2020 +0200
[CMD_ROSTEST] Add more tests for the command echoer and new tests for the parser.
---
modules/rostests/win32/cmd/test_echoer_parser.cmd | 451 +++++++++++++++++++++
.../rostests/win32/cmd/test_echoer_parser.cmd.exp | 295 ++++++++++++++
2 files changed, 746 insertions(+)
diff --git a/modules/rostests/win32/cmd/test_echoer_parser.cmd
b/modules/rostests/win32/cmd/test_echoer_parser.cmd
index e94313871f7..ecb20a63afd 100644
--- a/modules/rostests/win32/cmd/test_echoer_parser.cmd
+++ b/modules/rostests/win32/cmd/test_echoer_parser.cmd
@@ -251,6 +251,457 @@ if 1==1 (
)
+
+:: Parsing FOR, IF and REM commands.
+::
+:: Note: wrong syntaxes for FOR, IF, REM or parsing operators
+:: are considered syntactic errors and batch running stops.
+:: For all other commands, execution continues.
+::
+
+@echo on
+
+echo --------- Parsing FOR, IF and REM commands ---------
+
+fOr@space@@space@@space@@tab@@tab@ /d@space@@space@@tab@ %%d iN
(*)@space@@space@@tab@ do eCHo %%d
+:for /asdf
+:: for /d %%d in (*) do echo %%d
+:: for /d %%d in (*) do echo %%~fd
+for /d %%d in (*) do echo %%~ed
+for /d %%d in (*) do echo %~d0:
+fOr@tab@@space@@space@@space@@space@@space@@space@@space@@space@@tab@/l@space@@tab@
%%c@space@@space@@tab@ iN@tab@ (1,1,5)@space@@space@@tab@
Do@space@@space@@tab@@space@@tab@ echo@tab@@space@@space@@space@@space@@tab@@tab@%%c
+
+
+iF@space@@space@@tab@ 457@space@@tab@@space@@tab@neQ@space@@space@@tab@
458@space@@tab@ (@space@@tab@ echo@space@@tab@ %~d0 ) eLSe (@space@@space@@tab@ echo
$~d0@space@@tab@ )
+
+::: if 457 nea 458 (echo %~d0) eLSe (echo $~dp)
+:if 457 nea 458 (echo yo) else (echo ya)
+:if 457 leq 458 (rem/? /d)
+:: if 457 leq 458 ( if 457 nea 458 (echo hi) else (echo yo) )
+
+iF@space@@space@@tab@ "2147483647"@space@@space@@tab@
gEq@space@@tab@@space@@tab@ "2147483648"@space@@tab@ (Echo
Larger)@space@@space@@tab@ Else@space@@tab@ (:Echo Smaller)
+ecHO sMaLlEr)
+
+iF@space@@space@@tab@eRrOrlevel 0 echo hi!
+
+
+:: rem@tab@@space@@tab@ /df@space@@space@@tab@ /d
+
+rEM /v@space@@tab@/d
+REm@space@@space@@space@@tab@@tab@ /d
+rEm REM2 /d
+reM@space@@tab@ /d@space@@tab@ >@space@@tab@ NUL
+:reM /?/d
+
+:: These commands, even commented out via the parser comment colon,
+:: cause parsing errors even when being commented out.
+:: Replace the two '%' by a single one to see the effects.
+::
+:echo %~f0 %%~dp %~p1
+:echo %%~d0 $~dp
+:echo %%~dp:
+:echo %%~b0
+
+
+
+::
+:: Parsing random commands
+::
+
+echo --------- Parsing random commands ---------
+
+:: Parsing these commands should fail (when being un-commmented).
+:@a ( b & |
+: a ( b & |
+
+:: If goto fails, batch stops. (Done OK in ROS' cmd)
+:goto /asdf whatever
+
+dir > NUL &(b)
+
+
+setlocal enabledelayedexpansion
+
+echo %~dp0
+
+set SOMEVAR=C:\ReAcToS
+rem %SOMEVAR% |
+
+Set "_var=first"
+Set "_var=second" & Rem %_var% !_var!
+Set "_var=third" & Echo %_var% !_var!
+
+endlocal
+
+
+
+::
+:: Parsing line continuations, either from parenthesized blocks
+:: or via the escape caret.
+:: It may be informative to manually run this test under CMD
+:: with cmd!fDumpTokens and cmd!fDumpParse flags enabled.
+::
+
+echo --------- Parsing line continuations ---------
+
+(
+a & b
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ '&'[a, CRLF[b, CRLF[c,d] ] ] ]
+::
+
+
+(
+a && b
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF['&&'[a,b], CRLF[c,d]] ]
+::
+
+
+(a & b)
+
+(
+a & b
+)
+
+
+(
+a & b
+c & d
+)
+
+
+(a & ^
+b
+c & d
+)
+::
+:: Parsed as:
+:: '('[ '&'[a, CRLF[b, '&'[c,d] ] ]
+::
+
+
+(
+a & b
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ '&'[a, CRLF[b, CRLF[c,d] ] ] ]
+::
+
+
+(
+a && b
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF['&&'[a,b], CRLF[c,d]] ]
+::
+
+
+(
+a || b
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF['||'[a,b], CRLF[c,d]] ]
+::
+
+
+(
+a
+b & c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF[a, '&'[b, CRLF[c,d]]] ]
+::
+
+
+(
+a
+b && c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF[a, CRLF['&&'[b,c], d]] ]
+::
+
+
+(
+a
+b
+c && d
+)
+::
+:: Parsed as:
+:: '('[ CRLF[a, CRLF[b, '&&'[c,d]]] ]
+::
+
+
+(
+a
+b
+c & d
+)
+::
+:: Parsed as:
+:: '('[ CRLF[a, CRLF[b, '&'[c,d]]] ]
+::
+
+
+(
+a
+b
+
+c
+d
+)
+::
+:: Parsed as:
+:: '('[ CRLF[a, CRLF[b, CRLF[c,d] ] ] ]
+::
+
+
+
+REM foo^
+bar^
+baz trol^
+
+
+if 1==1 (echo a) else (echo b)
+
+if 1==1 (echo a
+) else (echo b)
+
+if 1==1 (echo a) else (
+echo b)
+
+if 1==1 (
+echo a
+) else (
+echo b
+)
+
+
+REM if 1==1 (^
+REM echo a
+REM ) ^
+REM else
+REM (^
+REM echo b
+REM )
+
+
+REM if 1==1 (^
+REM echo a
+REM ) ^
+REM else^
+REM (^
+REM echo b
+REM )
+
+
+REM if 1==1 (^
+REM echo a
+REM ) ^
+REM else^
+REM (
+REM echo b
+REM )
+
+
+if 1==1 (^
+echo a
+)
+
+
+if 1==1 (^
+@echo a
+)
+
+
+
+(foo ^
+bar
+)
+
+(foo ^
+&& bar
+baz
+)
+
+(foo ^
+ && bar
+baz
+)
+
+REM (foo^
+REM && bar
+REM baz
+REM )
+
+(foo^
+bar
+baz
+)
+
+
+(foo &^
+& bar
+baz
+)
+
+
+(^
+foo
+bar
+)
+
+
+
+(
+
+
+foo ^
+bar
+)
+
+
+
+(
+
+
+foo ^
+&& bar
+baz
+)
+
+
+
+(
+
+
+foo ^
+ && bar
+baz
+)
+
+
+
+
+REM (
+REM
+REM
+REM foo^
+REM && bar
+REM baz
+REM )
+
+
+
+(
+
+
+foo^
+bar
+baz
+)
+
+
+
+(
+
+
+foo &^
+& bar
+baz
+)
+
+
+
+(
+
+
+^
+foo
+bar
+)
+
+
+
+::
+:: Tests for Character Escape and Line Continuation
+::
+
+(^"!pc::^=^!^")
+
+(^
+"!pc::^=^!^")
+
+(
+^"!pc::^=^!^")
+
+
+(^"!pc::^=^
+% New line %
+!^")
+
+REM @ 2>&1 ( ( dir) ) && lol
+
+
+echo & ^
+&&lol
+
+
+REM echo & ^
+REM ^
+REM &&lol
+
+
+trol ^
+&&lol
+
+
+trol^
+&&lol
+
+
+REM (echo hi)^
+REM &&lol
+
+
+rem trol(^
+line
+@rem trol2""^
+line2
+:trol3^
+line3
+
+echo trol^
+line
+
+:echo trol^
+line
+
+
+
@echo off
::
diff --git a/modules/rostests/win32/cmd/test_echoer_parser.cmd.exp
b/modules/rostests/win32/cmd/test_echoer_parser.cmd.exp
index 796b31eef76..65c909ea3e3 100644
--- a/modules/rostests/win32/cmd/test_echoer_parser.cmd.exp
+++ b/modules/rostests/win32/cmd/test_echoer_parser.cmd.exp
@@ -322,4 +322,299 @@ updated TN == TN
updated TN == TN
updated TN == TN
updated TN == TN
+
+@pwd@>echo --------- Parsing FOR, IF and REM commands ---------@space@
+--------- Parsing FOR, IF and REM commands ---------
+
+@pwd@>fOr / %d iN (*) do eCHo %d@space@
+
+@pwd@>eCHo script_testsuite@space@
+script_testsuite
+
+@pwd@>for / %d in (*) do echo %~ed@space@
+
+@pwd@>echo %~ed@space@
+%~ed
+
+@pwd@>for / %d in (*) do echo D::@space@
+
+@pwd@>echo D::@space@
+D::
+
+@pwd@>fOr /L %c iN (1 1 5) Do
echo@tab@@space@@space@@space@@space@@tab@@tab@%c@space@
+
+@pwd@>echo@tab@@space@@space@@space@@space@@tab@@tab@1@space@
+@space@@space@@space@@space@@tab@@tab@1
+
+@pwd@>echo@tab@@space@@space@@space@@space@@tab@@tab@2@space@
+@space@@space@@space@@space@@tab@@tab@2
+
+@pwd@>echo@tab@@space@@space@@space@@space@@tab@@tab@3@space@
+@space@@space@@space@@space@@tab@@tab@3
+
+@pwd@>echo@tab@@space@@space@@space@@space@@tab@@tab@4@space@
+@space@@space@@space@@space@@tab@@tab@4
+
+@pwd@>echo@tab@@space@@space@@space@@space@@tab@@tab@5@space@
+@space@@space@@space@@space@@tab@@tab@5
+
+@pwd@>iF 457 NEQ 458 (echo@space@@tab@ D: ) eLSe (echo $~d0@space@@tab@ )@space@
+@tab@ D:@space@
+
+@pwd@>iF "2147483647" GEQ "2147483648" (Echo Larger ) Else (ecHO
sMaLlEr )@space@
+sMaLlEr
+
+@pwd@>iF eRrOrlevel 0 echo hi!@space@
+hi
+
+@pwd@>rEM /v@space@@tab@/d@space@
+
+@pwd@>REm@space@@space@@space@@tab@@tab@ /d@space@
+
+@pwd@>rEm REM2 /d@space@
+
+@pwd@>reM@space@@tab@ /d@space@@tab@ >@space@@tab@ NUL@space@
+
+@pwd@>echo --------- Parsing random commands ---------@space@
+--------- Parsing random commands ---------
+
+@pwd@>dir 1>NUL & (b)@space@
+
+@pwd@>setlocal enabledelayedexpansion@space@
+
+@pwd@>echo @pwd@\@space@
+@pwd@\
+
+@pwd@>set SOMEVAR=C:\ReAcToS@space@
+
+@pwd@>rem C:\ReAcToS |@space@
+
+@pwd@>Set "_var=first"@space@
+
+@pwd@>Set "_var=second" & Rem first !_var!@space@
+
+@pwd@>Set "_var=third" & Echo second !_var!@space@
+second third
+
+@pwd@>endlocal
+
+@pwd@>echo --------- Parsing line continuations ---------@space@
+--------- Parsing line continuations ---------
+
+@pwd@>(a & b@space@
+ c@space@
+ d)@space@
+
+@pwd@>(
+a && b@space@
+ c@space@
+ d
+)@space@
+
+@pwd@>(a & b)@space@
+
+@pwd@>(a & b)@space@
+
+@pwd@>(a & b@space@
+ c & d)@space@
+
+@pwd@>(a & b@space@
+ c & d)@space@
+
+@pwd@>(a & b@space@
+ c@space@
+ d)@space@
+
+@pwd@>(
+a && b@space@
+ c@space@
+ d
+)@space@
+
+@pwd@>(
+a || b@space@
+ c@space@
+ d
+)@space@
+
+@pwd@>(
+a@space@
+ b & c@space@
+ d
+)@space@
+
+@pwd@>(
+a@space@
+ b && c@space@
+ d
+)@space@
+
+@pwd@>(
+a@space@
+ b@space@
+ c && d
+)@space@
+
+@pwd@>(
+a@space@
+ b@space@
+ c & d
+)@space@
+
+@pwd@>(
+a@space@
+ b@space@
+ c@space@
+ d
+)@space@
+
+@pwd@>REMbaz trol^@space@
+
+@pwd@>if 1 == 1 (echo a ) else (echo b )@space@
+a
+
+@pwd@>if 1 == 1 (echo a ) else (echo b )@space@
+a
+
+@pwd@>if 1 == 1 (echo a ) else (echo b )@space@
+a
+
+@pwd@>if 1 == 1 (echo a ) else (echo b )@space@
+a
+
+@pwd@>REM if 1==1 (^@space@
+
+@pwd@>REM echo a@space@
+
+@pwd@>REM ) ^@space@
+
+@pwd@>REM else@space@
+
+@pwd@>REMREM echo b@space@
+
+@pwd@>REM )@space@
+
+@pwd@>REM if 1==1 (^@space@
+
+@pwd@>REM echo a@space@
+
+@pwd@>REM ) ^@space@
+
+@pwd@>REMREM (^@space@
+
+@pwd@>REM echo b@space@
+
+@pwd@>REM )@space@
+
+@pwd@>REM if 1==1 (^@space@
+
+@pwd@>REM echo a@space@
+
+@pwd@>REM ) ^@space@
+
+@pwd@>REMREM (@space@
+
+@pwd@>REM echo b@space@
+
+@pwd@>REM )@space@
+
+@pwd@>if 1 == 1 (echo a )@space@
+a
+
+@pwd@>if 1 == 1 ()@space@
+a
+
+@pwd@>(foo bar )@space@
+
+@pwd@>(foo & & bar@space@
+ baz)@space@
+
+@pwd@>(
+foo && bar@space@
+ baz
+)@space@
+
+@pwd@>REMREM && bar@space@
+
+@pwd@>REM baz@space@
+
+@pwd@>REM )@space@
+
+@pwd@>(
+bar@space@
+ baz
+)@space@
+
+@pwd@>(foo & & bar@space@@space@
+ baz)@space@
+
+@pwd@>(
+foo@space@
+ bar
+)@space@
+
+@pwd@>(foo bar )@space@
+
+@pwd@>(foo & & bar@space@
+ baz)@space@
+
+@pwd@>(
+foo && bar@space@
+ baz
+)@space@
+
+@pwd@>REM (@space@
+
+@pwd@>REM
+
+@pwd@>REM
+
+@pwd@>REMREM && bar@space@
+
+@pwd@>REM baz@space@
+
+@pwd@>REM )@space@
+
+@pwd@>(
+bar@space@
+ baz
+)@space@
+
+@pwd@>(foo & & bar@space@@space@
+ baz)@space@
+
+@pwd@>(
+foo@space@
+ bar
+)@space@
+
+@pwd@>("!pc::=!")@space@
+
+@pwd@>("!pc::^=^!^")@space@
+
+@pwd@>("!pc::=!")@space@
+
+@pwd@>(!")@space@
+
+@pwd@>REM @ 2>&1 ( ( dir) ) && lol@space@
+
+@pwd@>echo & & & lol
+ECHO is on.
+
+@pwd@>REM echo & ^@space@
+
+@pwd@>REMREM &&lol@space@
+
+@pwd@>trol & & lol
+
+@pwd@>trol& & lol
+
+@pwd@>REM (echo hi)^@space@
+
+@pwd@>REM &&lol@space@
+
+@pwd@>remline@space@
+
+@pwd@>echo trolline@space@
+trolline
--------- Finished --------------