vbscript: Added support for exit do statement.
[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
45 x = "xx"
46 Call ok(x = "xx", "x = " & x & " expected ""xx""")
47
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""")
53
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))
79
80 Call ok(isNullDisp(nothing), "nothing is not nulldisp?")
81
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))
88
89 if(isEnglishLang) then
90     Call ok("" & true = "True", """"" & true = " & true)
91     Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
92 end if
93
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))
98
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")
104
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?")
109
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))
113
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?")
118
119 x = 3
120 Call ok(2+2 = 4, "2+2 = " & (2+2))
121 Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
122 Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
123 Call ok(2+empty = 2, "2+empty = " & (2+empty))
124 Call ok(x+x = 6, "x+x = " & (x+x))
125
126 Call ok(5-1 = 4, "5-1 = " & (5-1))
127 Call ok(3+5-true = 9, "3+5-true <> 9")
128 Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
129 Call ok(2-empty = 2, "2-empty = " & (2-empty))
130 Call ok(2-x = -1, "2-x = " & (2-x))
131
132 Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
133 Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
134 Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
135 Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
136 Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
137 'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
138
139 Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
140 Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
141 Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
142 Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
143
144 Call ok(2*3 = 6, "2*3 = " & (2*3))
145 Call ok(3/2 = 1.5, "3/2 = " & (3/2))
146 Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
147 Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
148
149 Call ok(2^3 = 8, "2^3 = " & (2^3))
150 Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
151 Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
152 Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
153
154 if false then
155     ok false, "if false called"
156 end if
157
158 x = true
159 if x then
160     x = false
161 end if
162 Call ok(not x, "x is false, if not evaluated?")
163
164 x = false
165 If false Then
166    Call ok(false, "inside if false")
167 Else
168    x = true
169 End If
170 Call ok(x, "else not called?")
171
172 x = false
173 If false Then
174    Call ok(false, "inside if false")
175 ElseIf not True Then
176    Call ok(false, "inside elseif not true")
177 Else
178    x = true
179 End If
180 Call ok(x, "else not called?")
181
182 x = false
183 If false Then
184    Call ok(false, "inside if false")
185    x = 1
186    y = 10+x
187 ElseIf not False Then
188    x = true
189 Else
190    Call ok(false, "inside else not true")
191 End If
192 Call ok(x, "elseif not called?")
193
194 x = false
195 If false Then
196    Call ok(false, "inside if false")
197 ElseIf not False Then
198    x = true
199 End If
200 Call ok(x, "elseif not called?")
201
202 x = false
203 y = false
204 while not (x and y)
205     if x then
206         y = true
207     end if
208     x = true
209 wend
210 call ok((x and y), "x or y is false after while")
211
212 while false
213 wend
214
215 x = false
216 y = false
217 do while not (x and y)
218     if x then
219         y = true
220     end if
221     x = true
222 loop
223 call ok((x and y), "x or y is false after while")
224
225 do while false
226 loop
227
228 do while true
229     exit do
230     ok false, "exit do didn't work"
231 loop
232
233 if false then
234 Sub testsub
235     x = true
236 End Sub
237 end if
238
239 x = false
240 Call testsub
241 Call ok(x, "x is false, testsub not called?")
242
243 Sub SubSetTrue(v)
244     Call ok(not v, "v is not true")
245     v = true
246 End Sub
247
248 x = false
249 SubSetTrue x
250 Call ok(x, "x was not set by SubSetTrue")
251
252 SubSetTrue false
253 Call ok(not false, "false is no longer false?")
254
255 Sub SubSetTrue2(ByRef v)
256     Call ok(not v, "v is not true")
257     v = true
258 End Sub
259
260 x = false
261 SubSetTrue2 x
262 Call ok(x, "x was not set by SubSetTrue")
263
264 Sub TestSubArgVal(ByVal v)
265     Call ok(not v, "v is not false")
266     v = true
267     Call ok(v, "v is not true?")
268 End Sub
269
270 x = false
271 Call TestSubArgVal(x)
272 Call ok(not x, "x is true after TestSubArgVal call?")
273
274 Sub TestSubMultiArgs(a,b,c,d,e)
275     Call ok(a=1, "a = " & a)
276     Call ok(b=2, "b = " & b)
277     Call ok(c=3, "c = " & c)
278     Call ok(d=4, "d = " & d)
279     Call ok(e=5, "e = " & e)
280 End Sub
281
282 Sub TestSubExit(ByRef a)
283     If a Then
284         Exit Sub
285     End If
286     Call ok(false, "Exit Sub not called?")
287 End Sub
288
289 Call TestSubExit(true)
290
291 TestSubMultiArgs 1, 2, 3, 4, 5
292 Call TestSubMultiArgs(1, 2, 3, 4, 5)
293
294 Sub TestSubLocalVal
295     x = false
296     Call ok(not x, "local x is not false?")
297     Dim x
298 End Sub
299
300 x = true
301 y = true
302 Call TestSubLocalVal
303 Call ok(x, "global x is not true?")
304
305 Public Sub TestPublicSub
306 End Sub
307 Call TestPublicSub
308
309 Private Sub TestPrivateSub
310 End Sub
311 Call TestPrivateSub
312
313 if false then
314 Function testfunc
315     x = true
316 End Function
317 end if
318
319 x = false
320 Call TestFunc
321 Call ok(x, "x is false, testfunc not called?")
322
323 Function FuncSetTrue(v)
324     Call ok(not v, "v is not true")
325     v = true
326 End Function
327
328 x = false
329 FuncSetTrue x
330 Call ok(x, "x was not set by FuncSetTrue")
331
332 FuncSetTrue false
333 Call ok(not false, "false is no longer false?")
334
335 Function FuncSetTrue2(ByRef v)
336     Call ok(not v, "v is not true")
337     v = true
338 End Function
339
340 x = false
341 FuncSetTrue2 x
342 Call ok(x, "x was not set by FuncSetTrue")
343
344 Function TestFuncArgVal(ByVal v)
345     Call ok(not v, "v is not false")
346     v = true
347     Call ok(v, "v is not true?")
348 End Function
349
350 x = false
351 Call TestFuncArgVal(x)
352 Call ok(not x, "x is true after TestFuncArgVal call?")
353
354 Function TestFuncMultiArgs(a,b,c,d,e)
355     Call ok(a=1, "a = " & a)
356     Call ok(b=2, "b = " & b)
357     Call ok(c=3, "c = " & c)
358     Call ok(d=4, "d = " & d)
359     Call ok(e=5, "e = " & e)
360 End Function
361
362 TestFuncMultiArgs 1, 2, 3, 4, 5
363 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
364
365 Function TestFuncLocalVal
366     x = false
367     Call ok(not x, "local x is not false?")
368     Dim x
369 End Function
370
371 x = true
372 y = true
373 Call TestFuncLocalVal
374 Call ok(x, "global x is not true?")
375
376 Function TestFuncExit(ByRef a)
377     If a Then
378         Exit Function
379     End If
380     Call ok(false, "Exit Function not called?")
381 End Function
382
383 Call TestFuncExit(true)
384
385 Function ReturnTrue
386      ReturnTrue = false
387      ReturnTrue = true
388 End Function
389
390 Call ok(ReturnTrue(), "ReturnTrue returned false?")
391
392 Function SetVal(ByRef x, ByVal v)
393     x = v
394     SetVal = x
395     Exit Function
396 End Function
397
398 x = false
399 ok SetVal(x, true), "SetVal returned false?"
400 Call ok(x, "x is not set to true by SetVal?")
401
402 Public Function TestPublicFunc
403 End Function
404 Call TestPublicFunc
405
406 Private Function TestPrivateFunc
407 End Function
408 Call TestPrivateFunc
409
410 ' Stop has an effect only in debugging mode
411 Stop
412
413 set x = testObj
414 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
415
416 Dim obj
417 Set obj = New EmptyClass
418 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
419
420 Class EmptyClass
421 End Class
422
423 Class TestClass
424     Public publicProp
425
426     Private privateProp
427
428     Public Function publicFunction()
429         privateSub()
430         publicFunction = 4
431     End Function
432
433     Public Property Get gsProp()
434         gsProp = privateProp
435         funcCalled = "gsProp get"
436         exit property
437         Call ok(false, "exit property not returned?")
438     End Property
439
440     Public Default Property Get DefValGet
441         DefValGet = privateProp
442         funcCalled = "GetDefVal"
443     End Property
444
445     Public Property Let DefValGet(x)
446     End Property
447
448     Public publicProp2
449
450     Public Sub publicSub
451     End Sub
452
453     Public Property Let gsProp(val)
454         privateProp = val
455         funcCalled = "gsProp let"
456         exit property
457         Call ok(false, "exit property not returned?")
458     End Property
459
460     Public Property Set gsProp(val)
461         funcCalled = "gsProp set"
462         exit property
463         Call ok(false, "exit property not returned?")
464     End Property
465
466     Public Sub setPrivateProp(x)
467         privateProp = x
468     End Sub
469
470     Function getPrivateProp
471         getPrivateProp = privateProp
472     End Function
473
474     Private Sub privateSub
475     End Sub
476
477     Public Sub Class_Initialize
478         publicProp2 = 2
479         privateProp = true
480     End Sub
481 End Class
482
483 Call testDisp(new testClass)
484
485 Set obj = New TestClass
486
487 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
488 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
489
490 obj.publicSub()
491 Call obj.publicSub
492 Call obj.publicFunction()
493
494 Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
495 obj.publicProp = 3
496 Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
497 obj.publicProp() = 3
498
499 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
500 Call obj.setPrivateProp(6)
501 Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
502
503 Dim funcCalled
504 funcCalled = ""
505 Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
506 Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
507 obj.gsProp = 3
508 Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
509 Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
510 Set obj.gsProp = New testclass
511 Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
512
513 x = obj
514 Call ok(x = 3, "(x = obj) = " & x)
515 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
516 funcCalled = ""
517 Call ok(obj = 3, "(x = obj) = " & obj)
518 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
519
520 Call obj.Class_Initialize
521 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
522
523 x = (New testclass).publicProp
524
525 Class TermTest
526     Public Sub Class_Terminate()
527         funcCalled = "terminate"
528     End Sub
529 End Class
530
531 Set obj = New TermTest
532 funcCalled = ""
533 Set obj = Nothing
534 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
535
536 Set obj = New TermTest
537 funcCalled = ""
538 Call obj.Class_Terminate
539 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
540 funcCalled = ""
541 Set obj = Nothing
542 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
543
544 reportSuccess()