2 ' Copyright 2011 Jacek Caban for CodeWeavers
4 ' This library is free software; you can redistribute it and/or
5 ' modify it under the terms of the GNU Lesser General Public
6 ' License as published by the Free Software Foundation; either
7 ' version 2.1 of the License, or (at your option) any later version.
9 ' This library is distributed in the hope that it will be useful,
10 ' but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ' Lesser General Public License for more details.
14 ' You should have received a copy of the GNU Lesser General Public
15 ' License along with this library; if not, write to the Free Software
16 ' Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 call ok(true, "true is not true?")
24 ok true, "true is not true?"
25 call ok((true), "true is not true?")
27 ok not false, "not false but not true?"
28 ok not not true, "not not true but not true?"
30 Call ok(true = true, "true = true is false")
31 Call ok(false = false, "false = false is false")
32 Call ok(not (true = false), "true = false is true")
33 Call ok("x" = "x", """x"" = ""x"" is false")
34 Call ok(empty = empty, "empty = empty is false")
35 Call ok(empty = "", "empty = """" is false")
36 Call ok(0 = 0.0, "0 <> 0.0")
37 Call ok(16 = &h10&, "16 <> &h10&")
38 Call ok(010 = 10, "010 <> 10")
39 Call ok(10. = 10, "10. <> 10")
40 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
41 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
42 Call ok(--1 = 1, "--1 = " & --1)
43 Call ok(-empty = 0, "-empty = " & (-empty))
44 Call ok(true = -1, "! true = -1")
45 Call ok(false = 0, "false <> 0")
46 Call ok(&hff = 255, "&hff <> 255")
47 Call ok(&Hff = 255, "&Hff <> 255")
50 Call ok(x = "xx", "x = " & x & " expected ""xx""")
52 Call ok(true <> false, "true <> false is false")
53 Call ok(not (true <> true), "true <> true is true")
54 Call ok(not ("x" <> "x"), """x"" <> ""x"" is true")
55 Call ok(not (empty <> empty), "empty <> empty is true")
56 Call ok(x <> "x", "x = ""x""")
57 Call ok("true" <> true, """true"" = true is true")
59 Call ok("" = true = false, """"" = true = false is false")
60 Call ok(not(false = true = ""), "false = true = """" is true")
61 Call ok(not (false = false <> false = false), "false = false <> false = false is true")
62 Call ok(not ("" <> false = false), """"" <> false = false is true")
64 Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL")
65 Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL")
66 Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR")
67 Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR")
68 Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY")
69 Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL")
70 Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2")
71 Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2")
72 Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8")
73 Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8")
74 Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4")
75 Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8")
76 Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2")
77 Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4")
78 Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4")
79 Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
80 Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
81 Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
82 Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
83 Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
84 Call ok(getVT(nothing) = "VT_DISPATCH", "getVT(nothing) = " & getVT(nothing))
86 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=nothing) = " & getVT(x))
88 Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x))
89 Call ok(getVT(false or true) = "VT_BOOL", "getVT(false) is not VT_BOOL")
91 Call ok(getVT(x) = "VT_BSTR*", "getVT(x) is not VT_BSTR*")
93 Call ok(getVT(x) = "VT_R8*", "getVT(x) = " & getVT(x))
95 Call ok(isNullDisp(nothing), "nothing is not nulldisp?")
98 Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
99 Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
100 Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty))
101 Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000))
102 Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x))
104 if(isEnglishLang) then
105 Call ok("" & true = "True", """"" & true = " & true)
106 Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
109 call ok(true and true, "true and true is not true")
110 call ok(true and not false, "true and not false is not true")
111 call ok(not (false and true), "not (false and true) is not true")
112 call ok(getVT(null and true) = "VT_NULL", "getVT(null and true) = " & getVT(null and true))
114 call ok(false or true, "false or uie is false?")
115 call ok(not (false or false), "false or false is not false?")
116 call ok(false and false or true, "false and false or true is false?")
117 call ok(true or false and false, "true or false and false is false?")
118 call ok(null or true, "null or true is false")
120 call ok(true xor false, "true xor false is false?")
121 call ok(not (false xor false), "false xor false is true?")
122 call ok(not (true or false xor true), "true or false xor true is true?")
123 call ok(not (true xor false or true), "true xor false or true is true?")
125 call ok(false eqv false, "false does not equal false?")
126 call ok(not (false eqv true), "false equals true?")
127 call ok(getVT(false eqv null) = "VT_NULL", "getVT(false eqv null) = " & getVT(false eqv null))
129 call ok(true imp true, "true does not imp true?")
130 call ok(false imp false, "false does not imp false?")
131 call ok(not (true imp false), "true imp false?")
132 call ok(false imp null, "false imp null is false?")
134 Call ok(2 >= 1, "! 2 >= 1")
135 Call ok(2 >= 2, "! 2 >= 2")
136 Call ok(not(true >= 2), "true >= 2 ?")
137 Call ok(2 > 1, "! 2 > 1")
138 Call ok(false > true, "! false < true")
139 Call ok(0 > true, "! 0 > true")
140 Call ok(not (true > 0), "true > 0")
141 Call ok(not (0 > 1 = 1), "0 > 1 = 1")
142 Call ok(1 < 2, "! 1 < 2")
143 Call ok(1 = 1 < 0, "! 1 = 1 < 0")
144 Call ok(1 <= 2, "! 1 <= 2")
145 Call ok(2 <= 2, "! 2 <= 2")
148 Call ok(2+2 = 4, "2+2 = " & (2+2))
149 Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
150 Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
151 Call ok(2+empty = 2, "2+empty = " & (2+empty))
152 Call ok(x+x = 6, "x+x = " & (x+x))
154 Call ok(5-1 = 4, "5-1 = " & (5-1))
155 Call ok(3+5-true = 9, "3+5-true <> 9")
156 Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
157 Call ok(2-empty = 2, "2-empty = " & (2-empty))
158 Call ok(2-x = -1, "2-x = " & (2-x))
160 Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
161 Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
162 Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
163 Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
164 Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
165 'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
167 Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
168 Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
169 Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
170 Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
172 Call ok(2*3 = 6, "2*3 = " & (2*3))
173 Call ok(3/2 = 1.5, "3/2 = " & (3/2))
174 Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
175 Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
177 Call ok(2^3 = 8, "2^3 = " & (2^3))
178 Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
179 Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
180 Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
189 if true then y = true : x = y
192 x = true : if false then x = false
193 ok x, "x is false, if false called?"
195 if not false then x = true
196 ok x, "x is false, if not false not called?"
198 if not false then x = "test" : x = true
199 ok x, "x is false, if not false not called?"
201 if false then x = y : call ok(false, "if false .. : called")
203 if false then x = y : call ok(false, "if false .. : called") else x = "else"
204 Call ok(x = "else", "else not called?")
206 if true then x = y else y = x : Call ok(false, "in else?")
210 if false then x = y : if true then call ok(false, "embedded if called")
213 ok false, "if false called"
220 Call ok(not x, "x is false, if not evaluated?")
224 Call ok(false, "inside if false")
228 Call ok(x, "else not called?")
232 Call ok(false, "inside if false")
234 Call ok(false, "inside elseif not true")
238 Call ok(x, "else not called?")
242 Call ok(false, "inside if false")
245 ElseIf not False Then
248 Call ok(false, "inside else not true")
250 Call ok(x, "elseif not called?")
254 Call ok(false, "inside if false")
255 ElseIf not False Then
258 Call ok(x, "elseif not called?")
268 call ok((x and y), "x or y is false after while")
275 do while not (x and y)
281 call ok((x and y), "x or y is false after while")
288 ok false, "exit do didn't work"
299 call ok((x and y), "x or y is false after do until")
306 ok false, "exit do didn't work"
317 call ok((x and y), "x or y is false after while")
324 ok false, "exit do didn't work"
334 loop while not (x and y)
335 call ok((x and y), "x or y is false after while")
342 ok false, "exit do didn't work"
349 Call ok(y = "for1: 5 6 7 8", "y = " & y)
352 for x = 5 to 8 step 2
355 Call ok(y = "for2: 5 7", "y = " & y)
362 Call ok(y = "for3: 5 6 7 8", "y = " & y)
368 Call ok(y = "for4:", "y = " & y)
371 for x = 5 to 3 step true
374 Call ok(y = "for5: 5 4 3", "y = " & y)
378 for x = 5 to z step 3-4
382 Call ok(y = "for6: 5 4", "y = " & y)
386 for x = 5 to 8 step z
390 Call ok(y = "for7: 5 6 7 8", "y = " & y)
397 Call ok(y = "for8: 5 7", "y = " & y)
400 Call ok(false, "for..to called when unexpected")
405 Call ok(false, "exit for not escaped the loop?")
416 Call ok(x, "x is false, testsub not called?")
419 Call ok(not v, "v is not true")
425 Call ok(x, "x was not set by SubSetTrue")
428 Call ok(not false, "false is no longer false?")
430 Sub SubSetTrue2(ByRef v)
431 Call ok(not v, "v is not true")
437 Call ok(x, "x was not set by SubSetTrue")
439 Sub TestSubArgVal(ByVal v)
440 Call ok(not v, "v is not false")
442 Call ok(v, "v is not true?")
446 Call TestSubArgVal(x)
447 Call ok(not x, "x is true after TestSubArgVal call?")
449 Sub TestSubMultiArgs(a,b,c,d,e)
450 Call ok(a=1, "a = " & a)
451 Call ok(b=2, "b = " & b)
452 Call ok(c=3, "c = " & c)
453 Call ok(d=4, "d = " & d)
454 Call ok(e=5, "e = " & e)
457 Sub TestSubExit(ByRef a)
461 Call ok(false, "Exit Sub not called?")
464 Call TestSubExit(true)
466 TestSubMultiArgs 1, 2, 3, 4, 5
467 Call TestSubMultiArgs(1, 2, 3, 4, 5)
471 Call ok(not x, "local x is not false?")
478 Call ok(x, "global x is not true?")
480 Public Sub TestPublicSub
484 Private Sub TestPrivateSub
496 Call ok(x, "x is false, testfunc not called?")
498 Function FuncSetTrue(v)
499 Call ok(not v, "v is not true")
505 Call ok(x, "x was not set by FuncSetTrue")
508 Call ok(not false, "false is no longer false?")
510 Function FuncSetTrue2(ByRef v)
511 Call ok(not v, "v is not true")
517 Call ok(x, "x was not set by FuncSetTrue")
519 Function TestFuncArgVal(ByVal v)
520 Call ok(not v, "v is not false")
522 Call ok(v, "v is not true?")
526 Call TestFuncArgVal(x)
527 Call ok(not x, "x is true after TestFuncArgVal call?")
529 Function TestFuncMultiArgs(a,b,c,d,e)
530 Call ok(a=1, "a = " & a)
531 Call ok(b=2, "b = " & b)
532 Call ok(c=3, "c = " & c)
533 Call ok(d=4, "d = " & d)
534 Call ok(e=5, "e = " & e)
537 TestFuncMultiArgs 1, 2, 3, 4, 5
538 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
540 Function TestFuncLocalVal
542 Call ok(not x, "local x is not false?")
548 Call TestFuncLocalVal
549 Call ok(x, "global x is not true?")
551 Function TestFuncExit(ByRef a)
555 Call ok(false, "Exit Function not called?")
558 Call TestFuncExit(true)
564 Function FuncParseTest
565 End Function : x = false
572 Call ok(ReturnTrue(), "ReturnTrue returned false?")
574 Function SetVal(ByRef x, ByVal v)
581 ok SetVal(x, true), "SetVal returned false?"
582 Call ok(x, "x is not set to true by SetVal?")
584 Public Function TestPublicFunc
588 Private Function TestPrivateFunc
592 ' Stop has an effect only in debugging mode
596 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
599 Set obj = New EmptyClass
600 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
606 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x) = " & getVT(x))
613 Public Function publicFunction()
618 Public Property Get gsProp()
620 funcCalled = "gsProp get"
622 Call ok(false, "exit property not returned?")
625 Public Default Property Get DefValGet
626 DefValGet = privateProp
627 funcCalled = "GetDefVal"
630 Public Property Let DefValGet(x)
638 Public Property Let gsProp(val)
640 funcCalled = "gsProp let"
642 Call ok(false, "exit property not returned?")
645 Public Property Set gsProp(val)
646 funcCalled = "gsProp set"
648 Call ok(false, "exit property not returned?")
651 Public Sub setPrivateProp(x)
655 Function getPrivateProp
656 getPrivateProp = privateProp
659 Private Sub privateSub
662 Public Sub Class_Initialize
668 Call testDisp(new testClass)
670 Set obj = New TestClass
672 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
673 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
677 Call obj.publicFunction()
679 Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
681 Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
684 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
685 Call obj.setPrivateProp(6)
686 Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
690 Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
691 Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
693 Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
694 Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
695 Set obj.gsProp = New testclass
696 Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
699 Call ok(x = 3, "(x = obj) = " & x)
700 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
702 Call ok(obj = 3, "(x = obj) = " & obj)
703 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
705 Call obj.Class_Initialize
706 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
708 x = (New testclass).publicProp
711 Public Sub Class_Terminate()
712 funcCalled = "terminate"
716 Set obj = New TermTest
719 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
721 Set obj = New TermTest
723 Call obj.Class_Terminate
724 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
727 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
729 Call (New testclass).publicSub()
730 Call (New testclass).publicSub
732 x = "following ':' is correct syntax" :
733 x = "following ':' is correct syntax" :: :
734 :: x = "also correct syntax"
735 rem another ugly way for comments
736 x = "rem as simplestatement" : rem rem comment
739 Set obj = new EmptyClass
741 Set y = new EmptyClass
743 Call ok(obj is x, "obj is not x")
744 Call ok(x is obj, "x is not obj")
745 Call ok(not (obj is y), "obj is not y")
746 Call ok(not obj is y, "obj is not y")
747 Call ok(not (x is Nothing), "x is 1")
748 Call ok(Nothing is Nothing, "Nothing is not Nothing")
749 Call ok(x is obj and true, "x is obj and true is false")
752 Public Sub Test(MyMe)
753 Call ok(Me is MyMe, "Me is not MyMe")
760 Call ok(getVT(test) = "VT_DISPATCH", "getVT(test) = " & getVT(test))
761 Call ok(Me is Test, "Me is not Test")
764 Call ok(c1 = 1, "c1 = " & c1)
765 Call ok(getVT(c1) = "VT_I2", "getVT(c1) = " & getVT(c1))
767 if false then Const conststr = "str"
768 Call ok(conststr = "str", "conststr = " & conststr)
769 Call ok(getVT(conststr) = "VT_BSTR", "getVT(conststr) = " & getVT(conststr))
770 Call ok(conststr = "str", "conststr = " & conststr)
774 Call ok(c1 = 1, "c1 = " & c1)
775 Call ok(funcconst = 1, "funcconst = " & funcconst)