msi: Remove const from integer parameters.
[wine.git] / dlls / vbscript / tests / run.c
blob4c22cb0085c6a0291ababd56436311dfc7e2196d
1 /*
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
19 #include <stdio.h>
21 #define COBJMACROS
22 #define CONST_VTABLE
24 #include <ole2.h>
25 #include <dispex.h>
26 #include <activscp.h>
28 #include "wine/test.h"
30 #ifdef _WIN64
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
39 #else
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
48 #endif
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) \
59 do { \
60 ok(expect_ ##func, "unexpected call " #func "\n"); \
61 called_ ## func = TRUE; \
62 }while(0)
64 #define CHECK_EXPECT(func) \
65 do { \
66 CHECK_EXPECT2(func); \
67 expect_ ## func = FALSE; \
68 }while(0)
70 #define CHECK_CALLED(func) \
71 do { \
72 ok(called_ ## func, "expected " #func "\n"); \
73 expect_ ## func = called_ ## func = FALSE; \
74 }while(0)
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);
92 DEFINE_EXPECT(Next);
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)
128 BSTR ret;
129 int len;
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);
135 return ret;
138 static int strcmp_wa(LPCWSTR strw, const char *stra)
140 CHAR buf[512];
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)
147 static char buf[50];
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]);
154 return buf;
157 static const char *vt2a(VARIANT *v)
159 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
160 static char buf[64];
161 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
162 return buf;
165 switch(V_VT(v)) {
166 case VT_EMPTY:
167 return "VT_EMPTY";
168 case VT_NULL:
169 return "VT_NULL";
170 case VT_I2:
171 return "VT_I2";
172 case VT_I4:
173 return "VT_I4";
174 case VT_R8:
175 return "VT_R8";
176 case VT_DATE:
177 return "VT_DATE";
178 case VT_BSTR:
179 return "VT_BSTR";
180 case VT_DISPATCH:
181 return "VT_DISPATCH";
182 case VT_BOOL:
183 return "VT_BOOL";
184 case VT_ARRAY|VT_VARIANT:
185 return "VT_ARRAY|VT_VARIANT";
186 default:
187 ok(0, "unknown vt %d\n", V_VT(v));
188 return NULL;
192 /* Returns true if the user interface is in English. Note that this does not
193 * presume of the formatting of dates, numbers, etc.
195 static BOOL is_lang_english(void)
197 static HMODULE hkernel32 = NULL;
198 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
199 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
201 if (!hkernel32)
203 hkernel32 = GetModuleHandleA("kernel32.dll");
204 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
205 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
207 if (pGetThreadUILanguage && PRIMARYLANGID(pGetThreadUILanguage()) != LANG_ENGLISH)
208 return FALSE;
209 if (pGetUserDefaultUILanguage && PRIMARYLANGID(pGetUserDefaultUILanguage()) != LANG_ENGLISH)
210 return FALSE;
212 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
215 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
217 ok(0, "unexpected call\n");
218 return E_NOINTERFACE;
221 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
223 return 2;
226 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
228 return 1;
231 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
232 REFIID riid, void **ppv)
234 ok(0, "unexpected service %s\n", debugstr_guid(guidService));
235 return E_NOINTERFACE;
238 static const IServiceProviderVtbl ServiceProviderVtbl = {
239 ServiceProvider_QueryInterface,
240 ServiceProvider_AddRef,
241 ServiceProvider_Release,
242 ServiceProvider_QueryService
245 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
247 static void test_disp(IDispatch *disp)
249 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
250 DISPID named_args[5] = {DISPID_PROPERTYPUT};
251 VARIANT v, args[5];
252 DISPPARAMS dp = {args, named_args};
253 IDispatchEx *dispex;
254 EXCEPINFO ei = {0};
255 BSTR str;
256 HRESULT hres;
258 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
259 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
261 str = a2bstr("publicProp");
262 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
263 SysFreeString(str);
264 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
266 str = a2bstr("PUBLICPROP");
267 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
268 SysFreeString(str);
269 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
270 ok(public_prop_id == id, "id = %d\n", public_prop_id);
272 str = a2bstr("publicPROP2");
273 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
274 SysFreeString(str);
275 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
277 str = a2bstr("defValGet");
278 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
279 SysFreeString(str);
280 ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
281 ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
283 str = a2bstr("privateProp");
284 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
285 SysFreeString(str);
286 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
287 ok(id == -1, "id = %d\n", id);
289 str = a2bstr("class_initialize");
290 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
291 SysFreeString(str);
292 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
294 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
295 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
296 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
298 V_VT(args) = VT_BOOL;
299 V_BOOL(args) = VARIANT_TRUE;
300 dp.cArgs = dp.cNamedArgs = 1;
301 V_VT(&v) = VT_BOOL;
302 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
303 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
304 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
306 dp.cArgs = dp.cNamedArgs = 0;
307 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
308 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
309 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
310 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
312 dp.cArgs = dp.cNamedArgs = 0;
313 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
314 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
315 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
316 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
318 dp.cArgs = 1;
319 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
320 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
321 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
323 V_VT(args) = VT_BOOL;
324 V_BOOL(args) = VARIANT_FALSE;
325 dp.cArgs = 1;
326 V_VT(&v) = VT_BOOL;
327 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
328 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
330 str = a2bstr("publicFunction");
331 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
332 SysFreeString(str);
333 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
334 ok(public_func_id != -1, "public_func_id = -1\n");
336 str = a2bstr("publicSub");
337 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
338 SysFreeString(str);
339 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
340 ok(public_sub_id != -1, "public_func_id = -1\n");
342 dp.cArgs = dp.cNamedArgs = 0;
343 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
344 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
345 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
346 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
348 dp.cArgs = dp.cNamedArgs = 0;
349 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
350 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
351 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
353 dp.cArgs = dp.cNamedArgs = 0;
354 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
355 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
356 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
357 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
359 dp.cArgs = dp.cNamedArgs = 0;
360 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
361 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
362 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
364 dp.cArgs = dp.cNamedArgs = 0;
365 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
366 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
367 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
369 dp.cArgs = dp.cNamedArgs = 0;
370 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
371 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
372 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
374 V_VT(args) = VT_BOOL;
375 V_BOOL(args) = VARIANT_TRUE;
376 dp.cArgs = dp.cNamedArgs = 1;
377 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
378 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
380 dp.cArgs = dp.cNamedArgs = 0;
381 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
382 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
383 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
384 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
386 dp.cArgs = dp.cNamedArgs = 0;
387 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
388 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
389 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
390 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
392 dp.cArgs = dp.cNamedArgs = 0;
393 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
394 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
395 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
397 dp.cArgs = dp.cNamedArgs = 0;
398 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
399 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
400 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
402 str = a2bstr("privateSub");
403 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
404 SysFreeString(str);
405 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
406 ok(id == -1, "id = %d\n", id);
408 str = a2bstr("dynprop");
409 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
410 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
411 ok(id == -1, "id = %d\n", id);
412 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
413 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
414 ok(id == -1, "id = %d\n", id);
415 SysFreeString(str);
417 str = a2bstr("publicProp");
418 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
419 SysFreeString(str);
420 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
422 id = 0xdeadbeef;
423 str = a2bstr("publicProp");
424 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
425 SysFreeString(str);
426 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
427 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
429 id = 0xdeadbeef;
430 str = a2bstr("publicprop");
431 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
432 SysFreeString(str);
433 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
434 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
436 IDispatchEx_Release(dispex);
439 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
440 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
442 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
445 static IDispatchEx enumDisp;
447 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
449 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
450 *ppv = iface;
451 return S_OK;
454 if(IsEqualGUID(riid, &IID_IDispatch)) {
455 *ppv = &enumDisp;
456 return S_OK;
459 ok(0, "unexpected call %s\n", debugstr_guid(riid));
460 return E_NOINTERFACE;
463 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
465 return 2;
468 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
470 return 1;
473 static unsigned next_cnt;
475 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
477 if(strict_dispid_check)
478 CHECK_EXPECT2(Next);
480 ok(celt == 1, "celt = %d\n", celt);
481 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
482 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
484 if(next_cnt++ < 3) {
485 V_VT(rgVar) = VT_I2;
486 V_I2(rgVar) = next_cnt;
487 return S_OK;
490 return S_FALSE;
493 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
495 ok(0, "unexpected call\n");
496 return E_NOTIMPL;
499 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
501 ok(0, "unexpected call\n");
502 return E_NOTIMPL;
505 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
507 ok(0, "unexpected call\n");
508 return E_NOTIMPL;
511 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
512 EnumVARIANT_QueryInterface,
513 EnumVARIANT_AddRef,
514 EnumVARIANT_Release,
515 EnumVARIANT_Next,
516 EnumVARIANT_Skip,
517 EnumVARIANT_Reset,
518 EnumVARIANT_Clone
521 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
523 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
525 *ppv = NULL;
527 if(IsEqualGUID(riid, &IID_IUnknown)
528 || IsEqualGUID(riid, &IID_IDispatch)
529 || IsEqualGUID(riid, &IID_IDispatchEx))
530 *ppv = iface;
531 else {
532 trace("QI %s\n", debugstr_guid(riid));
533 return E_NOINTERFACE;
536 IUnknown_AddRef((IUnknown*)*ppv);
537 return S_OK;
540 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
542 return 2;
545 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
547 return 1;
550 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
552 ok(0, "unexpected call\n");
553 return E_NOTIMPL;
556 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
557 LCID lcid, ITypeInfo **ppTInfo)
559 ok(0, "unexpected call\n");
560 return E_NOTIMPL;
563 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
564 LPOLESTR *rgszNames, UINT cNames,
565 LCID lcid, DISPID *rgDispId)
567 ok(0, "unexpected call\n");
568 return E_NOTIMPL;
571 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
572 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
573 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
575 ok(0, "unexpected call\n");
576 return E_NOTIMPL;
579 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
581 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
582 return E_NOTIMPL;
585 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
587 ok(0, "unexpected call\n");
588 return E_NOTIMPL;
591 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
593 ok(0, "unexpected call\n");
594 return E_NOTIMPL;
597 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
599 ok(0, "unexpected call\n");
600 return E_NOTIMPL;
603 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
605 ok(0, "unexpected call\n");
606 return E_NOTIMPL;
609 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
611 ok(0, "unexpected call\n");
612 return E_NOTIMPL;
615 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
617 ok(0, "unexpected call\n");
618 return E_NOTIMPL;
621 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
622 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
624 ok(0, "unexpected call %d\n", id);
625 return E_NOTIMPL;
628 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
630 if(!strcmp_wa(bstrName, "propget")) {
631 CHECK_EXPECT(testobj_propget_d);
632 test_grfdex(grfdex, fdexNameCaseInsensitive);
633 *pid = DISPID_TESTOBJ_PROPGET;
634 return S_OK;
636 if(!strcmp_wa(bstrName, "propput")) {
637 CHECK_EXPECT(testobj_propput_d);
638 test_grfdex(grfdex, fdexNameCaseInsensitive);
639 *pid = DISPID_TESTOBJ_PROPPUT;
640 return S_OK;
643 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
644 return DISP_E_UNKNOWNNAME;
647 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
648 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
650 switch(id) {
651 case DISPID_TESTOBJ_PROPGET:
652 CHECK_EXPECT(testobj_propget_i);
654 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
655 ok(pdp != NULL, "pdp == NULL\n");
656 ok(!pdp->rgvarg, "rgvarg == NULL\n");
657 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
658 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
659 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
660 ok(pvarRes != NULL, "pvarRes == NULL\n");
661 ok(pei != NULL, "pei == NULL\n");
663 V_VT(pvarRes) = VT_I2;
664 V_I2(pvarRes) = 10;
665 return S_OK;
666 case DISPID_TESTOBJ_PROPPUT:
667 CHECK_EXPECT(testobj_propput_i);
669 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
670 ok(pdp != NULL, "pdp == NULL\n");
671 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
672 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
673 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
674 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
675 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
676 ok(!pvarRes, "pvarRes != NULL\n");
677 ok(pei != NULL, "pei == NULL\n");
679 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
680 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
681 return S_OK;
684 ok(0, "unexpected call %d\n", id);
685 return E_FAIL;
688 static IDispatchExVtbl testObjVtbl = {
689 DispatchEx_QueryInterface,
690 DispatchEx_AddRef,
691 DispatchEx_Release,
692 DispatchEx_GetTypeInfoCount,
693 DispatchEx_GetTypeInfo,
694 DispatchEx_GetIDsOfNames,
695 DispatchEx_Invoke,
696 testObj_GetDispID,
697 testObj_InvokeEx,
698 DispatchEx_DeleteMemberByName,
699 DispatchEx_DeleteMemberByDispID,
700 DispatchEx_GetMemberProperties,
701 DispatchEx_GetMemberName,
702 DispatchEx_GetNextDispID,
703 DispatchEx_GetNameSpaceParent
706 static IDispatchEx testObj = { &testObjVtbl };
708 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
710 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
713 static IDispatchExVtbl enumDispVtbl = {
714 enumDisp_QueryInterface,
715 DispatchEx_AddRef,
716 DispatchEx_Release,
717 DispatchEx_GetTypeInfoCount,
718 DispatchEx_GetTypeInfo,
719 DispatchEx_GetIDsOfNames,
720 DispatchEx_Invoke,
721 DispatchEx_GetDispID,
722 DispatchEx_InvokeEx,
723 DispatchEx_DeleteMemberByName,
724 DispatchEx_DeleteMemberByDispID,
725 DispatchEx_GetMemberProperties,
726 DispatchEx_GetMemberName,
727 DispatchEx_GetNextDispID,
728 DispatchEx_GetNameSpaceParent
731 static IDispatchEx enumDisp = { &enumDispVtbl };
733 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
735 if(!strcmp_wa(bstrName, "reset")) {
736 *pid = DISPID_COLLOBJ_RESET;
737 return S_OK;
740 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
741 return DISP_E_UNKNOWNNAME;
744 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
745 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
747 switch(id) {
748 case DISPID_NEWENUM:
749 if(strict_dispid_check)
750 CHECK_EXPECT(collectionobj_newenum_i);
752 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
753 ok(pdp != NULL, "pdp == NULL\n");
754 ok(!pdp->rgvarg, "rgvarg == NULL\n");
755 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
756 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
757 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
758 ok(pvarRes != NULL, "pvarRes == NULL\n");
759 ok(pei != NULL, "pei == NULL\n");
761 V_VT(pvarRes) = VT_UNKNOWN;
762 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
763 return S_OK;
764 case DISPID_COLLOBJ_RESET:
765 next_cnt = 0;
766 return S_OK;
769 ok(0, "unexpected call %d\n", id);
770 return E_NOTIMPL;
773 static IDispatchExVtbl collectionObjVtbl = {
774 DispatchEx_QueryInterface,
775 DispatchEx_AddRef,
776 DispatchEx_Release,
777 DispatchEx_GetTypeInfoCount,
778 DispatchEx_GetTypeInfo,
779 DispatchEx_GetIDsOfNames,
780 DispatchEx_Invoke,
781 collectionObj_GetDispID,
782 collectionObj_InvokeEx,
783 DispatchEx_DeleteMemberByName,
784 DispatchEx_DeleteMemberByDispID,
785 DispatchEx_GetMemberProperties,
786 DispatchEx_GetMemberName,
787 DispatchEx_GetNextDispID,
788 DispatchEx_GetNameSpaceParent
791 static IDispatchEx collectionObj = { &collectionObjVtbl };
793 static ULONG refobj_ref;
795 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
797 return ++refobj_ref;
800 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
802 return --refobj_ref;
805 static IDispatchExVtbl RefObjVtbl = {
806 DispatchEx_QueryInterface,
807 RefObj_AddRef,
808 RefObj_Release,
809 DispatchEx_GetTypeInfoCount,
810 DispatchEx_GetTypeInfo,
811 DispatchEx_GetIDsOfNames,
812 DispatchEx_Invoke,
813 DispatchEx_GetDispID,
814 DispatchEx_InvokeEx,
815 DispatchEx_DeleteMemberByName,
816 DispatchEx_DeleteMemberByDispID,
817 DispatchEx_GetMemberProperties,
818 DispatchEx_GetMemberName,
819 DispatchEx_GetNextDispID,
820 DispatchEx_GetNameSpaceParent
823 static IDispatchEx RefObj = { &RefObjVtbl };
825 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
827 if(!strcmp_wa(bstrName, "ok")) {
828 test_grfdex(grfdex, fdexNameCaseInsensitive);
829 *pid = DISPID_GLOBAL_OK;
830 return S_OK;
832 if(!strcmp_wa(bstrName, "trace")) {
833 test_grfdex(grfdex, fdexNameCaseInsensitive);
834 *pid = DISPID_GLOBAL_TRACE;
835 return S_OK;
837 if(!strcmp_wa(bstrName, "reportSuccess")) {
838 CHECK_EXPECT(global_success_d);
839 test_grfdex(grfdex, fdexNameCaseInsensitive);
840 *pid = DISPID_GLOBAL_REPORTSUCCESS;
841 return S_OK;
843 if(!strcmp_wa(bstrName, "getVT")) {
844 test_grfdex(grfdex, fdexNameCaseInsensitive);
845 *pid = DISPID_GLOBAL_GETVT;
846 return S_OK;
848 if(!strcmp_wa(bstrName, "isEnglishLang")) {
849 test_grfdex(grfdex, fdexNameCaseInsensitive);
850 *pid = DISPID_GLOBAL_ISENGLANG;
851 return S_OK;
853 if(!strcmp_wa(bstrName, "testObj")) {
854 test_grfdex(grfdex, fdexNameCaseInsensitive);
855 *pid = DISPID_GLOBAL_TESTOBJ;
856 return S_OK;
858 if(!strcmp_wa(bstrName, "collectionObj")) {
859 test_grfdex(grfdex, fdexNameCaseInsensitive);
860 *pid = DISPID_GLOBAL_COLLOBJ;
861 return S_OK;
863 if(!strcmp_wa(bstrName, "vbvar")) {
864 CHECK_EXPECT(global_vbvar_d);
865 test_grfdex(grfdex, fdexNameCaseInsensitive);
866 *pid = DISPID_GLOBAL_VBVAR;
867 return S_OK;
869 if(!strcmp_wa(bstrName, "isNullDisp")) {
870 test_grfdex(grfdex, fdexNameCaseInsensitive);
871 *pid = DISPID_GLOBAL_ISNULLDISP;
872 return S_OK;
874 if(!strcmp_wa(bstrName, "testDisp")) {
875 test_grfdex(grfdex, fdexNameCaseInsensitive);
876 *pid = DISPID_GLOBAL_TESTDISP;
877 return S_OK;
879 if(!strcmp_wa(bstrName, "RefObj")) {
880 test_grfdex(grfdex, fdexNameCaseInsensitive);
881 *pid = DISPID_GLOBAL_REFOBJ;
882 return S_OK;
884 if(!strcmp_wa(bstrName, "propargput")) {
885 CHECK_EXPECT(global_propargput_d);
886 test_grfdex(grfdex, fdexNameCaseInsensitive);
887 *pid = DISPID_GLOBAL_PROPARGPUT;
888 return S_OK;
890 if(!strcmp_wa(bstrName, "propargput1")) {
891 CHECK_EXPECT(global_propargput1_d);
892 test_grfdex(grfdex, fdexNameCaseInsensitive);
893 *pid = DISPID_GLOBAL_PROPARGPUT1;
894 return S_OK;
896 if(!strcmp_wa(bstrName, "counter")) {
897 test_grfdex(grfdex, fdexNameCaseInsensitive);
898 *pid = DISPID_GLOBAL_COUNTER;
899 return S_OK;
901 if(!strcmp_wa(bstrName, "doubleAsString")) {
902 test_grfdex(grfdex, fdexNameCaseInsensitive);
903 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
904 return S_OK;
907 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
908 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
909 return DISP_E_UNKNOWNNAME;
912 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
913 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
915 switch(id) {
916 case DISPID_GLOBAL_OK: {
917 VARIANT *b;
919 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
920 ok(pdp != NULL, "pdp == NULL\n");
921 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
922 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
923 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
924 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
925 if(wFlags & INVOKE_PROPERTYGET)
926 ok(pvarRes != NULL, "pvarRes == NULL\n");
927 else
928 ok(!pvarRes, "pvarRes != NULL\n");
929 ok(pei != NULL, "pei == NULL\n");
931 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
933 b = pdp->rgvarg+1;
934 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
935 b = V_BYREF(b);
937 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
939 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
940 return S_OK;
943 case DISPID_GLOBAL_TRACE:
944 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
945 ok(pdp != NULL, "pdp == NULL\n");
946 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
947 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
948 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
949 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
950 ok(!pvarRes, "pvarRes != NULL\n");
951 ok(pei != NULL, "pei == NULL\n");
953 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
954 if(V_VT(pdp->rgvarg) == VT_BSTR)
955 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
957 return S_OK;
959 case DISPID_GLOBAL_REPORTSUCCESS:
960 CHECK_EXPECT(global_success_i);
962 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
963 ok(pdp != NULL, "pdp == NULL\n");
964 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
965 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
966 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
967 ok(!pvarRes, "pvarRes != NULL\n");
968 ok(pei != NULL, "pei == NULL\n");
970 return S_OK;
972 case DISPID_GLOBAL_GETVT:
973 ok(pdp != NULL, "pdp == NULL\n");
974 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
975 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
976 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
977 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
978 ok(pvarRes != NULL, "pvarRes == NULL\n");
979 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
980 ok(pei != NULL, "pei == NULL\n");
982 V_VT(pvarRes) = VT_BSTR;
983 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
984 return S_OK;
986 case DISPID_GLOBAL_ISENGLANG:
987 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
988 ok(pdp != NULL, "pdp == NULL\n");
989 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
990 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
991 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
992 ok(pvarRes != NULL, "pvarRes == NULL\n");
993 ok(pei != NULL, "pei == NULL\n");
995 V_VT(pvarRes) = VT_BOOL;
996 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
997 return S_OK;
999 case DISPID_GLOBAL_VBVAR:
1000 CHECK_EXPECT(global_vbvar_i);
1002 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1003 ok(pdp != NULL, "pdp == NULL\n");
1004 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1005 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1006 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1007 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1008 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1009 ok(!pvarRes, "pvarRes != NULL\n");
1010 ok(pei != NULL, "pei == NULL\n");
1012 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1013 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1014 return S_OK;
1016 case DISPID_GLOBAL_TESTOBJ:
1017 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1019 ok(pdp != NULL, "pdp == NULL\n");
1020 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1021 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1022 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1023 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1024 ok(pvarRes != NULL, "pvarRes == NULL\n");
1025 ok(pei != NULL, "pei == NULL\n");
1027 V_VT(pvarRes) = VT_DISPATCH;
1028 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1029 return S_OK;
1031 case DISPID_GLOBAL_COLLOBJ:
1032 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1034 ok(pdp != NULL, "pdp == NULL\n");
1035 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1036 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1037 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1038 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1039 ok(pvarRes != NULL, "pvarRes == NULL\n");
1040 ok(pei != NULL, "pei == NULL\n");
1042 V_VT(pvarRes) = VT_DISPATCH;
1043 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1044 return S_OK;
1046 case DISPID_GLOBAL_REFOBJ:
1047 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1049 ok(pdp != NULL, "pdp == NULL\n");
1050 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1051 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1052 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1053 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1054 ok(pvarRes != NULL, "pvarRes == NULL\n");
1055 ok(pei != NULL, "pei == NULL\n");
1057 IDispatchEx_AddRef(&RefObj);
1058 V_VT(pvarRes) = VT_DISPATCH;
1059 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1060 return S_OK;
1062 case DISPID_GLOBAL_ISNULLDISP: {
1063 VARIANT *v;
1065 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1066 ok(pdp != NULL, "pdp == NULL\n");
1067 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1068 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1069 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1070 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1071 ok(pvarRes != NULL, "pvarRes == NULL\n");
1072 ok(pei != NULL, "pei == NULL\n");
1074 v = pdp->rgvarg;
1075 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1076 v = V_VARIANTREF(v);
1078 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1079 V_VT(pvarRes) = VT_BOOL;
1080 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1081 return S_OK;
1084 case DISPID_GLOBAL_TESTDISP:
1085 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1086 ok(pdp != NULL, "pdp == NULL\n");
1087 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1088 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1089 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1090 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1091 ok(!pvarRes, "pvarRes != NULL\n");
1092 ok(pei != NULL, "pei == NULL\n");
1094 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1095 test_disp(V_DISPATCH(pdp->rgvarg));
1096 return S_OK;
1098 case DISPID_GLOBAL_PROPARGPUT:
1099 CHECK_EXPECT(global_propargput_i);
1101 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1102 ok(pdp != NULL, "pdp == NULL\n");
1103 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1104 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1105 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1106 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1107 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1108 ok(!pvarRes, "pvarRes != NULL\n");
1109 ok(pei != NULL, "pei == NULL\n");
1111 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1112 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1114 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1115 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1117 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1118 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1119 return S_OK;
1121 case DISPID_GLOBAL_PROPARGPUT1:
1122 CHECK_EXPECT(global_propargput1_i);
1124 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1125 ok(pdp != NULL, "pdp == NULL\n");
1126 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1127 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1128 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1129 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1130 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1131 ok(!pvarRes, "pvarRes != NULL\n");
1132 ok(pei != NULL, "pei == NULL\n");
1134 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1135 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1137 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1138 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1140 return S_OK;
1142 case DISPID_GLOBAL_COUNTER:
1143 ok(pdp != NULL, "pdp == NULL\n");
1144 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1145 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1146 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1147 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1148 ok(pvarRes != NULL, "pvarRes == NULL\n");
1149 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1150 ok(pei != NULL, "pei == NULL\n");
1152 V_VT(pvarRes) = VT_I2;
1153 V_I2(pvarRes) = test_counter++;
1154 return S_OK;
1156 case DISPID_GLOBAL_DOUBLEASSTRING:
1157 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1158 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1159 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1160 ok(pvarRes != NULL, "pvarRes == NULL\n");
1162 V_VT(pvarRes) = VT_BSTR;
1163 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1166 ok(0, "unexpected call %d\n", id);
1167 return DISP_E_MEMBERNOTFOUND;
1170 static IDispatchExVtbl GlobalVtbl = {
1171 DispatchEx_QueryInterface,
1172 DispatchEx_AddRef,
1173 DispatchEx_Release,
1174 DispatchEx_GetTypeInfoCount,
1175 DispatchEx_GetTypeInfo,
1176 DispatchEx_GetIDsOfNames,
1177 DispatchEx_Invoke,
1178 Global_GetDispID,
1179 Global_InvokeEx,
1180 DispatchEx_DeleteMemberByName,
1181 DispatchEx_DeleteMemberByDispID,
1182 DispatchEx_GetMemberProperties,
1183 DispatchEx_GetMemberName,
1184 DispatchEx_GetNextDispID,
1185 DispatchEx_GetNameSpaceParent
1188 static IDispatchEx Global = { &GlobalVtbl };
1190 static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
1192 ok(0, "unexpected call\n");
1193 return E_NOINTERFACE;
1196 static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
1198 return 2;
1201 static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
1203 return 1;
1206 static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
1208 if(!allow_ui)
1209 CHECK_EXPECT(GetWindow);
1210 *phwnd = NULL;
1211 return S_OK;
1214 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
1216 if(allow_ui)
1217 return S_OK;
1219 CHECK_EXPECT(EnableModeless);
1220 ok(!fEnable, "fEnable = %x\n", fEnable);
1221 return E_FAIL;
1224 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
1225 ActiveScriptSiteWindow_QueryInterface,
1226 ActiveScriptSiteWindow_AddRef,
1227 ActiveScriptSiteWindow_Release,
1228 ActiveScriptSiteWindow_GetWindow,
1229 ActiveScriptSiteWindow_EnableModeless
1232 static IActiveScriptSiteWindow ActiveScriptSiteWindow = { &ActiveScriptSiteWindowVtbl };
1234 static HRESULT WINAPI ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl *iface, REFIID riid, void **ppv)
1236 ok(0, "unexpected call\n");
1237 return E_NOINTERFACE;
1240 static ULONG WINAPI ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl *iface)
1242 return 2;
1245 static ULONG WINAPI ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl *iface)
1247 return 1;
1250 static HRESULT WINAPI ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl *iface, SCRIPTUICITEM UicItem,
1251 SCRIPTUICHANDLING *pUicHandling)
1253 if(!allow_ui) {
1254 CHECK_EXPECT(GetUIBehavior);
1255 ok(UicItem == SCRIPTUICITEM_MSGBOX, "UidItem = %d\n", UicItem);
1257 *pUicHandling = uic_handling;
1258 return S_OK;
1261 static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl = {
1262 ActiveScriptSiteUIControl_QueryInterface,
1263 ActiveScriptSiteUIControl_AddRef,
1264 ActiveScriptSiteUIControl_Release,
1265 ActiveScriptSiteUIControl_GetUIBehavior
1268 static IActiveScriptSiteUIControl ActiveScriptSiteUIControl = { &ActiveScriptSiteUIControlVtbl };
1270 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1272 *ppv = NULL;
1274 if(IsEqualGUID(&IID_IUnknown, riid))
1275 *ppv = iface;
1276 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1277 *ppv = iface;
1278 else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid))
1279 *ppv = &ActiveScriptSiteWindow;
1280 else if(IsEqualGUID(&IID_IActiveScriptSiteUIControl, riid))
1281 *ppv = &ActiveScriptSiteUIControl;
1282 else
1283 return E_NOINTERFACE;
1285 IUnknown_AddRef((IUnknown*)*ppv);
1286 return S_OK;
1289 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1291 return 2;
1294 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1296 return 1;
1299 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1301 *plcid = GetUserDefaultLCID();
1302 return S_OK;
1305 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1306 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1308 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1309 ok(!ppti, "ppti != NULL\n");
1311 if(strcmp_wa(pstrName, "test"))
1312 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1314 *ppiunkItem = (IUnknown*)&Global;
1315 return S_OK;
1318 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1320 return E_NOTIMPL;
1323 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1324 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1326 return E_NOTIMPL;
1329 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1331 return E_NOTIMPL;
1334 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1336 return E_NOTIMPL;
1339 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1341 return E_NOTIMPL;
1344 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1346 return E_NOTIMPL;
1349 #undef ACTSCPSITE_THIS
1351 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1352 ActiveScriptSite_QueryInterface,
1353 ActiveScriptSite_AddRef,
1354 ActiveScriptSite_Release,
1355 ActiveScriptSite_GetLCID,
1356 ActiveScriptSite_GetItemInfo,
1357 ActiveScriptSite_GetDocVersionString,
1358 ActiveScriptSite_OnScriptTerminate,
1359 ActiveScriptSite_OnStateChange,
1360 ActiveScriptSite_OnScriptError,
1361 ActiveScriptSite_OnEnterScript,
1362 ActiveScriptSite_OnLeaveScript
1365 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1367 static IActiveScript *create_script(void)
1369 IActiveScript *script;
1370 HRESULT hres;
1372 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1373 &IID_IActiveScript, (void**)&script);
1374 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1376 return script;
1379 static IActiveScript *create_and_init_script(DWORD flags)
1381 IActiveScriptParse *parser;
1382 IActiveScript *engine;
1383 HRESULT hres;
1385 engine = create_script();
1386 if(!engine)
1387 return NULL;
1389 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1390 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1392 hres = IActiveScriptParse_InitNew(parser);
1393 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1395 IActiveScriptParse_Release(parser);
1397 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1398 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1400 hres = IActiveScript_AddNamedItem(engine, testW,
1401 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1402 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1404 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1405 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1407 return engine;
1410 static void close_script(IActiveScript *script)
1412 ULONG ref;
1413 HRESULT hres;
1415 hres = IActiveScript_Close(script);
1416 ok(hres == S_OK, "Close failed: %08x\n", hres);
1418 ref = IActiveScript_Release(script);
1419 ok(!ref, "ref=%u\n", ref);
1422 static HRESULT parse_script(DWORD flags, BSTR script_str, const WCHAR *delim)
1424 IActiveScriptParse *parser;
1425 IActiveScript *engine;
1426 IDispatch *script_disp;
1427 LONG ref;
1428 HRESULT hres;
1430 engine = create_and_init_script(flags);
1431 if(!engine)
1432 return S_OK;
1434 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1435 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1436 if (FAILED(hres))
1438 IActiveScript_Release(engine);
1439 return hres;
1442 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1443 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1444 ok(script_disp != NULL, "script_disp == NULL\n");
1445 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1447 test_counter = 0;
1449 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, delim, 0, 0, 0, NULL, NULL);
1451 IActiveScript_Close(engine);
1453 IDispatch_Release(script_disp);
1454 IActiveScript_Release(engine);
1456 ref = IActiveScriptParse_Release(parser);
1457 ok(!ref, "ref=%d\n", ref);
1458 return hres;
1461 static void parse_script_af(DWORD flags, const char *src)
1463 BSTR tmp;
1464 HRESULT hres;
1466 tmp = a2bstr(src);
1467 hres = parse_script(flags, tmp, NULL);
1468 SysFreeString(tmp);
1469 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1472 static HRESULT parse_script_ar(const char *src)
1474 BSTR tmp;
1475 HRESULT hres;
1477 tmp = a2bstr(src);
1478 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, NULL);
1479 SysFreeString(tmp);
1480 return hres;
1483 static void parse_script_a(const char *src)
1485 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1488 #define parse_htmlscript_a(a) _parse_htmlscript_a(__LINE__,a)
1489 static void _parse_htmlscript_a(unsigned line, const char *src)
1491 BSTR tmp;
1492 HRESULT hres;
1494 static const WCHAR script_delimW[] = {'<','/','S','C','R','I','P','T','>',0};
1496 tmp = a2bstr(src);
1497 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, script_delimW);
1498 SysFreeString(tmp);
1499 ok_(__FILE__,line)(hres == S_OK, "parse_script failed: %08x\n", hres);
1502 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1504 IDispatchEx *dispex;
1505 IDispatch *disp;
1506 BSTR str;
1507 HRESULT hres;
1509 static const WCHAR delimiterW[] = {'\"',0};
1511 str = a2bstr(src);
1512 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0,
1513 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1514 SysFreeString(str);
1515 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1516 ok(disp != NULL, "disp = NULL\n");
1518 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1519 IDispatch_Release(disp);
1520 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1522 return dispex;
1526 static void test_procedures(void)
1528 IActiveScriptParseProcedure2 *parse_proc;
1529 DISPPARAMS dp = {NULL};
1530 IActiveScript *script;
1531 IDispatchEx *proc;
1532 EXCEPINFO ei = {0};
1533 VARIANT v;
1534 HRESULT hres;
1536 script = create_and_init_script(0);
1538 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1539 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1541 proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1543 V_VT(&v) = VT_EMPTY;
1544 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
1545 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1547 IDispatchEx_Release(proc);
1549 IActiveScriptParseProcedure2_Release(parse_proc);
1551 close_script(script);
1554 static void test_gc(void)
1556 IActiveScriptParse *parser;
1557 IActiveScript *engine;
1558 BSTR src;
1559 HRESULT hres;
1561 strict_dispid_check = FALSE;
1563 engine = create_script();
1564 if(!engine)
1565 return;
1567 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1568 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1570 hres = IActiveScriptParse_InitNew(parser);
1571 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1573 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1574 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1576 hres = IActiveScript_AddNamedItem(engine, testW,
1577 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1578 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1580 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1581 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1583 src = a2bstr(
1584 "class C\n"
1585 " Public ref\n"
1586 " Public Sub Class_Terminate\n"
1587 " Call reportSuccess()\n"
1588 " End Sub\n"
1589 "End Class\n"
1590 "Dim x\n"
1591 "set x = new C\n"
1592 "set x.ref = x\n"
1593 "set x = nothing\n");
1595 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1596 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1597 SysFreeString(src);
1599 SET_EXPECT(global_success_d);
1600 SET_EXPECT(global_success_i);
1601 IActiveScript_Close(engine);
1602 CHECK_CALLED(global_success_d);
1603 CHECK_CALLED(global_success_i);
1605 IActiveScript_Release(engine);
1606 IActiveScriptParse_Release(parser);
1609 static void test_msgbox(void)
1611 HRESULT hres;
1613 uic_handling = SCRIPTUICHANDLING_NOUIDEFAULT;
1615 SET_EXPECT(GetUIBehavior);
1616 SET_EXPECT(GetWindow);
1617 SET_EXPECT(EnableModeless);
1618 hres = parse_script_ar("MsgBox \"testing...\"");
1619 CLEAR_CALLED(GetUIBehavior);
1620 CLEAR_CALLED(GetWindow);
1621 CLEAR_CALLED(EnableModeless);
1622 if(FAILED(hres)) {
1623 win_skip("Skipping MsgBox tests, broken (probably too old) vbscript\n");
1624 return;
1627 SET_EXPECT(GetUIBehavior);
1628 parse_script_a("dim r\n r=MsgBox(\"testing...\")\n Call ok(r=0, \"r=\"&r)");
1629 CHECK_CALLED(GetUIBehavior);
1631 SET_EXPECT(GetUIBehavior);
1632 parse_script_a("MsgBox 10");
1633 CHECK_CALLED(GetUIBehavior);
1635 uic_handling = SCRIPTUICHANDLING_ALLOW;
1637 SET_EXPECT(GetUIBehavior);
1638 SET_EXPECT(GetWindow);
1639 SET_EXPECT(EnableModeless);
1640 hres = parse_script_ar("MsgBox \"testing...\"");
1641 ok(FAILED(hres), "script not failed\n");
1642 CHECK_CALLED(GetUIBehavior);
1643 CHECK_CALLED(GetWindow);
1644 CHECK_CALLED(EnableModeless);
1646 uic_handling = SCRIPTUICHANDLING_NOUIERROR;
1648 SET_EXPECT(GetUIBehavior);
1649 hres = parse_script_ar("MsgBox \"testing...\"");
1650 ok(FAILED(hres), "script not failed\n");
1651 CHECK_CALLED(GetUIBehavior);
1654 static HRESULT test_global_vars_ref(BOOL use_close)
1656 IActiveScriptParse *parser;
1657 IActiveScript *engine;
1658 BSTR script_str;
1659 LONG ref;
1660 HRESULT hres;
1662 engine = create_script();
1663 if(!engine)
1664 return S_OK;
1666 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1667 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1668 if (FAILED(hres))
1670 IActiveScript_Release(engine);
1671 return hres;
1674 hres = IActiveScriptParse_InitNew(parser);
1675 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1677 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1678 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1680 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1681 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1683 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1684 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1686 refobj_ref = 0;
1688 script_str = a2bstr("Dim x\nset x = RefObj\n");
1689 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1690 SysFreeString(script_str);
1692 ok(refobj_ref, "refobj_ref = 0\n");
1694 if(use_close) {
1695 hres = IActiveScript_Close(engine);
1696 ok(hres == S_OK, "Close failed: %08x\n", hres);
1697 }else {
1698 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1699 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1702 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1704 IActiveScript_Release(engine);
1706 ref = IActiveScriptParse_Release(parser);
1707 ok(!ref, "ref=%d\n", ref);
1708 return hres;
1711 static BSTR get_script_from_file(const char *filename)
1713 DWORD size, len;
1714 HANDLE file, map;
1715 const char *file_map;
1716 BSTR ret;
1718 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1719 if(file == INVALID_HANDLE_VALUE) {
1720 trace("Could not open file: %u\n", GetLastError());
1721 return NULL;
1724 size = GetFileSize(file, NULL);
1726 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1727 CloseHandle(file);
1728 if(map == INVALID_HANDLE_VALUE) {
1729 trace("Could not create file mapping: %u\n", GetLastError());
1730 return NULL;
1733 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1734 CloseHandle(map);
1735 if(!file_map) {
1736 trace("MapViewOfFile failed: %u\n", GetLastError());
1737 return NULL;
1740 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1741 ret = SysAllocStringLen(NULL, len);
1742 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1744 UnmapViewOfFile(file_map);
1746 return ret;
1749 static void run_from_file(const char *filename)
1751 BSTR script_str;
1752 HRESULT hres;
1754 script_str = get_script_from_file(filename);
1755 if(!script_str)
1756 return;
1758 strict_dispid_check = FALSE;
1759 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str, NULL);
1760 SysFreeString(script_str);
1761 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1764 static void run_from_res(const char *name)
1766 const char *data;
1767 DWORD size, len;
1768 BSTR str;
1769 HRSRC src;
1770 HRESULT hres;
1772 strict_dispid_check = FALSE;
1773 test_name = name;
1775 src = FindResourceA(NULL, name, (LPCSTR)40);
1776 ok(src != NULL, "Could not find resource %s\n", name);
1778 size = SizeofResource(NULL, src);
1779 data = LoadResource(NULL, src);
1781 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1782 str = SysAllocStringLen(NULL, len);
1783 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1785 SET_EXPECT(global_success_d);
1786 SET_EXPECT(global_success_i);
1787 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str, NULL);
1788 CHECK_CALLED(global_success_d);
1789 CHECK_CALLED(global_success_i);
1791 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1792 SysFreeString(str);
1795 static void run_tests(void)
1797 HRESULT hres;
1799 strict_dispid_check = TRUE;
1801 parse_script_a("");
1802 parse_script_a("' empty ;");
1804 SET_EXPECT(global_success_d);
1805 SET_EXPECT(global_success_i);
1806 parse_script_a("reportSuccess");
1807 CHECK_CALLED(global_success_d);
1808 CHECK_CALLED(global_success_i);
1810 SET_EXPECT(global_success_d);
1811 SET_EXPECT(global_success_i);
1812 parse_script_a("reportSuccess()");
1813 CHECK_CALLED(global_success_d);
1814 CHECK_CALLED(global_success_i);
1816 SET_EXPECT(global_success_d);
1817 SET_EXPECT(global_success_i);
1818 parse_script_a("Call reportSuccess");
1819 CHECK_CALLED(global_success_d);
1820 CHECK_CALLED(global_success_i);
1822 SET_EXPECT(global_success_d);
1823 SET_EXPECT(global_success_i);
1824 parse_script_a("test.reportSuccess()");
1825 CHECK_CALLED(global_success_d);
1826 CHECK_CALLED(global_success_i);
1828 SET_EXPECT(global_vbvar_d);
1829 SET_EXPECT(global_vbvar_i);
1830 parse_script_a("Option Explicit\nvbvar = 3");
1831 CHECK_CALLED(global_vbvar_d);
1832 CHECK_CALLED(global_vbvar_i);
1834 SET_EXPECT(global_vbvar_d);
1835 SET_EXPECT(global_vbvar_i);
1836 parse_script_a("Option Explicit\nvbvar() = 3");
1837 CHECK_CALLED(global_vbvar_d);
1838 CHECK_CALLED(global_vbvar_i);
1840 SET_EXPECT(testobj_propget_d);
1841 SET_EXPECT(testobj_propget_i);
1842 parse_script_a("dim x\nx = testObj.propget");
1843 CHECK_CALLED(testobj_propget_d);
1844 CHECK_CALLED(testobj_propget_i);
1846 SET_EXPECT(testobj_propput_d);
1847 SET_EXPECT(testobj_propput_i);
1848 parse_script_a("testObj.propput = 1");
1849 CHECK_CALLED(testobj_propput_d);
1850 CHECK_CALLED(testobj_propput_i);
1852 SET_EXPECT(global_propargput_d);
1853 SET_EXPECT(global_propargput_i);
1854 parse_script_a("propargput(counter(), counter()) = counter()");
1855 CHECK_CALLED(global_propargput_d);
1856 CHECK_CALLED(global_propargput_i);
1858 SET_EXPECT(global_propargput_d);
1859 SET_EXPECT(global_propargput_i);
1860 parse_script_a("test.propargput(counter(), counter()) = counter()");
1861 CHECK_CALLED(global_propargput_d);
1862 CHECK_CALLED(global_propargput_i);
1864 SET_EXPECT(global_propargput1_d);
1865 SET_EXPECT(global_propargput1_i);
1866 parse_script_a("propargput1 (counter()) = counter()");
1867 CHECK_CALLED(global_propargput1_d);
1868 CHECK_CALLED(global_propargput1_i);
1870 SET_EXPECT(global_propargput1_d);
1871 SET_EXPECT(global_propargput1_i);
1872 parse_script_a("test.propargput1(counter()) = counter()");
1873 CHECK_CALLED(global_propargput1_d);
1874 CHECK_CALLED(global_propargput1_i);
1876 parse_htmlscript_a("<!--");
1877 parse_htmlscript_a(" -->");
1878 parse_htmlscript_a("<!--\ndim x\nx=1\n-->\n");
1879 parse_htmlscript_a("<!--\ndim x\n-->\n<!--\nx=1\n-->\n");
1881 hres = parse_script_ar("<!--");
1882 ok(FAILED(hres), "script didn't fail\n");
1884 SET_EXPECT(global_success_d);
1885 SET_EXPECT(global_success_i);
1886 parse_htmlscript_a("<!--\n<!-- ignore this <> <>\n--> <>\nCall reportSuccess()\n-->\n");
1887 CHECK_CALLED(global_success_d);
1888 CHECK_CALLED(global_success_i);
1890 next_cnt = 0;
1891 SET_EXPECT(collectionobj_newenum_i);
1892 SET_EXPECT(Next);
1893 parse_script_a("for each x in collectionObj\nnext");
1894 CHECK_CALLED(collectionobj_newenum_i);
1895 CHECK_CALLED(Next);
1896 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1898 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1900 parse_script_a("x = _ \n3");
1902 test_global_vars_ref(TRUE);
1903 test_global_vars_ref(FALSE);
1905 strict_dispid_check = FALSE;
1907 parse_script_a("Sub testsub\n"
1908 "x = 1\n"
1909 "Call ok(x = 1, \"x = \" & x)\n"
1910 "End Sub\n"
1911 "Call testsub()");
1913 parse_script_a("Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n");
1914 parse_script_a("Call ok(x = \"\", \"x = \" & x)\n");
1915 parse_script_a("x = y\n"
1916 "Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n"
1917 "Call ok(getVT(y) = \"VT_EMPTY*\", \"getVT(y) = \" & getVT(y))");
1918 hres = parse_script_ar("x = y(\"a\")");
1919 ok(FAILED(hres), "script didn't fail\n");
1921 run_from_res("lang.vbs");
1922 run_from_res("api.vbs");
1924 test_procedures();
1925 test_gc();
1926 test_msgbox();
1929 static BOOL check_vbscript(void)
1931 IActiveScriptParseProcedure2 *vbscript;
1932 HRESULT hres;
1934 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1935 &IID_IActiveScriptParseProcedure2, (void**)&vbscript);
1936 if(SUCCEEDED(hres))
1937 IActiveScriptParseProcedure2_Release(vbscript);
1939 return hres == S_OK;
1942 START_TEST(run)
1944 int argc;
1945 char **argv;
1947 is_english = is_lang_english();
1948 if(!is_english)
1949 skip("Skipping some tests in non-English locale\n");
1951 argc = winetest_get_mainargs(&argv);
1953 CoInitialize(NULL);
1955 if(!check_vbscript()) {
1956 win_skip("Broken engine, probably too old\n");
1957 }else if(argc > 2) {
1958 allow_ui = TRUE;
1959 uic_handling = SCRIPTUICHANDLING_ALLOW;
1960 run_from_file(argv[2]);
1961 }else {
1962 run_tests();
1965 CoUninitialize();