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 19OPTION EXPLICIT : : DIM W 20 21dim x, y, z 22Dim obj 23 24call ok(true, "true is not true?") 25ok true, "true is not true?" 26call ok((true), "true is not true?") 27 28ok not false, "not false but not true?" 29ok not not true, "not not true but not true?" 30 31Call ok(true = true, "true = true is false") 32Call ok(false = false, "false = false is false") 33Call ok(not (true = false), "true = false is true") 34Call ok("x" = "x", """x"" = ""x"" is false") 35Call ok(empty = empty, "empty = empty is false") 36Call ok(empty = "", "empty = """" is false") 37Call ok(0 = 0.0, "0 <> 0.0") 38Call ok(16 = &h10&, "16 <> &h10&") 39Call ok(010 = 10, "010 <> 10") 40Call ok(10. = 10, "10. <> 10") 41Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1") 42Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1") 43Call ok(34e5 = 3400000, "34e5 <> 3400000") 44Call ok(34e+5 = 3400000, "34e+5 <> 3400000") 45Call ok(56.789e5 = 5678900, "56.789e5 = 5678900") 46Call ok(56.789e-2 = 0.56789, "56.789e-2 <> 0.56789") 47Call ok(1e-94938484 = 0, "1e-... <> 0") 48Call ok(34e0 = 34, "34e0 <> 34") 49Call ok(34E1 = 340, "34E0 <> 340") 50Call ok(--1 = 1, "--1 = " & --1) 51Call ok(-empty = 0, "-empty = " & (-empty)) 52Call ok(true = -1, "! true = -1") 53Call ok(false = 0, "false <> 0") 54Call ok(&hff = 255, "&hff <> 255") 55Call ok(&Hff = 255, "&Hff <> 255") 56 57W = 5 58Call ok(W = 5, "W = " & W & " expected " & 5) 59 60x = "xx" 61Call ok(x = "xx", "x = " & x & " expected ""xx""") 62 63Call ok(true <> false, "true <> false is false") 64Call ok(not (true <> true), "true <> true is true") 65Call ok(not ("x" <> "x"), """x"" <> ""x"" is true") 66Call ok(not (empty <> empty), "empty <> empty is true") 67Call ok(x <> "x", "x = ""x""") 68Call ok("true" <> true, """true"" = true is true") 69 70Call ok("" = true = false, """"" = true = false is false") 71Call ok(not(false = true = ""), "false = true = """" is true") 72Call ok(not (false = false <> false = false), "false = false <> false = false is true") 73Call ok(not ("" <> false = false), """"" <> false = false is true") 74 75Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL") 76Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL") 77Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR") 78Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR") 79Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY") 80Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL") 81Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2") 82Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2") 83Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8") 84Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8") 85Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4") 86Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8") 87Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2") 88Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4") 89Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4") 90Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2") 91Call ok(getVT(1e2) = "VT_R8", "getVT(1e2) is not VT_R8") 92Call ok(getVT(1e0) = "VT_R8", "getVT(1e0) is not VT_R8") 93Call ok(getVT(0.1e2) = "VT_R8", "getVT(0.1e2) is not VT_R8") 94Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR") 95Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty)) 96Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null)) 97Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y)) 98Call ok(getVT(nothing) = "VT_DISPATCH", "getVT(nothing) = " & getVT(nothing)) 99set x = nothing 100Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=nothing) = " & getVT(x)) 101x = true 102Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x)) 103Call ok(getVT(false or true) = "VT_BOOL", "getVT(false) is not VT_BOOL") 104x = "x" 105Call ok(getVT(x) = "VT_BSTR*", "getVT(x) is not VT_BSTR*") 106x = 0.0 107Call ok(getVT(x) = "VT_R8*", "getVT(x) = " & getVT(x)) 108 109Call ok(isNullDisp(nothing), "nothing is not nulldisp?") 110 111x = "xx" 112Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""") 113Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null)) 114Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty)) 115Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000)) 116Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x)) 117 118if(isEnglishLang) then 119 Call ok("" & true = "True", """"" & true = " & true) 120 Call ok(true & false = "TrueFalse", "true & false = " & (true & false)) 121end if 122 123call ok(true and true, "true and true is not true") 124call ok(true and not false, "true and not false is not true") 125call ok(not (false and true), "not (false and true) is not true") 126call ok(getVT(null and true) = "VT_NULL", "getVT(null and true) = " & getVT(null and true)) 127 128call ok(false or true, "false or uie is false?") 129call ok(not (false or false), "false or false is not false?") 130call ok(false and false or true, "false and false or true is false?") 131call ok(true or false and false, "true or false and false is false?") 132call ok(null or true, "null or true is false") 133 134call ok(true xor false, "true xor false is false?") 135call ok(not (false xor false), "false xor false is true?") 136call ok(not (true or false xor true), "true or false xor true is true?") 137call ok(not (true xor false or true), "true xor false or true is true?") 138 139call ok(false eqv false, "false does not equal false?") 140call ok(not (false eqv true), "false equals true?") 141call ok(getVT(false eqv null) = "VT_NULL", "getVT(false eqv null) = " & getVT(false eqv null)) 142 143call ok(true imp true, "true does not imp true?") 144call ok(false imp false, "false does not imp false?") 145call ok(not (true imp false), "true imp false?") 146call ok(false imp null, "false imp null is false?") 147 148Call ok(2 >= 1, "! 2 >= 1") 149Call ok(2 >= 2, "! 2 >= 2") 150Call ok(not(true >= 2), "true >= 2 ?") 151Call ok(2 > 1, "! 2 > 1") 152Call ok(false > true, "! false < true") 153Call ok(0 > true, "! 0 > true") 154Call ok(not (true > 0), "true > 0") 155Call ok(not (0 > 1 = 1), "0 > 1 = 1") 156Call ok(1 < 2, "! 1 < 2") 157Call ok(1 = 1 < 0, "! 1 = 1 < 0") 158Call ok(1 <= 2, "! 1 <= 2") 159Call ok(2 <= 2, "! 2 <= 2") 160 161Call ok(isNull(0 = null), "'(0 = null)' is not null") 162Call ok(isNull(null = 1), "'(null = 1)' is not null") 163Call ok(isNull(0 > null), "'(0 > null)' is not null") 164Call ok(isNull(null > 1), "'(null > 1)' is not null") 165Call ok(isNull(0 < null), "'(0 < null)' is not null") 166Call ok(isNull(null < 1), "'(null < 1)' is not null") 167Call ok(isNull(0 <> null), "'(0 <> null)' is not null") 168Call ok(isNull(null <> 1), "'(null <> 1)' is not null") 169Call ok(isNull(0 >= null), "'(0 >= null)' is not null") 170Call ok(isNull(null >= 1), "'(null >= 1)' is not null") 171Call ok(isNull(0 <= null), "'(0 <= null)' is not null") 172Call ok(isNull(null <= 1), "'(null <= 1)' is not null") 173 174x = 3 175Call ok(2+2 = 4, "2+2 = " & (2+2)) 176Call ok(false + 6 + true = 5, "false + 6 + true <> 5") 177Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null)) 178Call ok(2+empty = 2, "2+empty = " & (2+empty)) 179Call ok(x+x = 6, "x+x = " & (x+x)) 180 181Call ok(5-1 = 4, "5-1 = " & (5-1)) 182Call ok(3+5-true = 9, "3+5-true <> 9") 183Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null)) 184Call ok(2-empty = 2, "2-empty = " & (2-empty)) 185Call ok(2-x = -1, "2-x = " & (2-x)) 186 187Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6)) 188Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6)) 189Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5") 190Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null)) 191Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2)) 192'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2)) 193 194Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2)) 195Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5)) 196Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49)) 197Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4)) 198 199Call ok(2*3 = 6, "2*3 = " & (2*3)) 200Call ok(3/2 = 1.5, "3/2 = " & (3/2)) 201Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1)) 202Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2)) 203Call ok(5/1000000 = 0.000005, "5/1000000 = " & (5/1000000)) 204 205Call ok(2^3 = 8, "2^3 = " & (2^3)) 206Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2)) 207Call ok(-3^2 = 9, "-3^2 = " & (-3^2)) 208Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2)) 209 210x =_ 211 3 212x _ 213 = 3 214 215x = 3 216 217if true then y = true : x = y 218ok x, "x is false" 219 220x = true : if false then x = false 221ok x, "x is false, if false called?" 222 223if not false then x = true 224ok x, "x is false, if not false not called?" 225 226if not false then x = "test" : x = true 227ok x, "x is false, if not false not called?" 228 229if false then x = y : call ok(false, "if false .. : called") 230 231if false then x = y : call ok(false, "if false .. : called") else x = "else" 232Call ok(x = "else", "else not called?") 233 234if true then x = y else y = x : Call ok(false, "in else?") 235 236if false then : 237 238if false then x = y : if true then call ok(false, "embedded if called") 239 240if false then x=1 else x=2 end if 241if true then x=1 end if 242 243x = false 244if false then x = true : x = true 245Call ok(x = false, "x <> false") 246 247if false then 248 ok false, "if false called" 249end if 250 251x = true 252if x then 253 x = false 254end if 255Call ok(not x, "x is false, if not evaluated?") 256 257x = false 258If false Then 259 Call ok(false, "inside if false") 260Else 261 x = true 262End If 263Call ok(x, "else not called?") 264 265x = false 266If false Then 267 Call ok(false, "inside if false") 268ElseIf not True Then 269 Call ok(false, "inside elseif not true") 270Else 271 x = true 272End If 273Call ok(x, "else not called?") 274 275x = false 276If false Then 277 Call ok(false, "inside if false") 278 x = 1 279 y = 10+x 280ElseIf not False Then 281 x = true 282Else 283 Call ok(false, "inside else not true") 284End If 285Call ok(x, "elseif not called?") 286 287x = false 288If false Then 289 Call ok(false, "inside if false") 290ElseIf not False Then 291 x = true 292End If 293Call ok(x, "elseif not called?") 294 295x = false 296if 1 then x = true 297Call ok(x, "if 1 not run?") 298 299x = false 300if &h10000& then x = true 301Call ok(x, "if &h10000& not run?") 302 303x = false 304y = false 305while not (x and y) 306 if x then 307 y = true 308 end if 309 x = true 310wend 311call ok((x and y), "x or y is false after while") 312 313if false then 314' empty body 315end if 316 317if false then 318 x = false 319elseif true then 320' empty body 321end if 322 323if false then 324 x = false 325else 326' empty body 327end if 328 329while false 330wend 331 332x = 0 333WHILE x < 3 : x = x + 1 334Wend 335Call ok(x = 3, "x not equal to 3") 336 337z = 2 338while z > -4 : 339 340 341z = z -2 342wend 343 344x = false 345y = false 346do while not (x and y) 347 if x then 348 y = true 349 end if 350 x = true 351loop 352call ok((x and y), "x or y is false after while") 353 354do while false 355loop 356 357do while true 358 exit do 359 ok false, "exit do didn't work" 360loop 361 362x = 0 363Do While x < 2 : x = x + 1 364Loop 365Call ok(x = 2, "x not equal to 2") 366 367x = 0 368Do While x >= -2 : 369x = x - 1 370Loop 371Call ok(x = -3, "x not equal to -3") 372 373x = false 374y = false 375do until x and y 376 if x then 377 y = true 378 end if 379 x = true 380loop 381call ok((x and y), "x or y is false after do until") 382 383do until true 384loop 385 386do until false 387 exit do 388 ok false, "exit do didn't work" 389loop 390 391x = 0 392Do: :: x = x + 2 393Loop Until x = 4 394Call ok(x = 4, "x not equal to 4") 395 396x = 5 397Do: : 398 399: x = x * 2 400Loop Until x = 40 401Call ok(x = 40, "x not equal to 40") 402 403 404x = false 405do 406 if x then exit do 407 x = true 408loop 409call ok(x, "x is false after do..loop?") 410 411x = 0 412Do :If x = 6 Then 413 Exit Do 414 End If 415 x = x + 3 416Loop 417Call ok(x = 6, "x not equal to 6") 418 419x = false 420y = false 421do 422 if x then 423 y = true 424 end if 425 x = true 426loop until x and y 427call ok((x and y), "x or y is false after while") 428 429do 430loop until true 431 432do 433 exit do 434 ok false, "exit do didn't work" 435loop until false 436 437x = false 438y = false 439do 440 if x then 441 y = true 442 end if 443 x = true 444loop while not (x and y) 445call ok((x and y), "x or y is false after while") 446 447do 448loop while false 449 450do 451 exit do 452 ok false, "exit do didn't work" 453loop while true 454 455y = "for1:" 456for x = 5 to 8 457 y = y & " " & x 458next 459Call ok(y = "for1: 5 6 7 8", "y = " & y) 460 461y = "for2:" 462for x = 5 to 8 step 2 463 y = y & " " & x 464next 465Call ok(y = "for2: 5 7", "y = " & y) 466 467y = "for3:" 468x = 2 469for x = x+3 to 8 470 y = y & " " & x 471next 472Call ok(y = "for3: 5 6 7 8", "y = " & y) 473 474y = "for4:" 475for x = 5 to 4 476 y = y & " " & x 477next 478Call ok(y = "for4:", "y = " & y) 479 480y = "for5:" 481for x = 5 to 3 step true 482 y = y & " " & x 483next 484Call ok(y = "for5: 5 4 3", "y = " & y) 485 486y = "for6:" 487z = 4 488for x = 5 to z step 3-4 489 y = y & " " & x 490 z = 0 491next 492Call ok(y = "for6: 5 4", "y = " & y) 493 494y = "for7:" 495z = 1 496for x = 5 to 8 step z 497 y = y & " " & x 498 z = 2 499next 500Call ok(y = "for7: 5 6 7 8", "y = " & y) 501 502z = 0 503For x = 10 To 18 Step 2 : : z = z + 1 504Next 505Call ok(z = 5, "z not equal to 5") 506 507y = "for8:" 508for x = 5 to 8 509 y = y & " " & x 510 x = x+1 511next 512Call ok(y = "for8: 5 7", "y = " & y) 513 514for x = 1.5 to 1 515 Call ok(false, "for..to called when unexpected") 516next 517 518for x = 1 to 100 519 exit for 520 Call ok(false, "exit for not escaped the loop?") 521next 522 523for x = 1 to 5 : 524: 525: :exit for 526 Call ok(false, "exit for not escaped the loop?") 527next 528 529do while true 530 for x = 1 to 100 531 exit do 532 next 533loop 534 535if null then call ok(false, "if null evaluated") 536 537while null 538 call ok(false, "while null evaluated") 539wend 540 541Call collectionObj.reset() 542y = 0 543for each x in collectionObj : 544 545 :y = y + 3 546next 547Call ok(y = 9, "y = " & y) 548 549Call collectionObj.reset() 550y = 0 551x = 10 552z = 0 553for each x in collectionObj : z = z + 2 554 y = y+1 555 Call ok(x = y, "x <> y") 556next 557Call ok(y = 3, "y = " & y) 558Call ok(z = 6, "z = " & z) 559Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x)) 560 561Call collectionObj.reset() 562y = false 563for each x in collectionObj 564 if x = 2 then exit for 565 y = 1 566next 567Call ok(y = 1, "y = " & y) 568Call ok(x = 2, "x = " & x) 569 570Set obj = collectionObj 571Call obj.reset() 572y = 0 573x = 10 574for each x in obj 575 y = y+1 576 Call ok(x = y, "x <> y") 577next 578Call ok(y = 3, "y = " & y) 579Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x)) 580 581x = false 582select case 3 583 case 2 584 Call ok(false, "unexpected case") 585 case 2 586 Call ok(false, "unexpected case") 587 case 4 588 Call ok(false, "unexpected case") 589 case "test" 590 case "another case" 591 Call ok(false, "unexpected case") 592 case 0, false, 2+1, 10 593 x = true 594 case ok(false, "unexpected case") 595 Call ok(false, "unexpected case") 596 case else 597 Call ok(false, "unexpected case") 598end select 599Call ok(x, "wrong case") 600 601x = false 602select case 3 603 case 3 604 x = true 605end select 606Call ok(x, "wrong case") 607 608x = false 609select case 2+2 610 case 3 611 Call ok(false, "unexpected case") 612 case else 613 x = true 614end select 615Call ok(x, "wrong case") 616 617y = "3" 618x = false 619select case y 620 case "3" 621 x = true 622 case 3 623 Call ok(false, "unexpected case") 624end select 625Call ok(x, "wrong case") 626 627select case 0 628 case 1 629 Call ok(false, "unexpected case") 630 case "2" 631 Call ok(false, "unexpected case") 632end select 633 634select case 0 635end select 636 637x = false 638select case 2 639 case 3,1,2,4: x = true 640 case 5,6,7 641 Call ok(false, "unexpected case") 642end select 643Call ok(x, "wrong case") 644 645x = false 646select case 2: case 5,6,7: Call ok(false, "unexpected case") 647 case 2,1,2,4 648 x = true 649 case else: Call ok(false, "unexpected case else") 650end select 651Call ok(x, "wrong case") 652 653x = False 654select case 1 : 655 656 :case 3, 4 : 657 658 659 case 5 660: 661 Call ok(false, "unexpected case") : 662 Case Else: 663 664 x = True 665end select 666Call ok(x, "wrong case") 667 668if false then 669Sub testsub 670 x = true 671End Sub 672end if 673 674x = false 675Call testsub 676Call ok(x, "x is false, testsub not called?") 677 678Sub SubSetTrue(v) 679 Call ok(not v, "v is not true") 680 v = true 681End Sub 682 683x = false 684SubSetTrue x 685Call ok(x, "x was not set by SubSetTrue") 686 687SubSetTrue false 688Call ok(not false, "false is no longer false?") 689 690Sub SubSetTrue2(ByRef v) 691 Call ok(not v, "v is not true") 692 v = true 693End Sub 694 695x = false 696SubSetTrue2 x 697Call ok(x, "x was not set by SubSetTrue") 698 699Sub TestSubArgVal(ByVal v) 700 Call ok(not v, "v is not false") 701 v = true 702 Call ok(v, "v is not true?") 703End Sub 704 705x = false 706Call TestSubArgVal(x) 707Call ok(not x, "x is true after TestSubArgVal call?") 708 709Sub TestSubMultiArgs(a,b,c,d,e) 710 Call ok(a=1, "a = " & a) 711 Call ok(b=2, "b = " & b) 712 Call ok(c=3, "c = " & c) 713 Call ok(d=4, "d = " & d) 714 Call ok(e=5, "e = " & e) 715End Sub 716 717Sub TestSubExit(ByRef a) 718 If a Then 719 Exit Sub 720 End If 721 Call ok(false, "Exit Sub not called?") 722End Sub 723 724Call TestSubExit(true) 725 726Sub TestSubExit2 727 for x = 1 to 100 728 Exit Sub 729 next 730End Sub 731Call TestSubExit2 732 733TestSubMultiArgs 1, 2, 3, 4, 5 734Call TestSubMultiArgs(1, 2, 3, 4, 5) 735 736Sub TestSubLocalVal 737 x = false 738 Call ok(not x, "local x is not false?") 739 Dim x 740 Dim a,b, c 741End Sub 742 743x = true 744y = true 745Call TestSubLocalVal 746Call ok(x, "global x is not true?") 747 748Public Sub TestPublicSub 749End Sub 750Call TestPublicSub 751 752Private Sub TestPrivateSub 753End Sub 754Call TestPrivateSub 755 756Public Sub TestSeparatorSub : : 757: 758End Sub 759Call TestSeparatorSub 760 761if false then 762Function testfunc 763 x = true 764End Function 765end if 766 767x = false 768Call TestFunc 769Call ok(x, "x is false, testfunc not called?") 770 771Function FuncSetTrue(v) 772 Call ok(not v, "v is not true") 773 v = true 774End Function 775 776x = false 777FuncSetTrue x 778Call ok(x, "x was not set by FuncSetTrue") 779 780FuncSetTrue false 781Call ok(not false, "false is no longer false?") 782 783Function FuncSetTrue2(ByRef v) 784 Call ok(not v, "v is not true") 785 v = true 786End Function 787 788x = false 789FuncSetTrue2 x 790Call ok(x, "x was not set by FuncSetTrue") 791 792Function TestFuncArgVal(ByVal v) 793 Call ok(not v, "v is not false") 794 v = true 795 Call ok(v, "v is not true?") 796End Function 797 798x = false 799Call TestFuncArgVal(x) 800Call ok(not x, "x is true after TestFuncArgVal call?") 801 802Function TestFuncMultiArgs(a,b,c,d,e) 803 Call ok(a=1, "a = " & a) 804 Call ok(b=2, "b = " & b) 805 Call ok(c=3, "c = " & c) 806 Call ok(d=4, "d = " & d) 807 Call ok(e=5, "e = " & e) 808End Function 809 810TestFuncMultiArgs 1, 2, 3, 4, 5 811Call TestFuncMultiArgs(1, 2, 3, 4, 5) 812 813Function TestFuncLocalVal 814 x = false 815 Call ok(not x, "local x is not false?") 816 Dim x 817End Function 818 819x = true 820y = true 821Call TestFuncLocalVal 822Call ok(x, "global x is not true?") 823 824Function TestFuncExit(ByRef a) 825 If a Then 826 Exit Function 827 End If 828 Call ok(false, "Exit Function not called?") 829End Function 830 831Call TestFuncExit(true) 832 833Function TestFuncExit2(ByRef a) 834 For x = 1 to 100 835 For y = 1 to 100 836 Exit Function 837 Next 838 Next 839 Call ok(false, "Exit Function not called?") 840End Function 841 842Call TestFuncExit2(true) 843 844Sub SubParseTest 845End Sub : x = false 846Call SubParseTest 847 848Function FuncParseTest 849End Function : x = false 850 851Function ReturnTrue 852 ReturnTrue = false 853 ReturnTrue = true 854End Function 855 856Call ok(ReturnTrue(), "ReturnTrue returned false?") 857 858Function SetVal(ByRef x, ByVal v) 859 x = v 860 SetVal = x 861 Exit Function 862End Function 863 864x = false 865ok SetVal(x, true), "SetVal returned false?" 866Call ok(x, "x is not set to true by SetVal?") 867 868Public Function TestPublicFunc 869End Function 870Call TestPublicFunc 871 872Private Function TestPrivateFunc 873End Function 874Call TestPrivateFunc 875 876Public Function TestSepFunc(ByVal a) : : 877: TestSepFunc = a 878End Function 879Call ok(TestSepFunc(1) = 1, "Function did not return 1") 880 881 882' Stop has an effect only in debugging mode 883Stop 884 885set x = testObj 886Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x)) 887 888Set obj = New EmptyClass 889Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj)) 890 891Class EmptyClass 892End Class 893 894Set x = obj 895Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x) = " & getVT(x)) 896 897Class TestClass 898 Public publicProp 899 900 Private privateProp 901 902 Public Function publicFunction() 903 privateSub() 904 publicFunction = 4 905 End Function 906 907 Public Property Get gsProp() 908 gsProp = privateProp 909 funcCalled = "gsProp get" 910 exit property 911 Call ok(false, "exit property not returned?") 912 End Property 913 914 Public Default Property Get DefValGet 915 DefValGet = privateProp 916 funcCalled = "GetDefVal" 917 End Property 918 919 Public Property Let DefValGet(x) 920 End Property 921 922 Public publicProp2 923 924 Public Sub publicSub 925 End Sub 926 927 Public Property Let gsProp(val) 928 privateProp = val 929 funcCalled = "gsProp let" 930 exit property 931 Call ok(false, "exit property not returned?") 932 End Property 933 934 Public Property Set gsProp(val) 935 funcCalled = "gsProp set" 936 exit property 937 Call ok(false, "exit property not returned?") 938 End Property 939 940 Public Sub setPrivateProp(x) 941 privateProp = x 942 End Sub 943 944 Function getPrivateProp 945 getPrivateProp = privateProp 946 End Function 947 948 Private Sub privateSub 949 End Sub 950 951 Public Sub Class_Initialize 952 publicProp2 = 2 953 privateProp = true 954 Call ok(getVT(privateProp) = "VT_BOOL*", "getVT(privateProp) = " & getVT(privateProp)) 955 Call ok(getVT(publicProp2) = "VT_I2*", "getVT(publicProp2) = " & getVT(publicProp2)) 956 Call ok(getVT(Me.publicProp2) = "VT_I2", "getVT(Me.publicProp2) = " & getVT(Me.publicProp2)) 957 End Sub 958 959 Property Get gsGetProp(x) 960 gsGetProp = x 961 End Property 962End Class 963 964Call testDisp(new testClass) 965 966Set obj = New TestClass 967 968Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction) 969Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction()) 970 971obj.publicSub() 972Call obj.publicSub 973Call obj.publicFunction() 974 975Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp)) 976obj.publicProp = 3 977Call ok(getVT(obj.publicProp) = "VT_I2", "getVT(obj.publicProp) = " & getVT(obj.publicProp)) 978Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp) 979obj.publicProp() = 3 980 981Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp()) 982Call obj.setPrivateProp(6) 983Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp) 984 985Dim funcCalled 986funcCalled = "" 987Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp) 988Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled) 989obj.gsProp = 3 990Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled) 991Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp) 992Set obj.gsProp = New testclass 993Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled) 994 995x = obj 996Call ok(x = 3, "(x = obj) = " & x) 997Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled) 998funcCalled = "" 999Call ok(obj = 3, "(x = obj) = " & obj) 1000Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled) 1001 1002Call obj.Class_Initialize 1003Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp()) 1004 1005x = (New testclass).publicProp 1006 1007Class TermTest 1008 Public Sub Class_Terminate() 1009 funcCalled = "terminate" 1010 End Sub 1011End Class 1012 1013Set obj = New TermTest 1014funcCalled = "" 1015Set obj = Nothing 1016Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled) 1017 1018Set obj = New TermTest 1019funcCalled = "" 1020Call obj.Class_Terminate 1021Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled) 1022funcCalled = "" 1023Set obj = Nothing 1024Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled) 1025 1026Call (New testclass).publicSub() 1027Call (New testclass).publicSub 1028 1029class PropTest 1030 property get prop0() 1031 prop0 = 1 1032 end property 1033 1034 property get prop1(x) 1035 prop1 = x+1 1036 end property 1037 1038 property get prop2(x, y) 1039 prop2 = x+y 1040 end property 1041end class 1042 1043set obj = new PropTest 1044 1045call ok(obj.prop0 = 1, "obj.prop0 = " & obj.prop0) 1046call ok(obj.prop1(3) = 4, "obj.prop1(3) = " & obj.prop1(3)) 1047call ok(obj.prop2(3,4) = 7, "obj.prop2(3,4) = " & obj.prop2(3,4)) 1048call obj.prop0() 1049call obj.prop1(2) 1050call obj.prop2(3,4) 1051 1052x = "following ':' is correct syntax" : 1053x = "following ':' is correct syntax" :: : 1054:: x = "also correct syntax" 1055rem another ugly way for comments 1056x = "rem as simplestatement" : rem rem comment 1057: 1058 1059Set obj = new EmptyClass 1060Set x = obj 1061Set y = new EmptyClass 1062 1063Call ok(obj is x, "obj is not x") 1064Call ok(x is obj, "x is not obj") 1065Call ok(not (obj is y), "obj is not y") 1066Call ok(not obj is y, "obj is not y") 1067Call ok(not (x is Nothing), "x is 1") 1068Call ok(Nothing is Nothing, "Nothing is not Nothing") 1069Call ok(x is obj and true, "x is obj and true is false") 1070 1071Class TestMe 1072 Public Sub Test(MyMe) 1073 Call ok(Me is MyMe, "Me is not MyMe") 1074 End Sub 1075End Class 1076 1077Set obj = New TestMe 1078Call obj.test(obj) 1079 1080Call ok(getVT(test) = "VT_DISPATCH", "getVT(test) = " & getVT(test)) 1081Call ok(Me is Test, "Me is not Test") 1082 1083Const c1 = 1, c2 = 2, c3 = -3 1084Call ok(c1 = 1, "c1 = " & c1) 1085Call ok(getVT(c1) = "VT_I2", "getVT(c1) = " & getVT(c1)) 1086Call ok(c3 = -3, "c3 = " & c3) 1087Call ok(getVT(c3) = "VT_I2", "getVT(c3) = " & getVT(c3)) 1088 1089Const cb = True, cs = "test", cnull = null 1090Call ok(cb, "cb = " & cb) 1091Call ok(getVT(cb) = "VT_BOOL", "getVT(cb) = " & getVT(cb)) 1092Call ok(cs = "test", "cs = " & cs) 1093Call ok(getVT(cs) = "VT_BSTR", "getVT(cs) = " & getVT(cs)) 1094Call ok(isNull(cnull), "cnull = " & cnull) 1095Call ok(getVT(cnull) = "VT_NULL", "getVT(cnull) = " & getVT(cnull)) 1096 1097Call ok(+1 = 1, "+1 != 1") 1098Call ok(+true = true, "+1 != 1") 1099Call ok(getVT(+true) = "VT_BOOL", "getVT(+true) = " & getVT(+true)) 1100Call ok(+"true" = "true", """+true"" != true") 1101Call ok(getVT(+"true") = "VT_BSTR", "getVT(+""true"") = " & getVT(+"true")) 1102Call ok(+obj is obj, "+obj != obj") 1103Call ok(+--+-+1 = -1, "+--+-+1 != -1") 1104 1105if false then Const conststr = "str" 1106Call ok(conststr = "str", "conststr = " & conststr) 1107Call ok(getVT(conststr) = "VT_BSTR", "getVT(conststr) = " & getVT(conststr)) 1108Call ok(conststr = "str", "conststr = " & conststr) 1109 1110Sub ConstTestSub 1111 Const funcconst = 1 1112 Call ok(c1 = 1, "c1 = " & c1) 1113 Call ok(funcconst = 1, "funcconst = " & funcconst) 1114End Sub 1115 1116Call ConstTestSub 1117Dim funcconst 1118 1119' Property may be used as an identifier (although it's a keyword) 1120Sub TestProperty 1121 Dim Property 1122 PROPERTY = true 1123 Call ok(property, "property = " & property) 1124 1125 for property = 1 to 2 1126 next 1127End Sub 1128 1129Call TestProperty 1130 1131Class Property 1132 Public Sub Property() 1133 End Sub 1134 1135 Sub Test(byref property) 1136 End Sub 1137End Class 1138 1139Class Property2 1140 Function Property() 1141 End Function 1142 1143 Sub Test(property) 1144 End Sub 1145 1146 Sub Test2(byval property) 1147 End Sub 1148End Class 1149 1150Class SeparatorTest : : Dim varTest1 1151: 1152 Private Sub Class_Initialize : varTest1 = 1 1153 End Sub :: 1154 1155 Property Get Test1() : 1156 Test1 = varTest1 1157 End Property :: 1158: : 1159 Property Let Test1(a) : 1160 varTest1 = a 1161 End Property : 1162 1163 Public Function AddToTest1(ByVal a) :: : 1164 varTest1 = varTest1 + a 1165 AddToTest1 = varTest1 1166 End Function : End Class : :: Set obj = New SeparatorTest 1167 1168Call ok(obj.Test1 = 1, "obj.Test1 is not 1") 1169obj.Test1 = 6 1170Call ok(obj.Test1 = 6, "obj.Test1 is not 6") 1171obj.AddToTest1(5) 1172Call ok(obj.Test1 = 11, "obj.Test1 is not 11") 1173 1174' Array tests 1175 1176Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr)) 1177 1178Dim arr(3) 1179Dim arr2(4,3), arr3(5,4,3), arr0(0), noarr() 1180 1181Call ok(getVT(arr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr) = " & getVT(arr)) 1182Call ok(getVT(arr2) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr2) = " & getVT(arr2)) 1183Call ok(getVT(arr0) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr0) = " & getVT(arr0)) 1184Call ok(getVT(noarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(noarr) = " & getVT(noarr)) 1185 1186Call testArray(1, arr) 1187Call testArray(2, arr2) 1188Call testArray(3, arr3) 1189Call testArray(0, arr0) 1190Call testArray(-1, noarr) 1191 1192Call ok(getVT(arr(1)) = "VT_EMPTY*", "getVT(arr(1)) = " & getVT(arr(1))) 1193Call ok(getVT(arr2(1,2)) = "VT_EMPTY*", "getVT(arr2(1,2)) = " & getVT(arr2(1,2))) 1194Call ok(getVT(arr3(1,2,2)) = "VT_EMPTY*", "getVT(arr3(1,2,3)) = " & getVT(arr3(1,2,2))) 1195Call ok(getVT(arr(0)) = "VT_EMPTY*", "getVT(arr(0)) = " & getVT(arr(0))) 1196Call ok(getVT(arr(3)) = "VT_EMPTY*", "getVT(arr(3)) = " & getVT(arr(3))) 1197Call ok(getVT(arr0(0)) = "VT_EMPTY*", "getVT(arr0(0)) = " & getVT(arr0(0))) 1198 1199arr(2) = 3 1200Call ok(arr(2) = 3, "arr(2) = " & arr(2)) 1201Call ok(getVT(arr(2)) = "VT_I2*", "getVT(arr(2)) = " & getVT(arr(2))) 1202 1203arr3(3,2,1) = 1 1204arr3(1,2,3) = 2 1205Call ok(arr3(3,2,1) = 1, "arr3(3,2,1) = " & arr3(3,2,1)) 1206Call ok(arr3(1,2,3) = 2, "arr3(1,2,3) = " & arr3(1,2,3)) 1207arr2(4,3) = 1 1208Call ok(arr2(4,3) = 1, "arr2(4,3) = " & arr2(4,3)) 1209 1210x = arr3 1211Call ok(x(3,2,1) = 1, "x(3,2,1) = " & x(3,2,1)) 1212 1213Function getarr() 1214 Dim arr(3) 1215 arr(2) = 2 1216 getarr = arr 1217 arr(3) = 3 1218End Function 1219 1220x = getarr() 1221Call ok(getVT(x) = "VT_ARRAY|VT_VARIANT*", "getVT(x) = " & getVT(x)) 1222Call ok(x(2) = 2, "x(2) = " & x(2)) 1223Call ok(getVT(x(3)) = "VT_EMPTY*", "getVT(x(3)) = " & getVT(x(3))) 1224 1225x(1) = 1 1226Call ok(x(1) = 1, "x(1) = " & x(1)) 1227x = getarr() 1228Call ok(getVT(x(1)) = "VT_EMPTY*", "getVT(x(1)) = " & getVT(x(1))) 1229Call ok(x(2) = 2, "x(2) = " & x(2)) 1230 1231x(1) = 1 1232y = x 1233x(1) = 2 1234Call ok(y(1) = 1, "y(1) = " & y(1)) 1235 1236for x=1 to 1 1237 Dim forarr(3) 1238 if x=1 then 1239 Call ok(getVT(forarr(1)) = "VT_EMPTY*", "getVT(forarr(1)) = " & getVT(forarr(1))) 1240 else 1241 Call ok(forarr(1) = x, "forarr(1) = " & forarr(1)) 1242 end if 1243 forarr(1) = x+1 1244next 1245 1246x=1 1247Call ok(forarr(x) = 2, "forarr(x) = " & forarr(x)) 1248 1249Class ArrClass 1250 Dim classarr(3) 1251 Dim classnoarr() 1252 Dim var 1253 1254 Private Sub Class_Initialize 1255 Call ok(getVT(classarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(classarr) = " & getVT(classarr)) 1256 Call testArray(-1, classnoarr) 1257 classarr(0) = 1 1258 classarr(1) = 2 1259 classarr(2) = 3 1260 classarr(3) = 4 1261 End Sub 1262 1263 Public Sub testVarVT 1264 Call ok(getVT(var) = "VT_ARRAY|VT_VARIANT*", "getVT(var) = " & getVT(var)) 1265 End Sub 1266End Class 1267 1268Set obj = new ArrClass 1269Call ok(getVT(obj.classarr) = "VT_ARRAY|VT_VARIANT", "getVT(obj.classarr) = " & getVT(obj.classarr)) 1270'todo_wine Call ok(obj.classarr(1) = 2, "obj.classarr(1) = " & obj.classarr(1)) 1271 1272obj.var = arr 1273Call ok(getVT(obj.var) = "VT_ARRAY|VT_VARIANT", "getVT(obj.var) = " & getVT(obj.var)) 1274Call obj.testVarVT 1275 1276Sub arrarg(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)) 1281End Sub 1282 1283Call arrarg(arr, arr, obj.classarr, obj.classarr) 1284 1285Sub arrarg2(byref refarr(), byval valarr(), byref refarr2(), byval valarr2()) 1286 Call ok(getVT(refarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(refarr) = " & getVT(refarr)) 1287 Call ok(getVT(valarr) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr) = " & getVT(valarr)) 1288 Call ok(getVT(refarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(refarr2) = " & getVT(refarr2)) 1289 Call ok(getVT(valarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr2) = " & getVT(valarr2)) 1290End Sub 1291 1292Call arrarg2(arr, arr, obj.classarr, obj.classarr) 1293 1294Sub testarrarg(arg(), vt) 1295 Call ok(getVT(arg) = vt, "getVT() = " & getVT(arg) & " expected " & vt) 1296End Sub 1297 1298Call testarrarg(1, "VT_I2*") 1299Call testarrarg(false, "VT_BOOL*") 1300Call testarrarg(Empty, "VT_EMPTY*") 1301 1302Sub modifyarr(arr) 1303 'Following test crashes on wine 1304 'Call ok(arr(0) = "not modified", "arr(0) = " & arr(0)) 1305 arr(0) = "modified" 1306End Sub 1307 1308arr(0) = "not modified" 1309Call modifyarr(arr) 1310Call ok(arr(0) = "modified", "arr(0) = " & arr(0)) 1311 1312arr(0) = "not modified" 1313modifyarr(arr) 1314Call todo_wine_ok(arr(0) = "not modified", "arr(0) = " & arr(0)) 1315 1316for x = 0 to UBound(arr) 1317 arr(x) = x 1318next 1319y = 0 1320for each x in arr 1321 Call ok(x = y, "x = " & x & ", expected " & y) 1322 Call ok(arr(y) = y, "arr(" & y & ") = " & arr(y)) 1323 arr(y) = 1 1324 x = 1 1325 y = y+1 1326next 1327Call ok(y = 4, "y = " & y & " after array enumeration") 1328 1329for x=0 to UBound(arr2, 1) 1330 for y=0 to UBound(arr2, 2) 1331 arr2(x, y) = x + y*(UBound(arr2, 1)+1) 1332 next 1333next 1334y = 0 1335for each x in arr2 1336 Call ok(x = y, "x = " & x & ", expected " & y) 1337 y = y+1 1338next 1339Call ok(y = 20, "y = " & y & " after array enumeration") 1340 1341for each x in noarr 1342 Call ok(false, "Empty array contains: " & x) 1343next 1344 1345' It's allowed to declare non-builtin RegExp class... 1346class RegExp 1347 public property get Global() 1348 Call ok(false, "Global called") 1349 Global = "fail" 1350 end property 1351end class 1352 1353' ...but there is no way to use it because builtin instance is always created 1354set x = new RegExp 1355Call ok(x.Global = false, "x.Global = " & x.Global) 1356 1357sub test_nothing_errors 1358 dim x 1359 on error resume next 1360 1361 x = 1 1362 err.clear 1363 x = nothing 1364 call ok(err.number = 91, "err.number = " & err.number) 1365 call ok(x = 1, "x = " & x) 1366 1367 err.clear 1368 x = not nothing 1369 call ok(err.number = 91, "err.number = " & err.number) 1370 call ok(x = 1, "x = " & x) 1371 1372 err.clear 1373 x = "" & nothing 1374 call ok(err.number = 91, "err.number = " & err.number) 1375 call ok(x = 1, "x = " & x) 1376end sub 1377call test_nothing_errors() 1378 1379sub test_identifiers 1380 ' test keywords that can also be a declared identifier 1381 Dim default 1382 default = "xx" 1383 Call ok(default = "xx", "default = " & default & " expected ""xx""") 1384 1385 Dim error 1386 error = "xx" 1387 Call ok(error = "xx", "error = " & error & " expected ""xx""") 1388 1389 Dim explicit 1390 explicit = "xx" 1391 Call ok(explicit = "xx", "explicit = " & explicit & " expected ""xx""") 1392 1393 Dim step 1394 step = "xx" 1395 Call ok(step = "xx", "step = " & step & " expected ""xx""") 1396end sub 1397call test_identifiers() 1398 1399sub test_dotIdentifiers 1400 ' test keywords that can also be an identifier after a dot 1401 ' Call ok(testObj.rem = 10, "testObj.rem = " & testObj.rem & " expected 10") 1402 Call ok(testObj.true = 10, "testObj.true = " & testObj.true & " expected 10") 1403 Call ok(testObj.false = 10, "testObj.false = " & testObj.false & " expected 10") 1404 Call ok(testObj.not = 10, "testObj.not = " & testObj.not & " expected 10") 1405 Call ok(testObj.and = 10, "testObj.and = " & testObj.and & " expected 10") 1406 Call ok(testObj.or = 10, "testObj.or = " & testObj.or & " expected 10") 1407 Call ok(testObj.xor = 10, "testObj.xor = " & testObj.xor & " expected 10") 1408 Call ok(testObj.eqv = 10, "testObj.eqv = " & testObj.eqv & " expected 10") 1409 Call ok(testObj.imp = 10, "testObj.imp = " & testObj.imp & " expected 10") 1410 Call ok(testObj.is = 10, "testObj.is = " & testObj.is & " expected 10") 1411 Call ok(testObj.mod = 10, "testObj.mod = " & testObj.mod & " expected 10") 1412 Call ok(testObj.call = 10, "testObj.call = " & testObj.call & " expected 10") 1413 Call ok(testObj.dim = 10, "testObj.dim = " & testObj.dim & " expected 10") 1414 Call ok(testObj.sub = 10, "testObj.sub = " & testObj.sub & " expected 10") 1415 Call ok(testObj.function = 10, "testObj.function = " & testObj.function & " expected 10") 1416 Call ok(testObj.get = 10, "testObj.get = " & testObj.get & " expected 10") 1417 Call ok(testObj.let = 10, "testObj.let = " & testObj.let & " expected 10") 1418 Call ok(testObj.const = 10, "testObj.const = " & testObj.const & " expected 10") 1419 Call ok(testObj.if = 10, "testObj.if = " & testObj.if & " expected 10") 1420 Call ok(testObj.else = 10, "testObj.else = " & testObj.else & " expected 10") 1421 Call ok(testObj.elseif = 10, "testObj.elseif = " & testObj.elseif & " expected 10") 1422 Call ok(testObj.end = 10, "testObj.end = " & testObj.end & " expected 10") 1423 Call ok(testObj.then = 10, "testObj.then = " & testObj.then & " expected 10") 1424 Call ok(testObj.exit = 10, "testObj.exit = " & testObj.exit & " expected 10") 1425 Call ok(testObj.while = 10, "testObj.while = " & testObj.while & " expected 10") 1426 Call ok(testObj.wend = 10, "testObj.wend = " & testObj.wend & " expected 10") 1427 Call ok(testObj.do = 10, "testObj.do = " & testObj.do & " expected 10") 1428 Call ok(testObj.loop = 10, "testObj.loop = " & testObj.loop & " expected 10") 1429 Call ok(testObj.until = 10, "testObj.until = " & testObj.until & " expected 10") 1430 Call ok(testObj.for = 10, "testObj.for = " & testObj.for & " expected 10") 1431 Call ok(testObj.to = 10, "testObj.to = " & testObj.to & " expected 10") 1432 Call ok(testObj.each = 10, "testObj.each = " & testObj.each & " expected 10") 1433 Call ok(testObj.in = 10, "testObj.in = " & testObj.in & " expected 10") 1434 Call ok(testObj.select = 10, "testObj.select = " & testObj.select & " expected 10") 1435 Call ok(testObj.case = 10, "testObj.case = " & testObj.case & " expected 10") 1436 Call ok(testObj.byref = 10, "testObj.byref = " & testObj.byref & " expected 10") 1437 Call ok(testObj.byval = 10, "testObj.byval = " & testObj.byval & " expected 10") 1438 Call ok(testObj.option = 10, "testObj.option = " & testObj.option & " expected 10") 1439 Call ok(testObj.nothing = 10, "testObj.nothing = " & testObj.nothing & " expected 10") 1440 Call ok(testObj.empty = 10, "testObj.empty = " & testObj.empty & " expected 10") 1441 Call ok(testObj.null = 10, "testObj.null = " & testObj.null & " expected 10") 1442 Call ok(testObj.class = 10, "testObj.class = " & testObj.class & " expected 10") 1443 Call ok(testObj.set = 10, "testObj.set = " & testObj.set & " expected 10") 1444 Call ok(testObj.new = 10, "testObj.new = " & testObj.new & " expected 10") 1445 Call ok(testObj.public = 10, "testObj.public = " & testObj.public & " expected 10") 1446 Call ok(testObj.private = 10, "testObj.private = " & testObj.private & " expected 10") 1447 Call ok(testObj.next = 10, "testObj.next = " & testObj.next & " expected 10") 1448 Call ok(testObj.on = 10, "testObj.on = " & testObj.on & " expected 10") 1449 Call ok(testObj.resume = 10, "testObj.resume = " & testObj.resume & " expected 10") 1450 Call ok(testObj.goto = 10, "testObj.goto = " & testObj.goto & " expected 10") 1451end sub 1452call test_dotIdentifiers 1453 1454' Test End statements not required to be preceeded by a newline or separator 1455Sub EndTestSub 1456 x = 1 End Sub 1457 1458Sub EndTestSubWithCall 1459 x = 1 1460 Call ok(x = 1, "x = " & x)End Sub 1461Call EndTestSubWithCall() 1462 1463Function EndTestFunc(x) 1464 Call ok(x > 0, "x = " & x)End Function 1465EndTestFunc(1) 1466 1467Class EndTestClassWithStorageId 1468 Public x End Class 1469 1470Class EndTestClassWithDim 1471 Dim x End Class 1472 1473Class EndTestClassWithFunc 1474 Function test(ByVal x) 1475 x = 0 End Function End Class 1476 1477Class EndTestClassWithProperty 1478 Public x 1479 Public default Property Get defprop 1480 defprop = x End Property End Class 1481 1482reportSuccess() 1483