@pwd@>echo Tests for cmd's builtin commands@space@ Tests for cmd's builtin commands @pwd@>echo ------------ Testing 'echo' [ON] ------------@space@ ------------ Testing 'echo' [ON] ------------ @pwd@>echo word@space@ word @pwd@>echo 'singlequotedword'@space@ 'singlequotedword' @pwd@>echo "doublequotedword"@space@ "doublequotedword" at-echoed-word @pwd@>echo "/?"@space@ "/?" @pwd@>echo. @pwd@>echo .@space@ . @pwd@>echo.word word @pwd@>echo .word@space@ .word @pwd@>echo: @pwd@>echo :@space@ : @pwd@>echo:word word @pwd@>echo :word@space@ :word @pwd@>echo/ @pwd@>echo /@space@ / @pwd@>echo/word word @pwd@>echo /word@space@ /word @pwd@>echo off now@space@ off now @pwd@>echo word@space@@space@ word@space@ @pwd@>echo word@space@@space@@space@ word@space@@space@ @pwd@>echo word@space@ word @pwd@>echo@tab@word@space@ word @pwd@>echo@tab@word@space@@tab@@space@ word@space@@tab@ @pwd@>echo@tab@word@tab@@space@@space@ word@tab@@space@ @pwd@>echo word@space@ word @pwd@>echo@space@@tab@word@space@ @tab@word @pwd@>echo@space@@space@@tab@word@space@ @space@@tab@word @pwd@>echo@tab@@tab@word@space@ @tab@word @pwd@>echo @tab@ on @space@@space@ --- @ with chains and brackets @todo_wine@@pwd@>(echo the @ character chains until && ) && echo and can hide brackets || () ||@space@ @todo_wine@the @ character chains until @todo_wine@we leave the current depth @todo_wine@and can hide brackets @todo_wine@--- noecho1 noecho2 echo3 ------------ Testing 'echo' [OFF] ------------ word 'singlequotedword' "doublequotedword" at-echoed-word "/?" . word .word : word :word / word /word on again word@space@ word@space@@space@ word word word@space@@tab@ word@tab@@space@ word @tab@word @space@@tab@word @tab@word ------------ Testing mixed echo modes ------------ @echo on if 1==1 echo foo if 1==1 @echo bar @echo off if 1==1 echo foo2 if 1==1 @echo bar2 @todo_wine@@pwd@>if 1 == 1 echo foo@space@ foo @todo_wine@@pwd@>if 1 == 1@space@ bar foo2 bar2 ------------ Testing parameterization ------------ 'a', 'b', 'c' '"a b c"', '', '' '"a b"\c', '', '' 'a', '~`+', '.{}!+b' 'a', 'b', '' '"a;b"', '', '' 'a', 'b', '' 'a[b]{c}(d)e', '', '' 'a', '', '' second line 'a', 'b', 'c' 'a', 'b', 'c' 'a', 'b', '' ------------ Testing rem ------------ @pwd@>rem Hello@space@ @pwd@>rem Hello@space@ @pwd@>rem Hello || foo@space@ @pwd@>rem echo lol@space@ @pwd@>rem echo foo & echo bar@space@ @pwd@>rem @tab@ Hello@space@ @pwd@>rem@tab@ Hello@space@ @pwd@>rem@tab@echo foo & echo bar@space@ ------------ Testing redirection operators ------------ --- stdout redirection foo foo@space@ foo@tab@ foo@space@ foo@tab@ foo7@space@@or_broken@foo@tab@ foo9@space@@or_broken@foo@tab@ foo1 foo11 foo12 foo13 foo14 foo15 --- stdout appending foo foo@space@ foob@space@ foob@space@ fooc@space@ foob@space@ fooc@space@ food1 foob@space@ fooc@space@ food1 food2 food21 @todo_wine@foo7@space@@space@@or_broken@not supported@space@ @todo_wine@foo@or_broken@not supported --- redirections within IF statements foo1 foo2 ----- foo2 foo3 file does not exist, ok foo4 baz5 baz6@space@ baz7 baz8 baz foo@space@ baz foo A B C ------------ Testing circumflex escape character ------------ hello, world hello, world hell^o, world hell^o, world helloworld hello world hello finished baz baz foo | echo bar foo & echo bar bak & baz@space@ 0@or_broken@1 foo > foo < ffoof WINE_FOO=bar | baz 0 WINE_FOO=bar ^| baz bar | baz 0 ------------ Testing chains ------------ --- chain success a1 a2 b1 b2 c1 @todo_wine@--- d1 d2 d3 e1 e2 e3 f1 f2 @todo_wine@--- g1 g2 g3 h1 h2 h3 i1 i2 @todo_wine@--- j1 @todo_wine@j3 @todo_wine@--- k1 @todo_wine@--- l1 @todo_wine@--- --- chain failure a1 a2 b1 @todo_wine@--- c1 c2 d1 d2 d3 e1 e2 @todo_wine@--- f1 f2 f3 g1 @todo_wine@g3 @todo_wine@--- h1 @todo_wine@--- i1 @todo_wine@i3 @todo_wine@--- j1 j2 j3 k1 k2 @todo_wine@--- l1 l2 l3 --- chain brackets a1 a2 a3 b1 b2 b3 c1 c2 @todo_wine@--- d1 d2 d3 e1 e2 e3 f1 f2 @todo_wine@--- g1 @todo_wine@--- h1 @todo_wine@--- i1 @todo_wine@--- j1 j2 j3 k1 k2 @todo_wine@--- l1 l2 l3 m1 @todo_wine@--- n1 @todo_wine@--- o1 @todo_wine@--- p1 p2 p3 q1 q2 @todo_wine@--- r1 r2 r3 --- chain pipe @todo_wine@a@space@ @todo_wine@a@space@ --- b2 c1 c3 d1 @todo_wine@--- e1 e3 f2 f3 g2 @todo_wine@--- h2 h3 i3 --- chain pipe input a2:[a1,a2] b3:[b2:[b1,b2],b3]@or_broken@b3:[b2:,b3] c4:[c3:[c2:[c1,c2],c3],c4]@or_broken@c4:[c3:[c2:,c3],c4]@or_broken@c4:[c3:,c4] d2:[d1,d2] e3:[e2:[e1,e2],e3]@or_broken@e3:[e2:,e3] f4:[f3:[f2:[f1,f2],f3],f4]@or_broken@f4:[f3:[f2:,f3],f4]@or_broken@f4:[f3:,f4] --- chain else a1 b2 @todo_wine@--- @todo_wine@c3 @todo_wine@--- @todo_wine@d3 @todo_wine@--- @todo_wine@--- @todo_wine@--- @todo_wine@--- @todo_wine@--- --- chain else (if true) a1 else echo a2 b2 else echo b3 c1 c2 else echo c3 d1 @todo_wine@--- e1 e2 else echo e3 f3 g1 else echo g2 g3 h1 else echo h2 @todo_wine@--- i1 else echo i2 i3 @todo_wine@j2@space@ @todo_wine@--- k1 k2 l1 @todo_wine@--- m1 m2 n1 o1 p1 q1 @todo_wine@--- --- chain else (if false) j3 --- k3 l3 m3 n3 o2 o3 p2 @todo_wine@--- q2 q3 ------------ Testing 'set' ------------ 1 0 WINE_FOOBAR not defined baz WINE_FOOBAR = baz 0 baz2 0 bar WINE_FOOBAR= bar WINE_FOOBAR = baz2 WINE_FOOBAR = baz2 WINE_FOOBAR not defined 1 bar foobar WINE_FOO not defined WINE_BAZ=bazbaz bazbaz set "WINE_FOO=bar" should not include the quotes in the variable value bar foo '' 'foo@space@' 'foo@tab@' 'value@space@' 'value' 'jim fred' '"jim" fred' 'jim fred' 'jim' 'apple"banana"grape' I'm here!@space@ I'm here!@space@ I'm here!@space@ ------------ Testing variable expansion ------------ ~p0 should be path containing batch file @path@ @path@ ~dp0 should be directory containing batch file @drive@@path@ @drive@@path@ CD value @pwd@@or_broken@CD value@space@ % P P S P PS ERRORLEVEL 0 00 0ERRORLEVEL 0 0% P0 0S P0S ------------ Testing variable substrings ------------ q qwe er 'ty'@or_broken@'' 't'@or_broken@'' ert@or_broken@qwerty e@or_broken@qwerty ''@or_broken@'qwerty' r@or_broken@qwerty ------------ Testing variable substitution ------------ --- in FOR variables "A B" C "A B" C 'A B'@or_broken@'' 'C'@or_broken@'' @drive@@path@C D@or_broken@%~ff @drive@@path@E@or_broken@%~ff @drive@ @drive@ @path@@or_broken@%~pd @path@@or_broken@%~pd L M N '.OOL' '.TABC' '' '@drive@@shortpath@R S'@or_broken@'' '@drive@@shortpath@T'@or_broken@'' '@drive@@shortpath@ABCDEFGHIJK.LMNOP'@or_broken@'' ''@or_broken@'%~ai' ''@or_broken@'%~ai' '--a------'@or_broken@'--a--------'@or_broken@'--a--c---'@or_broken@'%~ai' '5'@or_broken@'%~zi' ''@or_broken@'%~ti' ''@or_broken@'%~ti' ''@or_broken@'%~zi' ''@or_broken@'%~zi' @drive@@path@ @drive@@path@ @drive@ @drive@ @drive@ @drive@ '' '.eh' ',,,,,,,,,' --- in parameters "A B" C 'A B'@or_broken@'' 'C'@or_broken@'' @drive@@path@C D @drive@@path@E @drive@ @drive@ @path@ @path@ L M N '.OOL' '.TABC' '' '@drive@@shortpath@R S'@or_broken@'' '@drive@@shortpath@T'@or_broken@'' '@drive@@shortpath@ABCDEFGHIJK.LMNOP'@or_broken@'' @drive@@path@ @drive@@path@ @drive@ @drive@ @drive@ @drive@ '' '.eh'@or_broken@'' ------------ Testing parameter zero ------------ :func parm1 [:func] [@drive@] [@path@] [test] [.cmd] [@drive@@shortpath@test.cmd] ------------ Testing variable delayed expansion ------------ --- default mode (load-time expansion) foo !WINE_FOO! foo foo --- runtime (delayed) expansion mode foo foo@or_broken@!WINE_FOO! foo bar@or_broken@foo 0 0@or_broken@1 foo !WINE_FOO! --- using /V cmd flag foo foo@or_broken@!WINE_FOO! foo !WINE_FOO! ------------ Testing conditional execution ------------ --- unconditional ampersand foo1 bar2@space@ foo2 foobar deleted --- on success conditional and @todo_wine@foo3 not created bar4@space@ foo4 --- on failure conditional or foo5 foo6@space@ @todo_wine@------------ Testing cd ------------ singleFile Current dir: @drive@@path@foobar@or_broken@Current dir:@space@ @drive@@path@foobar @pwd@ @drive@@path@foobar @pwd@ @drive@@path@foobar @pwd@ @pwd@ @pwd@ @drive@@path@foobar\bar bak @drive@@path@foobar\bar bak @drive@@path@foobar\bar bak @drive@@path@foobar\bar bak @drive@@path@foobar\bar bak @pwd@ @drive@@path@foobar ------------ Testing type ------------ @pwd@>type foobaz@space@ bar @pwd@>echo ---@space@ --- bar ---1 bar ---2 bar ---3 ------------ Testing NUL ------------ bar bar bar NUL foo created Passed: file size check on a.a [7]@or_broken@Skipping file size check on NT4 Passed: file size check on b.b [8]@or_broken@Skipping file size check on NT4 Passed: file size check on a.a [7]@or_broken@Skipping file size check on NT4 Passed: file size check on b.b [8]@or_broken@Skipping file size check on NT4 Passed: file size check on a.a [7]@or_broken@Skipping file size check on NT4 Passed: file size check on subdir\a.a [8]@or_broken@Skipping file size check on NT4 ------------ Testing if/else ------------ --- if/else should work with blocks if seems to work else seems to work if seems not to detect /c as parameter else if seems to work else if seems to work else if seems to work expected1 expected post-embedded if --- case sensitivity with and without /i option if seems to default to case sensitivity if /i seems to work if /I seems to work --- string comparisons equal non equal non equal equal --- tabs handling doom doom doom lol quake quake quake --- comparison operators ------ for strings LSS string can be used as operand for LSS comparison floats are handled as strings numbers in quotes are handled as strings negative numbers as well@or_broken@NT4 if /i seems to work for LSS A LSS B A LSS AB A LSS BA A LSS AA B LSS BA AB LSS B AB LSS BA AA LSS B AA LSS AB AA LSS BA b LSS B@or_broken@NT4 a LSS B@or_broken@NT4 a LSS B insensitive A LSS b A LSS b insensitive A LEQ A A LEQ B A LEQ AB A LEQ BA A LEQ AA B LEQ B B LEQ BA AB LEQ B AB LEQ AB AB LEQ BA BA LEQ BA AA LEQ B AA LEQ AB AA LEQ BA AA LEQ AA b LEQ B@or_broken@NT4 b LEQ B insensitive a LEQ B@or_broken@NT4 a LEQ B insensitive A LEQ b A LEQ b insensitive A EQU A B EQU B AB EQU AB BA EQU BA AA EQU AA A EQU a insensitive A NEQ B A NEQ AB A NEQ BA A NEQ AA B NEQ A B NEQ AB B NEQ BA B NEQ AA AB NEQ A AB NEQ B AB NEQ BA AB NEQ AA BA NEQ A BA NEQ B BA NEQ AB BA NEQ AA AA NEQ A AA NEQ B AA NEQ AB AA NEQ BA A GEQ A B GEQ A B GEQ B B GEQ AB B GEQ AA AB GEQ A AB GEQ AB AB GEQ AA BA GEQ A BA GEQ B BA GEQ AB BA GEQ BA BA GEQ AA AA GEQ A AA GEQ AA B GTR A B GTR AB B GTR AA AB GTR A AB GTR AA BA GTR A BA GTR B BA GTR AB BA GTR AA AA GTR A ------------ Testing if/exist ------------ exist explicit works exist explicit unknown file works exist explicit in subdir works exist simple wildcard works exist wildcard works negate exist wildcard works exist wildcard bad subdir broken works exist subdir ok exist subdir with . ok exist subdir with \ ok exist subdir with \ and quotes ok ------ for numbers negative numbers handled negative numbers handled octal handled also in negative form hexa handled also in negative form 11 LSS 101 0 LSS 1 0 LSS 10 0 LSS 9 1 LSS 10 1 LSS 9 9 LSS 10 0 LEQ 0 0 LEQ 1 0 LEQ 10 0 LEQ 9 1 LEQ 1 1 LEQ 10 1 LEQ 9 10 LEQ 10 9 LEQ 10 9 LEQ 9 0 EQU 0 1 EQU 1 10 EQU 10 9 EQU 9 octal ok hexa ok string/hexa compare ok string/hexa compare ok 0 NEQ 1 0 NEQ 10 0 NEQ 9 1 NEQ 0 1 NEQ 10 1 NEQ 9 10 NEQ 0 10 NEQ 1 10 NEQ 9 9 NEQ 0 9 NEQ 1 9 NEQ 10 0 GEQ 0 1 GEQ 0 1 GEQ 1 10 GEQ 0 10 GEQ 1 10 GEQ 10 10 GEQ 9 9 GEQ 0 9 GEQ 1 9 GEQ 9 1 GTR 0 10 GTR 0 10 GTR 1 10 GTR 9 9 GTR 0 9 GTR 1 ------ for numbers and stringified numbers strings and integers not equal strings and integers not equal foo "10" GEQ "1" '1' GEQ 1@or_broken@NT4 1 GEQ "1" "1" GEQ "1" '1' GEQ "1" "10" GEQ "1" non NT4@or_broken@1 GEQ '1' '1' GEQ '1' foo 1 GEQ "10" foo '1' GEQ "10" "10" GEQ "10" --- unconditional ampersand after if one line 1@space@ 2@space@ 3 else echo 4 --- x@space@ --- x@space@ --- x@space@ --- x@space@ --- ------------ Testing for ------------ --- plain FOR A B C %I %I %I %j %j %j A B C 1 4 1 A B C X X2 X3 foo M X M N O `echo A B` 'echo A B' "echo A B" "A B" C --- imbricated FORs X Y X Y A C A D B C B D A C A D B C B D --- basic wildcards bazbaz --- wildcards in subdirs pop\bar1@space@ pop\bar2.txt@space@ pop\bar3@space@ --- for /d baz@space@ foo@space@ bar@space@ PASSED xxx - Should be xxx Expected second line --- for /R Plain directory enumeration Plain directory enumeration from provided root File enumeration File enumeration from provided root Mixed enumeration Mixed enumeration from provided root With duplicates enumeration Strip missing wildcards, keep unwildcarded names for /R passed --- Complex wildcards unix and windows slash Windows slashes, valid path ASIS: foobar\baz\bazbaz WC : foobar\baz\bazbaz Windows slashes, invalid path ASIS: foobar\jim\bazbaz Unix slashes, valid path ASIS: foobar/baz/bazbaz WC : bazbaz Unix slashes, invalid path ASIS: foobar/jim/bazbaz Done --- for /L 1 3 5 1 3 5 0 2 1 -1 ErrorLevel 0 ErrorLevel 0 1 2 3 4 1 3 4 3 2 1 4 2 0 1 1 -1 -1 1 3 --- rems inside for loops --- ifs inside for loops a1 b1 d1 a2 b2 d2 a3 c3 d3 a4 c4 d4 --- set /a ------ individual operations WINE_foo correctly 3 WINE_foo correctly -1 WINE_foo correctly 3 WINE_foo correctly 6 WINE_foo correctly 10 WINE_foo correctly 4 WINE_foo correctly 4 WINE_foo correctly -4 WINE_foo correctly 0 WINE_foo correctly 2 WINE_foo correctly 2 WINE_foo correctly -2 WINE_foo correctly 1 WINE_foo correctly 4 WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly 1073741824 [0] WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly -1073741824 [0] WINE_foo correctly -4 WINE_foo correctly 9 WINE_foo correctly 2 WINE_foo correctly 0 WINE_foo correctly -1 WINE_foo correctly -3 WINE_foo correctly 0 WINE_foo correctly 1 WINE_foo correctly 1 WINE_foo correctly 4 WINE_foo correctly 1 WINE_foo correctly 5 WINE_foo correctly 5 WINE_foo correctly 7 WINE_foo correctly 5 WINE_foo correctly 5 WINE_foo correctly 5 WINE_foo correctly 4 WINE_foo correctly 6 WINE_foo correctly 1 WINE_foo correctly 4 ------ precedence and grouping WINE_foo correctly 10 WINE_foo correctly 18@or_broken@ERROR: WINE_foo incorrectly [18] WINE_foo correctly 2@or_broken@ERROR: WINE_foo incorrectly 0 [2] WINE_foo correctly 2@or_broken@ERROR: WINE_foo incorrectly [2] WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly 4 [0] WINE_foo correctly 4@or_broken@ERROR: WINE_foo incorrectly [4] WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly [3] WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly [3] ------ octal and hexadecimal WINE_foo correctly 18 WINE_foo correctly 18 WINE_foo correctly 15 WINE_foo correctly 3 ------ variables WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly 0 [3] WINE_bar correctly 3@or_broken@ERROR: WINE_bar incorrectly [3] WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly 0 [3] WINE_bar correctly 4@or_broken@ERROR: WINE_bar incorrectly [4] WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly 0 [3] WINE_bar correctly 3@or_broken@ERROR: WINE_bar incorrectly [3] WINE_baz correctly 4@or_broken@ERROR: WINE_baz incorrectly [4] WINE_foo correctly 9@or_broken@ERROR: WINE_foo incorrectly 3 [9] WINE_bar correctly 9@or_broken@ERROR: WINE_bar incorrectly 3 [9] WINE_foo correctly 0 WINE_foo correctly 4 WINE_bar correctly 4 WINE_foo correctly -7@or_broken@ERROR: WINE_foo incorrectly 4 [-7] WINE_bar correctly -7@or_broken@ERROR: WINE_bar incorrectly 4 [-7] WINE_foo correctly -1@or_broken@ERROR: WINE_foo incorrectly -7 [-1] WINE_bar correctly -1@or_broken@ERROR: WINE_bar incorrectly -7 [-1] WINE_foo correctly 5@or_broken@ERROR: WINE_foo incorrectly 0 [5] WINE_bar correctly 1@or_broken@ERROR: WINE_bar incorrectly [1] WINE_foo correctly 4@or_broken@ERROR: WINE_foo incorrectly 1 [4] WINE_bar correctly 4@or_broken@ERROR: WINE_bar incorrectly 1 [4] WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly 4 [1] WINE_bar correctly 1@or_broken@ERROR: WINE_bar incorrectly 4 [1] WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly 1 [0] WINE_bar correctly 0@or_broken@ERROR: WINE_bar incorrectly 1 [0] WINE_foo correctly 5@or_broken@ERROR: WINE_foo incorrectly 0 [5] WINE_bar correctly 7@or_broken@ERROR: WINE_bar incorrectly [7] WINE_foo correctly 5@or_broken@ERROR: WINE_foo incorrectly 0 [5] WINE_bar correctly 7@or_broken@ERROR: WINE_bar incorrectly [7] WINE_foo correctly 19@or_broken@ERROR: WINE_foo incorrectly 0 [19] WINE_bar correctly 3@or_broken@ERROR: WINE_bar incorrectly [3] WINE_baz correctly 4 --- quotes WINE_foo correctly 1 WINE_foo correctly 1 WINE_foo correctly 1 WINE_bar correctly 2 WINE_foo correctly 1 WINE_bar correctly 2 WINE_foo correctly 1 WINE_bar correctly 2 WINE_foo correctly 1 WINE_bar correctly 2 WINE_foo correctly 1 WINE_bar correctly 2 WINE_baz correctly 3 WINE_foo correctly 1 WINE_bar correctly 2 WINE_baz correctly 3 WINE_foo correctly 1 WINE_bar correctly 2 WINE_baz correctly 3 WINE_foo correctly 1 WINE_bar correctly 2 WINE_baz correctly 3 WINE_foo correctly 1 WINE_bar correctly 2 WINE_baz correctly 3 WINE_foo correctly 1 WINE_foo correctly 1 WINE_bar correctly 5 WINE_baz correctly 2 WINE_foo correctly 18 WINE_foo correctly 3 WINE_bar correctly 7@or_broken@ERROR: WINE_bar incorrectly 4 [7] --- whitespace are ignored between double char operators WINE_foo correctly 10@or_broken@ERROR: WINE_foo incorrectly 4 [10] WINE_bar correctly 50@or_broken@ERROR: WINE_bar incorrectly 5 [50] WINE_foo correctly 772@or_broken@ERROR: WINE_foo incorrectly 4 [772] WINE_bar correctly 7720@or_broken@ERROR: WINE_bar incorrectly 5 [7720] --- invalid operator sequence 4 4 ----- negative prefix WINE_foo correctly -1 WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly [1] WINE_foo correctly 6 WINE_foo correctly 0 WINE_foo correctly 6 WINE_foo correctly 2 WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly [0] WINE_foo correctly 5 WINE_foo correctly 3@or_broken@ERROR: WINE_foo incorrectly -5 [3] ----- assignment tests involving the end destination WINE_foo correctly 11@or_broken@ERROR: WINE_foo incorrectly 3 [11] WINE_foo correctly 6@or_broken@ERROR: WINE_foo incorrectly 2 [6] WINE_bar correctly 9@or_broken@ERROR: WINE_bar incorrectly [9] WINE_foo correctly 6@or_broken@ERROR: WINE_foo incorrectly 2 [6] WINE_bar correctly 10@or_broken@ERROR: WINE_bar incorrectly [10] WINE_baz correctly 7@or_broken@ERROR: WINE_baz incorrectly [7] WINE_foo correctly 7@or_broken@ERROR: WINE_foo incorrectly 2 [7] WINE_bar correctly 7@or_broken@ERROR: WINE_bar incorrectly 2 [7] ----- equal precedence on stack WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly 0 [1] WINE_foo correctly 0 WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly [1] WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly [0] WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly [1] WINE_foo correctly -1@or_broken@ERROR: WINE_foo incorrectly [-1] WINE_foo correctly -1@or_broken@ERROR: WINE_foo incorrectly [-1] WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly [1] WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly [0] WINE_foo correctly -1 WINE_foo correctly 0@or_broken@ERROR: WINE_foo incorrectly -1 [0] WINE_foo correctly 0 WINE_foo correctly 1@or_broken@ERROR: WINE_foo incorrectly 0 [1] WINE_foo correctly -1@or_broken@ERROR: WINE_foo incorrectly 0 [-1] WINE_foo correctly 25@or_broken@ERROR: WINE_foo incorrectly 20 [25] WINE_foo correctly 20 WINE_foo correctly 1 WINE_foo correctly 4 WINE_foo correctly 7 WINE_foo correctly 8@or_broken@ERROR: WINE_foo incorrectly 4 [8] WINE_foo correctly 6@or_broken@ERROR: WINE_foo incorrectly 5 [6] WINE_bar correctly 6@or_broken@ERROR: WINE_bar incorrectly 5 [6] --- for /F ------ string argument a XaX a@or_broken@no output XaX@or_broken@no output a a@or_broken@no output a a@or_broken@no output a a@or_broken@no output a a@or_broken@no output ------ fileset argument --------- basic blank handling a a a a a b --------- multi-line with empty lines a b c --------- multiple files a b c q kkk q kkk a b c ------ command argument Passed1@or_broken@Missing functionality - Broken1 Passed2@or_broken@Missing functionality - Broken2 Passed3@or_broken@Missing functionality - Broken3 Passed4@or_broken@Missing functionality - Broken4 Passed5@or_broken@Missing functionality - Broken5 Passed6@or_broken@Missing functionality - Broken6 Passed7@or_broken@Missing functionality - Broken7 ------ eol option and@or_broken@Broken NT4 functionality1 Line@or_broken@Broken NT4 functionality2 Line@or_broken@Broken NT4 functionality3 ad z@y a|d no output no output ------ delims option a a@space@ a d a C r foo bar baz c:\ ------ skip option c no output no output c c no output ------ tokens= option h=%h i=a j=%j k=%k l=%l m=%m o=%o h=%h i=b j=%j k=%k l=%l m=%m o=%o h=%h i=a j=c k=e l=f m=g o=%o h=%h i=a j=e k=f g l=%l m=%m o=%o h=%h i=f j=i k=j k l m n o p q r s t u v w x y z l=%l m=%m o=%o h=%h i=f j=i k=j k l m n;;== o p q r s t u v w x y z l=%l m=%m o=%o h=%h i=a j=b k=c l=d e f g m=%m n=%n o=%o h=%h i=a j=b k=c l=d e f g m=%m n=%n o=%o h=%h i=a j=b k= l= m=%m n=%n o=%o h=%h i=a j=e k=y l=z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z m=%m n=%n o=%o h=%h i=a j=b k= l= m= n=%n o=%o h=%h i=a j=b k= l= m= n= o=%o u=a v=b w=c x=d y=e z=f A=%A a=%a @todo_wine@U=a V=b W=c X=d Y=e Z=f A=%A a=m h=%h i=a j=b k=c l=e m=%m o=%o@or_broken@h=%h i=a j=b k=c l=e m= o=%o h=%h i=e j=%j k=%k l=%l m=%m o=%o h=%h i=a j=b k=c l=d e f g m=%m n=%n o=%o@or_broken@h=%h i=a j=b k=c l=d e f g m= n=%n o=%o h=%h i=a j=c k= l= m=%m n=%n o=%o@or_broken@h=%h i=a j=c k= l= m= n=%n o=%o h=%h i=b j=c k= l= m=%m n=%n o=%o@or_broken@h=%h i=b j=c k= l= m= n=%n o=%o h=%h i=b j=c k= l= m=%m n=%n o=%o@or_broken@h=%h i=b j=c k= l= m= n=%n o=%o 1:3.14,%B 2:3.14, 4:3,14 ------ parameter splitting :forFParameterSplittingFunc myparam1=myvalue1 myparam2=myparam2 mytest@space@@space@@space@ :forFParameterSplittingFunc myparam1=myvalue1 myparam2=myparam2 mytest@space@@space@@space@ 4:3.14,%B 5:3,14 6:14, ------------ Testing del ------------ deleting 'file' errorlevel is 0, good successfully deleted 'file' attempting to delete 'file', even though it is not present errorlevel is 0, good ------------ Testing del /a ------------ not-r.test not found after delete, good r.test found before delete, good r.test not found after delete, good ------------ Testing del /q ------------ del /q * succeeded on file1 del /q * succeeded on file2.dat ------------ Testing del /s ------------ ------------ Testing rename ------------ --- ren and rename are synonymous foo renamed to bar bar renamed to foo --- name collision foo bar --- rename read-only files read-only file renamed --- rename directories dir renamed read-only dir renamed --- rename in other directory rename impossible in other directory original file still present ------------ Testing move ------------ --- file move file move succeeded @todo_wine@file move with overwrite succeeded@or_broken@file overwrite impossible! @todo_wine@bar@or_broken@baz read-only files are moveable file moved in subdirectory moving a file to itself is a no-op@or_broken@moving a file to itself should be a no-op! ErrorLevel: 0@or_broken@ErrorLevel: 1 --- directory move simple directory move succeeded moving a directory to itself gives error; errlevel 1 ------ dir in dir move foo bar2 foo2 ------------ Testing mkdir ------------ --- md and mkdir are synonymous 0 0 --- creating an already existing directory/file must fail 1 1 --- multilevel path creation 0 0 0 0 0 1 0 0 --- trailing backslashes 0 dir created 0 --- invalid chars mkdir ? gives errorlevel 1 mkdir ?\foo gives errorlevel 1 mkdir foo\? gives errorlevel 1 ok, foo created mkdir foo\bar\? gives errorlevel 1 ok, foo\bar created --- multiple directories at once foo created bar created foobar created bar\baz created bazbaz created zabzab created mkdir foo\* errorlevel 1 ok, foo created ------------ Testing rmdir ------------ 0 dir removed 0 dir removed 0 0 file not removed 0 non-empty dir not removed 0 non-empty dir not removed recursive rmdir succeeded recursive rmdir succeeded foo removed bar removed foobar removed bar\baz removed ------------ Testing pushd/popd ------------ @pwd@ --- popd is no-op when dir stack is empty @pwd@ --- pushing non-existing dir @pwd@ --- basic behaviour @drive@@path@foobar @pwd@ @drive@@path@foobar\baz @drive@@path@foobar @drive@@path@foobar @pwd@ @drive@@path@foobar @pwd@ ------------ Testing attrib ------------ A @drive@@path@foobar\foo@or_broken@A @drive@@path@foobar\foo@or_broken@A I @drive@@path@foobar\foo --- read-only attribute A R @drive@@path@foobar\foo@or_broken@A R @drive@@path@foobar\foo@or_broken@A R I @drive@@path@foobar\foo foo foo original contents Read-only file not deleted Read-only file forcibly deleted --- recursive behaviour A @drive@@path@foobar\baz\level2@or_broken@A @drive@@path@foobar\baz\level2@or_broken@A I @drive@@path@foobar\baz\level2 A R @drive@@path@foobar\level1@or_broken@A R @drive@@path@foobar\level1@or_broken@A R I @drive@@path@foobar\level1 A R @drive@@path@foobar\baz\level2@or_broken@A R @drive@@path@foobar\baz\level2@or_broken@A R I @drive@@path@foobar\baz\level2 A @drive@@path@foobar\bar@or_broken@A @drive@@path@foobar\bar@or_broken@A I @drive@@path@foobar\bar --- folders processing @drive@@path@foobar@or_broken@ @drive@@path@foobar@or_broken@ I @drive@@path@foobar @todo_wine@ R @drive@@path@foobar\baz@or_broken@ R @drive@@path@foobar\baz@or_broken@ @drive@@path@foobar\baz@or_broken@ R I @drive@@path@foobar\baz A @drive@@path@foobar\baz\toto@or_broken@A @drive@@path@foobar\baz\toto@or_broken@A I @drive@@path@foobar\baz\toto toto lulu file created in read-only dir ------------ Testing assoc ------------ --- setting association --- .foo=bar .foo=bar +++ .foo=bar --- resetting association --- +++ --- ------------ Testing ftype ------------ --- setting association --- footype=foo_opencmd .foo=footype footype=foo_opencmd +++ footype=foo_opencmd --- resetting association @todo_wine@original value@or_broken@buggyXP@or_broken@!WINE_FOO! ------------ Testing CALL ------------ --- external script foo@space@ foo 8 foo@space@@space@ foo bar@space@ foo ""@space@ "" bar@space@ foo ''@space@ '' bar@space@ --- internal routines bar :testRoutine foo@space@ foo bar foo "" "" bar foo '' '' bar --- with builtins 0 foo created Should expand foobaz batfile robinfile 1 1 non-builtin dir Line one Line two Get if ... and else! passed ------------ Testing SHIFT ------------ 'p1' 'p2' 'p3' 'p4' 'p5' 'p2' 'p3' 'p4' 'p5' '' 'p3' 'p4' 'p5' '' '' 'p3' 'p5' '' '' '' 'p3' 'p5' '' '' '' 'p5' '' '' '' '' ------------ Testing cmd invocation ------------ --- a batch file can delete itself file correctly deleted --- a batch file can alter itself bar ---------- Testing copy Passed: Found expected dummy.file Passed: Found expected dir1\file1 Passed: Found expected dir1\file1 Passed: Found expected dir1\file99 Passed: Found expected file1 Passed: Did not find dir2 Passed: Did not find dir2\file1 Passed: Found expected dir1\file1 Passed: Found expected dir1\file2 Passed: Found expected dir1\file3 Passed: Found expected dir1\file1 Passed: Found expected dir1\file2 Passed: Found expected dir1\file3 Passed: Found expected file1 Passed: Found expected file2 Passed: Found expected file3 Passed: Did not find dir2 Passed: Did not find dir2\file1 Passed: Did not find dir2\file2 Passed: Did not find dir2\file3 Passed: Found expected testfile Passed: Found expected testfile Passed: Found expected testfile Passed: Found expected testfile Passed: Found expected testfile Passed: Found expected dir1\fred Passed: Found expected dir1\fred Passed: Found expected fred Passed: Found expected fred Passed: file size check on file1 [5]@or_broken@Skipping file size check on NT4 Passed: file size check on file2 [8]@or_broken@Skipping file size check on NT4 Passed: file size check on file3 [11]@or_broken@Skipping file size check on NT4 Passed: file size check on file1_default [5]@or_broken@Skipping file size check on NT4 Passed: file size check on file1_default2 [5]@or_broken@Skipping file size check on NT4 Passed: file size check on file1_plus_eof [6]@or_broken@Skipping file size check on NT4 Passed: file size check on file2_plus_eof [9]@or_broken@Skipping file size check on NT4 Passed: file size check on file3_plus_eof [12]@or_broken@Skipping file size check on NT4 Passed: file size check on file12_plus_eof [14]@or_broken@Skipping file size check on NT4 Passed: file size check on file12_no_eof [13]@or_broken@Skipping file size check on NT4 Passed: file size check on file12_eof2 [14]@or_broken@Skipping file size check on NT4 Passed: file size check on file1 [24]@or_broken@Skipping file size check on NT4 Passed: file size check on file2 [16]@or_broken@Skipping file size check on NT4 Passed: file size check on file3 [13]@or_broken@Skipping file size check on NT4 Passed: file size check on file1_binary_srccopy [6]@or_broken@Skipping file size check on NT4 Passed: file size check on file1_ascii_srccopy [5]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_default_copy [25]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_ascii_copy [25]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_binary_copy [27]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy1 [26]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy2 [27]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy3 [26]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy4 [25]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy5 [28]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy6 [19]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy7 [6]@or_broken@Skipping file size check on NT4 Passed: file size check on file123_mixed_copy8 [7]@or_broken@Skipping file size check on NT4 Passed: errorlevel invalid check 1 Passed: Did not find dir1\file1 Passed: errorlevel invalid check 2 Passed: errorlevel invalid check 3 ------------ Testing setlocal/endlocal ------------ --- enable/disable extensions @todo_wine@ErrLev:@space@ ErrLev: 0 ErrLev: 0 @todo_wine@ErrLev:@space@@or_broken@ErrLev: 0 ErrLev: 0 --- setlocal with corresponding endlocal globalval localval @drive@@path@foobar\foobar2 globalval @drive@@path@foobar globalval @drive@@path@foobar --- setlocal with no corresponding endlocal globalval localval @drive@@path@foobar\foobar2 globalval @drive@@path@foobar --- setlocal within same batch program Var1 ok 1 Var2 ok 2 Var3 ok 3 Directory is ok 1 Var1 ok 1 Var2 ok 2 Var3 ok 3 Directory is ok 2 Var1 ok 1 Var2 ok 2 Var3 ok 3 Directory is ok 3 --- Mismatched set and end locals --- Extra setlocal in called batch value2 2set1endvalue1 @drive@@path@foobar\foodir3 Finished: value2 @drive@@path@foobar\foodir2 value1 @drive@@path@foobar --- Extra endlocal in called batch value2 value2 @drive@@path@foobar\foodir2 value2 @drive@@path@foobar\foodir2 Finished: value2 @drive@@path@foobar\foodir2 value1 @drive@@path@foobar --- endlocal in called function rather than batch pgm is ineffective 2 2 1 2 1 2 1 1 ------------ Testing Errorlevel ------------ 9009 1 errorlevel just right, good errorlevel with leading zero just right, good errorlevel with negative number OK abc0def@or_broken@abc1def errorlevel zero, good@or_broken@errorlevel nonzero, bad 7 should be 7 7 should still be 7 ------------ Testing GOTO ------------ goto with no leading space worked goto with colon and no leading space worked goto with a leading space worked goto with a leading tab worked goto with a following space worked goto with following amphersands worked goto with redirections worked Ignoring double colons worked label with mixed whitespace and no echo worked Correctly ignored trailing information Begin: ..First sub ..First sub Middle: ..Third sub ..Third sub Near end: ..Fourth sub ..Fourth sub At end: ..First sub ..First sub Finished ------------ Testing PATH ------------ PATH=original PATH=try2 PATH=try3 ------------ Testing start /W ------------ start /W seems to really wait ------------ Testing changing the drive letter ---------- Normal: Normal+space Normal+space+garbage Quoted should fail Normal+tab Normal+tab+garbage ------------ Testing combined CALLs/GOTOs ------------ world cheball barbare bar foo baz cheball barbare