+static void test_eval(void)
+{
+ IActiveScriptParse *parser;
+ IDispatchEx *script_dispex;
+ IDispatch *script_disp;
+ IActiveScript *engine;
+ VARIANT arg, res;
+ DISPPARAMS params;
+ DISPID id, v_id;
+ BSTR str;
+ HRESULT hres;
+
+ engine = create_script();
+
+ hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
+ ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
+
+ hres = IActiveScriptParse_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);
+
+ SET_EXPECT(GetItemInfo_testVal);
+ hres = IActiveScript_AddNamedItem(engine, test_valW,
+ SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
+ ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+ CHECK_CALLED(GetItemInfo_testVal);
+
+ hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
+ ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
+
+ hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
+ ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
+ ok(script_disp != NULL, "script_disp == NULL\n");
+
+ hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&script_dispex);
+ ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
+ IDispatch_Release(script_disp);
+
+ str = a2bstr("eval");
+ hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
+ ok(hres == S_OK, "Could not get eval dispid: %08x\n", hres);
+ SysFreeString(str);
+
+ params.rgvarg = &arg;
+ params.rgdispidNamedArgs = NULL;
+ params.cArgs = 1;
+ params.cNamedArgs = 0;
+ V_VT(&arg) = VT_BSTR;
+
+ V_BSTR(&arg) = a2bstr("var v = 1;");
+ V_VT(&res) = VT_ERROR;
+ hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, ¶ms, &res, NULL, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&res) == VT_EMPTY, "eval returned type %u\n", V_VT(&res));
+ SysFreeString(V_BSTR(&arg));
+
+ V_BSTR(&arg) = a2bstr("v");
+ V_VT(&res) = VT_ERROR;
+ hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, ¶ms, &res, NULL, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
+ ok(V_I4(&res) == 1, "eval returned %d\n", V_I4(&res));
+ SysFreeString(V_BSTR(&arg));
+
+ str = a2bstr("v");
+ hres = IDispatchEx_GetDispID(script_dispex, str, 0, &v_id);
+ ok(hres == S_OK, "Could not get v dispid: %08x\n", hres);
+ SysFreeString(str);
+
+ params.rgvarg = NULL;
+ params.cArgs = 0;
+ V_VT(&res) = VT_ERROR;
+ hres = IDispatchEx_InvokeEx(script_dispex, v_id, 0, DISPATCH_PROPERTYGET, ¶ms, &res, NULL, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
+ ok(V_I4(&res) == 1, "eval returned %d\n", V_I4(&res));
+
+ SET_EXPECT(global_calleval_i);
+ str = a2bstr("(function(){"
+ " var v = 2;"
+ " callEval(eval);"
+ " ok(x === 5, 'x = ' + x);"
+ "})();");
+ hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+ SysFreeString(str);
+ CHECK_CALLED(global_calleval_i);
+
+ str = a2bstr("x");
+ hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
+ ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(x) returned %08x\n", hres);
+ SysFreeString(str);
+
+ IDispatchEx_Release(script_dispex);
+ IActiveScriptParse_Release(parser);
+ IActiveScript_Close(engine);
+ IActiveScript_Release(engine);
+}
+