jscript: Added invoke version 2 tests.
This commit is contained in:
parent
86e7beae82
commit
fded8dc017
|
@ -667,7 +667,7 @@ ok(arr === arr.valueOf(), "arr !== arr.valueOf");
|
|||
|
||||
arr = [1,2,3];
|
||||
tmp = arr.unshift(0);
|
||||
ok(tmp === undefined, "[1,2,3].unshift(0) returned " +tmp);
|
||||
ok(tmp === (invokeVersion < 2 ? undefined : 4), "[1,2,3].unshift(0) returned " +tmp);
|
||||
ok(arr.length === 4, "arr.length = " + arr.length);
|
||||
ok(arr.toString() === "0,1,2,3", "arr.toString() = " + arr.toString());
|
||||
|
||||
|
@ -675,13 +675,13 @@ arr = new Array(3);
|
|||
arr[0] = 1;
|
||||
arr[2] = 3;
|
||||
tmp = arr.unshift(-1,0);
|
||||
ok(tmp === undefined, "unshift returned " +tmp);
|
||||
ok(tmp === (invokeVersion < 2 ? undefined : 5), "unshift returned " +tmp);
|
||||
ok(arr.length === 5, "arr.length = " + arr.length);
|
||||
ok(arr.toString() === "-1,0,1,,3", "arr.toString() = " + arr.toString());
|
||||
|
||||
arr = [1,2,3];
|
||||
tmp = arr.unshift();
|
||||
ok(tmp === undefined, "unshift returned " +tmp);
|
||||
ok(tmp === (invokeVersion < 2 ? undefined : 3), "unshift returned " +tmp);
|
||||
ok(arr.length === 3, "arr.length = " + arr.length);
|
||||
ok(arr.toString() === "1,2,3", "arr.toString() = " + arr.toString());
|
||||
|
||||
|
@ -690,7 +690,7 @@ arr.length = 2;
|
|||
arr[0] = 1;
|
||||
arr[1] = 2;
|
||||
tmp = Array.prototype.unshift.call(arr, 0);
|
||||
ok(tmp === undefined, "unshift returned " +tmp);
|
||||
ok(tmp === (invokeVersion < 2 ? undefined : 3), "unshift returned " +tmp);
|
||||
ok(arr.length === 3, "arr.length = " + arr.length);
|
||||
ok(arr[0] === 0 && arr[1] === 1 && arr[2] === 2, "unexpected array");
|
||||
|
||||
|
@ -1587,7 +1587,7 @@ ok(Error.prototype.name === "Error", "Error.prototype.name = " + Error.prototype
|
|||
ok(err.name === "Error", "err.name = " + err.name);
|
||||
EvalError.prototype.message = "test";
|
||||
ok(err.toString !== Object.prototype.toString, "err.toString === Object.prototype.toString");
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "Error"), "err.toString() = " + err.toString());
|
||||
err = new EvalError();
|
||||
ok(EvalError.prototype.name === "EvalError", "EvalError.prototype.name = " + EvalError.prototype.name);
|
||||
ok(err.name === "EvalError", "err.name = " + err.name);
|
||||
|
@ -1595,31 +1595,32 @@ ok(err.toString === Error.prototype.toString, "err.toString !== Error.prototype.
|
|||
ok(err.message === "", "err.message != ''");
|
||||
err.message = date;
|
||||
ok(err.message === date, "err.message != date");
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "EvalError: Fri Aug 17 22:50:50 UTC+0200 85"),
|
||||
"err.toString() = " + err.toString());
|
||||
ok(err.toString !== Object.prototype.toString, "err.toString === Object.prototype.toString");
|
||||
err = new RangeError();
|
||||
ok(RangeError.prototype.name === "RangeError", "RangeError.prototype.name = " + RangeError.prototype.name);
|
||||
ok(err.name === "RangeError", "err.name = " + err.name);
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "RangeError"), "err.toString() = " + err.toString());
|
||||
err = new ReferenceError();
|
||||
ok(ReferenceError.prototype.name === "ReferenceError", "ReferenceError.prototype.name = " + ReferenceError.prototype.name);
|
||||
ok(err.name === "ReferenceError", "err.name = " + err.name);
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "ReferenceError"), "err.toString() = " + err.toString());
|
||||
err = new SyntaxError();
|
||||
ok(SyntaxError.prototype.name === "SyntaxError", "SyntaxError.prototype.name = " + SyntaxError.prototype.name);
|
||||
ok(err.name === "SyntaxError", "err.name = " + err.name);
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "SyntaxError"), "err.toString() = " + err.toString());
|
||||
err = new TypeError();
|
||||
ok(TypeError.prototype.name === "TypeError", "TypeError.prototype.name = " + TypeError.prototype.name);
|
||||
ok(err.name === "TypeError", "err.name = " + err.name);
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "TypeError"), "err.toString() = " + err.toString());
|
||||
err = new URIError();
|
||||
ok(URIError.prototype.name === "URIError", "URIError.prototype.name = " + URIError.prototype.name);
|
||||
ok(err.name === "URIError", "err.name = " + err.name);
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "URIError"), "err.toString() = " + err.toString());
|
||||
err = new Error("message");
|
||||
ok(err.message === "message", "err.message !== 'message'");
|
||||
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
|
||||
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "Error: message"), "err.toString() = " + err.toString());
|
||||
err = new Error(123);
|
||||
ok(err.number === 123, "err.number = " + err.number);
|
||||
err = new Error(0, "message");
|
||||
|
@ -1627,6 +1628,35 @@ ok(err.number === 0, "err.number = " + err.number);
|
|||
ok(err.message === "message", "err.message = " + err.message);
|
||||
ok(err.description === "message", "err.description = " + err.description);
|
||||
|
||||
tmp = new Object();
|
||||
tmp.toString = function() { return "test"; };
|
||||
|
||||
tmp = Error.prototype.toString.call(tmp);
|
||||
ok(tmp === "[object Error]", "Error.prototype.toString.call(tmp) = " + tmp);
|
||||
|
||||
err = new Error();
|
||||
err.name = null;
|
||||
ok(err.name === null, "err.name = " + err.name + " expected null");
|
||||
if(invokeVersion >= 2)
|
||||
ok(err.toString() === "null", "err.toString() = " + err.toString());
|
||||
|
||||
err = new Error();
|
||||
err.message = false;
|
||||
ok(err.message === false, "err.message = " + err.message + " expected false");
|
||||
if(invokeVersion >= 2)
|
||||
ok(err.toString() === "Error: false", "err.toString() = " + err.toString());
|
||||
|
||||
err = new Error();
|
||||
err.message = new Object();
|
||||
err.message.toString = function() { return ""; };
|
||||
if(invokeVersion >= 2)
|
||||
ok(err.toString() === "Error", "err.toString() = " + err.toString());
|
||||
|
||||
err = new Error();
|
||||
err.message = undefined;
|
||||
if(invokeVersion >= 2)
|
||||
ok(err.toString() === "Error", "err.toString() = " + err.toString());
|
||||
|
||||
function exception_test(func, type, number) {
|
||||
ret = "";
|
||||
num = "";
|
||||
|
|
|
@ -81,6 +81,7 @@ DEFINE_EXPECT(GetItemInfo_testVal);
|
|||
#define DISPID_GLOBAL_NULL_DISP 0x1008
|
||||
#define DISPID_GLOBAL_TESTTHIS 0x1009
|
||||
#define DISPID_GLOBAL_TESTTHIS2 0x100a
|
||||
#define DISPID_GLOBAL_INVOKEVERSION 0x100b
|
||||
|
||||
#define DISPID_TESTOBJ_PROP 0x2000
|
||||
|
||||
|
@ -92,6 +93,7 @@ static const CHAR test_valA[] = "testVal";
|
|||
static BOOL strict_dispid_check;
|
||||
static const char *test_name = "(null)";
|
||||
static IDispatch *script_disp;
|
||||
static int invoke_version;
|
||||
|
||||
static BSTR a2bstr(const char *str)
|
||||
{
|
||||
|
@ -112,6 +114,13 @@ static int strcmp_wa(LPCWSTR strw, const char *stra)
|
|||
return lstrcmpA(buf, stra);
|
||||
}
|
||||
|
||||
#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
|
||||
static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
|
||||
{
|
||||
expect |= invoke_version << 28;
|
||||
ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
|
||||
{
|
||||
*ppv = NULL;
|
||||
|
@ -205,13 +214,13 @@ static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
|
|||
{
|
||||
if(!strcmp_wa(bstrName, "prop")) {
|
||||
CHECK_EXPECT(testobj_prop_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_TESTOBJ_PROP;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "noprop")) {
|
||||
CHECK_EXPECT(testobj_noprop_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
return DISP_E_UNKNOWNNAME;
|
||||
}
|
||||
|
||||
|
@ -250,7 +259,7 @@ static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrNa
|
|||
CHECK_EXPECT(testobj_delete);
|
||||
|
||||
ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -277,40 +286,40 @@ static IDispatchEx testObj = { &testObjVtbl };
|
|||
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
|
||||
{
|
||||
if(!strcmp_wa(bstrName, "ok")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_OK;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "trace")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TRACE;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "reportSuccess")) {
|
||||
CHECK_EXPECT(global_success_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_REPORTSUCCESS;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "testPropGet")) {
|
||||
CHECK_EXPECT(global_propget_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TESTPROPGET;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "testPropPut")) {
|
||||
CHECK_EXPECT(global_propput_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TESTPROPPUT;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "getVT")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_GETVT;
|
||||
return S_OK;
|
||||
}
|
||||
if(!strcmp_wa(bstrName, "testObj")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TESTOBJ;
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -324,22 +333,28 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
|
|||
}
|
||||
if(!strcmp_wa(bstrName, "notExists")) {
|
||||
CHECK_EXPECT(global_notexists_d);
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
return DISP_E_UNKNOWNNAME;
|
||||
}
|
||||
|
||||
if(!strcmp_wa(bstrName, "testThis")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TESTTHIS;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if(!strcmp_wa(bstrName, "testThis2")) {
|
||||
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_TESTTHIS2;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if(!strcmp_wa(bstrName, "invokeVersion")) {
|
||||
test_grfdex(grfdex, fdexNameCaseSensitive);
|
||||
*pid = DISPID_GLOBAL_INVOKEVERSION;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if(strict_dispid_check)
|
||||
ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
|
||||
return DISP_E_UNKNOWNNAME;
|
||||
|
@ -536,6 +551,23 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
|
|||
ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
|
||||
|
||||
return S_OK;
|
||||
|
||||
case DISPID_GLOBAL_INVOKEVERSION:
|
||||
ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
|
||||
ok(pdp != NULL, "pdp == NULL\n");
|
||||
ok(!pdp->rgvarg, "rgvarg != NULL\n");
|
||||
ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
|
||||
ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
|
||||
ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
|
||||
ok(pvarRes != NULL, "pvarRes == NULL\n");
|
||||
ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
|
||||
ok(pei != NULL, "pei == NULL\n");
|
||||
|
||||
V_VT(pvarRes) = VT_I4;
|
||||
V_I4(pvarRes) = invoke_version;
|
||||
|
||||
return S_OK;
|
||||
|
||||
}
|
||||
|
||||
ok(0, "unexpected call %x\n", id);
|
||||
|
@ -657,15 +689,40 @@ static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
|
|||
|
||||
static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
|
||||
|
||||
static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
|
||||
{
|
||||
IActiveScriptProperty *script_prop;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
|
||||
(void**)&script_prop);
|
||||
ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
|
||||
|
||||
hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
|
||||
IActiveScriptProperty_Release(script_prop);
|
||||
|
||||
return hres;
|
||||
}
|
||||
|
||||
static IActiveScript *create_script(void)
|
||||
{
|
||||
IActiveScript *script;
|
||||
VARIANT v;
|
||||
HRESULT hres;
|
||||
|
||||
hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
||||
&IID_IActiveScript, (void**)&script);
|
||||
ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
|
||||
|
||||
V_VT(&v) = VT_I4;
|
||||
V_I4(&v) = invoke_version;
|
||||
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
|
||||
ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
|
||||
if(invoke_version && FAILED(hres)) {
|
||||
IActiveScript_Release(script);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return script;
|
||||
}
|
||||
|
||||
|
@ -912,6 +969,17 @@ static void run_tests(void)
|
|||
{
|
||||
HRESULT hres;
|
||||
|
||||
if(invoke_version) {
|
||||
IActiveScript *script;
|
||||
|
||||
script = create_script();
|
||||
if(!script) {
|
||||
win_skip("Could not create script\n");
|
||||
return;
|
||||
}
|
||||
IActiveScript_Release(script);
|
||||
}
|
||||
|
||||
strict_dispid_check = TRUE;
|
||||
|
||||
parse_script_a("");
|
||||
|
@ -1019,10 +1087,17 @@ START_TEST(run)
|
|||
|
||||
CoInitialize(NULL);
|
||||
|
||||
if(argc > 2)
|
||||
if(argc > 2) {
|
||||
run_from_file(argv[2]);
|
||||
else
|
||||
}else {
|
||||
trace("invoke version 0\n");
|
||||
invoke_version = 0;
|
||||
run_tests();
|
||||
|
||||
trace("invoke version 2\n");
|
||||
invoke_version = 2;
|
||||
run_tests();
|
||||
}
|
||||
|
||||
CoUninitialize();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue