Jacek Caban : vbscript: Added more releasing tests.

Alexandre Julliard julliard at winehq.org
Fri Oct 14 14:14:49 CDT 2011


Module: wine
Branch: master
Commit: 01c4fed7b42f72983c3a6d0b1e28c21dd3d91cae
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=01c4fed7b42f72983c3a6d0b1e28c21dd3d91cae

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct 14 16:22:33 2011 +0200

vbscript: Added more releasing tests.

---

 dlls/vbscript/tests/run.c |  132 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 131 insertions(+), 1 deletions(-)

diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 4fbf689..367ffea 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -74,6 +74,7 @@ DEFINE_EXPECT(testobj_propput_i);
 #define DISPID_GLOBAL_TESTOBJ       1006
 #define DISPID_GLOBAL_ISNULLDISP    1007
 #define DISPID_GLOBAL_TESTDISP      1008
+#define DISPID_GLOBAL_REFOBJ        1009
 
 #define DISPID_TESTOBJ_PROPGET      2000
 #define DISPID_TESTOBJ_PROPPUT      2001
@@ -342,6 +343,7 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
     else
         return E_NOINTERFACE;
 
+    IUnknown_AddRef((IUnknown*)*ppv);
     return S_OK;
 }
 
@@ -420,6 +422,19 @@ static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown
     return E_NOTIMPL;
 }
 
+static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+        VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
 {
     if(!strcmp_wa(bstrName, "propget")) {
@@ -500,6 +515,38 @@ static IDispatchExVtbl testObjVtbl = {
 
 static IDispatchEx testObj = { &testObjVtbl };
 
+static ULONG refobj_ref;
+
+static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
+{
+    return ++refobj_ref;
+}
+
+static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
+{
+    return --refobj_ref;
+}
+
+static IDispatchExVtbl RefObjVtbl = {
+    DispatchEx_QueryInterface,
+    RefObj_AddRef,
+    RefObj_Release,
+    DispatchEx_GetTypeInfoCount,
+    DispatchEx_GetTypeInfo,
+    DispatchEx_GetIDsOfNames,
+    DispatchEx_Invoke,
+    DispatchEx_GetDispID,
+    DispatchEx_InvokeEx,
+    DispatchEx_DeleteMemberByName,
+    DispatchEx_DeleteMemberByDispID,
+    DispatchEx_GetMemberProperties,
+    DispatchEx_GetMemberName,
+    DispatchEx_GetNextDispID,
+    DispatchEx_GetNameSpaceParent
+};
+
+static IDispatchEx RefObj = { &RefObjVtbl };
+
 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
 {
     if(!strcmp_wa(bstrName, "ok")) {
@@ -549,6 +596,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         *pid = DISPID_GLOBAL_TESTDISP;
         return S_OK;
     }
+    if(!strcmp_wa(bstrName, "RefObj")) {
+        test_grfdex(grfdex, fdexNameCaseInsensitive);
+        *pid = DISPID_GLOBAL_REFOBJ;
+        return S_OK;
+    }
 
     if(strict_dispid_check && strcmp_wa(bstrName, "x"))
         ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
@@ -679,6 +731,22 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
         return S_OK;
 
+    case DISPID_GLOBAL_REFOBJ:
+        ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "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(pei != NULL, "pei == NULL\n");
+
+        IDispatchEx_AddRef(&RefObj);
+        V_VT(pvarRes) = VT_DISPATCH;
+        V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
+        return S_OK;
+
     case DISPID_GLOBAL_ISNULLDISP: {
         VARIANT *v;
 
@@ -850,6 +918,7 @@ static HRESULT parse_script(DWORD flags, BSTR script_str)
     IActiveScriptParse *parser;
     IActiveScript *engine;
     IDispatch *script_disp;
+    LONG ref;
     HRESULT hres;
 
     engine = create_script();
@@ -888,8 +957,9 @@ static HRESULT parse_script(DWORD flags, BSTR script_str)
 
     IDispatch_Release(script_disp);
     IActiveScript_Release(engine);
-    IUnknown_Release(parser);
 
+    ref = IUnknown_Release(parser);
+    ok(!ref, "ref=%d\n", ref);
     return hres;
 }
 
@@ -964,6 +1034,63 @@ static void test_gc(void)
     IUnknown_Release(parser);
 }
 
+static HRESULT test_global_vars_ref(BOOL use_close)
+{
+    IActiveScriptParse *parser;
+    IActiveScript *engine;
+    BSTR script_str;
+    LONG ref;
+    HRESULT hres;
+
+    engine = create_script();
+    if(!engine)
+        return S_OK;
+
+    hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
+    ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
+    if (FAILED(hres))
+    {
+        IActiveScript_Release(engine);
+        return hres;
+    }
+
+    hres = IActiveScriptParse64_InitNew(parser);
+    ok(hres == S_OK, "InitNew failed: %08x\n", hres);
+
+    hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
+    ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
+
+    hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
+    ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+
+    hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
+
+    refobj_ref = 0;
+
+    script_str = a2bstr("Dim x\nset x = RefObj\n");
+    hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+    SysFreeString(script_str);
+
+    ok(refobj_ref, "refobj_ref = 0\n");
+
+    if(use_close) {
+        hres = IActiveScript_Close(engine);
+        ok(hres == S_OK, "Close failed: %08x\n", hres);
+    }else {
+        hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
+        ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
+    }
+
+    ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
+
+    IActiveScript_Release(engine);
+
+    ref = IUnknown_Release(parser);
+    ok(!ref, "ref=%d\n", ref);
+    return hres;
+}
+
 static BSTR get_script_from_file(const char *filename)
 {
     DWORD size, len;
@@ -1099,6 +1226,9 @@ static void run_tests(void)
 
     parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
 
+    test_global_vars_ref(TRUE);
+    test_global_vars_ref(FALSE);
+
     strict_dispid_check = FALSE;
 
     parse_script_a("Sub testsub\n"




More information about the wine-cvs mailing list