From fded8dc017a6571344fd6d31737d4e9ba7ffa029 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 19 Oct 2009 20:41:32 +0200 Subject: [PATCH] jscript: Added invoke version 2 tests. --- dlls/jscript/tests/api.js | 54 +++++++++++++++----- dlls/jscript/tests/run.c | 105 ++++++++++++++++++++++++++++++++------ 2 files changed, 132 insertions(+), 27 deletions(-) diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index d7626f16238..cc13f033c8f 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -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 = ""; diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index cf34b2f1abd..72640a6e7a1 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -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(); }