[PATCH v2 3/3] jscript/tests: Add tests for named items.

Gabriel Ivăncescu gabrielopcode at gmail.com
Mon Feb 24 07:48:25 CST 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/jscript/tests/jscript.c | 618 ++++++++++++++++++++++++++++++++++-
 1 file changed, 605 insertions(+), 13 deletions(-)

diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c
index 84805b1..69a55d3 100644
--- a/dlls/jscript/tests/jscript.c
+++ b/dlls/jscript/tests/jscript.c
@@ -97,6 +97,12 @@ DEFINE_EXPECT(OnStateChange_CLOSED);
 DEFINE_EXPECT(OnStateChange_INITIALIZED);
 DEFINE_EXPECT(OnEnterScript);
 DEFINE_EXPECT(OnLeaveScript);
+DEFINE_EXPECT(OnScriptError);
+DEFINE_EXPECT(GetIDsOfNames);
+DEFINE_EXPECT(GetItemInfo_global);
+DEFINE_EXPECT(GetItemInfo_visible);
+DEFINE_EXPECT(GetItemInfo_visible_code);
+DEFINE_EXPECT(testCall);
 
 static const CLSID *engine_clsid = &CLSID_JScript;
 
@@ -111,6 +117,121 @@ static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstat
     ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);
 }
 
+static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
+{
+    if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
+        *ppv = iface;
+        IDispatch_AddRef(iface);
+        return S_OK;
+    }
+
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG global_named_item_ref, visible_named_item_ref, visible_code_named_item_ref;
+
+static ULONG WINAPI global_AddRef(IDispatch *iface)
+{
+    return ++global_named_item_ref;
+}
+
+static ULONG WINAPI global_Release(IDispatch *iface)
+{
+    return --global_named_item_ref;
+}
+
+static ULONG WINAPI visible_AddRef(IDispatch *iface)
+{
+    return ++visible_named_item_ref;
+}
+
+static ULONG WINAPI visible_Release(IDispatch *iface)
+{
+    return --visible_named_item_ref;
+}
+
+static ULONG WINAPI visible_code_AddRef(IDispatch *iface)
+{
+    return ++visible_code_named_item_ref;
+}
+
+static ULONG WINAPI visible_code_Release(IDispatch *iface)
+{
+    return --visible_code_named_item_ref;
+}
+
+static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    return DISP_E_BADINDEX;
+}
+
+static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names, UINT name_cnt,
+                                            LCID lcid, DISPID *ids)
+{
+    ok(name_cnt == 1, "name_cnt = %u\n", name_cnt);
+    if(!wcscmp(names[0], L"testCall")) {
+        *ids = 1;
+        return S_OK;
+    }
+
+    CHECK_EXPECT2(GetIDsOfNames);
+    return DISP_E_UNKNOWNNAME;
+}
+
+static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID id, REFIID riid, LCID lcid, WORD flags,
+                                      DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, UINT *err)
+{
+    CHECK_EXPECT(testCall);
+    ok(id == 1, "id = %u\n", id);
+    ok(flags == DISPATCH_METHOD, "flags = %x\n", flags);
+    ok(!dp->cArgs, "cArgs = %u\n", dp->cArgs);
+    ok(!res, "res = %p\n", res);
+    return S_OK;
+}
+
+static const IDispatchVtbl global_named_item_vtbl = {
+    Dispatch_QueryInterface,
+    global_AddRef,
+    global_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch global_named_item = { &global_named_item_vtbl };
+
+static const IDispatchVtbl visible_named_item_vtbl = {
+    Dispatch_QueryInterface,
+    visible_AddRef,
+    visible_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch visible_named_item = { &visible_named_item_vtbl };
+
+static const IDispatchVtbl visible_code_named_item_vtbl = {
+    Dispatch_QueryInterface,
+    visible_code_AddRef,
+    visible_code_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch visible_code_named_item = { &visible_code_named_item_vtbl };
+
 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -145,7 +266,26 @@ static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *p
 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
 {
-    ok(0, "unexpected call\n");
+    ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "dwReturnMask = %x\n", dwReturnMask);
+    if(!wcscmp(pstrName, L"globalItem")) {
+        CHECK_EXPECT(GetItemInfo_global);
+        IDispatch_AddRef(&global_named_item);
+        *ppiunkItem = (IUnknown*)&global_named_item;
+        return S_OK;
+    }
+    if(!wcscmp(pstrName, L"visibleItem")) {
+        CHECK_EXPECT(GetItemInfo_visible);
+        IDispatch_AddRef(&visible_named_item);
+        *ppiunkItem = (IUnknown*)&visible_named_item;
+        return S_OK;
+    }
+    if(!wcscmp(pstrName, L"visibleCodeItem")) {
+        CHECK_EXPECT(GetItemInfo_visible_code);
+        IDispatch_AddRef(&visible_code_named_item);
+        *ppiunkItem = (IUnknown*)&visible_code_named_item;
+        return S_OK;
+    }
+    ok(0, "unexpected call %s\n", wine_dbgstr_w(pstrName));
     return E_NOTIMPL;
 }
 
@@ -192,8 +332,8 @@ static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, S
 
 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    CHECK_EXPECT(OnScriptError);
+    return S_OK;
 }
 
 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
@@ -263,14 +403,14 @@ static void test_script_dispatch(IDispatchEx *dispex)
     VariantClear(&v);
 }
 
-static IDispatchEx *get_script_dispatch(IActiveScript *script)
+static IDispatchEx *get_script_dispatch(IActiveScript *script, const WCHAR *item_name)
 {
     IDispatchEx *dispex;
     IDispatch *disp;
     HRESULT hres;
 
     disp = (void*)0xdeadbeef;
-    hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
+    hres = IActiveScript_GetScriptDispatch(script, item_name, &disp);
     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
 
     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
@@ -512,7 +652,7 @@ static void test_jscript(void)
     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     test_script_dispatch(dispex);
 
     SET_EXPECT(OnStateChange_STARTED);
@@ -656,7 +796,7 @@ static void test_jscript_uninitializing(void)
 
     test_state(script, SCRIPTSTATE_CONNECTED);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     ok(dispex != NULL, "dispex == NULL\n");
     IDispatchEx_Release(dispex);
 
@@ -741,7 +881,7 @@ static void test_code_persistence(void)
     ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
 
     /* Pending code does not add identifiers to the global scope */
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     id = 0;
     get_disp_id(dispex, L"x", DISP_E_UNKNOWNNAME, &id);
     ok(id == -1, "id = %d, expected -1\n", id);
@@ -780,7 +920,7 @@ static void test_code_persistence(void)
     CHECK_CALLED_MULTI(OnLeaveScript, 2);
     test_state(script, SCRIPTSTATE_CONNECTED);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     id = 0;
     get_disp_id(dispex, L"x", DISP_E_UNKNOWNNAME, &id);
     ok(id == -1, "id = %d, expected -1\n", id);
@@ -826,7 +966,7 @@ static void test_code_persistence(void)
     CHECK_CALLED(GetLCID);
     CHECK_CALLED(OnStateChange_INITIALIZED);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     id = 0;
     get_disp_id(dispex, L"z", DISP_E_UNKNOWNNAME, &id);
     ok(id == -1, "id = %d, expected -1\n", id);
@@ -842,7 +982,7 @@ static void test_code_persistence(void)
     CHECK_CALLED(OnLeaveScript);
     test_state(script, SCRIPTSTATE_CONNECTED);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     id = 0;
     get_disp_id(dispex, L"z", S_OK, &id);
     ok(id != -1, "id = -1\n");
@@ -905,7 +1045,7 @@ static void test_code_persistence(void)
     CHECK_CALLED(OnStateChange_CONNECTED);
     test_state(script, SCRIPTSTATE_CONNECTED);
 
-    dispex = get_script_dispatch(script);
+    dispex = get_script_dispatch(script, NULL);
     id = 0;
     get_disp_id(dispex, L"y", DISP_E_UNKNOWNNAME, &id);
     ok(id == -1, "id = %d, expected -1\n", id);
@@ -926,6 +1066,457 @@ static void test_code_persistence(void)
     CHECK_CALLED(OnStateChange_CLOSED);
 }
 
+static void test_named_items(void)
+{
+    static const WCHAR *global_idents[] =
+    {
+        L"ActiveXObject",
+        L"Array",
+        L"Boolean",
+        L"Date",
+        L"Enumerator",
+        L"Error",
+        L"eval",
+        L"EvalError",
+        L"Function",
+        L"Infinity",
+        L"Math",
+        L"NaN",
+        L"Number",
+        L"Object",
+        L"RangeError",
+        L"ReferenceError",
+        L"RegExp",
+        L"RegExpError",
+        L"String",
+        L"SyntaxError",
+        L"TypeError",
+        L"undefined",
+        L"URIError",
+        L"VBArray",
+
+        L"CollectGarbage",
+        L"decodeURI",
+        L"decodeURIComponent",
+        L"encodeURI",
+        L"encodeURIComponent",
+        L"escape",
+        L"eval",
+        L"isFinite",
+        L"isNaN",
+        L"parseFloat",
+        L"parseInt",
+        L"ScriptEngine",
+        L"ScriptEngineBuildVersion",
+        L"ScriptEngineMajorVersion",
+        L"ScriptEngineMinorVersion",
+        L"unescape",
+
+        L"testFunc_global",
+        L"testVar_global"
+    };
+    static const WCHAR *global_code_test[] =
+    {
+        L"testFunc_global();",
+        L"if(testVar_global != 5) throw new Error();",
+        L"var testObj = new testClassFunc();",
+        L"eval(\"testFunc_global();\");",
+        L"if(Math.abs(-17) != 17) throw new Error();"
+    };
+    static const WCHAR *context_idents[] =
+    {
+        L"testFunc",
+        L"testVar"
+    };
+    static const WCHAR *context_code_test[] =
+    {
+        L"testFunc();",
+        L"if(testVar != 42) throw new Error();",
+        L"if(Math.abs(-testVar) != 42) throw new Error();"
+    };
+    IDispatchEx *dispex, *dispex2;
+    IActiveScriptParse *parse;
+    IActiveScript *script;
+    IDispatch *disp;
+    VARIANT var;
+    unsigned i;
+    HRESULT hr;
+    DISPID id;
+    ULONG ref;
+    BSTR bstr;
+
+    script = create_jscript();
+
+    hr = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
+    ok(hr == S_OK, "Could not get IActiveScriptParse: %08x\n", hr);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    hr = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
+    ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
+    hr = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS);
+    ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
+    hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
+    ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
+
+    SET_EXPECT(GetLCID);
+    hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
+    CHECK_CALLED(GetLCID);
+
+    SET_EXPECT(GetItemInfo_global);
+    hr = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS);
+    ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
+    CHECK_CALLED(GetItemInfo_global);
+
+    hr = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
+    ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
+    hr = IActiveScript_AddNamedItem(script, L"visibleCodeItem", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_CODEONLY);
+    ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
+    hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
+    ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
+
+    ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
+    ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
+
+    hr = IActiveScript_GetScriptDispatch(script, L"noContext", &disp);
+    ok(hr == E_INVALIDARG, "GetScriptDispatch returned: %08x\n", hr);
+    hr = IActiveScript_GetScriptDispatch(script, L"codeONLYItem", &disp);
+    ok(hr == E_INVALIDARG, "GetScriptDispatch returned: %08x\n", hr);
+
+    dispex = get_script_dispatch(script, NULL);
+    dispex2 = get_script_dispatch(script, L"globalItem");
+    ok(dispex == dispex2, "get_script_dispatch returned different dispatch objects.\n");
+    IDispatchEx_Release(dispex2);
+    dispex2 = get_script_dispatch(script, L"codeOnlyItem");
+    ok(dispex != dispex2, "get_script_dispatch returned same dispatch objects.\n");
+
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    hr = IActiveScriptParse_InitNew(parse);
+    ok(hr == S_OK, "InitNew failed: %08x\n", hr);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+
+    SET_EXPECT(OnStateChange_CONNECTED);
+    hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
+    ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
+    CHECK_CALLED(OnStateChange_CONNECTED);
+
+    SET_EXPECT(testCall);
+    parse_script(parse, L"testCall();");
+    CHECK_CALLED(testCall);
+
+    SET_EXPECT(GetItemInfo_visible);
+    SET_EXPECT(testCall);
+    parse_script(parse, L"visibleItem.testCall();");
+    CHECK_CALLED(GetItemInfo_visible);
+    CHECK_CALLED(testCall);
+
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    SET_EXPECT(testCall);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"testCall();", L"visibleCodeItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    CHECK_CALLED(testCall);
+
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(GetIDsOfNames);
+    SET_EXPECT(OnScriptError);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"codeOnlyItem();", L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(FAILED(hr), "ParseScriptText returned: %08x\n", hr);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(GetIDsOfNames);
+    CHECK_CALLED(OnScriptError);
+    CHECK_CALLED(OnLeaveScript);
+
+    hr = IActiveScript_GetScriptDispatch(script, L"visibleCodeItem", &disp);
+    ok(hr == S_OK, "GetScriptDispatch returned: %08x\n", hr);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"visibleCodeItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == disp,
+        "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    IDispatch_Release(disp);
+
+    SET_EXPECT(GetItemInfo_visible_code);
+    SET_EXPECT(testCall);
+    parse_script(parse, L"visibleCodeItem.testCall();");
+    CHECK_CALLED(GetItemInfo_visible_code);
+    CHECK_CALLED(testCall);
+
+    ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
+    ok(visible_named_item_ref > 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref > 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
+
+    SET_EXPECT(testCall);
+    parse_script(parse, L"visibleItem.testCall();");
+    CHECK_CALLED(testCall);
+
+    hr = IActiveScriptParse_ParseScriptText(parse, L"function testFunc() { }", L"CodeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(hr == E_INVALIDARG, "ParseScriptText returned: %08x\n", hr);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(GetIDsOfNames);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L""
+        "function testFunc_global() { }\n"
+        "var testVar_global = 10;\n"
+        "function testClassFunc() { this.x = 10; }\n",
+        NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(GetIDsOfNames);
+    CHECK_CALLED(OnLeaveScript);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"function testFunc() { }\n", L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L""
+        "var testVar = 42;\n"
+        "testVar_global = 5;\n",
+        L"codeOnlyItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+
+    for (i = 0; i < ARRAY_SIZE(global_idents); i++)
+    {
+        bstr = SysAllocString(global_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
+        ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(global_idents[i]));
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex2, bstr, 0, &id);
+        ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
+        ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(global_idents[i]), id);
+        SysFreeString(bstr);
+    }
+    for (i = 0; i < ARRAY_SIZE(context_idents); i++)
+    {
+        bstr = SysAllocString(context_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
+        ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex2, bstr, 0, &id);
+        ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
+        ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(context_idents[i]));
+        SysFreeString(bstr);
+    }
+
+    for (i = 0; i < ARRAY_SIZE(global_code_test); i++)
+    {
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnLeaveScript);
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(GetIDsOfNames);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnLeaveScript);
+    }
+    for (i = 0; i < ARRAY_SIZE(context_code_test); i++)
+    {
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(GetIDsOfNames);
+        SET_EXPECT(OnScriptError);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(GetIDsOfNames);
+        CHECK_CALLED(OnScriptError);
+        CHECK_CALLED(OnLeaveScript);
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnLeaveScript);
+    }
+
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"this", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &global_named_item,
+        "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"visibleItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &visible_named_item,
+        "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"codeOnlyItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == (IDispatch*)dispex2,
+        "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+
+    IDispatchEx_Release(dispex2);
+    IDispatchEx_Release(dispex);
+
+    SET_EXPECT(OnStateChange_DISCONNECTED);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    SET_EXPECT(OnStateChange_UNINITIALIZED);
+    hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
+    ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hr);
+    CHECK_CALLED(OnStateChange_DISCONNECTED);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+    CHECK_CALLED(OnStateChange_UNINITIALIZED);
+    test_no_script_dispatch(script);
+
+    ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
+    ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
+
+    hr = IActiveScript_GetScriptDispatch(script, L"codeOnlyItem", &disp);
+    ok(hr == E_UNEXPECTED, "hr = %08x, expected E_UNEXPECTED\n", hr);
+
+    SET_EXPECT(GetLCID);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
+    CHECK_CALLED(GetLCID);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+
+    hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
+    ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
+
+    SET_EXPECT(OnStateChange_CONNECTED);
+    SET_EXPECT_MULTI(OnEnterScript, 2);
+    SET_EXPECT_MULTI(OnLeaveScript, 2);
+    hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
+    ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
+    CHECK_CALLED(OnStateChange_CONNECTED);
+    CHECK_CALLED_MULTI(OnEnterScript, 2);
+    CHECK_CALLED_MULTI(OnLeaveScript, 2);
+    test_state(script, SCRIPTSTATE_CONNECTED);
+
+    dispex = get_script_dispatch(script, NULL);
+    for (i = 0; i < ARRAY_SIZE(global_idents); i++)
+    {
+        bstr = SysAllocString(global_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
+        ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(global_idents[i]));
+        SysFreeString(bstr);
+    }
+    for (i = 0; i < ARRAY_SIZE(context_idents); i++)
+    {
+        bstr = SysAllocString(context_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
+        ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
+        SysFreeString(bstr);
+    }
+    IDispatchEx_Release(dispex);
+
+    dispex = get_script_dispatch(script, L"codeOnlyItem");
+    for (i = 0; i < ARRAY_SIZE(global_idents); i++)
+    {
+        bstr = SysAllocString(global_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
+        ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(global_idents[i]), id);
+        SysFreeString(bstr);
+    }
+    for (i = 0; i < ARRAY_SIZE(context_idents); i++)
+    {
+        bstr = SysAllocString(context_idents[i]);
+        id = 0;
+        hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
+        ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
+        ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
+        SysFreeString(bstr);
+    }
+    IDispatchEx_Release(dispex);
+
+    for (i = 0; i < ARRAY_SIZE(global_code_test); i++)
+    {
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnLeaveScript);
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnLeaveScript);
+    }
+    for (i = 0; i < ARRAY_SIZE(context_code_test); i++)
+    {
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnScriptError);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnScriptError);
+        CHECK_CALLED(OnLeaveScript);
+        SET_EXPECT(OnEnterScript);
+        SET_EXPECT(OnScriptError);
+        SET_EXPECT(OnLeaveScript);
+        hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+        ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
+        CHECK_CALLED(OnEnterScript);
+        CHECK_CALLED(OnScriptError);
+        CHECK_CALLED(OnLeaveScript);
+    }
+
+    SET_EXPECT(OnStateChange_DISCONNECTED);
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    SET_EXPECT(OnStateChange_CLOSED);
+    hr = IActiveScript_Close(script);
+    ok(hr == S_OK, "Close failed: %08x\n", hr);
+    CHECK_CALLED(OnStateChange_DISCONNECTED);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+    CHECK_CALLED(OnStateChange_CLOSED);
+
+    ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
+    ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
+
+    test_state(script, SCRIPTSTATE_CLOSED);
+    IActiveScriptParse_Release(parse);
+
+    ref = IActiveScript_Release(script);
+    ok(!ref, "ref = %d\n", ref);
+}
+
 static void test_typeinfo(const WCHAR *parse_func_name)
 {
     static struct
@@ -1043,7 +1634,7 @@ static void test_typeinfo(const WCHAR *parse_func_name)
     else
     {
         parse_script(parser, source);
-        disp = get_script_dispatch(script);
+        disp = get_script_dispatch(script, NULL);
     }
 
     hr = IDispatchEx_QueryInterface(disp, &IID_ITypeInfo, (void**)&typeinfo);
@@ -1406,6 +1997,7 @@ START_TEST(jscript)
         test_jscript_uninitializing();
         test_aggregation();
         test_code_persistence();
+        test_named_items();
         test_typeinfo(NULL);
         test_typeinfo(L"some_func_name");
 
-- 
2.21.0




More information about the wine-devel mailing list