vbscript: Added support for short if statements.
[wine.git] / dlls / vbscript / tests / lang.vbs
blob029c5ac3963ebbefb835aad0fe76c2925b63f749
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
19 Option Explicit
21 dim x, y
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))
45 x = "xx"
46 Call ok(x = "xx", "x = " & x & " expected ""xx""")
48 Call ok(true <> false, "true <> false is false")
49 Call ok(not (true <> true), "true <> true is true")
50 Call ok(not ("x" <> "x"), """x"" <> ""x"" is true")
51 Call ok(not (empty <> empty), "empty <> empty is true")
52 Call ok(x <> "x", "x = ""x""")
54 Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL")
55 Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL")
56 Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR")
57 Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR")
58 Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY")
59 Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL")
60 Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2")
61 Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2")
62 Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8")
63 Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8")
64 Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4")
65 Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8")
66 Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2")
67 Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4")
68 Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4")
69 Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
70 Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
71 Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
72 Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
73 Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
74 Call ok(getVT(nothing) = "VT_DISPATCH", "getVT(nothing) = " & getVT(nothing))
75 set x = nothing
76 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=nothing) = " & getVT(x))
77 x = true
78 Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x))
80 Call ok(isNullDisp(nothing), "nothing is not nulldisp?")
82 x = "xx"
83 Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
84 Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
85 Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty))
86 Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000))
87 Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x))
89 if(isEnglishLang) then
90 Call ok("" & true = "True", """"" & true = " & true)
91 Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
92 end if
94 call ok(true and true, "true and true is not true")
95 call ok(true and not false, "true and not false is not true")
96 call ok(not (false and true), "not (false and true) is not true")
97 call ok(getVT(null and true) = "VT_NULL", "getVT(null and true) = " & getVT(null and true))
99 call ok(false or true, "false or uie is false?")
100 call ok(not (false or false), "false or false is not false?")
101 call ok(false and false or true, "false and false or true is false?")
102 call ok(true or false and false, "true or false and false is false?")
103 call ok(null or true, "null or true is false")
105 call ok(true xor false, "true xor false is false?")
106 call ok(not (false xor false), "false xor false is true?")
107 call ok(not (true or false xor true), "true or false xor true is true?")
108 call ok(not (true xor false or true), "true xor false or true is true?")
110 call ok(false eqv false, "false does not equal false?")
111 call ok(not (false eqv true), "false equals true?")
112 call ok(getVT(false eqv null) = "VT_NULL", "getVT(false eqv null) = " & getVT(false eqv null))
114 call ok(true imp true, "true does not imp true?")
115 call ok(false imp false, "false does not imp false?")
116 call ok(not (true imp false), "true imp false?")
117 call ok(false imp null, "false imp null is false?")
119 Call ok(2 >= 1, "! 2 >= 1")
120 Call ok(2 >= 2, "! 2 >= 2")
121 Call ok(not(true >= 2), "true >= 2 ?")
122 Call ok(2 > 1, "! 2 > 1")
123 Call ok(false > true, "! false < true")
124 Call ok(0 > true, "! 0 > true")
125 Call ok(not (true > 0), "true > 0")
126 Call ok(not (0 > 1 = 1), "0 > 1 = 1")
127 Call ok(1 < 2, "! 1 < 2")
128 Call ok(1 = 1 < 0, "! 1 = 1 < 0")
129 Call ok(1 <= 2, "! 1 <= 2")
130 Call ok(2 <= 2, "! 2 <= 2")
132 x = 3
133 Call ok(2+2 = 4, "2+2 = " & (2+2))
134 Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
135 Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
136 Call ok(2+empty = 2, "2+empty = " & (2+empty))
137 Call ok(x+x = 6, "x+x = " & (x+x))
139 Call ok(5-1 = 4, "5-1 = " & (5-1))
140 Call ok(3+5-true = 9, "3+5-true <> 9")
141 Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
142 Call ok(2-empty = 2, "2-empty = " & (2-empty))
143 Call ok(2-x = -1, "2-x = " & (2-x))
145 Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
146 Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
147 Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
148 Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
149 Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
150 'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
152 Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
153 Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
154 Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
155 Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
157 Call ok(2*3 = 6, "2*3 = " & (2*3))
158 Call ok(3/2 = 1.5, "3/2 = " & (3/2))
159 Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
160 Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
162 Call ok(2^3 = 8, "2^3 = " & (2^3))
163 Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
164 Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
165 Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
167 if true then y = true : x = y
168 ok x, "x is false"
170 x = true : if false then x = false
171 ok x, "x is false, if false called?"
173 if not false then x = true
174 ok x, "x is false, if not false not called?"
176 if not false then x = "test" : x = true
177 ok x, "x is false, if not false not called?"
179 if false then x = y : call ok(false, "if false .. : called")
181 if false then x = y : call ok(false, "if false .. : called") else x = "else"
182 Call ok(x = "else", "else not called?")
184 if true then x = y else y = x : Call ok(false, "in else?")
186 if false then :
188 if false then x = y : if true then call ok(false, "embedded if called")
190 if false then
191 ok false, "if false called"
192 end if
194 x = true
195 if x then
196 x = false
197 end if
198 Call ok(not x, "x is false, if not evaluated?")
200 x = false
201 If false Then
202 Call ok(false, "inside if false")
203 Else
204 x = true
205 End If
206 Call ok(x, "else not called?")
208 x = false
209 If false Then
210 Call ok(false, "inside if false")
211 ElseIf not True Then
212 Call ok(false, "inside elseif not true")
213 Else
214 x = true
215 End If
216 Call ok(x, "else not called?")
218 x = false
219 If false Then
220 Call ok(false, "inside if false")
221 x = 1
222 y = 10+x
223 ElseIf not False Then
224 x = true
225 Else
226 Call ok(false, "inside else not true")
227 End If
228 Call ok(x, "elseif not called?")
230 x = false
231 If false Then
232 Call ok(false, "inside if false")
233 ElseIf not False Then
234 x = true
235 End If
236 Call ok(x, "elseif not called?")
238 x = false
239 y = false
240 while not (x and y)
241 if x then
242 y = true
243 end if
244 x = true
245 wend
246 call ok((x and y), "x or y is false after while")
248 while false
249 wend
251 x = false
252 y = false
253 do while not (x and y)
254 if x then
255 y = true
256 end if
257 x = true
258 loop
259 call ok((x and y), "x or y is false after while")
261 do while false
262 loop
264 do while true
265 exit do
266 ok false, "exit do didn't work"
267 loop
269 x = false
270 y = false
271 do until x and y
272 if x then
273 y = true
274 end if
275 x = true
276 loop
277 call ok((x and y), "x or y is false after do until")
279 do until true
280 loop
282 do until false
283 exit do
284 ok false, "exit do didn't work"
285 loop
287 x = false
288 y = false
290 if x then
291 y = true
292 end if
293 x = true
294 loop until x and y
295 call ok((x and y), "x or y is false after while")
298 loop until true
301 exit do
302 ok false, "exit do didn't work"
303 loop until false
305 x = false
306 y = false
308 if x then
309 y = true
310 end if
311 x = true
312 loop while not (x and y)
313 call ok((x and y), "x or y is false after while")
316 loop while false
319 exit do
320 ok false, "exit do didn't work"
321 loop while true
323 if false then
324 Sub testsub
325 x = true
326 End Sub
327 end if
329 x = false
330 Call testsub
331 Call ok(x, "x is false, testsub not called?")
333 Sub SubSetTrue(v)
334 Call ok(not v, "v is not true")
335 v = true
336 End Sub
338 x = false
339 SubSetTrue x
340 Call ok(x, "x was not set by SubSetTrue")
342 SubSetTrue false
343 Call ok(not false, "false is no longer false?")
345 Sub SubSetTrue2(ByRef v)
346 Call ok(not v, "v is not true")
347 v = true
348 End Sub
350 x = false
351 SubSetTrue2 x
352 Call ok(x, "x was not set by SubSetTrue")
354 Sub TestSubArgVal(ByVal v)
355 Call ok(not v, "v is not false")
356 v = true
357 Call ok(v, "v is not true?")
358 End Sub
360 x = false
361 Call TestSubArgVal(x)
362 Call ok(not x, "x is true after TestSubArgVal call?")
364 Sub TestSubMultiArgs(a,b,c,d,e)
365 Call ok(a=1, "a = " & a)
366 Call ok(b=2, "b = " & b)
367 Call ok(c=3, "c = " & c)
368 Call ok(d=4, "d = " & d)
369 Call ok(e=5, "e = " & e)
370 End Sub
372 Sub TestSubExit(ByRef a)
373 If a Then
374 Exit Sub
375 End If
376 Call ok(false, "Exit Sub not called?")
377 End Sub
379 Call TestSubExit(true)
381 TestSubMultiArgs 1, 2, 3, 4, 5
382 Call TestSubMultiArgs(1, 2, 3, 4, 5)
384 Sub TestSubLocalVal
385 x = false
386 Call ok(not x, "local x is not false?")
387 Dim x
388 End Sub
390 x = true
391 y = true
392 Call TestSubLocalVal
393 Call ok(x, "global x is not true?")
395 Public Sub TestPublicSub
396 End Sub
397 Call TestPublicSub
399 Private Sub TestPrivateSub
400 End Sub
401 Call TestPrivateSub
403 if false then
404 Function testfunc
405 x = true
406 End Function
407 end if
409 x = false
410 Call TestFunc
411 Call ok(x, "x is false, testfunc not called?")
413 Function FuncSetTrue(v)
414 Call ok(not v, "v is not true")
415 v = true
416 End Function
418 x = false
419 FuncSetTrue x
420 Call ok(x, "x was not set by FuncSetTrue")
422 FuncSetTrue false
423 Call ok(not false, "false is no longer false?")
425 Function FuncSetTrue2(ByRef v)
426 Call ok(not v, "v is not true")
427 v = true
428 End Function
430 x = false
431 FuncSetTrue2 x
432 Call ok(x, "x was not set by FuncSetTrue")
434 Function TestFuncArgVal(ByVal v)
435 Call ok(not v, "v is not false")
436 v = true
437 Call ok(v, "v is not true?")
438 End Function
440 x = false
441 Call TestFuncArgVal(x)
442 Call ok(not x, "x is true after TestFuncArgVal call?")
444 Function TestFuncMultiArgs(a,b,c,d,e)
445 Call ok(a=1, "a = " & a)
446 Call ok(b=2, "b = " & b)
447 Call ok(c=3, "c = " & c)
448 Call ok(d=4, "d = " & d)
449 Call ok(e=5, "e = " & e)
450 End Function
452 TestFuncMultiArgs 1, 2, 3, 4, 5
453 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
455 Function TestFuncLocalVal
456 x = false
457 Call ok(not x, "local x is not false?")
458 Dim x
459 End Function
461 x = true
462 y = true
463 Call TestFuncLocalVal
464 Call ok(x, "global x is not true?")
466 Function TestFuncExit(ByRef a)
467 If a Then
468 Exit Function
469 End If
470 Call ok(false, "Exit Function not called?")
471 End Function
473 Call TestFuncExit(true)
475 Function ReturnTrue
476 ReturnTrue = false
477 ReturnTrue = true
478 End Function
480 Call ok(ReturnTrue(), "ReturnTrue returned false?")
482 Function SetVal(ByRef x, ByVal v)
483 x = v
484 SetVal = x
485 Exit Function
486 End Function
488 x = false
489 ok SetVal(x, true), "SetVal returned false?"
490 Call ok(x, "x is not set to true by SetVal?")
492 Public Function TestPublicFunc
493 End Function
494 Call TestPublicFunc
496 Private Function TestPrivateFunc
497 End Function
498 Call TestPrivateFunc
500 ' Stop has an effect only in debugging mode
501 Stop
503 set x = testObj
504 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
506 Dim obj
507 Set obj = New EmptyClass
508 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
510 Class EmptyClass
511 End Class
513 Class TestClass
514 Public publicProp
516 Private privateProp
518 Public Function publicFunction()
519 privateSub()
520 publicFunction = 4
521 End Function
523 Public Property Get gsProp()
524 gsProp = privateProp
525 funcCalled = "gsProp get"
526 exit property
527 Call ok(false, "exit property not returned?")
528 End Property
530 Public Default Property Get DefValGet
531 DefValGet = privateProp
532 funcCalled = "GetDefVal"
533 End Property
535 Public Property Let DefValGet(x)
536 End Property
538 Public publicProp2
540 Public Sub publicSub
541 End Sub
543 Public Property Let gsProp(val)
544 privateProp = val
545 funcCalled = "gsProp let"
546 exit property
547 Call ok(false, "exit property not returned?")
548 End Property
550 Public Property Set gsProp(val)
551 funcCalled = "gsProp set"
552 exit property
553 Call ok(false, "exit property not returned?")
554 End Property
556 Public Sub setPrivateProp(x)
557 privateProp = x
558 End Sub
560 Function getPrivateProp
561 getPrivateProp = privateProp
562 End Function
564 Private Sub privateSub
565 End Sub
567 Public Sub Class_Initialize
568 publicProp2 = 2
569 privateProp = true
570 End Sub
571 End Class
573 Call testDisp(new testClass)
575 Set obj = New TestClass
577 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
578 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
580 obj.publicSub()
581 Call obj.publicSub
582 Call obj.publicFunction()
584 Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
585 obj.publicProp = 3
586 Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
587 obj.publicProp() = 3
589 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
590 Call obj.setPrivateProp(6)
591 Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
593 Dim funcCalled
594 funcCalled = ""
595 Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
596 Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
597 obj.gsProp = 3
598 Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
599 Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
600 Set obj.gsProp = New testclass
601 Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
603 x = obj
604 Call ok(x = 3, "(x = obj) = " & x)
605 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
606 funcCalled = ""
607 Call ok(obj = 3, "(x = obj) = " & obj)
608 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
610 Call obj.Class_Initialize
611 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
613 x = (New testclass).publicProp
615 Class TermTest
616 Public Sub Class_Terminate()
617 funcCalled = "terminate"
618 End Sub
619 End Class
621 Set obj = New TermTest
622 funcCalled = ""
623 Set obj = Nothing
624 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
626 Set obj = New TermTest
627 funcCalled = ""
628 Call obj.Class_Terminate
629 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
630 funcCalled = ""
631 Set obj = Nothing
632 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
634 x = "following ':' is correct syntax" :
635 x = "following ':' is correct syntax" :: :
636 :: x = "also correct syntax"
637 rem another ugly way for comments
638 x = "rem as simplestatement" : rem rem comment
641 Set obj = new EmptyClass
642 Set x = obj
643 Set y = new EmptyClass
645 Call ok(obj is x, "obj is not x")
646 Call ok(x is obj, "x is not obj")
647 Call ok(not (obj is y), "obj is not y")
648 Call ok(not obj is y, "obj is not y")
649 Call ok(not (x is Nothing), "x is 1")
650 Call ok(Nothing is Nothing, "Nothing is not Nothing")
651 Call ok(x is obj and true, "x is obj and true is false")
653 Class TestMe
654 Public Sub Test(MyMe)
655 Call ok(Me is MyMe, "Me is not MyMe")
656 End Sub
657 End Class
659 Set obj = New TestMe
660 Call obj.test(obj)
662 Call ok(getVT(test) = "VT_DISPATCH", "getVT(test) = " & getVT(test))
663 Call ok(Me is Test, "Me is not Test")
665 reportSuccess()