2 * Copyright 2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/test.h"
32 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
33 #define IActiveScriptParse_Release IActiveScriptParse64_Release
34 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
35 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
36 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
37 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
41 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
42 #define IActiveScriptParse_Release IActiveScriptParse32_Release
43 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
44 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
45 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
46 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
50 extern const CLSID CLSID_VBScript;
52 #define DEFINE_EXPECT(func) \
53 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
55 #define SET_EXPECT(func) \
56 expect_ ## func = TRUE
58 #define CHECK_EXPECT2(func) \
60 ok(expect_ ##func, "unexpected call " #func "\n"); \
61 called_ ## func = TRUE; \
64 #define CHECK_EXPECT(func) \
66 CHECK_EXPECT2(func); \
67 expect_ ## func = FALSE; \
70 #define CHECK_CALLED(func) \
72 ok(called_ ## func, "expected " #func "\n"); \
73 expect_ ## func = called_ ## func = FALSE; \
76 #define CLEAR_CALLED(func) \
77 expect_ ## func = called_ ## func = FALSE
79 DEFINE_EXPECT(global_success_d);
80 DEFINE_EXPECT(global_success_i);
81 DEFINE_EXPECT(global_vbvar_d);
82 DEFINE_EXPECT(global_vbvar_i);
83 DEFINE_EXPECT(testobj_propget_d);
84 DEFINE_EXPECT(testobj_propget_i);
85 DEFINE_EXPECT(testobj_propput_d);
86 DEFINE_EXPECT(testobj_propput_i);
87 DEFINE_EXPECT(global_propargput_d);
88 DEFINE_EXPECT(global_propargput_i);
89 DEFINE_EXPECT(global_propargput1_d);
90 DEFINE_EXPECT(global_propargput1_i);
91 DEFINE_EXPECT(collectionobj_newenum_i);
93 DEFINE_EXPECT(GetWindow);
94 DEFINE_EXPECT(GetUIBehavior);
95 DEFINE_EXPECT(EnableModeless);
97 #define DISPID_GLOBAL_REPORTSUCCESS 1000
98 #define DISPID_GLOBAL_TRACE 1001
99 #define DISPID_GLOBAL_OK 1002
100 #define DISPID_GLOBAL_GETVT 1003
101 #define DISPID_GLOBAL_ISENGLANG 1004
102 #define DISPID_GLOBAL_VBVAR 1005
103 #define DISPID_GLOBAL_TESTOBJ 1006
104 #define DISPID_GLOBAL_ISNULLDISP 1007
105 #define DISPID_GLOBAL_TESTDISP 1008
106 #define DISPID_GLOBAL_REFOBJ 1009
107 #define DISPID_GLOBAL_COUNTER 1010
108 #define DISPID_GLOBAL_PROPARGPUT 1011
109 #define DISPID_GLOBAL_PROPARGPUT1 1012
110 #define DISPID_GLOBAL_COLLOBJ 1013
111 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
113 #define DISPID_TESTOBJ_PROPGET 2000
114 #define DISPID_TESTOBJ_PROPPUT 2001
116 #define DISPID_COLLOBJ_RESET 3000
118 static const WCHAR testW[] = {'t','e','s','t',0};
119 static const WCHAR emptyW[] = {0};
121 static BOOL strict_dispid_check, is_english, allow_ui;
122 static const char *test_name = "(null)";
123 static int test_counter;
124 static SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_NOUIERROR;
126 static BSTR a2bstr(const char *str)
131 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
132 ret = SysAllocStringLen(NULL, len-1);
133 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
138 static int strcmp_wa(LPCWSTR strw, const char *stra)
141 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
142 return lstrcmpA(buf, stra);
145 static const char *debugstr_guid(REFIID riid)
149 sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
150 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
151 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
152 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
157 static const char *vt2a(VARIANT *v)
159 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
161 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
179 return "VT_DISPATCH";
182 case VT_ARRAY|VT_VARIANT:
183 return "VT_ARRAY|VT_VARIANT";
185 ok(0, "unknown vt %d\n", V_VT(v));
190 /* Returns true if the user interface is in English. Note that this does not
191 * presume of the formatting of dates, numbers, etc.
193 static BOOL is_lang_english(void)
195 static HMODULE hkernel32 = NULL;
196 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
197 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
201 hkernel32 = GetModuleHandleA("kernel32.dll");
202 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
203 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
205 if (pGetThreadUILanguage)
206 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
207 if (pGetUserDefaultUILanguage)
208 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
210 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
213 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
215 ok(0, "unexpected call\n");
216 return E_NOINTERFACE;
219 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
224 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
229 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
230 REFIID riid, void **ppv)
232 ok(0, "unexpected service %s\n", debugstr_guid(guidService));
233 return E_NOINTERFACE;
236 static const IServiceProviderVtbl ServiceProviderVtbl = {
237 ServiceProvider_QueryInterface,
238 ServiceProvider_AddRef,
239 ServiceProvider_Release,
240 ServiceProvider_QueryService
243 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
245 static void test_disp(IDispatch *disp)
247 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
248 DISPID named_args[5] = {DISPID_PROPERTYPUT};
250 DISPPARAMS dp = {args, named_args};
256 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
257 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
259 str = a2bstr("publicProp");
260 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
262 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
264 str = a2bstr("PUBLICPROP");
265 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
267 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
268 ok(public_prop_id == id, "id = %d\n", public_prop_id);
270 str = a2bstr("publicPROP2");
271 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
273 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
275 str = a2bstr("defValGet");
276 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
278 ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
279 ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
281 str = a2bstr("privateProp");
282 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
284 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
285 ok(id == -1, "id = %d\n", id);
287 str = a2bstr("class_initialize");
288 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
290 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
292 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
293 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
294 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
296 V_VT(args) = VT_BOOL;
297 V_BOOL(args) = VARIANT_TRUE;
298 dp.cArgs = dp.cNamedArgs = 1;
300 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
301 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
302 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
304 dp.cArgs = dp.cNamedArgs = 0;
305 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
306 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
307 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
308 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
310 dp.cArgs = dp.cNamedArgs = 0;
311 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
312 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
313 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
314 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
317 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
318 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
319 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
321 V_VT(args) = VT_BOOL;
322 V_BOOL(args) = VARIANT_FALSE;
325 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
326 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
328 str = a2bstr("publicFunction");
329 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
331 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
332 ok(public_func_id != -1, "public_func_id = -1\n");
334 str = a2bstr("publicSub");
335 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
337 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
338 ok(public_sub_id != -1, "public_func_id = -1\n");
340 dp.cArgs = dp.cNamedArgs = 0;
341 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
342 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
343 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
344 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
346 dp.cArgs = dp.cNamedArgs = 0;
347 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
348 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
349 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
351 dp.cArgs = dp.cNamedArgs = 0;
352 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
353 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
354 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
355 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
357 dp.cArgs = dp.cNamedArgs = 0;
358 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
359 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
360 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
362 dp.cArgs = dp.cNamedArgs = 0;
363 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
364 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
365 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
367 dp.cArgs = dp.cNamedArgs = 0;
368 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
369 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
370 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
372 V_VT(args) = VT_BOOL;
373 V_BOOL(args) = VARIANT_TRUE;
374 dp.cArgs = dp.cNamedArgs = 1;
375 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
376 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
378 dp.cArgs = dp.cNamedArgs = 0;
379 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
380 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
381 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
382 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
384 dp.cArgs = dp.cNamedArgs = 0;
385 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
386 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
387 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
388 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
390 dp.cArgs = dp.cNamedArgs = 0;
391 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
392 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
393 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
395 dp.cArgs = dp.cNamedArgs = 0;
396 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
397 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
398 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
400 str = a2bstr("privateSub");
401 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
403 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
404 ok(id == -1, "id = %d\n", id);
406 str = a2bstr("dynprop");
407 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
408 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
409 ok(id == -1, "id = %d\n", id);
410 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
411 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
412 ok(id == -1, "id = %d\n", id);
415 str = a2bstr("publicProp");
416 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
418 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
421 str = a2bstr("publicProp");
422 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
424 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
425 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
428 str = a2bstr("publicprop");
429 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
431 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
432 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
434 IDispatchEx_Release(dispex);
437 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
438 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
440 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
443 static IDispatchEx enumDisp;
445 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
447 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
452 if(IsEqualGUID(riid, &IID_IDispatch)) {
457 ok(0, "unexpected call %s\n", debugstr_guid(riid));
458 return E_NOINTERFACE;
461 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
466 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
471 static unsigned next_cnt;
473 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
475 if(strict_dispid_check)
478 ok(celt == 1, "celt = %d\n", celt);
479 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
480 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
484 V_I2(rgVar) = next_cnt;
491 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
493 ok(0, "unexpected call\n");
497 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
499 ok(0, "unexpected call\n");
503 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
505 ok(0, "unexpected call\n");
509 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
510 EnumVARIANT_QueryInterface,
519 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
521 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
525 if(IsEqualGUID(riid, &IID_IUnknown)
526 || IsEqualGUID(riid, &IID_IDispatch)
527 || IsEqualGUID(riid, &IID_IDispatchEx))
530 trace("QI %s\n", debugstr_guid(riid));
531 return E_NOINTERFACE;
534 IUnknown_AddRef((IUnknown*)*ppv);
538 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
543 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
548 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
550 ok(0, "unexpected call\n");
554 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
555 LCID lcid, ITypeInfo **ppTInfo)
557 ok(0, "unexpected call\n");
561 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
562 LPOLESTR *rgszNames, UINT cNames,
563 LCID lcid, DISPID *rgDispId)
565 ok(0, "unexpected call\n");
569 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
570 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
571 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
573 ok(0, "unexpected call\n");
577 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
579 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
583 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
585 ok(0, "unexpected call\n");
589 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
591 ok(0, "unexpected call\n");
595 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
597 ok(0, "unexpected call\n");
601 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
603 ok(0, "unexpected call\n");
607 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
609 ok(0, "unexpected call\n");
613 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
615 ok(0, "unexpected call\n");
619 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
620 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
622 ok(0, "unexpected call %d\n", id);
626 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
628 if(!strcmp_wa(bstrName, "propget")) {
629 CHECK_EXPECT(testobj_propget_d);
630 test_grfdex(grfdex, fdexNameCaseInsensitive);
631 *pid = DISPID_TESTOBJ_PROPGET;
634 if(!strcmp_wa(bstrName, "propput")) {
635 CHECK_EXPECT(testobj_propput_d);
636 test_grfdex(grfdex, fdexNameCaseInsensitive);
637 *pid = DISPID_TESTOBJ_PROPPUT;
641 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
642 return DISP_E_UNKNOWNNAME;
645 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
646 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
649 case DISPID_TESTOBJ_PROPGET:
650 CHECK_EXPECT(testobj_propget_i);
652 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
653 ok(pdp != NULL, "pdp == NULL\n");
654 ok(!pdp->rgvarg, "rgvarg == NULL\n");
655 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
656 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
657 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
658 ok(pvarRes != NULL, "pvarRes == NULL\n");
659 ok(pei != NULL, "pei == NULL\n");
661 V_VT(pvarRes) = VT_I2;
664 case DISPID_TESTOBJ_PROPPUT:
665 CHECK_EXPECT(testobj_propput_i);
667 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
668 ok(pdp != NULL, "pdp == NULL\n");
669 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
670 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
671 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
672 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
673 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
674 ok(!pvarRes, "pvarRes != NULL\n");
675 ok(pei != NULL, "pei == NULL\n");
677 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
678 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
682 ok(0, "unexpected call %d\n", id);
686 static IDispatchExVtbl testObjVtbl = {
687 DispatchEx_QueryInterface,
690 DispatchEx_GetTypeInfoCount,
691 DispatchEx_GetTypeInfo,
692 DispatchEx_GetIDsOfNames,
696 DispatchEx_DeleteMemberByName,
697 DispatchEx_DeleteMemberByDispID,
698 DispatchEx_GetMemberProperties,
699 DispatchEx_GetMemberName,
700 DispatchEx_GetNextDispID,
701 DispatchEx_GetNameSpaceParent
704 static IDispatchEx testObj = { &testObjVtbl };
706 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
708 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
711 static IDispatchExVtbl enumDispVtbl = {
712 enumDisp_QueryInterface,
715 DispatchEx_GetTypeInfoCount,
716 DispatchEx_GetTypeInfo,
717 DispatchEx_GetIDsOfNames,
719 DispatchEx_GetDispID,
721 DispatchEx_DeleteMemberByName,
722 DispatchEx_DeleteMemberByDispID,
723 DispatchEx_GetMemberProperties,
724 DispatchEx_GetMemberName,
725 DispatchEx_GetNextDispID,
726 DispatchEx_GetNameSpaceParent
729 static IDispatchEx enumDisp = { &enumDispVtbl };
731 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
733 if(!strcmp_wa(bstrName, "reset")) {
734 *pid = DISPID_COLLOBJ_RESET;
738 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
739 return DISP_E_UNKNOWNNAME;
742 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
743 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
747 if(strict_dispid_check)
748 CHECK_EXPECT(collectionobj_newenum_i);
750 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
751 ok(pdp != NULL, "pdp == NULL\n");
752 ok(!pdp->rgvarg, "rgvarg == NULL\n");
753 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
754 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
755 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
756 ok(pvarRes != NULL, "pvarRes == NULL\n");
757 ok(pei != NULL, "pei == NULL\n");
759 V_VT(pvarRes) = VT_UNKNOWN;
760 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
762 case DISPID_COLLOBJ_RESET:
767 ok(0, "unexpected call %d\n", id);
771 static IDispatchExVtbl collectionObjVtbl = {
772 DispatchEx_QueryInterface,
775 DispatchEx_GetTypeInfoCount,
776 DispatchEx_GetTypeInfo,
777 DispatchEx_GetIDsOfNames,
779 collectionObj_GetDispID,
780 collectionObj_InvokeEx,
781 DispatchEx_DeleteMemberByName,
782 DispatchEx_DeleteMemberByDispID,
783 DispatchEx_GetMemberProperties,
784 DispatchEx_GetMemberName,
785 DispatchEx_GetNextDispID,
786 DispatchEx_GetNameSpaceParent
789 static IDispatchEx collectionObj = { &collectionObjVtbl };
791 static ULONG refobj_ref;
793 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
798 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
803 static IDispatchExVtbl RefObjVtbl = {
804 DispatchEx_QueryInterface,
807 DispatchEx_GetTypeInfoCount,
808 DispatchEx_GetTypeInfo,
809 DispatchEx_GetIDsOfNames,
811 DispatchEx_GetDispID,
813 DispatchEx_DeleteMemberByName,
814 DispatchEx_DeleteMemberByDispID,
815 DispatchEx_GetMemberProperties,
816 DispatchEx_GetMemberName,
817 DispatchEx_GetNextDispID,
818 DispatchEx_GetNameSpaceParent
821 static IDispatchEx RefObj = { &RefObjVtbl };
823 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
825 if(!strcmp_wa(bstrName, "ok")) {
826 test_grfdex(grfdex, fdexNameCaseInsensitive);
827 *pid = DISPID_GLOBAL_OK;
830 if(!strcmp_wa(bstrName, "trace")) {
831 test_grfdex(grfdex, fdexNameCaseInsensitive);
832 *pid = DISPID_GLOBAL_TRACE;
835 if(!strcmp_wa(bstrName, "reportSuccess")) {
836 CHECK_EXPECT(global_success_d);
837 test_grfdex(grfdex, fdexNameCaseInsensitive);
838 *pid = DISPID_GLOBAL_REPORTSUCCESS;
841 if(!strcmp_wa(bstrName, "getVT")) {
842 test_grfdex(grfdex, fdexNameCaseInsensitive);
843 *pid = DISPID_GLOBAL_GETVT;
846 if(!strcmp_wa(bstrName, "isEnglishLang")) {
847 test_grfdex(grfdex, fdexNameCaseInsensitive);
848 *pid = DISPID_GLOBAL_ISENGLANG;
851 if(!strcmp_wa(bstrName, "testObj")) {
852 test_grfdex(grfdex, fdexNameCaseInsensitive);
853 *pid = DISPID_GLOBAL_TESTOBJ;
856 if(!strcmp_wa(bstrName, "collectionObj")) {
857 test_grfdex(grfdex, fdexNameCaseInsensitive);
858 *pid = DISPID_GLOBAL_COLLOBJ;
861 if(!strcmp_wa(bstrName, "vbvar")) {
862 CHECK_EXPECT(global_vbvar_d);
863 test_grfdex(grfdex, fdexNameCaseInsensitive);
864 *pid = DISPID_GLOBAL_VBVAR;
867 if(!strcmp_wa(bstrName, "isNullDisp")) {
868 test_grfdex(grfdex, fdexNameCaseInsensitive);
869 *pid = DISPID_GLOBAL_ISNULLDISP;
872 if(!strcmp_wa(bstrName, "testDisp")) {
873 test_grfdex(grfdex, fdexNameCaseInsensitive);
874 *pid = DISPID_GLOBAL_TESTDISP;
877 if(!strcmp_wa(bstrName, "RefObj")) {
878 test_grfdex(grfdex, fdexNameCaseInsensitive);
879 *pid = DISPID_GLOBAL_REFOBJ;
882 if(!strcmp_wa(bstrName, "propargput")) {
883 CHECK_EXPECT(global_propargput_d);
884 test_grfdex(grfdex, fdexNameCaseInsensitive);
885 *pid = DISPID_GLOBAL_PROPARGPUT;
888 if(!strcmp_wa(bstrName, "propargput1")) {
889 CHECK_EXPECT(global_propargput1_d);
890 test_grfdex(grfdex, fdexNameCaseInsensitive);
891 *pid = DISPID_GLOBAL_PROPARGPUT1;
894 if(!strcmp_wa(bstrName, "counter")) {
895 test_grfdex(grfdex, fdexNameCaseInsensitive);
896 *pid = DISPID_GLOBAL_COUNTER;
899 if(!strcmp_wa(bstrName, "doubleAsString")) {
900 test_grfdex(grfdex, fdexNameCaseInsensitive);
901 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
905 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
906 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
907 return DISP_E_UNKNOWNNAME;
910 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
911 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
914 case DISPID_GLOBAL_OK: {
917 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
918 ok(pdp != NULL, "pdp == NULL\n");
919 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
920 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
921 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
922 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
923 if(wFlags & INVOKE_PROPERTYGET)
924 ok(pvarRes != NULL, "pvarRes == NULL\n");
926 ok(!pvarRes, "pvarRes != NULL\n");
927 ok(pei != NULL, "pei == NULL\n");
929 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
932 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
935 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
937 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
941 case DISPID_GLOBAL_TRACE:
942 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
943 ok(pdp != NULL, "pdp == NULL\n");
944 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
945 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
946 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
947 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
948 ok(!pvarRes, "pvarRes != NULL\n");
949 ok(pei != NULL, "pei == NULL\n");
951 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
952 if(V_VT(pdp->rgvarg) == VT_BSTR)
953 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
957 case DISPID_GLOBAL_REPORTSUCCESS:
958 CHECK_EXPECT(global_success_i);
960 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
961 ok(pdp != NULL, "pdp == NULL\n");
962 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
963 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
964 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
965 ok(!pvarRes, "pvarRes != NULL\n");
966 ok(pei != NULL, "pei == NULL\n");
970 case DISPID_GLOBAL_GETVT:
971 ok(pdp != NULL, "pdp == NULL\n");
972 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
973 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
974 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
975 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
976 ok(pvarRes != NULL, "pvarRes == NULL\n");
977 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
978 ok(pei != NULL, "pei == NULL\n");
980 V_VT(pvarRes) = VT_BSTR;
981 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
984 case DISPID_GLOBAL_ISENGLANG:
985 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
986 ok(pdp != NULL, "pdp == NULL\n");
987 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
988 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
989 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
990 ok(pvarRes != NULL, "pvarRes == NULL\n");
991 ok(pei != NULL, "pei == NULL\n");
993 V_VT(pvarRes) = VT_BOOL;
994 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
997 case DISPID_GLOBAL_VBVAR:
998 CHECK_EXPECT(global_vbvar_i);
1000 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1001 ok(pdp != NULL, "pdp == NULL\n");
1002 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1003 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1004 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1005 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1006 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1007 ok(!pvarRes, "pvarRes != NULL\n");
1008 ok(pei != NULL, "pei == NULL\n");
1010 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1011 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1014 case DISPID_GLOBAL_TESTOBJ:
1015 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1017 ok(pdp != NULL, "pdp == NULL\n");
1018 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1019 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1020 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1021 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1022 ok(pvarRes != NULL, "pvarRes == NULL\n");
1023 ok(pei != NULL, "pei == NULL\n");
1025 V_VT(pvarRes) = VT_DISPATCH;
1026 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1029 case DISPID_GLOBAL_COLLOBJ:
1030 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1032 ok(pdp != NULL, "pdp == NULL\n");
1033 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1034 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1035 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1036 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1037 ok(pvarRes != NULL, "pvarRes == NULL\n");
1038 ok(pei != NULL, "pei == NULL\n");
1040 V_VT(pvarRes) = VT_DISPATCH;
1041 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1044 case DISPID_GLOBAL_REFOBJ:
1045 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1047 ok(pdp != NULL, "pdp == NULL\n");
1048 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1049 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1050 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1051 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1052 ok(pvarRes != NULL, "pvarRes == NULL\n");
1053 ok(pei != NULL, "pei == NULL\n");
1055 IDispatchEx_AddRef(&RefObj);
1056 V_VT(pvarRes) = VT_DISPATCH;
1057 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1060 case DISPID_GLOBAL_ISNULLDISP: {
1063 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1064 ok(pdp != NULL, "pdp == NULL\n");
1065 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1066 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1067 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1068 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1069 ok(pvarRes != NULL, "pvarRes == NULL\n");
1070 ok(pei != NULL, "pei == NULL\n");
1073 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1074 v = V_VARIANTREF(v);
1076 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1077 V_VT(pvarRes) = VT_BOOL;
1078 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1082 case DISPID_GLOBAL_TESTDISP:
1083 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1084 ok(pdp != NULL, "pdp == NULL\n");
1085 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1086 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1087 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1088 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1089 ok(!pvarRes, "pvarRes != NULL\n");
1090 ok(pei != NULL, "pei == NULL\n");
1092 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1093 test_disp(V_DISPATCH(pdp->rgvarg));
1096 case DISPID_GLOBAL_PROPARGPUT:
1097 CHECK_EXPECT(global_propargput_i);
1099 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1100 ok(pdp != NULL, "pdp == NULL\n");
1101 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1102 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1103 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1104 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1105 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1106 ok(!pvarRes, "pvarRes != NULL\n");
1107 ok(pei != NULL, "pei == NULL\n");
1109 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1110 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1112 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1113 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1115 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1116 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1119 case DISPID_GLOBAL_PROPARGPUT1:
1120 CHECK_EXPECT(global_propargput1_i);
1122 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1123 ok(pdp != NULL, "pdp == NULL\n");
1124 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1125 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1126 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1127 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1128 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1129 ok(!pvarRes, "pvarRes != NULL\n");
1130 ok(pei != NULL, "pei == NULL\n");
1132 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1133 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1135 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1136 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1140 case DISPID_GLOBAL_COUNTER:
1141 ok(pdp != NULL, "pdp == NULL\n");
1142 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1143 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1144 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1145 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1146 ok(pvarRes != NULL, "pvarRes == NULL\n");
1147 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1148 ok(pei != NULL, "pei == NULL\n");
1150 V_VT(pvarRes) = VT_I2;
1151 V_I2(pvarRes) = test_counter++;
1154 case DISPID_GLOBAL_DOUBLEASSTRING:
1155 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1156 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1157 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1158 ok(pvarRes != NULL, "pvarRes == NULL\n");
1160 V_VT(pvarRes) = VT_BSTR;
1161 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1164 ok(0, "unexpected call %d\n", id);
1165 return DISP_E_MEMBERNOTFOUND;
1168 static IDispatchExVtbl GlobalVtbl = {
1169 DispatchEx_QueryInterface,
1172 DispatchEx_GetTypeInfoCount,
1173 DispatchEx_GetTypeInfo,
1174 DispatchEx_GetIDsOfNames,
1178 DispatchEx_DeleteMemberByName,
1179 DispatchEx_DeleteMemberByDispID,
1180 DispatchEx_GetMemberProperties,
1181 DispatchEx_GetMemberName,
1182 DispatchEx_GetNextDispID,
1183 DispatchEx_GetNameSpaceParent
1186 static IDispatchEx Global = { &GlobalVtbl };
1188 static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
1190 ok(0, "unexpected call\n");
1191 return E_NOINTERFACE;
1194 static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
1199 static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
1204 static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
1207 CHECK_EXPECT(GetWindow);
1212 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
1217 CHECK_EXPECT(EnableModeless);
1218 ok(!fEnable, "fEnable = %x\n", fEnable);
1222 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
1223 ActiveScriptSiteWindow_QueryInterface,
1224 ActiveScriptSiteWindow_AddRef,
1225 ActiveScriptSiteWindow_Release,
1226 ActiveScriptSiteWindow_GetWindow,
1227 ActiveScriptSiteWindow_EnableModeless
1230 static IActiveScriptSiteWindow ActiveScriptSiteWindow = { &ActiveScriptSiteWindowVtbl };
1232 static HRESULT WINAPI ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl *iface, REFIID riid, void **ppv)
1234 ok(0, "unexpected call\n");
1235 return E_NOINTERFACE;
1238 static ULONG WINAPI ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl *iface)
1243 static ULONG WINAPI ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl *iface)
1248 static HRESULT WINAPI ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl *iface, SCRIPTUICITEM UicItem,
1249 SCRIPTUICHANDLING *pUicHandling)
1252 CHECK_EXPECT(GetUIBehavior);
1253 ok(UicItem == SCRIPTUICITEM_MSGBOX, "UidItem = %d\n", UicItem);
1255 *pUicHandling = uic_handling;
1259 static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl = {
1260 ActiveScriptSiteUIControl_QueryInterface,
1261 ActiveScriptSiteUIControl_AddRef,
1262 ActiveScriptSiteUIControl_Release,
1263 ActiveScriptSiteUIControl_GetUIBehavior
1266 static IActiveScriptSiteUIControl ActiveScriptSiteUIControl = { &ActiveScriptSiteUIControlVtbl };
1268 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1272 if(IsEqualGUID(&IID_IUnknown, riid))
1274 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1276 else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid))
1277 *ppv = &ActiveScriptSiteWindow;
1278 else if(IsEqualGUID(&IID_IActiveScriptSiteUIControl, riid))
1279 *ppv = &ActiveScriptSiteUIControl;
1281 return E_NOINTERFACE;
1283 IUnknown_AddRef((IUnknown*)*ppv);
1287 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1292 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1297 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1299 *plcid = GetUserDefaultLCID();
1303 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1304 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1306 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1307 ok(!ppti, "ppti != NULL\n");
1309 if(strcmp_wa(pstrName, "test"))
1310 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1312 *ppiunkItem = (IUnknown*)&Global;
1316 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1321 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1322 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1327 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1332 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1337 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1342 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1347 #undef ACTSCPSITE_THIS
1349 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1350 ActiveScriptSite_QueryInterface,
1351 ActiveScriptSite_AddRef,
1352 ActiveScriptSite_Release,
1353 ActiveScriptSite_GetLCID,
1354 ActiveScriptSite_GetItemInfo,
1355 ActiveScriptSite_GetDocVersionString,
1356 ActiveScriptSite_OnScriptTerminate,
1357 ActiveScriptSite_OnStateChange,
1358 ActiveScriptSite_OnScriptError,
1359 ActiveScriptSite_OnEnterScript,
1360 ActiveScriptSite_OnLeaveScript
1363 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1365 static IActiveScript *create_script(void)
1367 IActiveScript *script;
1370 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1371 &IID_IActiveScript, (void**)&script);
1372 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1377 static IActiveScript *create_and_init_script(DWORD flags)
1379 IActiveScriptParse *parser;
1380 IActiveScript *engine;
1383 engine = create_script();
1387 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1388 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1390 hres = IActiveScriptParse_InitNew(parser);
1391 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1393 IActiveScriptParse_Release(parser);
1395 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1396 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1398 hres = IActiveScript_AddNamedItem(engine, testW,
1399 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1400 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1402 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1403 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1408 static void close_script(IActiveScript *script)
1413 hres = IActiveScript_Close(script);
1414 ok(hres == S_OK, "Close failed: %08x\n", hres);
1416 ref = IActiveScript_Release(script);
1417 ok(!ref, "ref=%u\n", ref);
1420 static HRESULT parse_script(DWORD flags, BSTR script_str)
1422 IActiveScriptParse *parser;
1423 IActiveScript *engine;
1424 IDispatch *script_disp;
1428 engine = create_and_init_script(flags);
1432 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1433 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1436 IActiveScript_Release(engine);
1440 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1441 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1442 ok(script_disp != NULL, "script_disp == NULL\n");
1443 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1447 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1449 IActiveScript_Close(engine);
1451 IDispatch_Release(script_disp);
1452 IActiveScript_Release(engine);
1454 ref = IActiveScriptParse_Release(parser);
1455 ok(!ref, "ref=%d\n", ref);
1459 static void parse_script_af(DWORD flags, const char *src)
1465 hres = parse_script(flags, tmp);
1467 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1470 static HRESULT parse_script_ar(const char *src)
1476 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp);
1481 static void parse_script_a(const char *src)
1483 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1486 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1488 IDispatchEx *dispex;
1493 static const WCHAR delimiterW[] = {'\"',0};
1496 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0,
1497 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1499 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1500 ok(disp != NULL, "disp = NULL\n");
1502 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1503 IDispatch_Release(disp);
1504 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1510 static void test_procedures(void)
1512 IActiveScriptParseProcedure2 *parse_proc;
1513 DISPPARAMS dp = {NULL};
1514 IActiveScript *script;
1520 script = create_and_init_script(0);
1522 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1523 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1525 proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1527 V_VT(&v) = VT_EMPTY;
1528 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
1529 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1531 IDispatchEx_Release(proc);
1533 IActiveScriptParseProcedure2_Release(parse_proc);
1535 close_script(script);
1538 static void test_gc(void)
1540 IActiveScriptParse *parser;
1541 IActiveScript *engine;
1545 strict_dispid_check = FALSE;
1547 engine = create_script();
1551 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1552 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1554 hres = IActiveScriptParse_InitNew(parser);
1555 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1557 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1558 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1560 hres = IActiveScript_AddNamedItem(engine, testW,
1561 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1562 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1564 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1565 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1570 " Public Sub Class_Terminate\n"
1571 " Call reportSuccess()\n"
1577 "set x = nothing\n");
1579 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1580 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1583 SET_EXPECT(global_success_d);
1584 SET_EXPECT(global_success_i);
1585 IActiveScript_Close(engine);
1586 CHECK_CALLED(global_success_d);
1587 CHECK_CALLED(global_success_i);
1589 IActiveScript_Release(engine);
1590 IActiveScriptParse_Release(parser);
1593 static void test_msgbox(void)
1597 uic_handling = SCRIPTUICHANDLING_NOUIDEFAULT;
1599 SET_EXPECT(GetUIBehavior);
1600 SET_EXPECT(GetWindow);
1601 SET_EXPECT(EnableModeless);
1602 hres = parse_script_ar("MsgBox \"testing...\"");
1603 CLEAR_CALLED(GetUIBehavior);
1604 CLEAR_CALLED(GetWindow);
1605 CLEAR_CALLED(EnableModeless);
1607 win_skip("Skipping MsgBox tests, broken (probably too old) vbscript\n");
1611 SET_EXPECT(GetUIBehavior);
1612 parse_script_a("dim r\n r=MsgBox(\"testing...\")\n Call ok(r=0, \"r=\"&r)");
1613 CHECK_CALLED(GetUIBehavior);
1615 SET_EXPECT(GetUIBehavior);
1616 parse_script_a("MsgBox 10");
1617 CHECK_CALLED(GetUIBehavior);
1619 uic_handling = SCRIPTUICHANDLING_ALLOW;
1621 SET_EXPECT(GetUIBehavior);
1622 SET_EXPECT(GetWindow);
1623 SET_EXPECT(EnableModeless);
1624 hres = parse_script_ar("MsgBox \"testing...\"");
1625 ok(FAILED(hres), "script not failed\n");
1626 CHECK_CALLED(GetUIBehavior);
1627 CHECK_CALLED(GetWindow);
1628 CHECK_CALLED(EnableModeless);
1630 uic_handling = SCRIPTUICHANDLING_NOUIERROR;
1632 SET_EXPECT(GetUIBehavior);
1633 hres = parse_script_ar("MsgBox \"testing...\"");
1634 ok(FAILED(hres), "script not failed\n");
1635 CHECK_CALLED(GetUIBehavior);
1638 static HRESULT test_global_vars_ref(BOOL use_close)
1640 IActiveScriptParse *parser;
1641 IActiveScript *engine;
1646 engine = create_script();
1650 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1651 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1654 IActiveScript_Release(engine);
1658 hres = IActiveScriptParse_InitNew(parser);
1659 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1661 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1662 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1664 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1665 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1667 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1668 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1672 script_str = a2bstr("Dim x\nset x = RefObj\n");
1673 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1674 SysFreeString(script_str);
1676 ok(refobj_ref, "refobj_ref = 0\n");
1679 hres = IActiveScript_Close(engine);
1680 ok(hres == S_OK, "Close failed: %08x\n", hres);
1682 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1683 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1686 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1688 IActiveScript_Release(engine);
1690 ref = IActiveScriptParse_Release(parser);
1691 ok(!ref, "ref=%d\n", ref);
1695 static BSTR get_script_from_file(const char *filename)
1699 const char *file_map;
1702 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1703 if(file == INVALID_HANDLE_VALUE) {
1704 trace("Could not open file: %u\n", GetLastError());
1708 size = GetFileSize(file, NULL);
1710 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1712 if(map == INVALID_HANDLE_VALUE) {
1713 trace("Could not create file mapping: %u\n", GetLastError());
1717 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1720 trace("MapViewOfFile failed: %u\n", GetLastError());
1724 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1725 ret = SysAllocStringLen(NULL, len);
1726 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1728 UnmapViewOfFile(file_map);
1733 static void run_from_file(const char *filename)
1738 script_str = get_script_from_file(filename);
1742 strict_dispid_check = FALSE;
1743 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1744 SysFreeString(script_str);
1745 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1748 static void run_from_res(const char *name)
1756 strict_dispid_check = FALSE;
1759 src = FindResourceA(NULL, name, (LPCSTR)40);
1760 ok(src != NULL, "Could not find resource %s\n", name);
1762 size = SizeofResource(NULL, src);
1763 data = LoadResource(NULL, src);
1765 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1766 str = SysAllocStringLen(NULL, len);
1767 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1769 SET_EXPECT(global_success_d);
1770 SET_EXPECT(global_success_i);
1771 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1772 CHECK_CALLED(global_success_d);
1773 CHECK_CALLED(global_success_i);
1775 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1779 static void run_tests(void)
1781 strict_dispid_check = TRUE;
1784 parse_script_a("' empty ;");
1786 SET_EXPECT(global_success_d);
1787 SET_EXPECT(global_success_i);
1788 parse_script_a("reportSuccess");
1789 CHECK_CALLED(global_success_d);
1790 CHECK_CALLED(global_success_i);
1792 SET_EXPECT(global_success_d);
1793 SET_EXPECT(global_success_i);
1794 parse_script_a("reportSuccess()");
1795 CHECK_CALLED(global_success_d);
1796 CHECK_CALLED(global_success_i);
1798 SET_EXPECT(global_success_d);
1799 SET_EXPECT(global_success_i);
1800 parse_script_a("Call reportSuccess");
1801 CHECK_CALLED(global_success_d);
1802 CHECK_CALLED(global_success_i);
1804 SET_EXPECT(global_success_d);
1805 SET_EXPECT(global_success_i);
1806 parse_script_a("test.reportSuccess()");
1807 CHECK_CALLED(global_success_d);
1808 CHECK_CALLED(global_success_i);
1810 SET_EXPECT(global_vbvar_d);
1811 SET_EXPECT(global_vbvar_i);
1812 parse_script_a("Option Explicit\nvbvar = 3");
1813 CHECK_CALLED(global_vbvar_d);
1814 CHECK_CALLED(global_vbvar_i);
1816 SET_EXPECT(global_vbvar_d);
1817 SET_EXPECT(global_vbvar_i);
1818 parse_script_a("Option Explicit\nvbvar() = 3");
1819 CHECK_CALLED(global_vbvar_d);
1820 CHECK_CALLED(global_vbvar_i);
1822 SET_EXPECT(testobj_propget_d);
1823 SET_EXPECT(testobj_propget_i);
1824 parse_script_a("dim x\nx = testObj.propget");
1825 CHECK_CALLED(testobj_propget_d);
1826 CHECK_CALLED(testobj_propget_i);
1828 SET_EXPECT(testobj_propput_d);
1829 SET_EXPECT(testobj_propput_i);
1830 parse_script_a("testObj.propput = 1");
1831 CHECK_CALLED(testobj_propput_d);
1832 CHECK_CALLED(testobj_propput_i);
1834 SET_EXPECT(global_propargput_d);
1835 SET_EXPECT(global_propargput_i);
1836 parse_script_a("propargput(counter(), counter()) = counter()");
1837 CHECK_CALLED(global_propargput_d);
1838 CHECK_CALLED(global_propargput_i);
1840 SET_EXPECT(global_propargput_d);
1841 SET_EXPECT(global_propargput_i);
1842 parse_script_a("test.propargput(counter(), counter()) = counter()");
1843 CHECK_CALLED(global_propargput_d);
1844 CHECK_CALLED(global_propargput_i);
1846 SET_EXPECT(global_propargput1_d);
1847 SET_EXPECT(global_propargput1_i);
1848 parse_script_a("propargput1 (counter()) = counter()");
1849 CHECK_CALLED(global_propargput1_d);
1850 CHECK_CALLED(global_propargput1_i);
1852 SET_EXPECT(global_propargput1_d);
1853 SET_EXPECT(global_propargput1_i);
1854 parse_script_a("test.propargput1(counter()) = counter()");
1855 CHECK_CALLED(global_propargput1_d);
1856 CHECK_CALLED(global_propargput1_i);
1859 SET_EXPECT(collectionobj_newenum_i);
1861 parse_script_a("for each x in collectionObj\nnext");
1862 CHECK_CALLED(collectionobj_newenum_i);
1864 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1866 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1868 parse_script_a("x = _ \n3");
1870 test_global_vars_ref(TRUE);
1871 test_global_vars_ref(FALSE);
1873 strict_dispid_check = FALSE;
1875 parse_script_a("Sub testsub\n"
1877 "Call ok(x = 1, \"x = \" & x)\n"
1881 run_from_res("lang.vbs");
1882 run_from_res("api.vbs");
1889 static BOOL check_vbscript(void)
1891 IActiveScriptParseProcedure2 *vbscript;
1894 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1895 &IID_IActiveScriptParseProcedure2, (void**)&vbscript);
1897 IActiveScriptParseProcedure2_Release(vbscript);
1899 return hres == S_OK;
1907 is_english = is_lang_english();
1909 skip("Skipping some tests in non-English UIs\n");
1911 argc = winetest_get_mainargs(&argv);
1915 if(!check_vbscript()) {
1916 win_skip("Broken engine, probably too old\n");
1917 }else if(argc > 2) {
1919 uic_handling = SCRIPTUICHANDLING_ALLOW;
1920 run_from_file(argv[2]);