vbscript: Added class_terminate support.
[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 if false then
203 Sub testsub
204     x = true
205 End Sub
206 end if
207
208 x = false
209 Call testsub
210 Call ok(x, "x is false, testsub not called?")
211
212 Sub SubSetTrue(v)
213     Call ok(not v, "v is not true")
214     v = true
215 End Sub
216
217 x = false
218 SubSetTrue x
219 Call ok(x, "x was not set by SubSetTrue")
220
221 SubSetTrue false
222 Call ok(not false, "false is no longer false?")
223
224 Sub SubSetTrue2(ByRef v)
225     Call ok(not v, "v is not true")
226     v = true
227 End Sub
228
229 x = false
230 SubSetTrue2 x
231 Call ok(x, "x was not set by SubSetTrue")
232
233 Sub TestSubArgVal(ByVal v)
234     Call ok(not v, "v is not false")
235     v = true
236     Call ok(v, "v is not true?")
237 End Sub
238
239 x = false
240 Call TestSubArgVal(x)
241 Call ok(not x, "x is true after TestSubArgVal call?")
242
243 Sub TestSubMultiArgs(a,b,c,d,e)
244     Call ok(a=1, "a = " & a)
245     Call ok(b=2, "b = " & b)
246     Call ok(c=3, "c = " & c)
247     Call ok(d=4, "d = " & d)
248     Call ok(e=5, "e = " & e)
249 End Sub
250
251 Sub TestSubExit(ByRef a)
252     If a Then
253         Exit Sub
254     End If
255     Call ok(false, "Exit Sub not called?")
256 End Sub
257
258 Call TestSubExit(true)
259
260 TestSubMultiArgs 1, 2, 3, 4, 5
261 Call TestSubMultiArgs(1, 2, 3, 4, 5)
262
263 Sub TestSubLocalVal
264     x = false
265     Call ok(not x, "local x is not false?")
266     Dim x
267 End Sub
268
269 x = true
270 y = true
271 Call TestSubLocalVal
272 Call ok(x, "global x is not true?")
273
274 Public Sub TestPublicSub
275 End Sub
276 Call TestPublicSub
277
278 Private Sub TestPrivateSub
279 End Sub
280 Call TestPrivateSub
281
282 if false then
283 Function testfunc
284     x = true
285 End Function
286 end if
287
288 x = false
289 Call TestFunc
290 Call ok(x, "x is false, testfunc not called?")
291
292 Function FuncSetTrue(v)
293     Call ok(not v, "v is not true")
294     v = true
295 End Function
296
297 x = false
298 FuncSetTrue x
299 Call ok(x, "x was not set by FuncSetTrue")
300
301 FuncSetTrue false
302 Call ok(not false, "false is no longer false?")
303
304 Function FuncSetTrue2(ByRef v)
305     Call ok(not v, "v is not true")
306     v = true
307 End Function
308
309 x = false
310 FuncSetTrue2 x
311 Call ok(x, "x was not set by FuncSetTrue")
312
313 Function TestFuncArgVal(ByVal v)
314     Call ok(not v, "v is not false")
315     v = true
316     Call ok(v, "v is not true?")
317 End Function
318
319 x = false
320 Call TestFuncArgVal(x)
321 Call ok(not x, "x is true after TestFuncArgVal call?")
322
323 Function TestFuncMultiArgs(a,b,c,d,e)
324     Call ok(a=1, "a = " & a)
325     Call ok(b=2, "b = " & b)
326     Call ok(c=3, "c = " & c)
327     Call ok(d=4, "d = " & d)
328     Call ok(e=5, "e = " & e)
329 End Function
330
331 TestFuncMultiArgs 1, 2, 3, 4, 5
332 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
333
334 Function TestFuncLocalVal
335     x = false
336     Call ok(not x, "local x is not false?")
337     Dim x
338 End Function
339
340 x = true
341 y = true
342 Call TestFuncLocalVal
343 Call ok(x, "global x is not true?")
344
345 Function TestFuncExit(ByRef a)
346     If a Then
347         Exit Function
348     End If
349     Call ok(false, "Exit Function not called?")
350 End Function
351
352 Call TestFuncExit(true)
353
354 Function ReturnTrue
355      ReturnTrue = false
356      ReturnTrue = true
357 End Function
358
359 Call ok(ReturnTrue(), "ReturnTrue returned false?")
360
361 Function SetVal(ByRef x, ByVal v)
362     x = v
363     SetVal = x
364     Exit Function
365 End Function
366
367 x = false
368 ok SetVal(x, true), "SetVal returned false?"
369 Call ok(x, "x is not set to true by SetVal?")
370
371 Public Function TestPublicFunc
372 End Function
373 Call TestPublicFunc
374
375 Private Function TestPrivateFunc
376 End Function
377 Call TestPrivateFunc
378
379 ' Stop has an effect only in debugging mode
380 Stop
381
382 set x = testObj
383 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
384
385 Dim obj
386 Set obj = New EmptyClass
387 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
388
389 Class EmptyClass
390 End Class
391
392 Class TestClass
393     Public publicProp
394
395     Private privateProp
396
397     Public Function publicFunction()
398         privateSub()
399         publicFunction = 4
400     End Function
401
402     Public Property Get gsProp()
403         gsProp = privateProp
404         funcCalled = "gsProp get"
405         exit property
406         Call ok(false, "exit property not returned?")
407     End Property
408
409     Public Default Property Get DefValGet
410         DefValGet = privateProp
411         funcCalled = "GetDefVal"
412     End Property
413
414     Public Property Let DefValGet(x)
415     End Property
416
417     Public publicProp2
418
419     Public Sub publicSub
420     End Sub
421
422     Public Property Let gsProp(val)
423         privateProp = val
424         funcCalled = "gsProp let"
425         exit property
426         Call ok(false, "exit property not returned?")
427     End Property
428
429     Public Property Set gsProp(val)
430         funcCalled = "gsProp set"
431         exit property
432         Call ok(false, "exit property not returned?")
433     End Property
434
435     Public Sub setPrivateProp(x)
436         privateProp = x
437     End Sub
438
439     Function getPrivateProp
440         getPrivateProp = privateProp
441     End Function
442
443     Private Sub privateSub
444     End Sub
445
446     Public Sub Class_Initialize
447         publicProp2 = 2
448         privateProp = true
449     End Sub
450 End Class
451
452 Call testDisp(new testClass)
453
454 Set obj = New TestClass
455
456 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
457 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
458
459 obj.publicSub()
460 Call obj.publicSub
461 Call obj.publicFunction()
462
463 Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
464 obj.publicProp = 3
465 Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
466 obj.publicProp() = 3
467
468 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
469 Call obj.setPrivateProp(6)
470 Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
471
472 Dim funcCalled
473 funcCalled = ""
474 Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
475 Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
476 obj.gsProp = 3
477 Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
478 Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
479 Set obj.gsProp = New testclass
480 Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
481
482 x = obj
483 Call ok(x = 3, "(x = obj) = " & x)
484 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
485 funcCalled = ""
486 Call ok(obj = 3, "(x = obj) = " & obj)
487 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
488
489 Call obj.Class_Initialize
490 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
491
492 x = (New testclass).publicProp
493
494 Class TermTest
495     Public Sub Class_Terminate()
496         funcCalled = "terminate"
497     End Sub
498 End Class
499
500 Set obj = New TermTest
501 funcCalled = ""
502 Set obj = Nothing
503 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
504
505 Set obj = New TermTest
506 funcCalled = ""
507 Call obj.Class_Terminate
508 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
509 funcCalled = ""
510 Set obj = Nothing
511 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
512
513 reportSuccess()