Piotr Caban : jscript: Added invocation flag tests.
Alexandre Julliard
julliard at winehq.org
Wed Oct 20 13:24:36 CDT 2010
Module: wine
Branch: master
Commit: ebb46f3fd09a9763702f9eeb897e1bd5591dd299
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ebb46f3fd09a9763702f9eeb897e1bd5591dd299
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Oct 19 23:14:35 2010 +0200
jscript: Added invocation flag tests.
---
dlls/jscript/object.c | 5 ++-
dlls/jscript/tests/run.c | 130 +++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 126 insertions(+), 9 deletions(-)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index eb1d435..4aa4ce8 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -210,7 +210,10 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
if(FAILED(hres))
return hres;
- var_set_jsdisp(retv, obj);
+ if(retv)
+ var_set_jsdisp(retv, obj);
+ else
+ jsdisp_release(obj);
break;
}
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 5c1a9f6..61e371c 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -70,6 +70,7 @@ DEFINE_EXPECT(testobj_prop_d);
DEFINE_EXPECT(testobj_noprop_d);
DEFINE_EXPECT(GetItemInfo_testVal);
DEFINE_EXPECT(ActiveScriptSite_OnScriptError);
+DEFINE_EXPECT(invoke_func);
#define DISPID_GLOBAL_TESTPROPGET 0x1000
#define DISPID_GLOBAL_TESTPROPPUT 0x1001
@@ -83,7 +84,9 @@ DEFINE_EXPECT(ActiveScriptSite_OnScriptError);
#define DISPID_GLOBAL_TESTTHIS 0x1009
#define DISPID_GLOBAL_TESTTHIS2 0x100a
#define DISPID_GLOBAL_INVOKEVERSION 0x100b
-#define DISPID_TEST_CREATEARRAY 0x100c
+#define DISPID_GLOBAL_CREATEARRAY 0x100c
+#define DISPID_GLOBAL_PROPGETFUNC 0x100d
+#define DISPID_GLOBAL_OBJECT_FLAG 0x100e
#define DISPID_TESTOBJ_PROP 0x2000
@@ -236,18 +239,29 @@ static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
{
switch(id) {
case DISPID_VALUE:
- CHECK_EXPECT(testobj_value);
-
- 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");
+ switch(wFlags) {
+ case INVOKE_PROPERTYGET:
+ CHECK_EXPECT(testobj_value);
+ ok(!pdp->rgvarg, "rgvarg != NULL\n");
+ ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
+ break;
+ case INVOKE_FUNC:
+ ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
+ break;
+ case INVOKE_FUNC|INVOKE_PROPERTYGET:
+ ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
+ break;
+ default:
+ ok(0, "invalid flag (%x)\n", wFlags);
+ }
+
V_VT(pvarRes) = VT_I4;
V_I4(pvarRes) = 1;
return S_OK;
@@ -359,7 +373,17 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
}
if(!strcmp_wa(bstrName, "createArray")) {
test_grfdex(grfdex, fdexNameCaseSensitive);
- *pid = DISPID_TEST_CREATEARRAY;
+ *pid = DISPID_GLOBAL_CREATEARRAY;
+ return S_OK;
+ }
+ if(!strcmp_wa(bstrName, "propGetFunc")) {
+ test_grfdex(grfdex, fdexNameCaseSensitive);
+ *pid = DISPID_GLOBAL_PROPGETFUNC;
+ return S_OK;
+ }
+ if(!strcmp_wa(bstrName, "objectFlag")) {
+ test_grfdex(grfdex, fdexNameCaseSensitive);
+ *pid = DISPID_GLOBAL_OBJECT_FLAG;
return S_OK;
}
@@ -579,7 +603,7 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
return S_OK;
- case DISPID_TEST_CREATEARRAY: {
+ case DISPID_GLOBAL_CREATEARRAY: {
SAFEARRAYBOUND bound[2];
VARIANT *data;
int i,j;
@@ -614,6 +638,78 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
return S_OK;
}
+
+ case DISPID_GLOBAL_PROPGETFUNC:
+ switch(wFlags) {
+ case INVOKE_FUNC:
+ CHECK_EXPECT(invoke_func);
+ break;
+ case INVOKE_FUNC|INVOKE_PROPERTYGET:
+ ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
+ ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
+ break;
+ default:
+ ok(0, "invalid flag (%x)\n", wFlags);
+ }
+
+ ok(pdp != NULL, "pdp == NULL\n");
+ ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+ ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+ ok(pei != NULL, "pei == NULL\n");
+
+ if(pvarRes) {
+ ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+ V_VT(pvarRes) = VT_I4;
+ V_I4(pvarRes) = pdp->cArgs;
+ }
+
+ return S_OK;
+
+ case DISPID_GLOBAL_OBJECT_FLAG: {
+ IDispatchEx *dispex;
+ BSTR str;
+ HRESULT hres;
+
+ hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
+ ok(hres == S_OK, "hres = %x\n", hres);
+
+ str = a2bstr("Object");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
+ SysFreeString(str);
+ ok(hres == S_OK, "hres = %x\n", hres);
+
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+
+ V_VT(pvarRes) = VT_EMPTY;
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+ ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+ VariantClear(pvarRes);
+
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+
+ V_VT(pvarRes) = VT_EMPTY;
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+ ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+ VariantClear(pvarRes);
+
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+
+ V_VT(pvarRes) = VT_EMPTY;
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
+ ok(hres == E_INVALIDARG, "hres = %x\n", hres);
+
+ V_VT(pvarRes) = VT_EMPTY;
+ hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+ ok(hres == S_OK, "hres = %x\n", hres);
+ ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+ IDispatchEx_Release(dispex);
+ return S_OK;
+ }
}
ok(0, "unexpected call %x\n", id);
@@ -1270,6 +1366,24 @@ static void run_tests(void)
parse_script_a("(function () { var testPropGet; })();");
parse_script_a("(function () { eval('var testPropGet;'); })();");
+ SET_EXPECT(invoke_func);
+ parse_script_a("ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
+ CHECK_CALLED(invoke_func);
+ parse_script_a("ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
+ parse_script_a("ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
+ SET_EXPECT(invoke_func);
+ parse_script_a("ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
+ CHECK_CALLED(invoke_func);
+ parse_script_a("ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
+ SET_EXPECT(invoke_func);
+ parse_script_a("propGetFunc(1);");
+ CHECK_CALLED(invoke_func);
+
+ parse_script_a("objectFlag(1).toString();");
+
+ parse_script_a("(function() { var tmp = (function () { return testObj; })()(1);})();");
+ parse_script_a("(function() { var tmp = (function () { return testObj; })()();})();");
+
parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
SET_EXPECT(testobj_prop_d);
More information about the wine-cvs
mailing list