Reactos

[VBSCRIPT_WINETEST] Sync with Wine Staging 4.18. CORE-16441

+1189 -41
+184
modules/rostests/winetests/vbscript/api.vbs
··· 129 129 if isEnglishLang then TestCStr 3.5, "3.5" 130 130 if isEnglishLang then TestCStr true, "True" 131 131 132 + sub testCStrError() 133 + on error resume next 134 + Error.clear() 135 + CStr(null) 136 + call ok(Err.number = 94, "Err.number = " & Err.number) 137 + if isEnglishLang then call ok(Err.source = "Microsoft VBScript runtime error", "Err.source = " & Err.source) 138 + if isEnglishLang then call ok(Err.description = "Invalid use of Null", "Err.description = " & Err.description) 139 + end sub 140 + call testCStrError() 141 + 132 142 Call ok(getVT(Chr(120)) = "VT_BSTR", "getVT(Chr(120)) = " & getVT(Chr(120))) 133 143 Call ok(getVT(Chr(255)) = "VT_BSTR", "getVT(Chr(255)) = " & getVT(Chr(255))) 134 144 Call ok(Chr(120) = "x", "Chr(120) = " & Chr(120)) ··· 144 154 call Err.clear() 145 155 call Chr(-1) 146 156 call ok(Err.number = 5, "Err.number = " & Err.number) 157 + if isEnglishLang then call ok(Err.description = "Invalid procedure call or argument", "Err.description = " & Err.description) 147 158 148 159 call Err.clear() 149 160 call Chr(256) ··· 237 248 Call ok(UBound(arr2, 1) = 2, "UBound(x) = " & UBound(x)) 238 249 Call ok(UBound(arr2, 2) = 4, "UBound(x) = " & UBound(x)) 239 250 251 + sub testUBoundError() 252 + on error resume next 253 + call Err.clear() 254 + call UBound() 255 + call ok(Err.number = 450, "Err.number = " & Err.number) 256 + call Err.clear() 257 + call UBound(arr, 1, 2) 258 + call ok(Err.number = 450, "Err.number = " & Err.number) 259 + if isEnglishLang then call ok(Err.description = "Wrong number of arguments or invalid property assignment", _ 260 + "Err.description = " & Err.description) 261 + end sub 262 + call testUBoundError() 263 + 240 264 Dim newObject 241 265 Set newObject = New ValClass 242 266 newObject.myval = 1 ··· 493 517 TestStrComp "ABC", Empty, 1, 1 494 518 TestStrComp vbNull, vbNull, 1, 0 495 519 TestStrComp "", vbNull, 1, -1 520 + 521 + sub testStrCompError() 522 + on error resume next 523 + call Err.clear() 524 + call StrComp() 525 + call ok(Err.number = 450, "Err.number = " & Err.number) 526 + call Err.clear() 527 + call StrComp("a", "a", 0, 1) 528 + call ok(Err.number = 450, "Err.number = " & Err.number) 529 + end sub 530 + call testStrCompError() 496 531 497 532 Call ok(Len("abc") = 3, "Len(abc) = " & Len("abc")) 498 533 Call ok(Len("") = 0, "Len() = " & Len("")) ··· 1066 1101 Call ok(getVT(VarType(Null)) = "VT_I2", "getVT(VarType(Null)) = " & getVT(VarType(Null))) 1067 1102 Call ok(VarType(255) = vbInteger, "VarType(255) = " & VarType(255)) 1068 1103 Call ok(getVT(VarType(255)) = "VT_I2", "getVT(VarType(255)) = " & getVT(VarType(255))) 1104 + set x = new EmptyClass 1105 + Call ok(VarType(x) = vbObject, "VarType(x) = " & VarType(x)) 1106 + Call ok(getVT(VarType(x)) = "VT_I2", "getVT(VarType(x)) = " & getVT(VarType(x))) 1069 1107 Call ok(VarType(32768) = vbLong, "VarType(32768) = " & VarType(32768)) 1070 1108 Call ok(getVT(VarType(32768)) = "VT_I2", "getVT(VarType(32768)) = " & getVT(VarType(32768))) 1071 1109 Call ok(VarType(CSng(0.5)) = vbSingle, "VarType(CSng(0.5)) = " & VarType(CSng(0.5))) ··· 1080 1118 Call ok(getVT(VarType(CBool(0.5))) = "VT_I2", "getVT(VarType(CBool(0.5))) = " & getVT(VarType(CBool(0.5)))) 1081 1119 Call ok(VarType(CByte(255)) = vbByte, "VarType(CByte(255)) = " & VarType(CByte(255))) 1082 1120 Call ok(getVT(VarType(CByte(255))) = "VT_I2", "getVT(VarType(CByte(255))) = " & getVT(VarType(CByte(255)))) 1121 + Call ok(VarType(arr) = (vbArray or vbVariant), "VarType(arr) = " & VarType(arr)) 1122 + Call ok(getVT(VarType(arr)) = "VT_I2", "getVT(VarType(arr)) = " & getVT(VarType(arr))) 1083 1123 1084 1124 Call ok(Sgn(Empty) = 0, "Sgn(MyEmpty) = " & Sgn(Empty)) 1085 1125 Call ok(getVT(Sgn(Empty)) = "VT_I2", "getVT(Sgn(MyEmpty)) = " & getVT(Sgn(Empty))) ··· 1407 1447 Call ok(getVT(Date) = "VT_DATE", "getVT(Date) = " & getVT(Date)) 1408 1448 Call ok(getVT(Time) = "VT_DATE", "getVT(Time) = " & getVT(Time)) 1409 1449 1450 + Call ok(getVT(Day(now)) = "VT_I2", "getVT(Day(now)) = " & getVT(Day(now))) 1451 + Call ok(Day(2) = 1, "Day(2) = " & Day(2)) 1452 + Call ok(getVT(Month(now)) = "VT_I2", "getVT(Month(now)) = " & getVT(Month(now))) 1453 + Call ok(Month(2) = 1, "Month(2) = " & Month(2)) 1454 + Call ok(getVT(Year(now)) = "VT_I2", "getVT(Year(now)) = " & getVT(Year(now))) 1455 + Call ok(Year(2) = 1900, "Year(2) = " & Year(2)) 1456 + Call ok(getVT(Hour(now)) = "VT_I2", "getVT(Hour(now)) = " & getVT(Hour(now))) 1457 + Call ok(Hour(2) = 0, "Hour(2) = " & Hour(2)) 1458 + Call ok(Hour(2.75) = 18, "Hour(2) = " & Hour(2.75)) 1459 + Call ok(getVT(Minute(now)) = "VT_I2", "getVT(Minute(now)) = " & getVT(Minute(now))) 1460 + Call ok(Minute(2) = 0, "Minute(2) = " & Minute(2)) 1461 + Call ok(Minute(2.02083) = 30, "Minute(2.02083) = " & Minute(2.02083)) 1462 + Call ok(getVT(Second(now)) = "VT_I2", "getVT(Second(now)) = " & getVT(Second(now))) 1463 + Call ok(Second(2) = 0, "Second(2) = " & Second(2)) 1464 + 1410 1465 Sub testRGBError(arg1, arg2, arg3, error_num) 1411 1466 on error resume next 1412 1467 Dim x ··· 1430 1485 Call testRGBError(&h4d&, -2, &h2f&, 5) 1431 1486 1432 1487 Call ok(getVT(Timer) = "VT_R4", "getVT(Timer) = " & getVT(Timer)) 1488 + 1489 + sub testAsc(arg, expected) 1490 + dim x 1491 + x = Asc(arg) 1492 + call ok(x = expected, "x = " & x & " expected " & expected) 1493 + call ok(getVT(x) = "VT_I2*", "getVT = " & getVT(x)) 1494 + end sub 1495 + 1496 + sub testAscError() 1497 + on error resume next 1498 + call Err.clear() 1499 + call Asc(null) 1500 + Call ok(Err.number = 94, "Err.number = " & Err.number) 1501 + call Err.clear() 1502 + call Asc(empty) 1503 + Call ok(Err.number = 5, "Err.number = " & Err.number) 1504 + call Err.clear() 1505 + call Asc() 1506 + Call ok(Err.number = 450, "Err.number = " & Err.number) 1507 + call Err.clear() 1508 + call Asc(Chr(260)) ' some versions of vista allow it 1509 + Call ok(Err.number = 5 or Err.number = 0, "asc4 Err.number = " & Err.number) 1510 + call Err.clear() 1511 + call Asc("") 1512 + Call ok(Err.number = 5, "Err.number = " & Err.number) 1513 + end sub 1514 + 1515 + call testAsc("T", 84) 1516 + call testAsc("test", 116) 1517 + call testAsc("3", 51) 1518 + call testAsc(3, 51) 1519 + call testAsc(" ", 32) 1520 + call testAsc(Chr(255), 255) 1521 + call testAsc(Chr(0), 0) 1522 + if isEnglishLang then testAsc true, 84 1523 + call testAscError() 1524 + 1525 + sub testErrNumber(n) 1526 + call ok(err.number = n, "err.number = " & err.number & " expected " & n) 1527 + end sub 1528 + 1529 + sub testErrRaise() 1530 + on error resume next 1531 + call ok(err.number = 0, "err.number = " & err.number) 1532 + err.raise 1 1533 + call ok(err.number = 1, "err.number = " & err.number) 1534 + err.raise 1535 + call ok(err.number = 450, "err.number = " & err.number) 1536 + call testErrNumber(450) 1537 + err.raise &h10000& 1538 + call ok(err.number = 5, "err.number = " & err.number) 1539 + 1540 + err.clear 1541 + call ok(getVT(err.source) = "VT_BSTR", "err.source = " & err.source) 1542 + call ok(getVT(err.description) = "VT_BSTR", "err.description = " & err.description) 1543 + call ok(getVT(err.helpfile) = "VT_BSTR", "err.helpfile = " & err.helpfile) 1544 + call ok(getVT(err.helpcontext) = "VT_I4", "err.helpcontext = " & err.helpcontext) 1545 + call ok(err.source = "", "err.source = " & err.source) 1546 + call ok(err.description = "", "err.description = " & err.description) 1547 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1548 + call ok(err.helpcontext = 0, "err.helpcontext = " & err.helpcontext) 1549 + 1550 + err.raise 1, "abc" 1551 + call ok(err.number = 1, "err.number = " & err.number) 1552 + call ok(err.source = "abc", "err.source = " & err.source) 1553 + if isEnglishLang then call ok(err.description = "Unknown runtime error", "err.description = " & err.description) 1554 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1555 + 1556 + err.raise 1, 2, "desc", "hf", 1 1557 + call ok(err.number = 1, "err.number = " & err.number) 1558 + call ok(getVT(err.source) = "VT_BSTR", "err.source = " & err.source) 1559 + call ok(err.source = "2", "err.source = " & err.source) 1560 + call ok(err.description = "desc", "err.description = " & err.description) 1561 + call ok(err.helpfile = "hf", "err.helpfile = " & err.helpfile) 1562 + call ok(getVT(err.helpcontext) = "VT_I4", "err.helpcontext = " & err.helpcontext) 1563 + call ok(err.helpcontext = 1, "err.helpcontext = " & err.helpcontext) 1564 + 1565 + err.raise 5 1566 + call ok(err.number = 5, "err.number = " & err.number) 1567 + call ok(err.source = "2", "err.source = " & err.source) 1568 + call ok(err.description = "desc", "err.description = " & err.description) 1569 + call ok(err.helpfile = "hf", "err.helpfile = " & err.helpfile) 1570 + call ok(getVT(err.helpcontext) = "VT_I4", "err.helpcontext = " & err.helpcontext) 1571 + call ok(err.helpcontext = 1, "err.helpcontext = " & err.helpcontext) 1572 + 1573 + err.clear 1574 + err.raise &h8007000E& 1575 + call ok(err.number = 7, "err.number = " & err.number) 1576 + if isEnglishLang then call ok(err.source = "Microsoft VBScript runtime error", "err.source = " & err.source) 1577 + if isEnglishLang then call ok(err.description = "Out of memory", "err.description = " & err.description) 1578 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1579 + call ok(err.helpcontext = 0, "err.helpcontext = " & err.helpcontext) 1580 + 1581 + err.clear 1582 + err.raise 1, "test" 1583 + err.raise &h8007000E& 1584 + call ok(err.number = 7, "err.number = " & err.number) 1585 + call ok(err.source = "test", "err.source = " & err.source) 1586 + if isEnglishLang then call ok(err.description = "Unknown runtime error", "err.description = " & err.description) 1587 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1588 + call ok(err.helpcontext = 0, "err.helpcontext = " & err.helpcontext) 1589 + 1590 + err.raise 1, 2, "desc", "hf", 1 1591 + err.unknownIdent 1592 + call ok(err.number = 438, "err.number = " & err.number) 1593 + if isEnglishLang then call ok(err.source = "Microsoft VBScript runtime error", "err.source = " & err.source) 1594 + if isEnglishLang then call ok(err.description = "Object doesn't support this property or method", _ 1595 + "err.description = " & err.description) 1596 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1597 + call ok(err.helpcontext = 0, "err.helpcontext = " & err.helpcontext) 1598 + 1599 + e = err 1600 + call ok(getVT(e) = "VT_I4*", "getVT(e) = " & getVT(e)) 1601 + call ok(e = 438, "e = " & e) 1602 + 1603 + err.raise 1, 2, "desc", "hf", 1 1604 + on error goto 0 1605 + call ok(err.number = 0, "err.number = " & err.number) 1606 + call ok(err.source = "", "err.source = " & err.source) 1607 + call ok(err.description = "", "err.description = " & err.description) 1608 + call ok(err.helpfile = "", "err.helpfile = " & err.helpfile) 1609 + call ok(err.helpcontext = 0, "err.helpcontext = " & err.helpcontext) 1610 + 1611 + dim e 1612 + e = err 1613 + call ok(getVT(e) = "VT_I4*", "getVT(e) = " & getVT(e)) 1614 + call ok(e = 0, "e = " & e) 1615 + end sub 1616 + call testErrRaise() 1433 1617 1434 1618 Call reportSuccess()
+134
modules/rostests/winetests/vbscript/lang.vbs
··· 41 41 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1") 42 42 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1") 43 43 Call ok(34e5 = 3400000, "34e5 <> 3400000") 44 + Call ok(34e+5 = 3400000, "34e+5 <> 3400000") 44 45 Call ok(56.789e5 = 5678900, "56.789e5 = 5678900") 45 46 Call ok(56.789e-2 = 0.56789, "56.789e-2 <> 0.56789") 46 47 Call ok(1e-94938484 = 0, "1e-... <> 0") ··· 1093 1094 Call ok(isNull(cnull), "cnull = " & cnull) 1094 1095 Call ok(getVT(cnull) = "VT_NULL", "getVT(cnull) = " & getVT(cnull)) 1095 1096 1097 + Call ok(+1 = 1, "+1 != 1") 1098 + Call ok(+true = true, "+1 != 1") 1099 + Call ok(getVT(+true) = "VT_BOOL", "getVT(+true) = " & getVT(+true)) 1100 + Call ok(+"true" = "true", """+true"" != true") 1101 + Call ok(getVT(+"true") = "VT_BSTR", "getVT(+""true"") = " & getVT(+"true")) 1102 + Call ok(+obj is obj, "+obj != obj") 1103 + Call ok(+--+-+1 = -1, "+--+-+1 != -1") 1104 + 1096 1105 if false then Const conststr = "str" 1097 1106 Call ok(conststr = "str", "conststr = " & conststr) 1098 1107 Call ok(getVT(conststr) = "VT_BSTR", "getVT(conststr) = " & getVT(conststr)) ··· 1344 1353 ' ...but there is no way to use it because builtin instance is always created 1345 1354 set x = new RegExp 1346 1355 Call ok(x.Global = false, "x.Global = " & x.Global) 1356 + 1357 + sub 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) 1376 + end sub 1377 + call test_nothing_errors() 1378 + 1379 + sub 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""") 1396 + end sub 1397 + call test_identifiers() 1398 + 1399 + sub 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") 1451 + end sub 1452 + call test_dotIdentifiers 1453 + 1454 + ' Test End statements not required to be preceeded by a newline or separator 1455 + Sub EndTestSub 1456 + x = 1 End Sub 1457 + 1458 + Sub EndTestSubWithCall 1459 + x = 1 1460 + Call ok(x = 1, "x = " & x)End Sub 1461 + Call EndTestSubWithCall() 1462 + 1463 + Function EndTestFunc(x) 1464 + Call ok(x > 0, "x = " & x)End Function 1465 + EndTestFunc(1) 1466 + 1467 + Class EndTestClassWithStorageId 1468 + Public x End Class 1469 + 1470 + Class EndTestClassWithDim 1471 + Dim x End Class 1472 + 1473 + Class EndTestClassWithFunc 1474 + Function test(ByVal x) 1475 + x = 0 End Function End Class 1476 + 1477 + Class EndTestClassWithProperty 1478 + Public x 1479 + Public default Property Get defprop 1480 + defprop = x End Property End Class 1347 1481 1348 1482 reportSuccess()
+669 -37
modules/rostests/winetests/vbscript/run.c
··· 58 58 #define SET_EXPECT(func) \ 59 59 expect_ ## func = TRUE 60 60 61 + #define REF_EXPECT(func) \ 62 + (&expect_ ## func), (&called_ ## func) 63 + 61 64 #define CHECK_EXPECT2(func) \ 62 65 do { \ 63 66 ok(expect_ ##func, "unexpected call " #func "\n"); \ ··· 76 79 expect_ ## func = called_ ## func = FALSE; \ 77 80 }while(0) 78 81 82 + #define CHECK_NOT_CALLED(func) \ 83 + do { \ 84 + ok(!called_ ## func, "unexpected " #func "\n"); \ 85 + expect_ ## func = called_ ## func = FALSE; \ 86 + }while(0) 87 + 79 88 #define CLEAR_CALLED(func) \ 80 89 expect_ ## func = called_ ## func = FALSE 81 90 ··· 85 94 DEFINE_EXPECT(global_vbvar_i); 86 95 DEFINE_EXPECT(global_letobj_i); 87 96 DEFINE_EXPECT(global_setobj_i); 97 + DEFINE_EXPECT(global_globalcallback_i); 88 98 DEFINE_EXPECT(testobj_propget_d); 89 99 DEFINE_EXPECT(testobj_propget_i); 90 100 DEFINE_EXPECT(testobj_propput_d); ··· 95 105 DEFINE_EXPECT(global_propargput1_d); 96 106 DEFINE_EXPECT(global_propargput1_i); 97 107 DEFINE_EXPECT(global_testoptionalarg_i); 108 + DEFINE_EXPECT(global_testerrorobject_i); 98 109 DEFINE_EXPECT(collectionobj_newenum_i); 99 110 DEFINE_EXPECT(Next); 100 111 DEFINE_EXPECT(GetWindow); 101 112 DEFINE_EXPECT(GetUIBehavior); 102 113 DEFINE_EXPECT(EnableModeless); 103 114 DEFINE_EXPECT(OnScriptError); 115 + DEFINE_EXPECT(OnEnterScript); 116 + DEFINE_EXPECT(OnLeaveScript); 104 117 105 118 #define DISPID_GLOBAL_REPORTSUCCESS 1000 106 119 #define DISPID_GLOBAL_TRACE 1001 ··· 124 137 #define DISPID_GLOBAL_SETOBJ 1019 125 138 #define DISPID_GLOBAL_TODO_WINE_OK 1020 126 139 #define DISPID_GLOBAL_WEEKSTARTDAY 1021 140 + #define DISPID_GLOBAL_GLOBALCALLBACK 1022 141 + #define DISPID_GLOBAL_TESTERROROBJECT 1023 127 142 128 143 #define DISPID_TESTOBJ_PROPGET 2000 129 144 #define DISPID_TESTOBJ_PROPPUT 2001 145 + #define DISPID_TESTOBJ_KEYWORD 2002 130 146 131 147 #define DISPID_COLLOBJ_RESET 3000 132 148 ··· 143 159 static SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_NOUIERROR; 144 160 static IDispatchEx testObj; 145 161 static HRESULT onerror_hres = E_NOTIMPL; 162 + static BOOL strict_enter_script; 146 163 147 164 static BSTR a2bstr(const char *str) 148 165 { ··· 161 178 CHAR buf[512]; 162 179 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0); 163 180 return lstrcmpA(buf, stra); 181 + } 182 + 183 + static int stricmp_wa(LPCWSTR strw, const char *stra) 184 + { 185 + CHAR buf[512]; 186 + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0); 187 + return lstrcmpiA(buf, stra); 164 188 } 165 189 166 190 static const char *vt2a(VARIANT *v) ··· 685 709 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, 686 710 LCID lcid, ITypeInfo **ppTInfo) 687 711 { 688 - ok(0, "unexpected call\n"); 689 712 return E_NOTIMPL; 690 713 } 691 714 ··· 756 779 757 780 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) 758 781 { 759 - if(!strcmp_wa(bstrName, "propget")) { 760 - CHECK_EXPECT(testobj_propget_d); 761 - test_grfdex(grfdex, fdexNameCaseInsensitive); 762 - *pid = DISPID_TESTOBJ_PROPGET; 763 - return S_OK; 764 - } 765 - if(!strcmp_wa(bstrName, "propput")) { 766 - CHECK_EXPECT(testobj_propput_d); 767 - test_grfdex(grfdex, fdexNameCaseInsensitive); 768 - *pid = DISPID_TESTOBJ_PROPPUT; 769 - return S_OK; 782 + typedef struct { 783 + const char * const name; 784 + DISPID pid; 785 + BOOL *expect; 786 + BOOL *called; 787 + } dispid_t; 788 + 789 + dispid_t dispids[] = { 790 + { "propget", DISPID_TESTOBJ_PROPGET, REF_EXPECT(testobj_propget_d) }, 791 + { "propput", DISPID_TESTOBJ_PROPPUT, REF_EXPECT(testobj_propput_d) }, 792 + { "rem", DISPID_TESTOBJ_KEYWORD, NULL }, 793 + { "true", DISPID_TESTOBJ_KEYWORD, NULL }, 794 + { "false", DISPID_TESTOBJ_KEYWORD, NULL }, 795 + { "not", DISPID_TESTOBJ_KEYWORD, NULL }, 796 + { "and", DISPID_TESTOBJ_KEYWORD, NULL }, 797 + { "or", DISPID_TESTOBJ_KEYWORD, NULL }, 798 + { "xor", DISPID_TESTOBJ_KEYWORD, NULL }, 799 + { "eqv", DISPID_TESTOBJ_KEYWORD, NULL }, 800 + { "imp", DISPID_TESTOBJ_KEYWORD, NULL }, 801 + { "is", DISPID_TESTOBJ_KEYWORD, NULL }, 802 + { "mod", DISPID_TESTOBJ_KEYWORD, NULL }, 803 + { "call", DISPID_TESTOBJ_KEYWORD, NULL }, 804 + { "dim", DISPID_TESTOBJ_KEYWORD, NULL }, 805 + { "sub", DISPID_TESTOBJ_KEYWORD, NULL }, 806 + { "function", DISPID_TESTOBJ_KEYWORD, NULL }, 807 + { "get", DISPID_TESTOBJ_KEYWORD, NULL }, 808 + { "let", DISPID_TESTOBJ_KEYWORD, NULL }, 809 + { "const", DISPID_TESTOBJ_KEYWORD, NULL }, 810 + { "if", DISPID_TESTOBJ_KEYWORD, NULL }, 811 + { "else", DISPID_TESTOBJ_KEYWORD, NULL }, 812 + { "elseif", DISPID_TESTOBJ_KEYWORD, NULL }, 813 + { "end", DISPID_TESTOBJ_KEYWORD, NULL }, 814 + { "then", DISPID_TESTOBJ_KEYWORD, NULL }, 815 + { "exit", DISPID_TESTOBJ_KEYWORD, NULL }, 816 + { "while", DISPID_TESTOBJ_KEYWORD, NULL }, 817 + { "wend", DISPID_TESTOBJ_KEYWORD, NULL }, 818 + { "do", DISPID_TESTOBJ_KEYWORD, NULL }, 819 + { "loop", DISPID_TESTOBJ_KEYWORD, NULL }, 820 + { "until", DISPID_TESTOBJ_KEYWORD, NULL }, 821 + { "for", DISPID_TESTOBJ_KEYWORD, NULL }, 822 + { "to", DISPID_TESTOBJ_KEYWORD, NULL }, 823 + { "each", DISPID_TESTOBJ_KEYWORD, NULL }, 824 + { "in", DISPID_TESTOBJ_KEYWORD, NULL }, 825 + { "select", DISPID_TESTOBJ_KEYWORD, NULL }, 826 + { "case", DISPID_TESTOBJ_KEYWORD, NULL }, 827 + { "byref", DISPID_TESTOBJ_KEYWORD, NULL }, 828 + { "byval", DISPID_TESTOBJ_KEYWORD, NULL }, 829 + { "option", DISPID_TESTOBJ_KEYWORD, NULL }, 830 + { "nothing", DISPID_TESTOBJ_KEYWORD, NULL }, 831 + { "empty", DISPID_TESTOBJ_KEYWORD, NULL }, 832 + { "null", DISPID_TESTOBJ_KEYWORD, NULL }, 833 + { "class", DISPID_TESTOBJ_KEYWORD, NULL }, 834 + { "set", DISPID_TESTOBJ_KEYWORD, NULL }, 835 + { "new", DISPID_TESTOBJ_KEYWORD, NULL }, 836 + { "public", DISPID_TESTOBJ_KEYWORD, NULL }, 837 + { "private", DISPID_TESTOBJ_KEYWORD, NULL }, 838 + { "next", DISPID_TESTOBJ_KEYWORD, NULL }, 839 + { "on", DISPID_TESTOBJ_KEYWORD, NULL }, 840 + { "resume", DISPID_TESTOBJ_KEYWORD, NULL }, 841 + { "goto", DISPID_TESTOBJ_KEYWORD, NULL }, 842 + }; 843 + int i; 844 + 845 + for (i = 0; i < ARRAY_SIZE(dispids); i++) { 846 + if(!stricmp_wa(bstrName, dispids[i].name)) { 847 + dispid_t *d = &dispids[i]; 848 + if(d->expect) { 849 + ok(*d->expect, "unexpected call %s\n", d->name); 850 + *d->called = TRUE; 851 + *d->expect = FALSE; 852 + } 853 + test_grfdex(grfdex, fdexNameCaseInsensitive); 854 + *pid = d->pid; 855 + return S_OK; 856 + } 770 857 } 771 858 772 859 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName)); ··· 830 917 831 918 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); 832 919 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg)); 920 + return S_OK; 921 + 922 + case DISPID_TESTOBJ_KEYWORD: 923 + V_VT(pvarRes) = VT_I2; 924 + V_I2(pvarRes) = 10; 833 925 return S_OK; 834 926 } 835 927 ··· 1024 1116 *pid = DISPID_GLOBAL_WEEKSTARTDAY; 1025 1117 return S_OK; 1026 1118 } 1119 + if(!strcmp_wa(bstrName, "globalCallback")) { 1120 + test_grfdex(grfdex, fdexNameCaseInsensitive); 1121 + *pid = DISPID_GLOBAL_GLOBALCALLBACK; 1122 + return S_OK; 1123 + } 1027 1124 if(!strcmp_wa(bstrName, "testObj")) { 1028 1125 test_grfdex(grfdex, fdexNameCaseInsensitive); 1029 1126 *pid = DISPID_GLOBAL_TESTOBJ; ··· 1100 1197 if(!strcmp_wa(bstrName, "testOptionalArg")) { 1101 1198 test_grfdex(grfdex, fdexNameCaseInsensitive); 1102 1199 *pid = DISPID_GLOBAL_TESTOPTIONALARG; 1200 + return S_OK; 1201 + } 1202 + if(!strcmp_wa(bstrName, "testErrorObject")) { 1203 + test_grfdex(grfdex, fdexNameCaseInsensitive); 1204 + *pid = DISPID_GLOBAL_TESTERROROBJECT; 1103 1205 return S_OK; 1104 1206 } 1105 1207 ··· 1480 1582 ok(V_ERROR(v) == DISP_E_PARAMNOTFOUND, "V_ERROR(v) = %08x\n", V_ERROR(v)); 1481 1583 return S_OK; 1482 1584 } 1585 + case DISPID_GLOBAL_GLOBALCALLBACK: { 1586 + DISPPARAMS dp = {0}; 1587 + IDispatchEx *dispex; 1588 + EXCEPINFO ei; 1589 + VARIANT v; 1590 + DISPID id; 1591 + BSTR str; 1592 + HRESULT hres; 1593 + 1594 + CHECK_EXPECT(global_globalcallback_i); 1595 + CHECK_CALLED(OnEnterScript); 1596 + 1597 + ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); 1598 + ok(pdp != NULL, "pdp == NULL\n"); 1599 + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); 1600 + ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg)); 1601 + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); 1602 + ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); 1603 + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); 1604 + ok(!pvarRes, "pvarRes != NULL\n"); 1605 + ok(pei != NULL, "pei == NULL\n"); 1606 + 1607 + hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IDispatchEx, (void**)&dispex); 1608 + ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); 1609 + 1610 + str = SysAllocString(L"callback"); 1611 + hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id); 1612 + ok(hres == S_OK, "GetDispID failed: %08x\n", hres); 1613 + SysFreeString(str); 1614 + 1615 + SET_EXPECT(OnEnterScript); 1616 + SET_EXPECT(OnLeaveScript); 1617 + memset(&ei, 0, sizeof(ei)); 1618 + hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_METHOD, &dp, &v, &ei, pspCaller); 1619 + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); 1620 + CHECK_CALLED(OnEnterScript); 1621 + CHECK_CALLED(OnLeaveScript); 1622 + ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v)); 1623 + ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v)); 1624 + 1625 + IDispatchEx_Release(dispex); 1626 + 1627 + SET_EXPECT(OnLeaveScript); 1628 + return S_OK; 1629 + } 1630 + case DISPID_GLOBAL_TESTERROROBJECT: { 1631 + ITypeInfo *typeinfo; 1632 + IDispatchEx *dispex; 1633 + DISPPARAMS dp; 1634 + VARIANT v, r; 1635 + EXCEPINFO ei; 1636 + IDispatch *disp; 1637 + WCHAR *names[1]; 1638 + UINT count, i; 1639 + DISPID id; 1640 + HRESULT hres; 1641 + 1642 + static WCHAR props[][32] = { L"clear", L"description", L"helpcontext", L"helpFILE", L"number", L"raise", L"source" }; 1643 + 1644 + CHECK_EXPECT(global_testerrorobject_i); 1645 + 1646 + ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); 1647 + ok(pdp != NULL, "pdp == NULL\n"); 1648 + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); 1649 + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); 1650 + ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); 1651 + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); 1652 + ok(!pvarRes, "pvarRes != NULL\n"); 1653 + ok(pei != NULL, "pei == NULL\n"); 1654 + 1655 + ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg)); 1656 + disp = V_DISPATCH(pdp->rgvarg); 1657 + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); 1658 + ok(hres == E_NOINTERFACE, "Could not get IDispatchEx iface: %08x\n", hres); 1659 + 1660 + hres = IDispatch_GetTypeInfoCount(disp, &count); 1661 + ok(hres == S_OK, "GetTypeInfoCount returned: %08x\n", hres); 1662 + ok(count == 0, "count = %u\n", count); 1663 + 1664 + hres = IDispatch_GetTypeInfo(disp, 0, 0, &typeinfo); 1665 + ok(hres == DISP_E_BADINDEX, "GetTypeInfo returned: %08x\n", hres); 1666 + 1667 + for(i = 0; i < ARRAY_SIZE(props); i++) { 1668 + names[0] = props[i]; 1669 + hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, names, 1, 0, &id); 1670 + ok(hres == S_OK, "GetIDsOfNames failed: %08x\n", hres); 1671 + ok(id == i + 1, "%s id = %u\n", wine_dbgstr_w(props[i]), id); 1672 + } 1673 + 1674 + memset(&dp, 0, sizeof(dp)); 1675 + memset(&ei, 0, sizeof(ei)); 1676 + V_VT(&v) = VT_ERROR; 1677 + hres = IDispatch_Invoke(disp, 5, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); 1678 + ok(hres == S_OK, "Invoke failed: %08x\n", hres); 1679 + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); 1680 + ok(V_I4(&v) == 1, "V_I4(v) = %d\n", V_I4(&v)); 1681 + hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); 1682 + ok(hres == S_OK, "Invoke failed: %08x\n", hres); 1683 + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); 1684 + ok(V_I4(&v) == 1, "V_I4(v) = %d\n", V_I4(&v)); 1685 + 1686 + dp.rgvarg = &v; 1687 + V_VT(&v) = VT_I4; 1688 + V_I4(&v) = 6; 1689 + V_VT(&r) = VT_EMPTY; 1690 + hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 6, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dp, &r, &ei, NULL); 1691 + ok(hres == S_OK, "Invoke failed: %08x\n", hres); 1692 + return S_OK; 1693 + } 1483 1694 } 1484 1695 1485 1696 ok(0, "unexpected call %d\n", id); ··· 1651 1862 return E_NOTIMPL; 1652 1863 } 1653 1864 1865 + static IActiveScriptError **store_script_error; 1866 + 1654 1867 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror) 1655 1868 { 1656 - HRESULT hr = onerror_hres; 1869 + HRESULT hr = onerror_hres, hres; 1657 1870 1658 1871 if(!expect_OnScriptError) { 1659 1872 EXCEPINFO info; ··· 1664 1877 if(SUCCEEDED(hres)) 1665 1878 hres = IActiveScriptError_GetExceptionInfo(pscripterror, &info); 1666 1879 if(SUCCEEDED(hres)) 1667 - trace("Error in line %u: %s\n", line+1, wine_dbgstr_w(info.bstrDescription)); 1880 + trace("Error in line %u: %x %s\n", line+1, info.wCode, wine_dbgstr_w(info.bstrDescription)); 1881 + }else { 1882 + IDispatchEx *dispex; 1883 + 1884 + hres = IActiveScriptError_QueryInterface(pscripterror, &IID_IDispatchEx, (void**)&dispex); 1885 + ok(hres == E_NOINTERFACE, "QI(IDispatchEx) returned: %08x\n", hres); 1886 + } 1887 + 1888 + if(store_script_error) { 1889 + IActiveScriptError_AddRef(pscripterror); 1890 + *store_script_error = pscripterror; 1891 + store_script_error = NULL; 1668 1892 } 1669 1893 1670 1894 CHECK_EXPECT(OnScriptError); ··· 1675 1899 1676 1900 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) 1677 1901 { 1902 + if(strict_enter_script) 1903 + CHECK_EXPECT(OnEnterScript); 1678 1904 return E_NOTIMPL; 1679 1905 } 1680 1906 1681 1907 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) 1682 1908 { 1909 + if(strict_enter_script) 1910 + CHECK_EXPECT(OnLeaveScript); 1683 1911 return E_NOTIMPL; 1684 1912 } 1685 - 1686 - #undef ACTSCPSITE_THIS 1687 1913 1688 1914 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { 1689 1915 ActiveScriptSite_QueryInterface, ··· 1713 1939 return script; 1714 1940 } 1715 1941 1716 - static IActiveScript *create_and_init_script(DWORD flags) 1942 + static IActiveScript *create_and_init_script(DWORD flags, BOOL start) 1717 1943 { 1718 1944 IActiveScriptParse *parser; 1719 1945 IActiveScript *engine; ··· 1738 1964 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags); 1739 1965 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); 1740 1966 1741 - hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); 1742 - ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); 1967 + if (start) 1968 + { 1969 + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); 1970 + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); 1971 + } 1743 1972 1744 1973 return engine; 1745 1974 } ··· 1764 1993 LONG ref; 1765 1994 HRESULT hres; 1766 1995 1767 - engine = create_and_init_script(flags); 1996 + engine = create_and_init_script(flags, TRUE); 1768 1997 if(!engine) 1769 1998 return S_OK; 1770 1999 ··· 1828 2057 static const WCHAR yW[] = {'y',0}; 1829 2058 1830 2059 global_ref = 1; 1831 - engine = create_and_init_script(0); 2060 + engine = create_and_init_script(0, TRUE); 1832 2061 if(!engine) 1833 2062 return; 1834 2063 1835 2064 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); 1836 2065 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); 1837 2066 2067 + /* NULL code text succeeds but does nothing */ 2068 + hres = IActiveScriptParse_ParseScriptText(parser, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2069 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2070 + 1838 2071 /* unknown identifier context is not a valid argument */ 1839 2072 str = a2bstr("Call reportSuccess()\n"); 1840 2073 hres = IActiveScriptParse_ParseScriptText(parser, str, yW, NULL, NULL, 0, 0, 0, NULL, NULL); ··· 1891 2124 ok_(__FILE__,line)(hres == S_OK, "parse_script failed: %08x\n", hres); 1892 2125 } 1893 2126 1894 - static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src) 2127 + static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src, DWORD flags) 1895 2128 { 1896 2129 IDispatchEx *dispex; 1897 2130 IDispatch *disp; ··· 1902 2135 1903 2136 str = a2bstr(src); 1904 2137 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0, 1905 - SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp); 2138 + SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS|flags, &disp); 1906 2139 SysFreeString(str); 1907 2140 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres); 1908 2141 ok(disp != NULL, "disp = NULL\n"); ··· 1921 2154 DISPPARAMS dp = {NULL}; 1922 2155 IActiveScript *script; 1923 2156 IDispatchEx *proc; 2157 + IDispatch *disp; 1924 2158 EXCEPINFO ei = {0}; 1925 2159 VARIANT v; 1926 2160 HRESULT hres; 1927 2161 1928 - script = create_and_init_script(0); 2162 + strict_enter_script = TRUE; 2163 + script = create_and_init_script(0, TRUE); 1929 2164 1930 2165 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc); 1931 2166 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres); 1932 2167 1933 - proc = parse_procedure(parse_proc, "dim x\nif true then x=false"); 2168 + hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, NULL, NULL, emptyW, NULL, NULL, NULL, 0, 0, 0, &disp); 2169 + ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres); 2170 + IDispatch_Release(disp); 1934 2171 2172 + proc = parse_procedure(parse_proc, "dim x\nif true then x=false", 0); 2173 + 2174 + SET_EXPECT(OnEnterScript); 2175 + SET_EXPECT(OnLeaveScript); 1935 2176 V_VT(&v) = VT_EMPTY; 1936 2177 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp); 1937 2178 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); 2179 + CHECK_CALLED(OnEnterScript); 2180 + CHECK_CALLED(OnLeaveScript); 2181 + VariantClear(&v); 2182 + IDispatchEx_Release(proc); 1938 2183 2184 + proc = parse_procedure(parse_proc, "\"foobar\"", SCRIPTPROC_ISEXPRESSION); 2185 + 2186 + SET_EXPECT(OnEnterScript); 2187 + SET_EXPECT(OnLeaveScript); 2188 + hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp); 2189 + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); 2190 + CHECK_CALLED(OnEnterScript); 2191 + CHECK_CALLED(OnLeaveScript); 2192 + ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR, got %s\n", vt2a(&v)); 2193 + ok(!strcmp_wa(V_BSTR(&v), "foobar"), "Wrong string, got %s\n", wine_dbgstr_w(V_BSTR(&v))); 2194 + VariantClear(&v); 1939 2195 IDispatchEx_Release(proc); 1940 2196 1941 2197 IActiveScriptParseProcedure2_Release(parse_proc); 1942 2198 1943 2199 close_script(script); 2200 + strict_enter_script = FALSE; 2201 + } 2202 + 2203 + static void free_ei(EXCEPINFO *ei) 2204 + { 2205 + SysFreeString(ei->bstrSource); 2206 + SysFreeString(ei->bstrDescription); 2207 + SysFreeString(ei->bstrHelpFile); 2208 + } 2209 + 2210 + static void test_callbacks(void) 2211 + { 2212 + IActiveScriptError *error1, *error2; 2213 + IActiveScriptParse *parser; 2214 + DISPPARAMS dp = {NULL}; 2215 + IActiveScript *script; 2216 + IDispatchEx *dispex; 2217 + IDispatch *disp; 2218 + DISPID id; 2219 + EXCEPINFO ei = {0}; 2220 + BSTR str; 2221 + VARIANT v; 2222 + HRESULT hres; 2223 + 2224 + strict_enter_script = TRUE; 2225 + script = create_and_init_script(SCRIPTITEM_GLOBALMEMBERS, TRUE); 2226 + 2227 + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser); 2228 + ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres); 2229 + 2230 + SET_EXPECT(OnEnterScript); 2231 + SET_EXPECT(OnLeaveScript); 2232 + hres = IActiveScriptParse_ParseScriptText(parser, 2233 + L"class CallbackClass\n" 2234 + L" public function callback()\n" 2235 + L" call ok(err.number = 2, \"err.number = \" & err.number)\n" 2236 + L" callback = true\n" 2237 + L" end function\n" 2238 + L"end class\n" 2239 + L"function callGlobalCallback()\n" 2240 + L" on error resume next\n" 2241 + L" err.raise 2\n" 2242 + L" call test.globalCallback(new CallbackClass)\n" 2243 + L" call ok(err.number = 2, \"err.number = \" & err.numner)\n" 2244 + L"end function\n", 2245 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2246 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2247 + CHECK_CALLED(OnEnterScript); 2248 + CHECK_CALLED(OnLeaveScript); 2249 + 2250 + hres = IActiveScript_GetScriptDispatch(script, NULL, &disp); 2251 + ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres); 2252 + 2253 + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); 2254 + ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); 2255 + IDispatch_Release(disp); 2256 + 2257 + str = SysAllocString(L"callGlobalCallback"); 2258 + hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id); 2259 + ok(hres == S_OK, "GetDispID failed: %08x\n", hres); 2260 + SysFreeString(str); 2261 + 2262 + SET_EXPECT(OnEnterScript); 2263 + /* OnLeaveScript will be set in global callback */ 2264 + SET_EXPECT(global_globalcallback_i); 2265 + hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp); 2266 + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); 2267 + /* OnEnterScript was checked in global callback */ 2268 + CHECK_CALLED(OnLeaveScript); 2269 + CHECK_CALLED(global_globalcallback_i); 2270 + 2271 + store_script_error = &error1; 2272 + 2273 + SET_EXPECT(OnEnterScript); 2274 + SET_EXPECT(OnLeaveScript); 2275 + SET_EXPECT(OnScriptError); 2276 + hres = IActiveScriptParse_ParseScriptText(parser, L"err.raise 2\n", 2277 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2278 + ok(hres == MAKE_VBSERROR(2), "ParseScriptText failed: %08x\n", hres); 2279 + CHECK_CALLED(OnEnterScript); 2280 + CHECK_CALLED(OnLeaveScript); 2281 + CHECK_CALLED(OnScriptError); 2282 + 2283 + store_script_error = &error2; 2284 + 2285 + SET_EXPECT(OnEnterScript); 2286 + SET_EXPECT(OnLeaveScript); 2287 + SET_EXPECT(OnScriptError); 2288 + hres = IActiveScriptParse_ParseScriptText(parser, 2289 + L"call ok(err.number = 0, \"err.number = \" & err.number)\n" 2290 + L"err.raise &h86664004&, \"src\", \"desc\", \"help\", 1\n", 2291 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2292 + ok(hres == SCRIPT_E_RECORDED, "ParseScriptText failed: %08x\n", hres); 2293 + CHECK_CALLED(OnEnterScript); 2294 + CHECK_CALLED(OnLeaveScript); 2295 + CHECK_CALLED(OnScriptError); 2296 + 2297 + memset(&ei, 0xcc, sizeof(ei)); 2298 + hres = IActiveScriptError_GetExceptionInfo(error1, &ei); 2299 + ok(hres == S_OK, "GetExceptionInfo returned %08x\n", hres); 2300 + ok(!ei.wCode, "wCode = %x\n", ei.wCode); 2301 + ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved); 2302 + if(is_english) { 2303 + ok(!wcscmp(ei.bstrSource, L"Microsoft VBScript runtime error"), 2304 + "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource)); 2305 + ok(!wcscmp(ei.bstrDescription, L"Object doesn't support this property or method"), 2306 + "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription)); 2307 + } 2308 + ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile)); 2309 + ok(!ei.dwHelpContext, "dwHelpContext = %x\n", ei.dwHelpContext); 2310 + ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved); 2311 + ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn); 2312 + ok(ei.scode == MAKE_VBSERROR(2), "scode = %x\n", ei.scode); 2313 + free_ei(&ei); 2314 + 2315 + IActiveScriptError_Release(error1); 2316 + 2317 + memset(&ei, 0xcc, sizeof(ei)); 2318 + hres = IActiveScriptError_GetExceptionInfo(error2, &ei); 2319 + ok(hres == S_OK, "GetExceptionInfo returned %08x\n", hres); 2320 + ok(!ei.wCode, "wCode = %x\n", ei.wCode); 2321 + ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved); 2322 + ok(!wcscmp(ei.bstrSource, L"src"), "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource)); 2323 + ok(!wcscmp(ei.bstrDescription, L"desc"), "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription)); 2324 + ok(!wcscmp(ei.bstrHelpFile, L"help"), "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile)); 2325 + ok(ei.dwHelpContext == 1, "dwHelpContext = %x\n", ei.dwHelpContext); 2326 + ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved); 2327 + ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn); 2328 + ok(ei.scode == SCRIPT_E_RECORDED, "scode = %x\n", ei.scode); 2329 + free_ei(&ei); 2330 + 2331 + IActiveScriptError_Release(error2); 2332 + 2333 + SET_EXPECT(OnEnterScript); 2334 + SET_EXPECT(OnLeaveScript); 2335 + SET_EXPECT(OnScriptError); 2336 + hres = IActiveScriptParse_ParseScriptText(parser, L"err.raise &hffff&\n", 2337 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2338 + ok(hres == MAKE_VBSERROR(0xffff), "ParseScriptText failed: %08x\n", hres); 2339 + CHECK_CALLED(OnEnterScript); 2340 + CHECK_CALLED(OnLeaveScript); 2341 + CHECK_CALLED(OnScriptError); 2342 + 2343 + SET_EXPECT(OnEnterScript); 2344 + SET_EXPECT(OnLeaveScript); 2345 + SET_EXPECT(OnScriptError); 2346 + hres = IActiveScriptParse_ParseScriptText(parser, L"err.raise &h80102030&\n", 2347 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2348 + ok(hres == 0x80102030, "ParseScriptText failed: %08x\n", hres); 2349 + CHECK_CALLED(OnEnterScript); 2350 + CHECK_CALLED(OnLeaveScript); 2351 + CHECK_CALLED(OnScriptError); 2352 + 2353 + SET_EXPECT(OnEnterScript); 2354 + SET_EXPECT(global_testerrorobject_i); 2355 + SET_EXPECT(OnLeaveScript); 2356 + hres = IActiveScriptParse_ParseScriptText(parser, 2357 + L"on error resume next\n" 2358 + L"err.raise 1\n" 2359 + L"testErrorObject err\n", 2360 + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2361 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2362 + CHECK_CALLED(OnEnterScript); 2363 + CHECK_CALLED(global_testerrorobject_i); 2364 + CHECK_CALLED(OnLeaveScript); 2365 + 2366 + IDispatchEx_Release(dispex); 2367 + 2368 + IActiveScriptParse_Release(parser); 2369 + close_script(script); 2370 + strict_enter_script = FALSE; 1944 2371 } 1945 2372 1946 2373 static void test_gc(void) ··· 1998 2425 IActiveScriptParse_Release(parser); 1999 2426 } 2000 2427 2428 + static void test_parse_errors(void) 2429 + { 2430 + static const char *invalid_scripts[] = 2431 + { 2432 + /* If...End If */ 2433 + "If 0 > 1 Then\n" 2434 + " x = 0 End If\n", 2435 + 2436 + /* While...End While */ 2437 + "While False\n" 2438 + " x = 0 End While\n", 2439 + 2440 + /* While...Wend */ 2441 + "While False\n" 2442 + " x = 0 Wend\n", 2443 + 2444 + /* Do While...Loop */ 2445 + "Do While False\n" 2446 + " x = 0 Loop\n", 2447 + 2448 + /* Do Until...Loop */ 2449 + "Do Until True\n" 2450 + " x = 0 Loop\n", 2451 + 2452 + /* Do...Loop While */ 2453 + "Do\n" 2454 + " x = 0 Loop While False\n", 2455 + 2456 + /* Do...Loop Until */ 2457 + "Do\n" 2458 + " x = 0 Loop Until True\n", 2459 + 2460 + /* Select...End Select */ 2461 + "x = False\n" 2462 + "Select Case 42\n" 2463 + " Case 0\n" 2464 + " Call ok(False, \"unexpected case\")\n" 2465 + " Case 42\n" 2466 + " x = True End Select\n" 2467 + "Call ok(x, \"wrong case\")\n", 2468 + 2469 + /* Class...End Class (empty) */ 2470 + "Class C End Class" 2471 + }; 2472 + HRESULT hres; 2473 + UINT i; 2474 + 2475 + for (i = 0; i < ARRAY_SIZE(invalid_scripts); i++) 2476 + { 2477 + SET_EXPECT(OnScriptError); 2478 + hres = parse_script_ar(invalid_scripts[i]); 2479 + ok(FAILED(hres), "[%u] script did not fail\n", i); 2480 + CHECK_CALLED(OnScriptError); 2481 + } 2482 + } 2483 + 2001 2484 static void test_msgbox(void) 2002 2485 { 2003 2486 HRESULT hres; ··· 2035 2518 CHECK_CALLED(GetUIBehavior); 2036 2519 CHECK_CALLED(GetWindow); 2037 2520 CHECK_CALLED(EnableModeless); 2038 - todo_wine CHECK_CALLED(OnScriptError); 2521 + CHECK_CALLED(OnScriptError); 2039 2522 2040 2523 uic_handling = SCRIPTUICHANDLING_NOUIERROR; 2041 2524 ··· 2044 2527 hres = parse_script_ar("MsgBox \"testing...\""); 2045 2528 ok(FAILED(hres), "script not failed\n"); 2046 2529 CHECK_CALLED(GetUIBehavior); 2047 - todo_wine CHECK_CALLED(OnScriptError); 2530 + CHECK_CALLED(OnScriptError); 2048 2531 } 2049 2532 2050 2533 static HRESULT test_global_vars_ref(BOOL use_close) ··· 2104 2587 return hres; 2105 2588 } 2106 2589 2590 + static void test_isexpression(void) 2591 + { 2592 + IActiveScriptParse *parser; 2593 + IActiveScript *engine; 2594 + SCRIPTSTATE ss; 2595 + HRESULT hres; 2596 + VARIANT var; 2597 + BSTR str; 2598 + 2599 + if (!(engine = create_and_init_script(0, FALSE))) 2600 + return; 2601 + 2602 + hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); 2603 + ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); 2604 + if (FAILED(hres)) 2605 + { 2606 + close_script(engine); 2607 + return; 2608 + } 2609 + 2610 + /* Expression when script is not started is still executed */ 2611 + hres = IActiveScript_GetScriptState(engine, &ss); 2612 + ok(hres == S_OK, "GetScriptState failed: %08x\n", hres); 2613 + ok(ss == SCRIPTSTATE_INITIALIZED, "Wrong script state %u\n", ss); 2614 + 2615 + str = a2bstr("13"); 2616 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2617 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2618 + ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var)); 2619 + ok(V_I2(&var) == 13, "Expected 13, got %d\n", V_I2(&var)); 2620 + VariantClear(&var); 2621 + SysFreeString(str); 2622 + 2623 + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); 2624 + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); 2625 + 2626 + /* Empty expressions */ 2627 + V_VT(&var) = VT_I2; 2628 + str = a2bstr(""); 2629 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2630 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2631 + ok(V_VT(&var) == VT_EMPTY, "Expected VT_EMPTY, got %s\n", vt2a(&var)); 2632 + VariantClear(&var); 2633 + SysFreeString(str); 2634 + 2635 + /* Two expressions fail */ 2636 + str = a2bstr("1\n3"); 2637 + SET_EXPECT(OnScriptError); 2638 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2639 + ok(FAILED(hres), "ParseScriptText did not fail: %08x\n", hres); 2640 + CHECK_CALLED(OnScriptError); 2641 + VariantClear(&var); 2642 + SysFreeString(str); 2643 + 2644 + /* Simple numerical expression */ 2645 + str = a2bstr("(1 + 7) * 2 - 3"); 2646 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, NULL, NULL); 2647 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2648 + 2649 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2650 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2651 + ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var)); 2652 + ok(V_I2(&var) == 13, "Expected 13, got %d\n", V_I2(&var)); 2653 + VariantClear(&var); 2654 + SysFreeString(str); 2655 + 2656 + /* An expression can also refer to a variable, function, class, etc previously set */ 2657 + V_VT(&var) = VT_I2; 2658 + str = a2bstr("If True Then foo = 42 Else foo = 0\n"); 2659 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, &var, NULL); 2660 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2661 + ok(V_VT(&var) == VT_EMPTY, "Expected VT_EMPTY, got %s\n", vt2a(&var)); 2662 + VariantClear(&var); 2663 + SysFreeString(str); 2664 + 2665 + str = a2bstr("foo\n\n"); 2666 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2667 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2668 + ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var)); 2669 + ok(V_I2(&var) == 42, "Expected 42, got %d\n", V_I2(&var)); 2670 + VariantClear(&var); 2671 + SysFreeString(str); 2672 + 2673 + str = a2bstr("foo : "); 2674 + SET_EXPECT(OnScriptError); 2675 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2676 + ok(FAILED(hres), "ParseScriptText did not fail: %08x\n", hres); 2677 + CHECK_CALLED(OnScriptError); 2678 + VariantClear(&var); 2679 + SysFreeString(str); 2680 + 2681 + str = a2bstr("\"foo is \" & CStr(foo) \n \n\n "); 2682 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2683 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2684 + ok(V_VT(&var) == VT_BSTR, "Expected VT_BSTR, got %s\n", vt2a(&var)); 2685 + ok(!strcmp_wa(V_BSTR(&var), "foo is 42"), "Wrong string, got %s\n", wine_dbgstr_w(V_BSTR(&var))); 2686 + VariantClear(&var); 2687 + SysFreeString(str); 2688 + 2689 + str = a2bstr("Function test(x)\n" 2690 + " test = x + 0.5\n" 2691 + "End Function\n"); 2692 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2693 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2694 + SysFreeString(str); 2695 + 2696 + str = a2bstr("test(4) * 3\n"); 2697 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2698 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2699 + ok(V_VT(&var) == VT_R8, "Expected VT_R8, got %s\n", vt2a(&var)); 2700 + ok(V_R8(&var) == 13.5, "Expected %lf, got %lf\n", 13.5, V_R8(&var)); 2701 + VariantClear(&var); 2702 + SysFreeString(str); 2703 + 2704 + str = a2bstr("Class C\n" 2705 + " Public x\n" 2706 + "End Class\n" 2707 + "Set obj = New C\n" 2708 + "obj.x = True\n"); 2709 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); 2710 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2711 + SysFreeString(str); 2712 + 2713 + str = a2bstr("obj.x"); 2714 + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL); 2715 + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); 2716 + ok(V_VT(&var) == VT_BOOL, "Expected VT_BOOL, got %s\n", vt2a(&var)); 2717 + ok(V_BOOL(&var) == VARIANT_TRUE, "Expected %x, got %x\n", VARIANT_TRUE, V_BOOL(&var)); 2718 + VariantClear(&var); 2719 + SysFreeString(str); 2720 + 2721 + IActiveScriptParse_Release(parser); 2722 + close_script(engine); 2723 + } 2724 + 2107 2725 static BSTR get_script_from_file(const char *filename) 2108 2726 { 2109 2727 DWORD size, len; ··· 2186 2804 2187 2805 ok(hres == S_OK, "parse_script failed: %08x\n", hres); 2188 2806 SysFreeString(str); 2807 + test_name = ""; 2189 2808 } 2190 2809 2191 2810 static void run_tests(void) ··· 2255 2874 parse_script_a("Option Explicit\nset test.setobj = testObj"); 2256 2875 CHECK_CALLED(global_setobj_i); 2257 2876 2877 + SET_EXPECT(OnScriptError); 2878 + hres = parse_script_ar("dim x\nx = testObj.rem"); 2879 + todo_wine 2880 + ok(hres == S_OK, "use of 'rem' as dot identifier failed: %x08\n", hres); 2881 + todo_wine 2882 + CHECK_NOT_CALLED(OnScriptError); 2883 + 2258 2884 SET_EXPECT(testobj_propget_d); 2259 2885 SET_EXPECT(testobj_propget_i); 2260 2886 parse_script_a("dim x\nx = testObj.propget"); ··· 2299 2925 SET_EXPECT(OnScriptError); 2300 2926 hres = parse_script_ar("<!--"); 2301 2927 ok(FAILED(hres), "script didn't fail\n"); 2302 - todo_wine CHECK_CALLED(OnScriptError); 2928 + CHECK_CALLED(OnScriptError); 2303 2929 2304 2930 SET_EXPECT(global_success_d); 2305 2931 SET_EXPECT(global_success_i); ··· 2325 2951 SET_EXPECT(OnScriptError); 2326 2952 hres = parse_script_ar("throwInt(&h80080008&)"); 2327 2953 ok(hres == 0x80080008, "hres = %08x\n", hres); 2328 - todo_wine CHECK_CALLED(OnScriptError); 2954 + CHECK_CALLED(OnScriptError); 2329 2955 2330 2956 /* DISP_E_BADINDEX */ 2331 2957 SET_EXPECT(OnScriptError); 2332 2958 hres = parse_script_ar("throwInt(&h8002000b&)"); 2333 2959 ok(hres == MAKE_VBSERROR(9), "hres = %08x\n", hres); 2334 - todo_wine CHECK_CALLED(OnScriptError); 2960 + CHECK_CALLED(OnScriptError); 2335 2961 2336 2962 SET_EXPECT(OnScriptError); 2337 2963 hres = parse_script_ar("throwInt(&h800a0009&)"); 2338 2964 ok(hres == MAKE_VBSERROR(9), "hres = %08x\n", hres); 2339 - todo_wine CHECK_CALLED(OnScriptError); 2965 + CHECK_CALLED(OnScriptError); 2340 2966 2341 2967 onerror_hres = S_OK; 2342 2968 SET_EXPECT(OnScriptError); 2343 2969 hres = parse_script_ar("throwInt(&h800a0009&)"); 2344 - todo_wine ok(hres == SCRIPT_E_REPORTED, "hres = %08x\n", hres); 2345 - todo_wine CHECK_CALLED(OnScriptError); 2970 + ok(hres == SCRIPT_E_REPORTED, "hres = %08x\n", hres); 2971 + CHECK_CALLED(OnScriptError); 2346 2972 2347 2973 /* E_NOTIMPL */ 2348 2974 SET_EXPECT(OnScriptError); 2349 2975 hres = parse_script_ar("throwInt(&h80004001&)"); 2350 2976 ok(hres == MAKE_VBSERROR(445), "hres = %08x\n", hres); 2351 - todo_wine CHECK_CALLED(OnScriptError); 2977 + CHECK_CALLED(OnScriptError); 2352 2978 2353 2979 onerror_hres = S_OK; 2354 2980 SET_EXPECT(OnScriptError); 2355 2981 hres = parse_script_ar("throwInt(&h80004001&)"); 2356 - todo_wine ok(hres == SCRIPT_E_REPORTED, "hres = %08x\n", hres); 2357 - todo_wine CHECK_CALLED(OnScriptError); 2982 + ok(hres == SCRIPT_E_REPORTED, "hres = %08x\n", hres); 2983 + CHECK_CALLED(OnScriptError); 2358 2984 2359 2985 SET_EXPECT(global_testoptionalarg_i); 2360 2986 parse_script_a("call testOptionalArg(1,,2)"); ··· 2392 3018 SET_EXPECT(OnScriptError); 2393 3019 hres = parse_script_ar("x = y(\"a\")"); 2394 3020 ok(FAILED(hres), "script didn't fail\n"); 2395 - todo_wine CHECK_CALLED(OnScriptError); 3021 + CHECK_CALLED(OnScriptError); 2396 3022 2397 3023 SET_EXPECT(global_success_d); 2398 3024 SET_EXPECT(global_success_i); 2399 3025 parse_script_a("' comment\r" 3026 + "x = _\r3\r" 3027 + "x = _\n3\r" 3028 + "x = _\r\n3\r" 2400 3029 "Sub testsub(arg)\r" 2401 3030 "If arg = 1 Then\r\r" 2402 3031 "Call reportSuccess()\n\n" ··· 2414 3043 test_procedures(); 2415 3044 test_gc(); 2416 3045 test_msgbox(); 3046 + test_isexpression(); 3047 + test_parse_errors(); 2417 3048 test_parse_context(); 3049 + test_callbacks(); 2418 3050 } 2419 3051 2420 3052 static BOOL check_vbscript(void)
+202 -4
modules/rostests/winetests/vbscript/vbscript.c
··· 84 84 DEFINE_EXPECT(OnStateChange_INITIALIZED); 85 85 DEFINE_EXPECT(OnEnterScript); 86 86 DEFINE_EXPECT(OnLeaveScript); 87 + DEFINE_EXPECT(GetItemInfo_global); 88 + DEFINE_EXPECT(GetItemInfo_visible); 89 + DEFINE_EXPECT(testCall); 87 90 88 91 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8); 89 92 DEFINE_GUID(CLSID_VBScriptRegExp, 0x3f4daca4, 0x160d, 0x11d2, 0xa8,0xe9, 0x00,0x10,0x4b,0x36,0x5c,0x9f); ··· 111 114 ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate); 112 115 } 113 116 117 + static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) 118 + { 119 + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) { 120 + *ppv = iface; 121 + IDispatch_AddRef(iface); 122 + return S_OK; 123 + } 124 + 125 + *ppv = NULL; 126 + return E_NOINTERFACE; 127 + } 128 + 129 + static ULONG global_named_item_ref, visible_named_item_ref; 130 + 131 + static ULONG WINAPI global_AddRef(IDispatch *iface) 132 + { 133 + return ++global_named_item_ref; 134 + } 135 + 136 + static ULONG WINAPI global_Release(IDispatch *iface) 137 + { 138 + return --global_named_item_ref; 139 + } 140 + 141 + static ULONG WINAPI visible_AddRef(IDispatch *iface) 142 + { 143 + return ++visible_named_item_ref; 144 + } 145 + 146 + static ULONG WINAPI visible_Release(IDispatch *iface) 147 + { 148 + return --visible_named_item_ref; 149 + } 150 + 151 + static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) 152 + { 153 + ok(0, "unexpected call\n"); 154 + return E_NOTIMPL; 155 + } 156 + 157 + static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) 158 + { 159 + return DISP_E_BADINDEX; 160 + } 161 + 162 + static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names, UINT name_cnt, 163 + LCID lcid, DISPID *ids) 164 + { 165 + ok(name_cnt == 1, "name_cnt = %u\n", name_cnt); 166 + ok(!wcscmp(names[0], L"testCall"), "names[0] = %s\n", wine_dbgstr_w(names[0])); 167 + *ids = 1; 168 + return S_OK; 169 + } 170 + 171 + static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID id, REFIID riid, LCID lcid, WORD flags, 172 + DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, UINT *err) 173 + { 174 + CHECK_EXPECT(testCall); 175 + ok(id == 1, "id = %u\n", id); 176 + ok(flags == DISPATCH_METHOD, "flags = %x\n", flags); 177 + ok(!dp->cArgs, "cArgs = %u\n", dp->cArgs); 178 + ok(!res, "res = %p\n", res); 179 + return S_OK; 180 + } 181 + 182 + static const IDispatchVtbl global_named_item_vtbl = { 183 + Dispatch_QueryInterface, 184 + global_AddRef, 185 + global_Release, 186 + Dispatch_GetTypeInfoCount, 187 + Dispatch_GetTypeInfo, 188 + Dispatch_GetIDsOfNames, 189 + Dispatch_Invoke 190 + }; 191 + 192 + static IDispatch global_named_item = { &global_named_item_vtbl }; 193 + 194 + static const IDispatchVtbl visible_named_item_vtbl = { 195 + Dispatch_QueryInterface, 196 + visible_AddRef, 197 + visible_Release, 198 + Dispatch_GetTypeInfoCount, 199 + Dispatch_GetTypeInfo, 200 + Dispatch_GetIDsOfNames, 201 + Dispatch_Invoke 202 + }; 203 + 204 + static IDispatch visible_named_item = { &visible_named_item_vtbl }; 205 + 114 206 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv) 115 207 { 116 208 *ppv = NULL; ··· 142 234 return E_NOTIMPL; 143 235 } 144 236 145 - static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, 146 - DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) 237 + static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR name, 238 + DWORD return_mask, IUnknown **item_unk, ITypeInfo **item_ti) 147 239 { 148 - ok(0, "unexpected call\n"); 240 + ok(return_mask == SCRIPTINFO_IUNKNOWN, "return_mask = %x\n", return_mask); 241 + if(!wcscmp(name, L"globalItem")) { 242 + CHECK_EXPECT(GetItemInfo_global); 243 + IDispatch_AddRef(&global_named_item); 244 + *item_unk = (IUnknown*)&global_named_item; 245 + return S_OK; 246 + } 247 + if(!wcscmp(name, L"visibleItem")) { 248 + CHECK_EXPECT(GetItemInfo_visible); 249 + IDispatch_AddRef(&visible_named_item); 250 + *item_unk = (IUnknown*)&visible_named_item; 251 + return S_OK; 252 + } 253 + ok(0, "unexpected call %s\n", wine_dbgstr_w(name)); 149 254 return E_NOTIMPL; 150 255 } 151 256 ··· 392 497 393 498 static void test_scriptdisp(void) 394 499 { 500 + IDispatchEx *script_disp, *script_disp2; 395 501 IActiveScriptParse *parser; 396 - IDispatchEx *script_disp; 397 502 IActiveScript *vbscript; 398 503 DISPID id, id2; 399 504 DISPPARAMS dp; ··· 415 520 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); 416 521 CHECK_CALLED(GetLCID); 417 522 523 + script_disp2 = get_script_dispatch(vbscript); 524 + 418 525 test_state(vbscript, SCRIPTSTATE_UNINITIALIZED); 419 526 420 527 SET_EXPECT(OnStateChange_INITIALIZED); ··· 432 539 test_state(vbscript, SCRIPTSTATE_CONNECTED); 433 540 434 541 script_disp = get_script_dispatch(vbscript); 542 + ok(script_disp == script_disp2, "script_disp != script_disp2\n"); 543 + IDispatchEx_Release(script_disp2); 435 544 436 545 id = 100; 437 546 get_disp_id(script_disp, "LCase", DISP_E_UNKNOWNNAME, &id); ··· 529 638 530 639 test_state(vbscript, SCRIPTSTATE_UNINITIALIZED); 531 640 test_safety(vbscript); 641 + test_no_script_dispatch(vbscript); 532 642 533 643 SET_EXPECT(GetLCID); 534 644 hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite); ··· 599 709 600 710 hres = IActiveScriptParse_InitNew(parse); 601 711 ok(hres == S_OK, "InitNew failed: %08x\n", hres); 712 + 713 + test_no_script_dispatch(script); 602 714 603 715 SET_EXPECT(GetLCID); 604 716 SET_EXPECT(OnStateChange_INITIALIZED); ··· 684 796 CHECK_CALLED(OnStateChange_CLOSED); 685 797 686 798 test_state(script, SCRIPTSTATE_CLOSED); 799 + 800 + hres = IActiveScriptParse_InitNew(parse); 801 + ok(hres == E_UNEXPECTED, "InitNew failed: %08x\n", hres); 687 802 688 803 IActiveScriptParse_Release(parse); 689 804 ··· 794 909 ok(!ref, "ref = %d\n", ref); 795 910 } 796 911 912 + static void test_named_items(void) 913 + { 914 + IActiveScriptParse *parse; 915 + IActiveScript *script; 916 + ULONG ref; 917 + HRESULT hres; 918 + 919 + script = create_vbscript(); 920 + 921 + hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); 922 + ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); 923 + 924 + test_state(script, SCRIPTSTATE_UNINITIALIZED); 925 + 926 + hres = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE); 927 + ok(hres == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hres); 928 + hres = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS); 929 + ok(hres == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hres); 930 + 931 + SET_EXPECT(GetLCID); 932 + hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); 933 + ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); 934 + CHECK_CALLED(GetLCID); 935 + 936 + SET_EXPECT(GetItemInfo_global); 937 + hres = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS); 938 + ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); 939 + CHECK_CALLED(GetItemInfo_global); 940 + 941 + hres = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE); 942 + ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); 943 + 944 + ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref); 945 + ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref); 946 + 947 + SET_EXPECT(OnStateChange_INITIALIZED); 948 + hres = IActiveScriptParse_InitNew(parse); 949 + ok(hres == S_OK, "InitNew failed: %08x\n", hres); 950 + CHECK_CALLED(OnStateChange_INITIALIZED); 951 + 952 + SET_EXPECT(OnStateChange_CONNECTED); 953 + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED); 954 + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); 955 + CHECK_CALLED(OnStateChange_CONNECTED); 956 + 957 + SET_EXPECT(testCall); 958 + parse_script(parse, "testCall\n"); 959 + CHECK_CALLED(testCall); 960 + 961 + SET_EXPECT(GetItemInfo_visible); 962 + SET_EXPECT(testCall); 963 + parse_script(parse, "visibleItem.testCall\n"); 964 + CHECK_CALLED(GetItemInfo_visible); 965 + CHECK_CALLED(testCall); 966 + 967 + ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref); 968 + ok(visible_named_item_ref == 1, "visible_named_item_ref = %u\n", visible_named_item_ref); 969 + 970 + SET_EXPECT(testCall); 971 + parse_script(parse, "visibleItem.testCall\n"); 972 + CHECK_CALLED(testCall); 973 + 974 + SET_EXPECT(OnStateChange_DISCONNECTED); 975 + SET_EXPECT(OnStateChange_INITIALIZED); 976 + SET_EXPECT(OnStateChange_CLOSED); 977 + hres = IActiveScript_Close(script); 978 + ok(hres == S_OK, "Close failed: %08x\n", hres); 979 + CHECK_CALLED(OnStateChange_DISCONNECTED); 980 + CHECK_CALLED(OnStateChange_INITIALIZED); 981 + CHECK_CALLED(OnStateChange_CLOSED); 982 + 983 + ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref); 984 + ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref); 985 + 986 + test_state(script, SCRIPTSTATE_CLOSED); 987 + 988 + IActiveScriptParse_Release(parse); 989 + 990 + ref = IActiveScript_Release(script); 991 + ok(!ref, "ref = %d\n", ref); 992 + } 993 + 797 994 static void test_RegExp(void) 798 995 { 799 996 IRegExp2 *regexp; ··· 957 1154 test_vbscript_release(); 958 1155 test_vbscript_simplecreate(); 959 1156 test_vbscript_initializing(); 1157 + test_named_items(); 960 1158 test_scriptdisp(); 961 1159 test_RegExp(); 962 1160 }else {