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