Jacek Caban : vbscript: Added more uninitialization tests and fixes.

Alexandre Julliard julliard at winehq.org
Mon Sep 5 13:26:21 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep  5 11:14:29 2011 +0200

vbscript: Added more uninitialization tests and fixes.

---

 dlls/vbscript/tests/vbscript.c |  127 ++++++++++++++++++++++++++++++++++++++-
 dlls/vbscript/vbscript.c       |   24 +++++---
 2 files changed, 138 insertions(+), 13 deletions(-)

diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c
index 9dd3f0f..ab5c8af 100644
--- a/dlls/vbscript/tests/vbscript.c
+++ b/dlls/vbscript/tests/vbscript.c
@@ -23,6 +23,7 @@
 #include <ole2.h>
 #include <activscp.h>
 #include <objsafe.h>
+#include <dispex.h>
 
 #include "wine/test.h"
 
@@ -282,6 +283,24 @@ static void test_safety(IActiveScript *script)
     IObjectSafety_Release(safety);
 }
 
+static IDispatchEx *get_script_dispatch(IActiveScript *script)
+{
+    IDispatchEx *dispex;
+    IDispatch *disp;
+    HRESULT hres;
+
+    disp = (void*)0xdeadbeef;
+    hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
+    ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
+    if(FAILED(hres))
+        return NULL;
+
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    IDispatch_Release(disp);
+    ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
+    return dispex;
+}
+
 static void test_no_script_dispatch(IActiveScript *script)
 {
     IDispatch *disp;
@@ -349,9 +368,7 @@ static void test_vbscript(void)
     SET_EXPECT(OnStateChange_CLOSED);
     hres = IActiveScript_Close(vbscript);
     ok(hres == S_OK, "Close failed: %08x\n", hres);
-    todo_wine
     CHECK_CALLED(OnStateChange_DISCONNECTED);
-    todo_wine
     CHECK_CALLED(OnStateChange_INITIALIZED);
     CHECK_CALLED(OnStateChange_CLOSED);
 
@@ -364,6 +381,106 @@ static void test_vbscript(void)
     ok(!ref, "ref = %d\n", ref);
 }
 
+static void test_vbscript_uninitializing(void)
+{
+    IActiveScriptParse *parse;
+    IActiveScript *script;
+    IDispatchEx *dispex;
+    ULONG ref;
+    HRESULT hres;
+
+    static const WCHAR script_textW[] =
+        {'F','u','n','c','t','i','o','n',' ','f','\n','E','n','d',' ','F','u','n','c','t','i','o','n','\n',0};
+
+    script = create_vbscript();
+
+    hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
+    ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    hres = IActiveScriptParse64_InitNew(parse);
+    ok(hres == S_OK, "InitNew failed: %08x\n", hres);
+
+    SET_EXPECT(GetLCID);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
+    CHECK_CALLED(GetLCID);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+
+    test_state(script, SCRIPTSTATE_INITIALIZED);
+
+    hres = IActiveScriptParse64_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL);
+    todo_wine
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+
+    hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
+
+    SET_EXPECT(OnStateChange_UNINITIALIZED);
+    hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
+    CHECK_CALLED(OnStateChange_UNINITIALIZED);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
+
+    SET_EXPECT(GetLCID);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
+    CHECK_CALLED(GetLCID);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+
+    SET_EXPECT(OnStateChange_CONNECTED);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
+    CHECK_CALLED(OnStateChange_CONNECTED);
+    todo_wine
+    CHECK_CALLED(OnEnterScript);
+    todo_wine
+    CHECK_CALLED(OnLeaveScript);
+
+    test_state(script, SCRIPTSTATE_CONNECTED);
+
+    dispex = get_script_dispatch(script);
+    ok(dispex != NULL, "dispex == NULL\n");
+    if(dispex)
+        IDispatchEx_Release(dispex);
+
+    SET_EXPECT(OnStateChange_DISCONNECTED);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    SET_EXPECT(OnStateChange_UNINITIALIZED);
+    hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
+    CHECK_CALLED(OnStateChange_DISCONNECTED);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+    CHECK_CALLED(OnStateChange_UNINITIALIZED);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    hres = IActiveScript_Close(script);
+    ok(hres == S_OK, "Close failed: %08x\n", hres);
+
+    test_state(script, SCRIPTSTATE_CLOSED);
+
+    hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
+    ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres);
+
+    test_state(script, SCRIPTSTATE_CLOSED);
+
+    IUnknown_Release(parse);
+
+    ref = IActiveScript_Release(script);
+    ok(!ref, "ref = %d\n", ref);
+}
+
+
 static BOOL check_vbscript(void)
 {
     IActiveScript *vbscript;
@@ -381,10 +498,12 @@ START_TEST(vbscript)
 {
     CoInitialize(NULL);
 
-    if(check_vbscript())
+    if(check_vbscript()) {
         test_vbscript();
-    else
+        test_vbscript_uninitializing();
+    }else {
         win_skip("VBScript engine not available\n");
+    }
 
     CoUninitialize();
 }
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 9d23499..2ca5584 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -98,27 +98,33 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state)
 {
     switch(This->state) {
     case SCRIPTSTATE_CONNECTED:
+        change_state(This, SCRIPTSTATE_DISCONNECTED);
+        if(state == SCRIPTSTATE_DISCONNECTED)
+            return;
+        /* FALLTHROUGH */
     case SCRIPTSTATE_STARTED:
     case SCRIPTSTATE_DISCONNECTED:
-        FIXME("unimplemented state %d\n", This->state);
+        if(This->state == SCRIPTSTATE_DISCONNECTED)
+            change_state(This, SCRIPTSTATE_INITIALIZED);
         if(state == SCRIPTSTATE_INITIALIZED)
             break;
         /* FALLTHROUGH */
     case SCRIPTSTATE_INITIALIZED:
-        destroy_script(This->ctx);
-        This->ctx = NULL;
-        This->thread_id = 0;
-
-        change_state(This, state);
-        if(state == SCRIPTSTATE_UNINITIALIZED)
-            break;
-        /* FALLTHROUGH */
     case SCRIPTSTATE_UNINITIALIZED:
+        change_state(This, state);
+
         if(This->site) {
             IActiveScriptSite_Release(This->site);
             This->site = NULL;
         }
 
+        This->thread_id = 0;
+
+        if(state == SCRIPTSTATE_CLOSED) {
+            destroy_script(This->ctx);
+            This->ctx = NULL;
+        }
+
         break;
     default:
         assert(0);




More information about the wine-cvs mailing list