@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 off now@space@ off now @pwd@>echo word@space@@space@ word@space@ @pwd@>echo word@space@@space@@space@ word@space@@space@ @todo_wine@@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@ @todo_wine@@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@ ------------ Testing 'echo' [OFF] ------------ word 'singlequotedword' "doublequotedword" at-echoed-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 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 --- 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 @todo_wine@foo1 ----- foo2 foo3 @todo_wine@file does not exist, ok @todo_wine@----- foo4 baz5 baz6@space@ baz7 baz8 baz foo@space@ baz foo A B C ------------ Testing circumflex escape character ------------ @todo_wine@hello, world @todo_wine@hello, world @todo_wine@hell^o, world @todo_wine@hell^o, world baz @todo_wine@baz @todo_wine@foo | echo bar @todo_wine@foo & echo bar @todo_wine@bak & @todo_wine@baz@space@ @todo_wine@0@or_broken@1 @todo_wine@foo > foo @todo_wine@< @todo_wine@ffoof @todo_wine@FOO=bar | baz @todo_wine@0 @todo_wine@FOO=bar ^| baz @todo_wine@bar | baz @todo_wine@0 ------------ Testing 'set' ------------ 1 @todo_wine@0 FOOBAR not defined @todo_wine@ baz FOOBAR = baz @todo_wine@0 @todo_wine@ baz2 @todo_wine@0 bar @todo_wine@FOOBAR= bar @todo_wine@FOOBAR = baz2 FOOBAR = baz2 FOOBAR not defined 1 bar foobar FOO not defined BAZ=bazbaz bazbaz set "FOO=bar" should not include the quotes in the variable value bar foo '' 'foo@space@' 'foo@tab@' ------------ Testing variable expansion ------------ ~dp0 should be directory containing batch file @pwd@\ @pwd@\ 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 @todo_wine@'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 @todo_wine@"A B" C 'A B'@or_broken@'' 'C'@or_broken@'' @pwd@\C D@or_broken@%~ff @pwd@\E@or_broken@%~ff @drive@ @drive@ @path@@or_broken@%~pd @path@@or_broken@%~pd L M N '.OOL' '.TABC' '' @todo_wine@'@drive@@shortpath@R S'@or_broken@'' @todo_wine@'@drive@@shortpath@T'@or_broken@'' @todo_wine@'@drive@@shortpath@ABCDEFGHIJK.LMNOP'@or_broken@'' @todo_wine@''@or_broken@'%~ai' @todo_wine@''@or_broken@'%~ai' @todo_wine@'--a------'@or_broken@'%~ai' @todo_wine@''@or_broken@'%~ti' @todo_wine@''@or_broken@'%~ti' @todo_wine@''@or_broken@'%~zi' @todo_wine@''@or_broken@'%~zi' @drive@@path@ @drive@@path@ @drive@ @drive@ @drive@ @drive@ '' '.eh' --- in parameters @todo_wine@"A B" C @todo_wine@'A B'@or_broken@'' 'C'@or_broken@'' @todo_wine@@pwd@\C D @pwd@\E @drive@ @drive@ @path@ @path@ @todo_wine@L M N @todo_wine@'.OOL' '.TABC' '' @todo_wine@'@drive@@shortpath@R S'@or_broken@'' @todo_wine@'@drive@@shortpath@T'@or_broken@'' @todo_wine@'@drive@@shortpath@ABCDEFGHIJK.LMNOP'@or_broken@'' @drive@@path@ @drive@@path@ @drive@ @drive@ @drive@ @drive@ '' '.eh'@or_broken@'' ------------ Testing variable delayed expansion ------------ --- default mode (load-time expansion) foo !FOO! foo foo --- runtime (delayed) expansion mode foo @todo_wine@foo@or_broken@!FOO! foo @todo_wine@bar@or_broken@foo 0 0@or_broken@1 foo !FOO! --- using /V cmd flag foo @todo_wine@foo@or_broken@!FOO! foo !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: @pwd@\foobar@or_broken@Current dir:@space@ @pwd@\foobar @pwd@ @pwd@\foobar @pwd@ @pwd@\foobar @pwd@ @pwd@ @pwd@ @pwd@\foobar\bar bak @pwd@\foobar\bar bak @pwd@\foobar\bar bak @pwd@ @pwd@\foobar ------------ Testing type ------------ @pwd@>type foobaz@space@ bar @pwd@>echo ---@space@ --- bar --- ------------ Testing NUL ------------ bar bar bar NUL @todo_wine@foo created ------------ 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 Testing case sensitivity with and without /i option if seems to default to case sensitivity if /i seems to work if /I seems to work Testing string comparisons equal non equal non equal equal Testing tabs handling doom doom doom lol quake quake quake ------------ 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' @todo_wine@"echo A B" @todo_wine@"A B" C --- imbricated FORs @todo_wine@X Y @todo_wine@X Y @todo_wine@A C @todo_wine@A D @todo_wine@B C @todo_wine@B D @todo_wine@A C @todo_wine@A D @todo_wine@B C @todo_wine@B D --- basic wildcards bazbaz --- for /d baz foo bar --- for /L 1 3 5 1 3 5 0 2 1 -1 @todo_wine@ErrorLevel 0 @todo_wine@ErrorLevel 0 --- for /a ------ individual operations 0 @todo_wine@3 @todo_wine@-1 @todo_wine@3 @todo_wine@6 @todo_wine@10 @todo_wine@4 @todo_wine@4 @todo_wine@-4 0 @todo_wine@2 @todo_wine@2 @todo_wine@-2 @todo_wine@1 @todo_wine@4 0@or_broken@1073741824 0@or_broken@-1073741824 @todo_wine@-4 @todo_wine@9 @todo_wine@2 0 @todo_wine@-1 @todo_wine@-3 0 @todo_wine@1 @todo_wine@1 @todo_wine@4 @todo_wine@1 @todo_wine@5 @todo_wine@5 @todo_wine@7 @todo_wine@5 @todo_wine@5 @todo_wine@5 @todo_wine@4 @todo_wine@6 @todo_wine@1 ------ precedence and grouping @todo_wine@4 @todo_wine@10 @todo_wine@18@or_broken@10 @todo_wine@2@or_broken@0 @todo_wine@2@or_broken@0 0@or_broken@4 @todo_wine@4 @todo_wine@3@or_broken@4 ------ octal and hexadecimal @todo_wine@3@or_broken@4 @todo_wine@18 @todo_wine@18 @todo_wine@15 ------ variables @todo_wine@3 @todo_wine@3@or_broken@foo not defined @todo_wine@3@or_broken@0 @todo_wine@3@or_broken@0 @todo_wine@3@or_broken@0 @todo_wine@9@or_broken@0 0 @todo_wine@4@or_broken@0 @todo_wine@-7@or_broken@0 @todo_wine@-1@or_broken@0 @todo_wine@5@or_broken@0 @todo_wine@4@or_broken@0 @todo_wine@1@or_broken@0 0 @todo_wine@5@or_broken@0 --- for /F ------ string argument a a a a a ------ 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 ------ eol option @todo_wine@ad @todo_wine@z@y @todo_wine@a|d @todo_wine@no output @todo_wine@no output ------ delims option @todo_wine@a @todo_wine@a@space@ @todo_wine@a d @todo_wine@a @todo_wine@C r @todo_wine@foo bar baz @todo_wine@c:\ ------ skip option @todo_wine@c @todo_wine@no output @todo_wine@no output ------------ 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 @todo_wine@rename impossible in other directory @todo_wine@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 @todo_wine@moving a file to itself is a no-op@or_broken@moving a file to itself should be a no-op! @todo_wine@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 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 @pwd@\foobar @pwd@ @pwd@\foobar\baz @pwd@\foobar @pwd@\foobar @pwd@ @pwd@\foobar @pwd@ ------------ Testing attrib ------------ @todo_wine@A @pwd@\foobar\foo@or_broken@A @pwd@\foobar\foo@or_broken@A I @pwd@\foobar\foo --- read-only attribute @todo_wine@A R @pwd@\foobar\foo@or_broken@A R @pwd@\foobar\foo@or_broken@A R I @pwd@\foobar\foo foo foo original contents Read-only file not deleted Read-only file forcibly deleted --- recursive behaviour @todo_wine@A @pwd@\foobar\baz\level2@or_broken@A @pwd@\foobar\baz\level2@or_broken@A I @pwd@\foobar\baz\level2 @todo_wine@A R @pwd@\foobar\level1@or_broken@A R @pwd@\foobar\level1@or_broken@A R I @pwd@\foobar\level1 @todo_wine@A R @pwd@\foobar\baz\level2@or_broken@A R @pwd@\foobar\baz\level2@or_broken@A R I @pwd@\foobar\baz\level2 @todo_wine@A @pwd@\foobar\bar@or_broken@A @pwd@\foobar\bar@or_broken@A I @pwd@\foobar\bar --- folders processing @todo_wine@ @pwd@\foobar@or_broken@ @pwd@\foobar@or_broken@ I @pwd@\foobar @todo_wine@ R @pwd@\foobar\baz@or_broken@ R @pwd@\foobar\baz@or_broken@ @pwd@\foobar\baz@or_broken@ R I @pwd@\foobar\baz @todo_wine@A @pwd@\foobar\baz\toto@or_broken@A @pwd@\foobar\baz\toto@or_broken@A I @pwd@\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@!FOO! ------------ Testing CALL ------------ --- external script foo@space@ foo 8 foo@space@@space@ foo bar@space@ @todo_wine@foo ""@space@ @todo_wine@"" bar@space@ foo ''@space@ '' bar@space@ --- internal routines bar :testRoutine foo@space@ foo bar @todo_wine@foo "" @todo_wine@"" bar foo '' '' bar --- with builtins @todo_wine@0 @todo_wine@foo created @todo_wine@Should expand foobaz @todo_wine@batfile @todo_wine@robinfile @todo_wine@1 @todo_wine@1 non-builtin dir ------------ 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 @todo_wine@bar ------------ 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 globalval globalval --- setlocal with no corresponding endlocal globalval localval @todo_wine@globalval ------------ 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 a leading space worked goto with a leading tab worked goto with a following space worked ------------ Testing combined CALLs/GOTOs ------------ world cheball barbare bar foo baz cheball barbare