[PATCH 1/3] [cmd] Convert the set /a tests to validate better

Ann and Jason Edmeades jason at edmeades.me.uk
Thu Dec 13 15:59:44 CST 2012


The tests previously set a variable which was not checked until
the subsequent test completed (as env vars are expanded as the
line is read, meaning a sequence of set /a var=x & echo %var%
echos the contents before the set is executed). In addition when
multiple variables are involved in the calculation, only the
first one was being checked, and this is changed to check all
variables involved in the calculation.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20121213/286d34bd/attachment-0001.html>
-------------- next part --------------
From c0aaafe4228a711e90fccabde92845c76fe63764 Mon Sep 17 00:00:00 2001
From: Jason Edmeades <jason at edmeades.me.uk>
Date: Wed, 12 Dec 2012 00:30:45 +0000
Subject: [PATCH 1/3] [cmd] Convert the set /a tests to validate better

The tests previously set a variable which was not checked until
the subsequent test completed (as env vars are expanded as the
line is read, meaning a sequence of set /a var=x & echo %var%
echos the contents before the set is executed). In addition when
multiple variables are involved in the calculation, only the
first one was being checked, and this is changed to check all
variables involved in the calculation.
---
 programs/cmd/tests/test_builtins.cmd     |  179 ++++++++++++++++++------------
 programs/cmd/tests/test_builtins.cmd.exp |  147 +++++++++++++-----------
 2 files changed, 188 insertions(+), 138 deletions(-)

diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index eb9b888..6859311 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1030,85 +1030,120 @@ for /L %%i in (2,2,1) do (
   echo %%i
   echo FAILED
 )
-echo --- for /a
+echo --- set /a
+goto :testseta
+
+REM Check the variables are set to the expected value and clear their contents
+:check_vars
+if not "%1"=="" (
+  if "%1"=="%WINE_var1%" (
+    echo WINE_var1 correctly %1
+  ) else (
+    echo ERROR: WINE_var1 incorrectly %WINE_var1% [%1]
+  )
+)
+if not "%2"=="" (
+  if "%2"=="%WINE_var2%" (
+    echo WINE_var2 correctly %2
+  ) else (
+    echo ERROR: WINE_var2 incorrectly %WINE_var2% [%2]
+  )
+)
+if not "%3"=="" (
+  if "%3"=="%WINE_var3%" (
+    echo WINE_var3 correctly %1
+  ) else (
+    echo ERROR: WINE_var3 incorrectly %WINE_var3% [%3]
+  )
+)
+set WINE_var1=
+set WINE_var2=
+set WINE_var3=
+goto :eof
+
+:testseta
 rem No output when using "set expr" syntax, unless in interactive mode
 rem Need to use "set envvar=expr" to use in a batch script
 echo ------ individual operations
-set WINE_var=0
-set /a WINE_var=1 +2 & echo %WINE_var%
-set /a WINE_var=1 +-2 & echo %WINE_var%
-set /a WINE_var=1 --2 & echo %WINE_var%
-set /a WINE_var=2* 3 & echo %WINE_var%
-set /a WINE_var=-2* -5 & echo %WINE_var%
-set /a WINE_var=12/3 & echo %WINE_var%
-set /a WINE_var=13/3 & echo %WINE_var%
-set /a WINE_var=-13/3 & echo %WINE_var%
+set WINE_var1=0
+set /a WINE_var1=1 +2 & call :check_vars 3
+set /a WINE_var1=1 +-2 & call :check_vars -1
+set /a WINE_var1=1 --2 & call :check_vars 3
+set /a WINE_var1=2* 3 & call :check_vars 6
+set /a WINE_var1=-2* -5 & call :check_vars 10
+set /a WINE_var1=12/3 & call :check_vars 4
+set /a WINE_var1=13/3 & call :check_vars 4
+set /a WINE_var1=-13/3 & call :check_vars -4
 rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
-set /a WINE_var=5 %% 5 & echo %WINE_var%
-set /a WINE_var=5 %% 3 & echo %WINE_var%
-set /a WINE_var=5 %% -3 & echo %WINE_var%
-set /a WINE_var=-5 %% -3 & echo %WINE_var%
-set /a WINE_var=1 ^<^< 0 & echo %WINE_var%
-set /a WINE_var=1 ^<^< 2 & echo %WINE_var%
-set /a WINE_var=1 ^<^< -2 & echo %WINE_var%
-set /a WINE_var=-1 ^<^< -2 & echo %WINE_var%
-set /a WINE_var=-1 ^<^< 2 & echo %WINE_var%
-set /a WINE_var=9 ^>^> 0 & echo %WINE_var%
-set /a WINE_var=9 ^>^> 2 & echo %WINE_var%
-set /a WINE_var=9 ^>^> -2 & echo %WINE_var%
-set /a WINE_var=-9 ^>^> -2 & echo %WINE_var%
-set /a WINE_var=-9 ^>^> 2 & echo %WINE_var%
-set /a WINE_var=5 ^& 0 & echo %WINE_var%
-set /a WINE_var=5 ^& 1 & echo %WINE_var%
-set /a WINE_var=5 ^& 3 & echo %WINE_var%
-set /a WINE_var=5 ^& 4 & echo %WINE_var%
-set /a WINE_var=5 ^& 1 & echo %WINE_var%
-set /a WINE_var=5 ^| 0 & echo %WINE_var%
-set /a WINE_var=5 ^| 1 & echo %WINE_var%
-set /a WINE_var=5 ^| 3 & echo %WINE_var%
-set /a WINE_var=5 ^| 4 & echo %WINE_var%
-set /a WINE_var=5 ^| 1 & echo %WINE_var%
-set /a WINE_var=5 ^^ 0 & echo %WINE_var%
-set /a WINE_var=5 ^^ 1 & echo %WINE_var%
-set /a WINE_var=5 ^^ 3 & echo %WINE_var%
-set /a WINE_var=5 ^^ 4 & echo %WINE_var%
-set /a WINE_var=5 ^^ 1 & echo %WINE_var%
+set /a WINE_var1=5 %% 5 & call :check_vars 0
+set /a WINE_var1=5 %% 3 & call :check_vars 2
+set /a WINE_var1=5 %% -3 & call :check_vars 2
+set /a WINE_var1=-5 %% -3 & call :check_vars -2
+set /a WINE_var1=1 ^<^< 0 & call :check_vars 1
+set /a WINE_var1=1 ^<^< 2 & call :check_vars 4
+set /a WINE_var1=1 ^<^< -2 & call :check_vars 0
+set /a WINE_var1=-1 ^<^< -2 & call :check_vars 0
+set /a WINE_var1=-1 ^<^< 2 & call :check_vars -4
+set /a WINE_var1=9 ^>^> 0 & call :check_vars 9
+set /a WINE_var1=9 ^>^> 2 & call :check_vars 2
+set /a WINE_var1=9 ^>^> -2 & call :check_vars 0
+set /a WINE_var1=-9 ^>^> -2 & call :check_vars -1
+set /a WINE_var1=-9 ^>^> 2 & call :check_vars -3
+set /a WINE_var1=5 ^& 0 & call :check_vars 0
+set /a WINE_var1=5 ^& 1 & call :check_vars 1
+set /a WINE_var1=5 ^& 3 & call :check_vars 1
+set /a WINE_var1=5 ^& 4 & call :check_vars 4
+set /a WINE_var1=5 ^& 1 & call :check_vars 1
+set /a WINE_var1=5 ^| 0 & call :check_vars 5
+set /a WINE_var1=5 ^| 1 & call :check_vars 5
+set /a WINE_var1=5 ^| 3 & call :check_vars 7
+set /a WINE_var1=5 ^| 4 & call :check_vars 5
+set /a WINE_var1=5 ^| 1 & call :check_vars 5
+set /a WINE_var1=5 ^^ 0 & call :check_vars 5
+set /a WINE_var1=5 ^^ 1 & call :check_vars 4
+set /a WINE_var1=5 ^^ 3 & call :check_vars 6
+set /a WINE_var1=5 ^^ 4 & call :check_vars 1
+set /a WINE_var1=5 ^^ 1 & call :check_vars 4
 echo ------ precedence and grouping
-set /a WINE_var=4 + 2*3 & echo %WINE_var%
-set /a WINE_var=(4+2)*3 & echo %WINE_var%
-set /a WINE_var=4 * 3/5 & echo %WINE_var%
-set /a WINE_var=(4 * 3)/5 & echo %WINE_var%
-set /a WINE_var=4 * 5 %% 4 & echo %WINE_var%
-set /a WINE_var=4 * (5 %% 4) & echo %WINE_var%
-set /a WINE_var=3 %% (5 + 8 %% 3 ^^ 2) & echo %WINE_var%
-set /a WINE_var=3 %% (5 + 8 %% 3 ^^ -2) & echo %WINE_var%
+set /a WINE_var1=4 + 2*3 & call :check_vars 10
+set /a WINE_var1=(4+2)*3 & call :check_vars 18
+set /a WINE_var1=4 * 3/5 & call :check_vars 2
+set /a WINE_var1=(4 * 3)/5 & call :check_vars 2
+set /a WINE_var1=4 * 5 %% 4 & call :check_vars 0
+set /a WINE_var1=4 * (5 %% 4) & call :check_vars 4
+set /a WINE_var1=3 %% (5 + 8 %% 3 ^^ 2) & call :check_vars 3
+set /a WINE_var1=3 %% (5 + 8 %% 3 ^^ -2) & call :check_vars 3
 echo ------ octal and hexadecimal
-set /a WINE_var=0xf + 3 & echo %WINE_var%
-set /a WINE_var=0xF + 3 & echo %WINE_var%
-set /a WINE_var=015 + 2 & echo %WINE_var%
-set /a WINE_var=3, 8+3,0 & echo %WINE_var%
+set /a WINE_var1=0xf + 3 & call :check_vars 18
+set /a WINE_var1=0xF + 3 & call :check_vars 18
+set /a WINE_var1=015 + 2 & call :check_vars 15
+set /a WINE_var1=3, 8+3,0 & call :check_vars 3
 echo ------ variables
-set /a WINE_var=WINE_foo=3, WINE_foo+1 & echo %WINE_var%
-if defined WINE_foo (echo %WINE_foo%) else (
-    echo WINE_foo not defined
-)
-set /a WINE_var=WINE_foo=3, WINE_foo+=1 & echo %WINE_var%
-set /a WINE_var=WINE_foo=3, WINE_bar=1, WINE_bar+=WINE_foo, WINE_bar & echo %WINE_var%
-set /a WINE_var=WINE_foo*= WINE_foo & echo %WINE_var%
-set /a WINE_var=WINE_whateverNonExistingVar & echo %WINE_var%
-set /a WINE_var=WINE_whateverNonExistingVar + WINE_bar & echo %WINE_var%
-set /a WINE_var=WINE_foo -= WINE_foo + 7 & echo %WINE_var%
-set /a WINE_var=WINE_foo /= 3 + 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo=5, WINE_foo %%=2 & echo %WINE_var%
-set /a WINE_var=WINE_foo ^<^<= 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo ^>^>= 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo ^&= 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo=5, WINE_foo ^|= 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo=5, WINE_foo ^^= 2 & echo %WINE_var%
-set /a WINE_var=WINE_foo=19, WINE_foo %%= 4 + (WINE_bar %%= 7) & echo.
-set WINE_foo=
-set WINE_bar=
-set WINE_var=
+set /a WINE_var1=WINE_var2=3, WINE_var2+1 & call :check_vars 3 3
+set /a WINE_var1=WINE_var2=3, WINE_var2+=1 & call :check_vars 3 4
+set /a WINE_var1=WINE_var2=3, WINE_var3=1, WINE_var3+=WINE_var2, WINE_var3 & call :check_vars 3 3 4
+set WINE_var2=3
+set /a WINE_var1=WINE_var2*= WINE_var2 & call :check_vars 9 9
+set /a WINE_var1=WINE_whateverNonExistingVar & call :check_vars 0
+set WINE_var2=4
+set /a WINE_var1=WINE_whateverNonExistingVar + WINE_var2 & call :check_vars 4 4
+set WINE_var2=4
+set /a WINE_var1=WINE_var2 -= WINE_var2 + 7 & call :check_vars -7 -7
+set WINE_var2=-7
+set /a WINE_var1=WINE_var2 /= 3 + 2 & call :check_vars -1 -1
+set /a WINE_var1=WINE_var2=5, WINE_var2 %%=2 & call :check_vars 5 1
+rem 4 1 0 5
+set WINE_var2=1
+set /a WINE_var1=WINE_var2 ^<^<= 2 & call :check_vars 4 4
+set WINE_var2=4
+set /a WINE_var1=WINE_var2 ^>^>= 2 & call :check_vars 1 1
+set WINE_var2=1
+set /a WINE_var1=WINE_var2 ^&= 2 & call :check_vars 0 0
+set /a WINE_var1=WINE_var2=5, WINE_var2 ^|= 2 & call :check_vars 5 7
+set /a WINE_var1=WINE_var2=5, WINE_var2 ^^= 2 & call :check_vars 5 7
+set WINE_var3=4
+set /a WINE_var1=WINE_var2=19, WINE_var2 %%= 4 + (WINE_var3 %%= 7) & call :check_vars 19 3 4
+
 echo --- for /F
 mkdir foobar & cd foobar
 echo ------ string argument
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index e7300b4..c0234a0 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -715,76 +715,91 @@ ErrorLevel 0
 -1
 1
 3
---- for /a
+--- set /a
 ------ individual operations
-0
- at todo_wine@3
- at todo_wine@-1
- at todo_wine@3
- at todo_wine@6
- at todo_wine@10
- at todo_wine@4
- at todo_wine@4
- at todo_wine@-4
-0
- at todo_wine@2
- at todo_wine@2
- at todo_wine@-2
- at todo_wine@1
- at todo_wine@4
-0 at or_broken@1073741824
-0 at or_broken@-1073741824
- at todo_wine@-4
- at todo_wine@9
- at todo_wine@2
-0
- at todo_wine@-1
- at todo_wine@-3
-0
- at todo_wine@1
- at todo_wine@1
- at todo_wine@4
- at todo_wine@1
- at todo_wine@5
- at todo_wine@5
- at todo_wine@7
- at todo_wine@5
- at todo_wine@5
- at todo_wine@5
- at todo_wine@4
- at todo_wine@6
- at todo_wine@1
+ at todo_wine@WINE_var1 correctly 3
+ at todo_wine@WINE_var1 correctly -1
+ at todo_wine@WINE_var1 correctly 3
+ at todo_wine@WINE_var1 correctly 6
+ at todo_wine@WINE_var1 correctly 10
+ at todo_wine@WINE_var1 correctly 4
+ at todo_wine@WINE_var1 correctly 4
+ at todo_wine@WINE_var1 correctly -4
+ at todo_wine@WINE_var1 correctly 0
+ at todo_wine@WINE_var1 correctly 2
+ at todo_wine@WINE_var1 correctly 2
+ at todo_wine@WINE_var1 correctly -2
+ at todo_wine@WINE_var1 correctly 1
+ at todo_wine@WINE_var1 correctly 4
+ at todo_wine@WINE_var1 correctly 0 at or_broken@ERROR: WINE_var1 incorrectly 1073741824 [0]
+ at todo_wine@WINE_var1 correctly 0 at or_broken@ERROR: WINE_var1 incorrectly -1073741824 [0]
+ at todo_wine@WINE_var1 correctly -4
+ at todo_wine@WINE_var1 correctly 9
+ at todo_wine@WINE_var1 correctly 2
+ at todo_wine@WINE_var1 correctly 0
+ at todo_wine@WINE_var1 correctly -1
+ at todo_wine@WINE_var1 correctly -3
+ at todo_wine@WINE_var1 correctly 0
+ at todo_wine@WINE_var1 correctly 1
+ at todo_wine@WINE_var1 correctly 1
+ at todo_wine@WINE_var1 correctly 4
+ at todo_wine@WINE_var1 correctly 1
+ at todo_wine@WINE_var1 correctly 5
+ at todo_wine@WINE_var1 correctly 5
+ at todo_wine@WINE_var1 correctly 7
+ at todo_wine@WINE_var1 correctly 5
+ at todo_wine@WINE_var1 correctly 5
+ at todo_wine@WINE_var1 correctly 5
+ at todo_wine@WINE_var1 correctly 4
+ at todo_wine@WINE_var1 correctly 6
+ at todo_wine@WINE_var1 correctly 1
+ at todo_wine@WINE_var1 correctly 4
 ------ precedence and grouping
- at todo_wine@4
- at todo_wine@10
- at todo_wine@18 at or_broken@10
- at todo_wine@2 at or_broken@0
- at todo_wine@2 at or_broken@0
-0 at or_broken@4
- at todo_wine@4
- at todo_wine@3 at or_broken@4
+ at todo_wine@WINE_var1 correctly 10
+ at todo_wine@WINE_var1 correctly 18 at or_broken@ERROR: WINE_var1 incorrectly  [18]
+ at todo_wine@WINE_var1 correctly 2 at or_broken@ERROR: WINE_var1 incorrectly 0 [2]
+ at todo_wine@WINE_var1 correctly 2 at or_broken@ERROR: WINE_var1 incorrectly  [2]
+ at todo_wine@WINE_var1 correctly 0 at or_broken@ERROR: WINE_var1 incorrectly 4 [0]
+ at todo_wine@WINE_var1 correctly 4 at or_broken@ERROR: WINE_var1 incorrectly  [4]
+ at todo_wine@WINE_var1 correctly 3 at or_broken@ERROR: WINE_var1 incorrectly  [3]
+ at todo_wine@WINE_var1 correctly 3 at or_broken@ERROR: WINE_var1 incorrectly  [3]
 ------ octal and hexadecimal
- at todo_wine@3 at or_broken@4
- at todo_wine@18
- at todo_wine@18
- at todo_wine@15
+ at todo_wine@WINE_var1 correctly 18
+ at todo_wine@WINE_var1 correctly 18
+ at todo_wine@WINE_var1 correctly 15
+ at todo_wine@WINE_var1 correctly 3
 ------ variables
- at todo_wine@3
- at todo_wine@3 at or_broken@WINE_foo not defined
- at todo_wine@3 at or_broken@0
- at todo_wine@3 at or_broken@0
- at todo_wine@3 at or_broken@0
- at todo_wine@9 at or_broken@0
-0
- at todo_wine@4 at or_broken@0
- at todo_wine@-7 at or_broken@0
- at todo_wine@-1 at or_broken@0
- at todo_wine@5 at or_broken@0
- at todo_wine@4 at or_broken@0
- at todo_wine@1 at or_broken@0
-0
- at todo_wine@5 at or_broken@0
-
+ at todo_wine@WINE_var1 correctly 3 at or_broken@ERROR: WINE_var1 incorrectly 0 [3]
+ at todo_wine@WINE_var2 correctly 3 at or_broken@ERROR: WINE_var2 incorrectly  [3]
+ at todo_wine@WINE_var1 correctly 3 at or_broken@ERROR: WINE_var1 incorrectly 0 [3]
+ at todo_wine@WINE_var2 correctly 4 at or_broken@ERROR: WINE_var2 incorrectly  [4]
+ at todo_wine@WINE_var1 correctly 3 at or_broken@ERROR: WINE_var1 incorrectly 0 [3]
+ at todo_wine@WINE_var2 correctly 3 at or_broken@ERROR: WINE_var2 incorrectly  [3]
+ at todo_wine@WINE_var3 correctly 3 at or_broken@ERROR: WINE_var3 incorrectly  [4]
+ at todo_wine@WINE_var1 correctly 9 at or_broken@ERROR: WINE_var1 incorrectly 3 [9]
+ at todo_wine@WINE_var2 correctly 9 at or_broken@ERROR: WINE_var2 incorrectly 3 [9]
+ at todo_wine@WINE_var1 correctly 0
+ at todo_wine@WINE_var1 correctly 4
+WINE_var2 correctly 4
+ at todo_wine@WINE_var1 correctly -7 at or_broken@ERROR: WINE_var1 incorrectly 4 [-7]
+ at todo_wine@WINE_var2 correctly -7 at or_broken@ERROR: WINE_var2 incorrectly 4 [-7]
+ at todo_wine@WINE_var1 correctly -1 at or_broken@ERROR: WINE_var1 incorrectly -7 [-1]
+ at todo_wine@WINE_var2 correctly -1 at or_broken@ERROR: WINE_var2 incorrectly -7 [-1]
+ at todo_wine@WINE_var1 correctly 5 at or_broken@ERROR: WINE_var1 incorrectly 0 [5]
+ at todo_wine@WINE_var2 correctly 1 at or_broken@ERROR: WINE_var2 incorrectly  [1]
+ at todo_wine@WINE_var1 correctly 4 at or_broken@ERROR: WINE_var1 incorrectly 1 [4]
+ at todo_wine@WINE_var2 correctly 4 at or_broken@ERROR: WINE_var2 incorrectly 1 [4]
+ at todo_wine@WINE_var1 correctly 1 at or_broken@ERROR: WINE_var1 incorrectly 4 [1]
+ at todo_wine@WINE_var2 correctly 1 at or_broken@ERROR: WINE_var2 incorrectly 4 [1]
+ at todo_wine@WINE_var1 correctly 0 at or_broken@ERROR: WINE_var1 incorrectly 1 [0]
+ at todo_wine@WINE_var2 correctly 0 at or_broken@ERROR: WINE_var2 incorrectly 1 [0]
+ at todo_wine@WINE_var1 correctly 5 at or_broken@ERROR: WINE_var1 incorrectly 0 [5]
+ at todo_wine@WINE_var2 correctly 7 at or_broken@ERROR: WINE_var2 incorrectly  [7]
+ at todo_wine@WINE_var1 correctly 5 at or_broken@ERROR: WINE_var1 incorrectly 0 [5]
+ at todo_wine@WINE_var2 correctly 7 at or_broken@ERROR: WINE_var2 incorrectly  [7]
+ at todo_wine@WINE_var1 correctly 19 at or_broken@ERROR: WINE_var1 incorrectly 0 [19]
+ at todo_wine@WINE_var2 correctly 3 at or_broken@ERROR: WINE_var2 incorrectly  [3]
+WINE_var3 correctly 19
 --- for /F
 ------ string argument
 a
-- 
1.7.9.5


More information about the wine-patches mailing list