vbscript: Added interp_mcall implementation.
[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(isEnglishLocale) 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 set x = testObj
380 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
381
382 Dim obj
383 Set obj = New EmptyClass
384 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
385
386 Class EmptyClass
387 End Class
388
389 Class TestClass
390     Public Function publicFunction()
391         publicFunction = 4
392     End Function
393
394     Public Sub publicSub
395     End Sub
396
397     Private Sub privateSub
398     End Sub
399 End Class
400
401 Call testDisp(new testClass)
402
403 Set obj = New TestClass
404
405 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
406 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
407
408 obj.publicSub()
409 Call obj.publicSub
410 Call obj.publicFunction()
411
412 reportSuccess()