wscript: Fix tests on wow64.
[wine] / programs / cmd / tests / test_builtins.cmd
1 echo Tests for cmd's builtin commands
2
3 @echo on
4 echo ------------ Testing 'echo' [ON] --------------
5 echo word
6 echo 'singlequotedword'
7 echo "doublequotedword"
8 @echo at-echoed-word
9 echo "/?"
10 echo.
11 echo .
12 echo.word
13 echo .word
14 echo:
15 echo :
16 echo:word
17 echo :word
18 echo word@space@
19 echo word@space@@space@
20
21 @echo off
22 echo ------------ Testing 'echo' [OFF] --------------
23 echo word
24 echo 'singlequotedword'
25 echo "doublequotedword"
26 @echo at-echoed-word
27 echo "/?"
28 echo.
29 echo .
30 echo.word
31 echo .word
32 echo:
33 echo :
34 echo:word
35 echo :word
36 echo word@space@
37 echo word@space@@space@
38
39 echo ------------ Testing redirection operators --------------
40 mkdir foobar & cd foobar
41 echo ...stdout redirection
42 echo foo>foo
43 type foo
44 echo foo 1> foo
45 type foo
46 echo foo1> foo
47 type foo
48 echo foo11> foo
49 type foo
50 echo foo12> foo
51 type foo
52 echo ...stdout appending
53 echo foo>foo
54 echo foo >>foo
55 type foo
56 del foo
57 echo foob >> foo
58 type foo
59 echo fooc 1>>foo
60 type foo
61 echo food1>>foo
62 type foo
63 echo food2>>foo
64 type foo
65 del foo
66 echo food21>>foo
67 type foo
68 cd ..
69 rd /s/q foobar
70
71 echo ------------ Testing ^^ escape character --------------
72 rem Using something like "echo foo^" asks for an additional char after a "More?" prompt on the following line; it's not possible to currently test that non-interactively
73 echo ^hell^o, world
74 echo hell^o, world
75 echo hell^^o, world
76 echo hell^^^o, world
77 mkdir foobar
78 echo baz> foobar\baz
79 type foobar\baz
80 type foobar^\baz
81 rd /s/q foobar
82 echo foo ^| echo bar
83 echo foo ^& echo bar
84 call :setError 0
85 echo bak ^&& echo baz 2> nul
86 echo %ErrorLevel%
87 echo foo ^> foo
88 echo ^<> foo
89 type foo
90 del foo
91 set FOO=oof
92 echo ff^%FOO%
93 set FOO=bar ^| baz
94 set FOO
95 rem FIXME: echoing %FOO% gives an error (baz not recognized) but prematurely
96 rem exits the script on windows; redirecting stdout and/or stderr doesn't help
97 echo %ErrorLevel%
98 call :setError 0
99 set FOO=bar ^^^| baz
100 set FOO
101 echo %FOO%
102 echo %ErrorLevel%
103 set FOO=
104
105 echo ------------ Testing 'set' --------------
106 call :setError 0
107 set FOOBAR 2> nul > nul
108 echo %ErrorLevel%
109 set FOOBAR =  baz
110 echo %ErrorLevel%
111 echo %FOOBAR%FOOBAR not defined
112 echo %FOOBAR %
113 set FOOBAR 2> nul
114 set FOOBAR =  baz2
115 echo %ErrorLevel%
116 echo %fOObAr %
117 set FOOBAR= bar
118 echo %ErrorLevel%
119 echo %FOOBAR%
120 set FOO
121 set FOOBAR=
122 set FOOB
123 echo %FOOBAR%FOOBAR not defined
124 set FOOBAR =
125 set FOOBA 2> nul > nul
126 echo %ErrorLevel%
127 set FOO=bar
128 echo %FOO%
129 set FOO=foo
130 set BAR=bar
131 echo %FOO%%BAR%
132 set BAR=
133 set FOO=
134 set FOO=%FOO%
135 echo %FOO%FOO not defined
136 set BAZ%=bazbaz
137 set BA
138 echo %BAZ%%
139 set BAZ%=
140 echo set "FOO=bar" should not include the quotes in the variable value
141 set "FOO=bar"
142 echo %FOO%
143 set FOO=
144
145 echo ------------ Testing variable expansion --------------
146 call :setError 0
147 echo ~dp0 should be directory containing batch file
148 echo %~dp0
149 mkdir dummydir
150 cd dummydir
151 echo %~dp0
152 cd ..
153 rmdir dummydir
154 echo CD value %CD%
155 echo %%
156 echo P%
157 echo %P
158 echo %UNKNOWN%S
159 echo P%UNKNOWN%
160 echo P%UNKNOWN%S
161 echo %ERRORLEVEL
162 echo %ERRORLEVEL%
163 echo %ERRORLEVEL%%ERRORLEVEL%
164 echo %ERRORLEVEL%ERRORLEVEL%
165 echo %ERRORLEVEL%%
166 echo %ERRORLEVEL%%%
167 echo P%ERRORLEVEL%
168 echo %ERRORLEVEL%S
169 echo P%ERRORLEVEL%S
170
171 echo ------------ Testing variable delayed expansion --------------
172 rem NT4 doesn't support this
173 echo ...default mode (load-time expansion)
174 set FOO=foo
175 echo %FOO%
176 echo !FOO!
177 if %FOO% == foo (
178     set FOO=bar
179     if %FOO% == bar (echo bar) else echo foo
180 )
181
182 set FOO=foo
183 if %FOO% == foo (
184     set FOO=bar
185     if !FOO! == bar (echo bar) else echo foo
186 )
187
188 echo ...runtime (delayed) expansion mode
189 setlocal EnableDelayedExpansion
190 set FOO=foo
191 echo %FOO%
192 echo !FOO!
193 if %FOO% == foo (
194     set FOO=bar
195     if %FOO% == bar (echo bar) else echo foo
196 )
197
198 set FOO=foo
199 if %FOO% == foo (
200     set FOO=bar
201     if !FOO! == bar (echo bar) else echo foo
202 )
203 echo %ErrorLevel%
204 setlocal DisableDelayedExpansion
205 echo %ErrorLevel%
206 set FOO=foo
207 echo %FOO%
208 echo !FOO!
209 set FOO=
210 echo ...using /V cmd flag
211 echo @echo off> tmp.cmd
212 echo set FOO=foo>> tmp.cmd
213 echo echo %%FOO%%>> tmp.cmd
214 echo echo !FOO!>> tmp.cmd
215 echo set FOO=>> tmp.cmd
216 cmd /V:ON /C tmp.cmd
217 cmd /V:OfF /C tmp.cmd
218 del tmp.cmd
219
220 echo ------------ Testing conditional execution --------------
221 echo ...unconditional ^&
222 call :setError 123 & echo foo1
223 echo bar2 & echo foo2
224 mkdir foobar & cd foobar
225 echo > foobazbar
226 cd .. & rd /s/q foobar
227 if exist foobazbar (
228     echo foobar not deleted!
229     cd ..
230     rd /s/q foobar
231 ) else echo foobar deleted
232 echo ...on success conditional ^&^&
233 call :setError 456 && echo foo3 > foo3
234 if exist foo3 (
235     echo foo3 created
236     del foo3
237 ) else echo foo3 not created
238 echo bar4 && echo foo4
239 echo ...on failure conditional ^|^|
240 call :setError 789 || echo foo5
241 echo foo6 || echo bar6 > bar6
242 if exist bar6 (
243     echo bar6 created
244     del bar6
245 )
246
247 echo ------------ Testing type ------------
248 echo bar> foobaz
249 @echo on
250 type foobaz
251 echo ***
252 @echo off
253 type foobaz
254 echo ***
255 del foobaz
256
257 echo ------------ Testing NUL ------------
258 md foobar & cd foobar
259 rem NUL file (non) creation + case insensitivity
260 rem Note: "if exist" does not work with NUL, so to check for file existence we use a kludgy workaround
261 echo > bar
262 echo foo > NUL
263 dir /b /a-d
264 echo foo > nul
265 dir /b /a-d
266 echo foo > NuL
267 dir /b /a-d
268 del bar
269 rem NUL not special everywhere
270 call :setError 123
271 echo NUL> foo
272 if not exist foo (echo foo should have been created) else (
273     type foo
274     del foo
275 )
276 rem Empty file creation
277 copy nul foo > nul
278 if exist foo (
279     echo foo created
280     del foo
281     type foo
282 ) else (
283     echo ***
284 )
285 cd ..
286 rd foobar
287
288 echo ------------ Testing if/else --------------
289 echo if/else should work with blocks
290 if 0 == 0 (
291   echo if seems to work
292 ) else (
293   echo if seems to be broken
294 )
295 if 1 == 0 (
296   echo else seems to be broken
297 ) else (
298   echo else seems to work
299 )
300 if /c==/c (
301   echo if seems not to detect /c as parameter
302 ) else (
303   echo parameter detection seems to be broken
304 )
305 echo Testing case sensitivity with and without /i option
306 if bar==BAR echo if does not default to case sensitivity
307 if not bar==BAR echo if seems to default to case sensitivity
308 if /i foo==FOO echo if /i seems to work
309 if /i not foo==FOO echo if /i seems to be broken
310 if /I foo==FOO echo if /I seems to work
311 if /I not foo==FOO echo if /I seems to be broken
312
313 echo -----------Testing for -----------
314 echo ...plain FOR
315 for %%i in (A B C) do echo %%i
316 for %%i in (A B C) do echo %%I
317 for %%i in (A B C) do echo %%j
318 for %%i in (A B C) do call :forTestFun1 %%i
319 for %%i in (1,4,1) do echo %%i
320 for %%i in (A, B,C) do echo %%i
321 goto :endForTestFun1
322 :forTestFun1
323 echo %1
324 goto :eof
325 :endForTestFun1
326 echo ...imbricated FORs
327 for %%i in (X) do (
328     for %%j in (Y) do (
329         echo %%i %%j))
330 for %%i in (X) do (
331     for %%I in (Y) do (
332         echo %%i %%I))
333 for %%i in (A B) do (
334     for %%j in (C D) do (
335         echo %%i %%j))
336 for %%i in (A B) do (
337     for %%j in (C D) do (
338         call :forTestFun2 %%i %%j ))
339 goto :endForTestFun2
340 :forTestFun2
341 echo %1 %2
342 goto :eof
343 :endForTestFun2
344 mkdir foobar & cd foobar
345 mkdir foo
346 mkdir bar
347 mkdir baz
348 echo > bazbaz
349 echo ...basic wildcards
350 for %%i in (ba*) do echo %%i
351 echo ...for /d
352 for /d %%i in (baz foo bar) do echo %%i
353 rem FIXME for /d incorrectly parses when wildcards are used
354 rem for /d %%i in (bazb*) do echo %%i
355 rem FIXME can't test wildcard expansion here since it's listed in directory
356 rem order, and not in alphabetic order.
357 rem Proper testing would need a currently missing "sort" program implementation.
358 rem for /d %%i in (ba*) do echo %%i>> tmp
359 rem sort < tmp
360 rem del tmp
361 rem for /d %%i in (?a*) do echo %%i>> tmp
362 rem sort < tmp
363 rem del tmp
364 rem for /d %%i in (*) do echo %%i>> tmp
365 rem sort < tmp
366 rem del tmp
367 cd ..
368 rd /s/Q foobar
369 echo ...for /L
370 rem Some cases loop forever writing 0s, like e.g. (1,0,1), (1,a,3) or (a,b,c); those can't be tested here
371 for /L %%i in (1,2,0) do echo %%i
372 for /L %%i in (1,2,6) do echo %%i
373 for /l %%i in (1 ,2,6) do echo %%i
374 for /L %%i in (a,2,3) do echo %%i
375 for /L %%i in (1,2,-1) do echo %%i
376 for /L %%i in (-4,-1,-1) do echo %%i
377 for /L %%i in (1,-2,-2) do echo %%i
378 for /L %%i in (1,2,a) do echo %%i
379 echo ErrorLevel %ErrorLevel%
380 for /L %%i in (1,a,b) do echo %%i
381 echo ErrorLevel %ErrorLevel%
382 rem FIXME: following test cases cannot be currently tested due to an inconsistent/buggy 'for /L' parsing.
383 rem for /L %%i in (a,2,b) do echo %%i
384 rem for /L %%i in (1,1,1) do echo %%i
385 rem for /L %%i in (1,-2,-1) do echo %%i
386 rem for /L %%i in (-1,-1,-1) do echo %%i
387 rem for /L %%i in (1,2, 3) do echo %%i
388 echo ...for /a
389 rem No output when using "set expr" syntax, unless in interactive mode
390 rem Need to use "set envvar=expr" to use in a batch script
391 echo ......individual operations
392 set var=0
393 set /a var=1 +2 & echo %var%
394 set /a var=1 +-2 & echo %var%
395 set /a var=1 --2 & echo %var%
396 set /a var=2* 3 & echo %var%
397 set /a var=-2* -5 & echo %var%
398 set /a var=12/3 & echo %var%
399 set /a var=13/3 & echo %var%
400 set /a var=-13/3 & echo %var%
401 rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
402 set /a var=5 %% 5 & echo %var%
403 set /a var=5 %% 3 & echo %var%
404 set /a var=5 %% -3 & echo %var%
405 set /a var=-5 %% -3 & echo %var%
406 set /a var=1 ^<^< 0 & echo %var%
407 set /a var=1 ^<^< 2 & echo %var%
408 set /a var=1 ^<^< -2 & echo %var%
409 set /a var=-1 ^<^< -2 & echo %var%
410 set /a var=-1 ^<^< 2 & echo %var%
411 set /a var=9 ^>^> 0 & echo %var%
412 set /a var=9 ^>^> 2 & echo %var%
413 set /a var=9 ^>^> -2 & echo %var%
414 set /a var=-9 ^>^> -2 & echo %var%
415 set /a var=-9 ^>^> 2 & echo %var%
416 set /a var=5 ^& 0 & echo %var%
417 set /a var=5 ^& 1 & echo %var%
418 set /a var=5 ^& 3 & echo %var%
419 set /a var=5 ^& 4 & echo %var%
420 set /a var=5 ^& 1 & echo %var%
421 set /a var=5 ^| 0 & echo %var%
422 set /a var=5 ^| 1 & echo %var%
423 set /a var=5 ^| 3 & echo %var%
424 set /a var=5 ^| 4 & echo %var%
425 set /a var=5 ^| 1 & echo %var%
426 set /a var=5 ^^ 0 & echo %var%
427 set /a var=5 ^^ 1 & echo %var%
428 set /a var=5 ^^ 3 & echo %var%
429 set /a var=5 ^^ 4 & echo %var%
430 set /a var=5 ^^ 1 & echo %var%
431 echo ......precedence and grouping
432 set /a var=4 + 2*3 & echo %var%
433 set /a var=(4+2)*3 & echo %var%
434 set /a var=4 * 3/5 & echo %var%
435 set /a var=(4 * 3)/5 & echo %var%
436 set /a var=4 * 5 %% 4 & echo %var%
437 set /a var=4 * (5 %% 4) & echo %var%
438 set /a var=3 %% (5 + 8 %% 3 ^^ 2) & echo %var%
439 set /a var=3 %% (5 + 8 %% 3 ^^ -2) & echo %var%
440 echo ......octal and hexadecimal
441 set /a var=0xf + 3 & echo %var%
442 set /a var=0xF + 3 & echo %var%
443 set /a var=015 + 2 & echo %var%
444 set /a var=3, 8+3,0 & echo %var%
445 echo ......variables
446 set /a var=foo=3, foo+1 & echo %var%
447 if defined foo (echo %foo%) else (
448     echo foo not defined
449 )
450 set /a var=foo=3, foo+=1 & echo %var%
451 set /a var=foo=3, bar=1, bar+=foo, bar & echo %var%
452 set /a var=foo*= foo & echo %var%
453 set /a var=whateverNonExistingVar & echo %var%
454 set /a var=whateverNonExistingVar + bar & echo %var%
455 set /a var=foo -= foo + 7 & echo %var%
456 set /a var=foo /= 3 + 2 & echo %var%
457 set /a var=foo=5, foo %%=2 & echo %var%
458 set /a var=foo ^<^<= 2 & echo %var%
459 set /a var=foo ^>^>= 2 & echo %var%
460 set /a var=foo ^&= 2 & echo %var%
461 set /a var=foo=5, foo ^|= 2 & echo %var%
462 set /a var=foo=5, foo ^^= 2 & echo %var%
463 set /a var=foo=19, foo %%= 4 + (bar %%= 7) & echo.
464 set foo=
465 set bar=
466 set var=
467
468 echo -----------Testing del /a-----------
469 del /f/q *.test > nul
470 echo r > r.test
471 attrib +r r.test
472 echo not-r > not-r.test
473
474 if not exist not-r.test echo not-r.test not found before delete, bad
475 del /a:-r *.test
476 if not exist not-r.test echo not-r.test not found after delete, good
477
478 if not exist r.test echo r.test not found before delete, bad
479 if exist r.test echo r.test found before delete, good
480 del /a:r *.test
481 if not exist r.test echo r.test not found after delete, good
482 if exist r.test echo r.test found after delete, bad
483
484 echo ------------ Testing del /q --------------
485 mkdir del_q_dir
486 cd del_q_dir
487 echo abc > file1
488 echo abc > file2.dat
489 rem If /q doesn't work, cmd will prompt and the test case should hang
490 del /q * > nul
491 for %%a in (1 2.dat) do if exist file%%a echo del /q * failed on file%%a
492 for %%a in (1 2.dat) do if not exist file%%a echo del /q * succeeded on file%%a
493 cd ..
494 rmdir del_q_dir
495
496 echo ------------ Testing del /s --------------
497 mkdir "foo bar"
498 cd "foo bar"
499 echo hi > file1.dat
500 echo there > file2.dat
501 echo bub > file3.dat
502 echo bye > "file with spaces.dat"
503 cd ..
504 del /s file1.dat > nul
505 del file2.dat /s > nul
506 del "file3.dat" /s > nul
507 del "file with spaces.dat" /s > nul
508 cd "foo bar"
509 for %%f in (1 2 3) do if exist file%%f.dat echo Del /s failed on file%%f
510 for %%f in (1 2 3) do if exist file%%f.dat del file%%f.dat
511 if exist "file with spaces.dat" echo Del /s failed on "file with spaces.dat"
512 if exist "file with spaces.dat" del "file with spaces.dat"
513 cd ..
514 rmdir "foo bar"
515
516 echo ----------- Testing mkdir -----------
517 call :setError 0
518 rem md and mkdir are synonymous
519 mkdir foobar
520 echo %ErrorLevel%
521 rmdir foobar
522 md foobar
523 echo %ErrorLevel%
524 rmdir foobar
525 rem Creating an already existing directory/file must fail
526 mkdir foobar
527 md foobar
528 echo %ErrorLevel%
529 rmdir foobar
530 echo > foobar
531 mkdir foobar
532 echo %ErrorLevel%
533 del foobar
534 rem Multi-level path creation
535 mkdir foo
536 echo %ErrorLevel%
537 mkdir foo\bar\baz
538 echo %ErrorLevel%
539 cd foo
540 echo %ErrorLevel%
541 cd bar
542 echo %ErrorLevel%
543 cd baz
544 echo %ErrorLevel%
545 echo > ..\..\bar2
546 mkdir ..\..\..\foo\bar2
547 echo %ErrorLevel%
548 del ..\..\bar2
549 mkdir ..\..\..\foo\bar2
550 echo %ErrorLevel%
551 rmdir ..\..\..\foo\bar2
552 cd ..
553 rmdir baz
554 cd ..
555 rmdir bar
556 cd ..
557 rmdir foo
558 echo %ErrorLevel%
559 rem Trailing backslashes
560 mkdir foo\\\\
561 echo %ErrorLevel%
562 if exist foo (rmdir foo & echo dir created
563 ) else ( echo dir not created )
564 echo %ErrorLevel%
565 rem Invalid chars
566 mkdir ?
567 echo mkdir ? gives errorlevel %ErrorLevel%
568 call :setError 0
569 mkdir ?\foo
570 echo mkdir ?\foo gives errorlevel %ErrorLevel%
571 call :setError 0
572 mkdir foo\?
573 echo mkdir foo\? gives errorlevel %ErrorLevel%
574 if exist foo (rmdir foo & echo ok, foo created
575 ) else ( echo foo not created )
576 call :setError 0
577 mkdir foo\bar\?
578 echo mkdir foo\bar\? gives errorlevel %ErrorLevel%
579 call :setError 0
580 if not exist foo (
581     echo bad, foo not created
582 ) else (
583     cd foo
584     if exist bar (
585         echo ok, foo\bar created
586         rmdir bar
587     )
588     cd ..
589     rmdir foo
590 )
591 rem multiples directories at once
592 mkdir foobaz & cd foobaz
593 mkdir foo bar\baz foobar
594 if exist foo (echo foo created) else echo foo not created!
595 if exist bar (echo bar created) else echo bar not created!
596 if exist foobar (echo foobar created) else echo foobar not created!
597 if exist bar\baz (echo bar\baz created) else echo bar\baz not created!
598 cd ..
599 rd /s/q foobaz
600 call :setError 0
601 mkdir foo\*
602 echo mkdir foo\* errorlevel %ErrorLevel%
603 if exist foo (rmdir foo & echo ok, foo created
604 ) else ( echo bad, foo not created )
605
606 echo ----------- Testing rmdir -----------
607 call :setError 0
608 rem rd and rmdir are synonymous
609 mkdir foobar
610 rmdir foobar
611 echo %ErrorLevel%
612 if not exist foobar echo dir removed
613 mkdir foobar
614 rd foobar
615 echo %ErrorLevel%
616 if not exist foobar echo dir removed
617 rem Removing nonexistent directory
618 rmdir foobar
619 echo %ErrorLevel%
620 rem Removing single-level directories
621 echo > foo
622 rmdir foo
623 echo %ErrorLevel%
624 if exist foo echo file not removed
625 del foo
626 mkdir foo
627 echo > foo\bar
628 rmdir foo
629 echo %ErrorLevel%
630 if exist foo echo non-empty dir not removed
631 del foo\bar
632 mkdir foo\bar
633 rmdir foo
634 echo %ErrorLevel%
635 if exist foo echo non-empty dir not removed
636 rmdir foo\bar
637 rmdir foo
638 rem Recursive rmdir
639 mkdir foo\bar\baz
640 rmdir /s /Q foo
641 if not exist foo (
642     echo recursive rmdir succeeded
643 ) else (
644     rd foo\bar\baz
645     rd foo\bar
646     rd foo
647 )
648 mkdir foo\bar\baz
649 echo foo > foo\bar\brol
650 rmdir /s /Q foo
651 if not exist foo (
652     echo recursive rmdir succeeded
653 ) else (
654     rd foo\bar\baz
655     del foo\bar\brol
656     rd foo\bar
657     rd foo
658 )
659 rem multiples directories at once
660 mkdir foobaz & cd foobaz
661 mkdir foo
662 mkdir bar\baz
663 mkdir foobar
664 rd /s/q foo bar foobar
665 if not exist foo (echo foo removed) else echo foo not removed!
666 if not exist bar (echo bar removed) else echo bar not removed!
667 if not exist foobar (echo foobar removed) else echo foobar not removed!
668 if not exist bar\baz (echo bar\baz removed) else echo bar\baz not removed!
669 cd ..
670 rd /s/q foobaz
671
672 echo ------------ Testing CALL --------------
673 mkdir foobar & cd foobar
674 rem External script
675 echo echo foo %%1> foo.cmd
676 call foo
677 call foo.cmd 8
678 echo echo %%1 %%2 > foo.cmd
679 call foo.cmd foo
680 call foo.cmd foo bar
681 call foo.cmd foo ""
682 call foo.cmd "" bar
683 call foo.cmd foo ''
684 call foo.cmd '' bar
685 del foo.cmd
686 rem Internal routines
687 call :testRoutine :testRoutine
688 goto :endTestRoutine
689 :testRoutine
690 echo bar %1
691 goto :eof
692 :endTestRoutine
693
694 call :testRoutineArgs foo
695 call :testRoutineArgs foo bar
696 call :testRoutineArgs foo ""
697 call :testRoutineArgs ""  bar
698 call :testRoutineArgs foo ''
699 call :testRoutineArgs ''  bar
700 goto :endTestRoutineArgs
701 :testRoutineArgs
702 echo %1 %2
703 goto :eof
704 :endTestRoutineArgs
705
706 rem Should work for builtins...
707 call mkdir foo
708 echo %ErrorLevel%
709 if exist foo (echo foo created) else echo foo should exist!
710 rmdir foo
711 set FOOBAZ_VAR=foobaz
712 call echo Should expand %FOOBAZ_VAR%
713 set FOOBAZ_VAR=
714 echo>batfile
715 call dir /b
716 echo>robinfile
717 if 1==1 call del batfile
718 dir /b
719 if exist batfile echo batfile shouldn't exist
720 rem ... but not for 'if' or 'for'
721 call if 1==1 echo bar 2> nul
722 echo %ErrorLevel%
723 call :setError 0
724 call for %%i in (foo bar baz) do echo %%i 2> nul
725 echo %ErrorLevel%
726 rem First look for programs in the path before trying a builtin
727 echo echo non-builtin dir> dir.cmd
728 call dir /b
729 cd ..
730 rd /s/q foobar
731
732 echo ------------ Testing setlocal/endlocal ------------
733 call :setError 0
734 rem Note: setlocal EnableDelayedExtension already tested in the variable delayed expansion test section
735 mkdir foobar & cd foobar
736 echo ...enable/disable extensions
737 setlocal DisableEXTensions
738 echo ErrLev: %ErrorLevel%
739 endlocal
740 echo ErrLev: %ErrorLevel%
741 echo @echo off> tmp.cmd
742 echo echo ErrLev: %%ErrorLevel%%>> tmp.cmd
743 rem Enabled by default
744 cmd /C tmp.cmd
745 cmd /E:OfF /C tmp.cmd
746 cmd /e:oN /C tmp.cmd
747
748 rem FIXME: creating file before setting envvar value to prevent parsing-time evaluation (due to EnableDelayedExpansion not being implemented/available yet)
749 echo ...setlocal with corresponding endlocal
750 echo @echo off> test.cmd
751 echo echo %%VAR%%>> test.cmd
752 echo setlocal>> test.cmd
753 echo set VAR=localval>> test.cmd
754 echo echo %%VAR%%>> test.cmd
755 echo endlocal>> test.cmd
756 echo echo %%VAR%%>> test.cmd
757 set VAR=globalval
758 call test.cmd
759 echo %VAR%
760 set VAR=
761 echo ...setlocal with no corresponding endlocal
762 echo @echo off> test.cmd
763 echo echo %%VAR%%>> test.cmd
764 echo setlocal>> test.cmd
765 echo set VAR=localval>> test.cmd
766 echo echo %%VAR%%>> test.cmd
767 set VAR=globalval
768 call test.cmd
769 echo %VAR%
770 set VAR=
771 cd ..
772 rd /q/s foobar
773
774 echo -----------Testing Errorlevel-----------
775 rem WARNING: Do *not* add tests using ErrorLevel after this section
776 should_not_exist 2> nul > nul
777 echo %ErrorLevel%
778 rem nt 4.0 doesn't really support a way of setting errorlevel, so this is weak
779 rem See http://www.robvanderwoude.com/exit.php
780 call :setError 1
781 echo %ErrorLevel%
782 if errorlevel 2 echo errorlevel too high, bad
783 if errorlevel 1 echo errorlevel just right, good
784 call :setError 0
785 echo abc%ErrorLevel%def
786 if errorlevel 1 echo errorlevel nonzero, bad
787 if not errorlevel 1 echo errorlevel zero, good
788 rem Now verify that setting a real variable hides its magic variable
789 set errorlevel=7
790 echo %ErrorLevel% should be 7
791 if errorlevel 7 echo setting var worked too well, bad
792 call :setError 3
793 echo %ErrorLevel% should still be 7
794
795 echo -----------Testing GOTO-----------
796 if a==a goto dest1
797 :dest1
798 echo goto with no leading space worked
799 if b==b goto dest2
800  :dest2
801 echo goto with a leading space worked
802 if c==c goto dest3
803         :dest3
804 echo goto with a leading tab worked
805 if d==d goto dest4
806 :dest4@space@
807 echo goto with a following space worked
808
809 echo -----------Done, jumping to EOF-----------
810 goto :eof
811 rem Subroutine to set errorlevel and return
812 rem in windows nt 4.0, this always sets errorlevel 1, since /b isn't supported
813 :setError
814 exit /B %1
815 rem This line runs under cmd in windows NT 4, but not in more modern versions.