ddraw/tests: Rewrite LimitTest().
[wine.git] / dlls / vbscript / tests / lang.vbs
blob2af77bdfcc4ab05f22fb8926311e524ec3b6e17c
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 : : DIM W
21 dim x, y, z
22 Dim obj
24 call ok(true, "true is not true?")
25 ok true, "true is not true?"
26 call ok((true), "true is not true?")
28 ok not false, "not false but not true?"
29 ok not not true, "not not true but not true?"
31 Call ok(true = true, "true = true is false")
32 Call ok(false = false, "false = false is false")
33 Call ok(not (true = false), "true = false is true")
34 Call ok("x" = "x", """x"" = ""x"" is false")
35 Call ok(empty = empty, "empty = empty is false")
36 Call ok(empty = "", "empty = """" is false")
37 Call ok(0 = 0.0, "0 <> 0.0")
38 Call ok(16 = &h10&, "16 <> &h10&")
39 Call ok(010 = 10, "010 <> 10")
40 Call ok(10. = 10, "10. <> 10")
41 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
42 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
43 Call ok(34e5 = 3400000, "34e5 <> 3400000")
44 Call ok(56.789e5 = 5678900, "56.789e5 = 5678900")
45 Call ok(56.789e-2 = 0.56789, "56.789e-2 <> 0.56789")
46 Call ok(1e-94938484 = 0, "1e-... <> 0")
47 Call ok(34e0 = 34, "34e0 <> 34")
48 Call ok(34E1 = 340, "34E0 <> 340")
49 Call ok(--1 = 1, "--1 = " & --1)
50 Call ok(-empty = 0, "-empty = " & (-empty))
51 Call ok(true = -1, "! true = -1")
52 Call ok(false = 0, "false <> 0")
53 Call ok(&hff = 255, "&hff <> 255")
54 Call ok(&Hff = 255, "&Hff <> 255")
56 W = 5
57 Call ok(W = 5, "W = " & W & " expected " & 5)
59 x = "xx"
60 Call ok(x = "xx", "x = " & x & " expected ""xx""")
62 Call ok(true <> false, "true <> false is false")
63 Call ok(not (true <> true), "true <> true is true")
64 Call ok(not ("x" <> "x"), """x"" <> ""x"" is true")
65 Call ok(not (empty <> empty), "empty <> empty is true")
66 Call ok(x <> "x", "x = ""x""")
67 Call ok("true" <> true, """true"" = true is true")
69 Call ok("" = true = false, """"" = true = false is false")
70 Call ok(not(false = true = ""), "false = true = """" is true")
71 Call ok(not (false = false <> false = false), "false = false <> false = false is true")
72 Call ok(not ("" <> false = false), """"" <> false = false is true")
74 Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL")
75 Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL")
76 Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR")
77 Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR")
78 Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY")
79 Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL")
80 Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2")
81 Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2")
82 Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8")
83 Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8")
84 Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4")
85 Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8")
86 Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2")
87 Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4")
88 Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4")
89 Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
90 Call ok(getVT(1e2) = "VT_R8", "getVT(1e2) is not VT_R8")
91 Call ok(getVT(1e0) = "VT_R8", "getVT(1e0) is not VT_R8")
92 Call ok(getVT(0.1e2) = "VT_R8", "getVT(0.1e2) is not VT_R8")
93 Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
94 Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
95 Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
96 Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
97 Call ok(getVT(nothing) = "VT_DISPATCH", "getVT(nothing) = " & getVT(nothing))
98 set x = nothing
99 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=nothing) = " & getVT(x))
100 x = true
101 Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x))
102 Call ok(getVT(false or true) = "VT_BOOL", "getVT(false) is not VT_BOOL")
103 x = "x"
104 Call ok(getVT(x) = "VT_BSTR*", "getVT(x) is not VT_BSTR*")
105 x = 0.0
106 Call ok(getVT(x) = "VT_R8*", "getVT(x) = " & getVT(x))
108 Call ok(isNullDisp(nothing), "nothing is not nulldisp?")
110 x = "xx"
111 Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
112 Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
113 Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty))
114 Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000))
115 Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x))
117 if(isEnglishLang) then
118 Call ok("" & true = "True", """"" & true = " & true)
119 Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
120 end if
122 call ok(true and true, "true and true is not true")
123 call ok(true and not false, "true and not false is not true")
124 call ok(not (false and true), "not (false and true) is not true")
125 call ok(getVT(null and true) = "VT_NULL", "getVT(null and true) = " & getVT(null and true))
127 call ok(false or true, "false or uie is false?")
128 call ok(not (false or false), "false or false is not false?")
129 call ok(false and false or true, "false and false or true is false?")
130 call ok(true or false and false, "true or false and false is false?")
131 call ok(null or true, "null or true is false")
133 call ok(true xor false, "true xor false is false?")
134 call ok(not (false xor false), "false xor false is true?")
135 call ok(not (true or false xor true), "true or false xor true is true?")
136 call ok(not (true xor false or true), "true xor false or true is true?")
138 call ok(false eqv false, "false does not equal false?")
139 call ok(not (false eqv true), "false equals true?")
140 call ok(getVT(false eqv null) = "VT_NULL", "getVT(false eqv null) = " & getVT(false eqv null))
142 call ok(true imp true, "true does not imp true?")
143 call ok(false imp false, "false does not imp false?")
144 call ok(not (true imp false), "true imp false?")
145 call ok(false imp null, "false imp null is false?")
147 Call ok(2 >= 1, "! 2 >= 1")
148 Call ok(2 >= 2, "! 2 >= 2")
149 Call ok(not(true >= 2), "true >= 2 ?")
150 Call ok(2 > 1, "! 2 > 1")
151 Call ok(false > true, "! false < true")
152 Call ok(0 > true, "! 0 > true")
153 Call ok(not (true > 0), "true > 0")
154 Call ok(not (0 > 1 = 1), "0 > 1 = 1")
155 Call ok(1 < 2, "! 1 < 2")
156 Call ok(1 = 1 < 0, "! 1 = 1 < 0")
157 Call ok(1 <= 2, "! 1 <= 2")
158 Call ok(2 <= 2, "! 2 <= 2")
160 Call ok(isNull(0 = null), "'(0 = null)' is not null")
161 Call ok(isNull(null = 1), "'(null = 1)' is not null")
162 Call ok(isNull(0 > null), "'(0 > null)' is not null")
163 Call ok(isNull(null > 1), "'(null > 1)' is not null")
164 Call ok(isNull(0 < null), "'(0 < null)' is not null")
165 Call ok(isNull(null < 1), "'(null < 1)' is not null")
166 Call ok(isNull(0 <> null), "'(0 <> null)' is not null")
167 Call ok(isNull(null <> 1), "'(null <> 1)' is not null")
168 Call ok(isNull(0 >= null), "'(0 >= null)' is not null")
169 Call ok(isNull(null >= 1), "'(null >= 1)' is not null")
170 Call ok(isNull(0 <= null), "'(0 <= null)' is not null")
171 Call ok(isNull(null <= 1), "'(null <= 1)' is not null")
173 x = 3
174 Call ok(2+2 = 4, "2+2 = " & (2+2))
175 Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
176 Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
177 Call ok(2+empty = 2, "2+empty = " & (2+empty))
178 Call ok(x+x = 6, "x+x = " & (x+x))
180 Call ok(5-1 = 4, "5-1 = " & (5-1))
181 Call ok(3+5-true = 9, "3+5-true <> 9")
182 Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
183 Call ok(2-empty = 2, "2-empty = " & (2-empty))
184 Call ok(2-x = -1, "2-x = " & (2-x))
186 Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
187 Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
188 Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
189 Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
190 Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
191 'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
193 Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
194 Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
195 Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
196 Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
198 Call ok(2*3 = 6, "2*3 = " & (2*3))
199 Call ok(3/2 = 1.5, "3/2 = " & (3/2))
200 Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
201 Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
202 Call ok(5/1000000 = 0.000005, "5/1000000 = " & (5/1000000))
204 Call ok(2^3 = 8, "2^3 = " & (2^3))
205 Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
206 Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
207 Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
209 x =_
214 x = 3
216 if true then y = true : x = y
217 ok x, "x is false"
219 x = true : if false then x = false
220 ok x, "x is false, if false called?"
222 if not false then x = true
223 ok x, "x is false, if not false not called?"
225 if not false then x = "test" : x = true
226 ok x, "x is false, if not false not called?"
228 if false then x = y : call ok(false, "if false .. : called")
230 if false then x = y : call ok(false, "if false .. : called") else x = "else"
231 Call ok(x = "else", "else not called?")
233 if true then x = y else y = x : Call ok(false, "in else?")
235 if false then :
237 if false then x = y : if true then call ok(false, "embedded if called")
239 if false then x=1 else x=2 end if
240 if true then x=1 end if
242 x = false
243 if false then x = true : x = true
244 Call ok(x = false, "x <> false")
246 if false then
247 ok false, "if false called"
248 end if
250 x = true
251 if x then
252 x = false
253 end if
254 Call ok(not x, "x is false, if not evaluated?")
256 x = false
257 If false Then
258 Call ok(false, "inside if false")
259 Else
260 x = true
261 End If
262 Call ok(x, "else not called?")
264 x = false
265 If false Then
266 Call ok(false, "inside if false")
267 ElseIf not True Then
268 Call ok(false, "inside elseif not true")
269 Else
270 x = true
271 End If
272 Call ok(x, "else not called?")
274 x = false
275 If false Then
276 Call ok(false, "inside if false")
277 x = 1
278 y = 10+x
279 ElseIf not False Then
280 x = true
281 Else
282 Call ok(false, "inside else not true")
283 End If
284 Call ok(x, "elseif not called?")
286 x = false
287 If false Then
288 Call ok(false, "inside if false")
289 ElseIf not False Then
290 x = true
291 End If
292 Call ok(x, "elseif not called?")
294 x = false
295 if 1 then x = true
296 Call ok(x, "if 1 not run?")
298 x = false
299 if &h10000& then x = true
300 Call ok(x, "if &h10000& not run?")
302 x = false
303 y = false
304 while not (x and y)
305 if x then
306 y = true
307 end if
308 x = true
309 wend
310 call ok((x and y), "x or y is false after while")
312 if false then
313 ' empty body
314 end if
316 if false then
317 x = false
318 elseif true then
319 ' empty body
320 end if
322 if false then
323 x = false
324 else
325 ' empty body
326 end if
328 while false
329 wend
331 x = 0
332 WHILE x < 3 : x = x + 1
333 Wend
334 Call ok(x = 3, "x not equal to 3")
336 z = 2
337 while z > -4 :
340 z = z -2
341 wend
343 x = false
344 y = false
345 do while not (x and y)
346 if x then
347 y = true
348 end if
349 x = true
350 loop
351 call ok((x and y), "x or y is false after while")
353 do while false
354 loop
356 do while true
357 exit do
358 ok false, "exit do didn't work"
359 loop
361 x = 0
362 Do While x < 2 : x = x + 1
363 Loop
364 Call ok(x = 2, "x not equal to 2")
366 x = 0
367 Do While x >= -2 :
368 x = x - 1
369 Loop
370 Call ok(x = -3, "x not equal to -3")
372 x = false
373 y = false
374 do until x and y
375 if x then
376 y = true
377 end if
378 x = true
379 loop
380 call ok((x and y), "x or y is false after do until")
382 do until true
383 loop
385 do until false
386 exit do
387 ok false, "exit do didn't work"
388 loop
390 x = 0
391 Do: :: x = x + 2
392 Loop Until x = 4
393 Call ok(x = 4, "x not equal to 4")
395 x = 5
396 Do: :
398 : x = x * 2
399 Loop Until x = 40
400 Call ok(x = 40, "x not equal to 40")
403 x = false
405 if x then exit do
406 x = true
407 loop
408 call ok(x, "x is false after do..loop?")
410 x = 0
411 Do :If x = 6 Then
412 Exit Do
413 End If
414 x = x + 3
415 Loop
416 Call ok(x = 6, "x not equal to 6")
418 x = false
419 y = false
421 if x then
422 y = true
423 end if
424 x = true
425 loop until x and y
426 call ok((x and y), "x or y is false after while")
429 loop until true
432 exit do
433 ok false, "exit do didn't work"
434 loop until false
436 x = false
437 y = false
439 if x then
440 y = true
441 end if
442 x = true
443 loop while not (x and y)
444 call ok((x and y), "x or y is false after while")
447 loop while false
450 exit do
451 ok false, "exit do didn't work"
452 loop while true
454 y = "for1:"
455 for x = 5 to 8
456 y = y & " " & x
457 next
458 Call ok(y = "for1: 5 6 7 8", "y = " & y)
460 y = "for2:"
461 for x = 5 to 8 step 2
462 y = y & " " & x
463 next
464 Call ok(y = "for2: 5 7", "y = " & y)
466 y = "for3:"
467 x = 2
468 for x = x+3 to 8
469 y = y & " " & x
470 next
471 Call ok(y = "for3: 5 6 7 8", "y = " & y)
473 y = "for4:"
474 for x = 5 to 4
475 y = y & " " & x
476 next
477 Call ok(y = "for4:", "y = " & y)
479 y = "for5:"
480 for x = 5 to 3 step true
481 y = y & " " & x
482 next
483 Call ok(y = "for5: 5 4 3", "y = " & y)
485 y = "for6:"
486 z = 4
487 for x = 5 to z step 3-4
488 y = y & " " & x
489 z = 0
490 next
491 Call ok(y = "for6: 5 4", "y = " & y)
493 y = "for7:"
494 z = 1
495 for x = 5 to 8 step z
496 y = y & " " & x
497 z = 2
498 next
499 Call ok(y = "for7: 5 6 7 8", "y = " & y)
501 z = 0
502 For x = 10 To 18 Step 2 : : z = z + 1
503 Next
504 Call ok(z = 5, "z not equal to 5")
506 y = "for8:"
507 for x = 5 to 8
508 y = y & " " & x
509 x = x+1
510 next
511 Call ok(y = "for8: 5 7", "y = " & y)
513 for x = 1.5 to 1
514 Call ok(false, "for..to called when unexpected")
515 next
517 for x = 1 to 100
518 exit for
519 Call ok(false, "exit for not escaped the loop?")
520 next
522 for x = 1 to 5 :
524 : :exit for
525 Call ok(false, "exit for not escaped the loop?")
526 next
528 do while true
529 for x = 1 to 100
530 exit do
531 next
532 loop
534 if null then call ok(false, "if null evaluated")
536 while null
537 call ok(false, "while null evaluated")
538 wend
540 Call collectionObj.reset()
541 y = 0
542 for each x in collectionObj :
544 :y = y + 3
545 next
546 Call ok(y = 9, "y = " & y)
548 Call collectionObj.reset()
549 y = 0
550 x = 10
551 z = 0
552 for each x in collectionObj : z = z + 2
553 y = y+1
554 Call ok(x = y, "x <> y")
555 next
556 Call ok(y = 3, "y = " & y)
557 Call ok(z = 6, "z = " & z)
558 Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x))
560 Call collectionObj.reset()
561 y = false
562 for each x in collectionObj
563 if x = 2 then exit for
564 y = 1
565 next
566 Call ok(y = 1, "y = " & y)
567 Call ok(x = 2, "x = " & x)
569 Set obj = collectionObj
570 Call obj.reset()
571 y = 0
572 x = 10
573 for each x in obj
574 y = y+1
575 Call ok(x = y, "x <> y")
576 next
577 Call ok(y = 3, "y = " & y)
578 Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x))
580 x = false
581 select case 3
582 case 2
583 Call ok(false, "unexpected case")
584 case 2
585 Call ok(false, "unexpected case")
586 case 4
587 Call ok(false, "unexpected case")
588 case "test"
589 case "another case"
590 Call ok(false, "unexpected case")
591 case 0, false, 2+1, 10
592 x = true
593 case ok(false, "unexpected case")
594 Call ok(false, "unexpected case")
595 case else
596 Call ok(false, "unexpected case")
597 end select
598 Call ok(x, "wrong case")
600 x = false
601 select case 3
602 case 3
603 x = true
604 end select
605 Call ok(x, "wrong case")
607 x = false
608 select case 2+2
609 case 3
610 Call ok(false, "unexpected case")
611 case else
612 x = true
613 end select
614 Call ok(x, "wrong case")
616 y = "3"
617 x = false
618 select case y
619 case "3"
620 x = true
621 case 3
622 Call ok(false, "unexpected case")
623 end select
624 Call ok(x, "wrong case")
626 select case 0
627 case 1
628 Call ok(false, "unexpected case")
629 case "2"
630 Call ok(false, "unexpected case")
631 end select
633 select case 0
634 end select
636 x = false
637 select case 2
638 case 3,1,2,4: x = true
639 case 5,6,7
640 Call ok(false, "unexpected case")
641 end select
642 Call ok(x, "wrong case")
644 x = false
645 select case 2: case 5,6,7: Call ok(false, "unexpected case")
646 case 2,1,2,4
647 x = true
648 case else: Call ok(false, "unexpected case else")
649 end select
650 Call ok(x, "wrong case")
652 x = False
653 select case 1 :
655 :case 3, 4 :
658 case 5
660 Call ok(false, "unexpected case") :
661 Case Else:
663 x = True
664 end select
665 Call ok(x, "wrong case")
667 if false then
668 Sub testsub
669 x = true
670 End Sub
671 end if
673 x = false
674 Call testsub
675 Call ok(x, "x is false, testsub not called?")
677 Sub SubSetTrue(v)
678 Call ok(not v, "v is not true")
679 v = true
680 End Sub
682 x = false
683 SubSetTrue x
684 Call ok(x, "x was not set by SubSetTrue")
686 SubSetTrue false
687 Call ok(not false, "false is no longer false?")
689 Sub SubSetTrue2(ByRef v)
690 Call ok(not v, "v is not true")
691 v = true
692 End Sub
694 x = false
695 SubSetTrue2 x
696 Call ok(x, "x was not set by SubSetTrue")
698 Sub TestSubArgVal(ByVal v)
699 Call ok(not v, "v is not false")
700 v = true
701 Call ok(v, "v is not true?")
702 End Sub
704 x = false
705 Call TestSubArgVal(x)
706 Call ok(not x, "x is true after TestSubArgVal call?")
708 Sub TestSubMultiArgs(a,b,c,d,e)
709 Call ok(a=1, "a = " & a)
710 Call ok(b=2, "b = " & b)
711 Call ok(c=3, "c = " & c)
712 Call ok(d=4, "d = " & d)
713 Call ok(e=5, "e = " & e)
714 End Sub
716 Sub TestSubExit(ByRef a)
717 If a Then
718 Exit Sub
719 End If
720 Call ok(false, "Exit Sub not called?")
721 End Sub
723 Call TestSubExit(true)
725 Sub TestSubExit2
726 for x = 1 to 100
727 Exit Sub
728 next
729 End Sub
730 Call TestSubExit2
732 TestSubMultiArgs 1, 2, 3, 4, 5
733 Call TestSubMultiArgs(1, 2, 3, 4, 5)
735 Sub TestSubLocalVal
736 x = false
737 Call ok(not x, "local x is not false?")
738 Dim x
739 Dim a,b, c
740 End Sub
742 x = true
743 y = true
744 Call TestSubLocalVal
745 Call ok(x, "global x is not true?")
747 Public Sub TestPublicSub
748 End Sub
749 Call TestPublicSub
751 Private Sub TestPrivateSub
752 End Sub
753 Call TestPrivateSub
755 Public Sub TestSeparatorSub : :
757 End Sub
758 Call TestSeparatorSub
760 if false then
761 Function testfunc
762 x = true
763 End Function
764 end if
766 x = false
767 Call TestFunc
768 Call ok(x, "x is false, testfunc not called?")
770 Function FuncSetTrue(v)
771 Call ok(not v, "v is not true")
772 v = true
773 End Function
775 x = false
776 FuncSetTrue x
777 Call ok(x, "x was not set by FuncSetTrue")
779 FuncSetTrue false
780 Call ok(not false, "false is no longer false?")
782 Function FuncSetTrue2(ByRef v)
783 Call ok(not v, "v is not true")
784 v = true
785 End Function
787 x = false
788 FuncSetTrue2 x
789 Call ok(x, "x was not set by FuncSetTrue")
791 Function TestFuncArgVal(ByVal v)
792 Call ok(not v, "v is not false")
793 v = true
794 Call ok(v, "v is not true?")
795 End Function
797 x = false
798 Call TestFuncArgVal(x)
799 Call ok(not x, "x is true after TestFuncArgVal call?")
801 Function TestFuncMultiArgs(a,b,c,d,e)
802 Call ok(a=1, "a = " & a)
803 Call ok(b=2, "b = " & b)
804 Call ok(c=3, "c = " & c)
805 Call ok(d=4, "d = " & d)
806 Call ok(e=5, "e = " & e)
807 End Function
809 TestFuncMultiArgs 1, 2, 3, 4, 5
810 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
812 Function TestFuncLocalVal
813 x = false
814 Call ok(not x, "local x is not false?")
815 Dim x
816 End Function
818 x = true
819 y = true
820 Call TestFuncLocalVal
821 Call ok(x, "global x is not true?")
823 Function TestFuncExit(ByRef a)
824 If a Then
825 Exit Function
826 End If
827 Call ok(false, "Exit Function not called?")
828 End Function
830 Call TestFuncExit(true)
832 Function TestFuncExit2(ByRef a)
833 For x = 1 to 100
834 For y = 1 to 100
835 Exit Function
836 Next
837 Next
838 Call ok(false, "Exit Function not called?")
839 End Function
841 Call TestFuncExit2(true)
843 Sub SubParseTest
844 End Sub : x = false
845 Call SubParseTest
847 Function FuncParseTest
848 End Function : x = false
850 Function ReturnTrue
851 ReturnTrue = false
852 ReturnTrue = true
853 End Function
855 Call ok(ReturnTrue(), "ReturnTrue returned false?")
857 Function SetVal(ByRef x, ByVal v)
858 x = v
859 SetVal = x
860 Exit Function
861 End Function
863 x = false
864 ok SetVal(x, true), "SetVal returned false?"
865 Call ok(x, "x is not set to true by SetVal?")
867 Public Function TestPublicFunc
868 End Function
869 Call TestPublicFunc
871 Private Function TestPrivateFunc
872 End Function
873 Call TestPrivateFunc
875 Public Function TestSepFunc(ByVal a) : :
876 : TestSepFunc = a
877 End Function
878 Call ok(TestSepFunc(1) = 1, "Function did not return 1")
881 ' Stop has an effect only in debugging mode
882 Stop
884 set x = testObj
885 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
887 Set obj = New EmptyClass
888 Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
890 Class EmptyClass
891 End Class
893 Set x = obj
894 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x) = " & getVT(x))
896 Class TestClass
897 Public publicProp
899 Private privateProp
901 Public Function publicFunction()
902 privateSub()
903 publicFunction = 4
904 End Function
906 Public Property Get gsProp()
907 gsProp = privateProp
908 funcCalled = "gsProp get"
909 exit property
910 Call ok(false, "exit property not returned?")
911 End Property
913 Public Default Property Get DefValGet
914 DefValGet = privateProp
915 funcCalled = "GetDefVal"
916 End Property
918 Public Property Let DefValGet(x)
919 End Property
921 Public publicProp2
923 Public Sub publicSub
924 End Sub
926 Public Property Let gsProp(val)
927 privateProp = val
928 funcCalled = "gsProp let"
929 exit property
930 Call ok(false, "exit property not returned?")
931 End Property
933 Public Property Set gsProp(val)
934 funcCalled = "gsProp set"
935 exit property
936 Call ok(false, "exit property not returned?")
937 End Property
939 Public Sub setPrivateProp(x)
940 privateProp = x
941 End Sub
943 Function getPrivateProp
944 getPrivateProp = privateProp
945 End Function
947 Private Sub privateSub
948 End Sub
950 Public Sub Class_Initialize
951 publicProp2 = 2
952 privateProp = true
953 Call ok(getVT(privateProp) = "VT_BOOL*", "getVT(privateProp) = " & getVT(privateProp))
954 Call ok(getVT(publicProp2) = "VT_I2*", "getVT(publicProp2) = " & getVT(publicProp2))
955 Call ok(getVT(Me.publicProp2) = "VT_I2", "getVT(Me.publicProp2) = " & getVT(Me.publicProp2))
956 End Sub
958 Property Get gsGetProp(x)
959 gsGetProp = x
960 End Property
961 End Class
963 Call testDisp(new testClass)
965 Set obj = New TestClass
967 Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
968 Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
970 obj.publicSub()
971 Call obj.publicSub
972 Call obj.publicFunction()
974 Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
975 obj.publicProp = 3
976 Call ok(getVT(obj.publicProp) = "VT_I2", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
977 Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
978 obj.publicProp() = 3
980 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
981 Call obj.setPrivateProp(6)
982 Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
984 Dim funcCalled
985 funcCalled = ""
986 Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
987 Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
988 obj.gsProp = 3
989 Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
990 Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
991 Set obj.gsProp = New testclass
992 Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
994 x = obj
995 Call ok(x = 3, "(x = obj) = " & x)
996 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
997 funcCalled = ""
998 Call ok(obj = 3, "(x = obj) = " & obj)
999 Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
1001 Call obj.Class_Initialize
1002 Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
1004 x = (New testclass).publicProp
1006 Class TermTest
1007 Public Sub Class_Terminate()
1008 funcCalled = "terminate"
1009 End Sub
1010 End Class
1012 Set obj = New TermTest
1013 funcCalled = ""
1014 Set obj = Nothing
1015 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
1017 Set obj = New TermTest
1018 funcCalled = ""
1019 Call obj.Class_Terminate
1020 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
1021 funcCalled = ""
1022 Set obj = Nothing
1023 Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
1025 Call (New testclass).publicSub()
1026 Call (New testclass).publicSub
1028 class PropTest
1029 property get prop0()
1030 prop0 = 1
1031 end property
1033 property get prop1(x)
1034 prop1 = x+1
1035 end property
1037 property get prop2(x, y)
1038 prop2 = x+y
1039 end property
1040 end class
1042 set obj = new PropTest
1044 call ok(obj.prop0 = 1, "obj.prop0 = " & obj.prop0)
1045 call ok(obj.prop1(3) = 4, "obj.prop1(3) = " & obj.prop1(3))
1046 call ok(obj.prop2(3,4) = 7, "obj.prop2(3,4) = " & obj.prop2(3,4))
1047 call obj.prop0()
1048 call obj.prop1(2)
1049 call obj.prop2(3,4)
1051 x = "following ':' is correct syntax" :
1052 x = "following ':' is correct syntax" :: :
1053 :: x = "also correct syntax"
1054 rem another ugly way for comments
1055 x = "rem as simplestatement" : rem rem comment
1058 Set obj = new EmptyClass
1059 Set x = obj
1060 Set y = new EmptyClass
1062 Call ok(obj is x, "obj is not x")
1063 Call ok(x is obj, "x is not obj")
1064 Call ok(not (obj is y), "obj is not y")
1065 Call ok(not obj is y, "obj is not y")
1066 Call ok(not (x is Nothing), "x is 1")
1067 Call ok(Nothing is Nothing, "Nothing is not Nothing")
1068 Call ok(x is obj and true, "x is obj and true is false")
1070 Class TestMe
1071 Public Sub Test(MyMe)
1072 Call ok(Me is MyMe, "Me is not MyMe")
1073 End Sub
1074 End Class
1076 Set obj = New TestMe
1077 Call obj.test(obj)
1079 Call ok(getVT(test) = "VT_DISPATCH", "getVT(test) = " & getVT(test))
1080 Call ok(Me is Test, "Me is not Test")
1082 Const c1 = 1, c2 = 2, c3 = -3
1083 Call ok(c1 = 1, "c1 = " & c1)
1084 Call ok(getVT(c1) = "VT_I2", "getVT(c1) = " & getVT(c1))
1085 Call ok(c3 = -3, "c3 = " & c3)
1086 Call ok(getVT(c3) = "VT_I2", "getVT(c3) = " & getVT(c3))
1088 Const cb = True, cs = "test", cnull = null
1089 Call ok(cb, "cb = " & cb)
1090 Call ok(getVT(cb) = "VT_BOOL", "getVT(cb) = " & getVT(cb))
1091 Call ok(cs = "test", "cs = " & cs)
1092 Call ok(getVT(cs) = "VT_BSTR", "getVT(cs) = " & getVT(cs))
1093 Call ok(isNull(cnull), "cnull = " & cnull)
1094 Call ok(getVT(cnull) = "VT_NULL", "getVT(cnull) = " & getVT(cnull))
1096 if false then Const conststr = "str"
1097 Call ok(conststr = "str", "conststr = " & conststr)
1098 Call ok(getVT(conststr) = "VT_BSTR", "getVT(conststr) = " & getVT(conststr))
1099 Call ok(conststr = "str", "conststr = " & conststr)
1101 Sub ConstTestSub
1102 Const funcconst = 1
1103 Call ok(c1 = 1, "c1 = " & c1)
1104 Call ok(funcconst = 1, "funcconst = " & funcconst)
1105 End Sub
1107 Call ConstTestSub
1108 Dim funcconst
1110 ' Property may be used as an identifier (although it's a keyword)
1111 Sub TestProperty
1112 Dim Property
1113 PROPERTY = true
1114 Call ok(property, "property = " & property)
1116 for property = 1 to 2
1117 next
1118 End Sub
1120 Call TestProperty
1122 Class Property
1123 Public Sub Property()
1124 End Sub
1126 Sub Test(byref property)
1127 End Sub
1128 End Class
1130 Class Property2
1131 Function Property()
1132 End Function
1134 Sub Test(property)
1135 End Sub
1137 Sub Test2(byval property)
1138 End Sub
1139 End Class
1141 Class SeparatorTest : : Dim varTest1
1143 Private Sub Class_Initialize : varTest1 = 1
1144 End Sub ::
1146 Property Get Test1() :
1147 Test1 = varTest1
1148 End Property ::
1150 Property Let Test1(a) :
1151 varTest1 = a
1152 End Property :
1154 Public Function AddToTest1(ByVal a) :: :
1155 varTest1 = varTest1 + a
1156 AddToTest1 = varTest1
1157 End Function : End Class : :: Set obj = New SeparatorTest
1159 Call ok(obj.Test1 = 1, "obj.Test1 is not 1")
1160 obj.Test1 = 6
1161 Call ok(obj.Test1 = 6, "obj.Test1 is not 6")
1162 obj.AddToTest1(5)
1163 Call ok(obj.Test1 = 11, "obj.Test1 is not 11")
1165 ' Array tests
1167 Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr))
1169 Dim arr(3)
1170 Dim arr2(4,3), arr3(5,4,3), arr0(0), noarr()
1172 Call ok(getVT(arr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr) = " & getVT(arr))
1173 Call ok(getVT(arr2) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr2) = " & getVT(arr2))
1174 Call ok(getVT(arr0) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr0) = " & getVT(arr0))
1175 Call ok(getVT(noarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(noarr) = " & getVT(noarr))
1177 Call testArray(1, arr)
1178 Call testArray(2, arr2)
1179 Call testArray(3, arr3)
1180 Call testArray(0, arr0)
1181 Call testArray(-1, noarr)
1183 Call ok(getVT(arr(1)) = "VT_EMPTY*", "getVT(arr(1)) = " & getVT(arr(1)))
1184 Call ok(getVT(arr2(1,2)) = "VT_EMPTY*", "getVT(arr2(1,2)) = " & getVT(arr2(1,2)))
1185 Call ok(getVT(arr3(1,2,2)) = "VT_EMPTY*", "getVT(arr3(1,2,3)) = " & getVT(arr3(1,2,2)))
1186 Call ok(getVT(arr(0)) = "VT_EMPTY*", "getVT(arr(0)) = " & getVT(arr(0)))
1187 Call ok(getVT(arr(3)) = "VT_EMPTY*", "getVT(arr(3)) = " & getVT(arr(3)))
1188 Call ok(getVT(arr0(0)) = "VT_EMPTY*", "getVT(arr0(0)) = " & getVT(arr0(0)))
1190 arr(2) = 3
1191 Call ok(arr(2) = 3, "arr(2) = " & arr(2))
1192 Call ok(getVT(arr(2)) = "VT_I2*", "getVT(arr(2)) = " & getVT(arr(2)))
1194 arr3(3,2,1) = 1
1195 arr3(1,2,3) = 2
1196 Call ok(arr3(3,2,1) = 1, "arr3(3,2,1) = " & arr3(3,2,1))
1197 Call ok(arr3(1,2,3) = 2, "arr3(1,2,3) = " & arr3(1,2,3))
1198 arr2(4,3) = 1
1199 Call ok(arr2(4,3) = 1, "arr2(4,3) = " & arr2(4,3))
1201 x = arr3
1202 Call ok(x(3,2,1) = 1, "x(3,2,1) = " & x(3,2,1))
1204 Function getarr()
1205 Dim arr(3)
1206 arr(2) = 2
1207 getarr = arr
1208 arr(3) = 3
1209 End Function
1211 x = getarr()
1212 Call ok(getVT(x) = "VT_ARRAY|VT_VARIANT*", "getVT(x) = " & getVT(x))
1213 Call ok(x(2) = 2, "x(2) = " & x(2))
1214 Call ok(getVT(x(3)) = "VT_EMPTY*", "getVT(x(3)) = " & getVT(x(3)))
1216 x(1) = 1
1217 Call ok(x(1) = 1, "x(1) = " & x(1))
1218 x = getarr()
1219 Call ok(getVT(x(1)) = "VT_EMPTY*", "getVT(x(1)) = " & getVT(x(1)))
1220 Call ok(x(2) = 2, "x(2) = " & x(2))
1222 x(1) = 1
1223 y = x
1224 x(1) = 2
1225 Call ok(y(1) = 1, "y(1) = " & y(1))
1227 for x=1 to 1
1228 Dim forarr(3)
1229 if x=1 then
1230 Call ok(getVT(forarr(1)) = "VT_EMPTY*", "getVT(forarr(1)) = " & getVT(forarr(1)))
1231 else
1232 Call ok(forarr(1) = x, "forarr(1) = " & forarr(1))
1233 end if
1234 forarr(1) = x+1
1235 next
1238 Call ok(forarr(x) = 2, "forarr(x) = " & forarr(x))
1240 Class ArrClass
1241 Dim classarr(3)
1242 Dim classnoarr()
1243 Dim var
1245 Private Sub Class_Initialize
1246 Call ok(getVT(classarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(classarr) = " & getVT(classarr))
1247 Call testArray(-1, classnoarr)
1248 classarr(0) = 1
1249 classarr(1) = 2
1250 classarr(2) = 3
1251 classarr(3) = 4
1252 End Sub
1254 Public Sub testVarVT
1255 Call ok(getVT(var) = "VT_ARRAY|VT_VARIANT*", "getVT(var) = " & getVT(var))
1256 End Sub
1257 End Class
1259 Set obj = new ArrClass
1260 Call ok(getVT(obj.classarr) = "VT_ARRAY|VT_VARIANT", "getVT(obj.classarr) = " & getVT(obj.classarr))
1261 'todo_wine Call ok(obj.classarr(1) = 2, "obj.classarr(1) = " & obj.classarr(1))
1263 obj.var = arr
1264 Call ok(getVT(obj.var) = "VT_ARRAY|VT_VARIANT", "getVT(obj.var) = " & getVT(obj.var))
1265 Call obj.testVarVT
1267 Sub arrarg(byref refarr, byval valarr, byref refarr2, byval valarr2)
1268 Call ok(getVT(refarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(refarr) = " & getVT(refarr))
1269 Call ok(getVT(valarr) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr) = " & getVT(valarr))
1270 Call ok(getVT(refarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(refarr2) = " & getVT(refarr2))
1271 Call ok(getVT(valarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr2) = " & getVT(valarr2))
1272 End Sub
1274 Call arrarg(arr, arr, obj.classarr, obj.classarr)
1276 Sub arrarg2(byref refarr(), byval valarr(), byref refarr2(), byval valarr2())
1277 Call ok(getVT(refarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(refarr) = " & getVT(refarr))
1278 Call ok(getVT(valarr) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr) = " & getVT(valarr))
1279 Call ok(getVT(refarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(refarr2) = " & getVT(refarr2))
1280 Call ok(getVT(valarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr2) = " & getVT(valarr2))
1281 End Sub
1283 Call arrarg2(arr, arr, obj.classarr, obj.classarr)
1285 Sub testarrarg(arg(), vt)
1286 Call ok(getVT(arg) = vt, "getVT() = " & getVT(arg) & " expected " & vt)
1287 End Sub
1289 Call testarrarg(1, "VT_I2*")
1290 Call testarrarg(false, "VT_BOOL*")
1291 Call testarrarg(Empty, "VT_EMPTY*")
1293 Sub modifyarr(arr)
1294 'Following test crashes on wine
1295 'Call ok(arr(0) = "not modified", "arr(0) = " & arr(0))
1296 arr(0) = "modified"
1297 End Sub
1299 arr(0) = "not modified"
1300 Call modifyarr(arr)
1301 Call ok(arr(0) = "modified", "arr(0) = " & arr(0))
1303 arr(0) = "not modified"
1304 modifyarr(arr)
1305 Call todo_wine_ok(arr(0) = "not modified", "arr(0) = " & arr(0))
1307 for x = 0 to UBound(arr)
1308 arr(x) = x
1309 next
1310 y = 0
1311 for each x in arr
1312 Call ok(x = y, "x = " & x & ", expected " & y)
1313 Call ok(arr(y) = y, "arr(" & y & ") = " & arr(y))
1314 arr(y) = 1
1315 x = 1
1316 y = y+1
1317 next
1318 Call ok(y = 4, "y = " & y & " after array enumeration")
1320 for x=0 to UBound(arr2, 1)
1321 for y=0 to UBound(arr2, 2)
1322 arr2(x, y) = x + y*(UBound(arr2, 1)+1)
1323 next
1324 next
1325 y = 0
1326 for each x in arr2
1327 Call ok(x = y, "x = " & x & ", expected " & y)
1328 y = y+1
1329 next
1330 Call ok(y = 20, "y = " & y & " after array enumeration")
1332 for each x in noarr
1333 Call ok(false, "Empty array contains: " & x)
1334 next
1336 ' It's allowed to declare non-builtin RegExp class...
1337 class RegExp
1338 public property get Global()
1339 Call ok(false, "Global called")
1340 Global = "fail"
1341 end property
1342 end class
1344 ' ...but there is no way to use it because builtin instance is always created
1345 set x = new RegExp
1346 Call ok(x.Global = false, "x.Global = " & x.Global)
1348 reportSuccess()