Release 1.5.29.
[wine] / dlls / vbscript / tests / run.c
1 /*
2  * Copyright 2011 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include <stdio.h>
20
21 #define COBJMACROS
22 #define CONST_VTABLE
23
24 #include <ole2.h>
25 #include <dispex.h>
26 #include <activscp.h>
27
28 #include "vbsregexp55.h"
29
30 #include "wine/test.h"
31
32 #ifdef _WIN64
33
34 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
35 #define IActiveScriptParse_Release IActiveScriptParse64_Release
36 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
37 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
38 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
39 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
40
41 #else
42
43 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
44 #define IActiveScriptParse_Release IActiveScriptParse32_Release
45 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
46 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
47 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
48 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
49
50 #endif
51
52 extern const CLSID CLSID_VBScript;
53 extern const CLSID CLSID_VBScriptRegExp;
54
55 #define DEFINE_EXPECT(func) \
56     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
57
58 #define SET_EXPECT(func) \
59     expect_ ## func = TRUE
60
61 #define CHECK_EXPECT2(func) \
62     do { \
63         ok(expect_ ##func, "unexpected call " #func "\n"); \
64         called_ ## func = TRUE; \
65     }while(0)
66
67 #define CHECK_EXPECT(func) \
68     do { \
69         CHECK_EXPECT2(func); \
70         expect_ ## func = FALSE; \
71     }while(0)
72
73 #define CHECK_CALLED(func) \
74     do { \
75         ok(called_ ## func, "expected " #func "\n"); \
76         expect_ ## func = called_ ## func = FALSE; \
77     }while(0)
78
79 #define CLEAR_CALLED(func) \
80     expect_ ## func = called_ ## func = FALSE
81
82 DEFINE_EXPECT(global_success_d);
83 DEFINE_EXPECT(global_success_i);
84 DEFINE_EXPECT(global_vbvar_d);
85 DEFINE_EXPECT(global_vbvar_i);
86 DEFINE_EXPECT(testobj_propget_d);
87 DEFINE_EXPECT(testobj_propget_i);
88 DEFINE_EXPECT(testobj_propput_d);
89 DEFINE_EXPECT(testobj_propput_i);
90 DEFINE_EXPECT(global_propargput_d);
91 DEFINE_EXPECT(global_propargput_i);
92 DEFINE_EXPECT(global_propargput1_d);
93 DEFINE_EXPECT(global_propargput1_i);
94 DEFINE_EXPECT(collectionobj_newenum_i);
95 DEFINE_EXPECT(Next);
96 DEFINE_EXPECT(GetWindow);
97 DEFINE_EXPECT(GetUIBehavior);
98 DEFINE_EXPECT(EnableModeless);
99
100 #define DISPID_GLOBAL_REPORTSUCCESS 1000
101 #define DISPID_GLOBAL_TRACE         1001
102 #define DISPID_GLOBAL_OK            1002
103 #define DISPID_GLOBAL_GETVT         1003
104 #define DISPID_GLOBAL_ISENGLANG     1004
105 #define DISPID_GLOBAL_VBVAR         1005
106 #define DISPID_GLOBAL_TESTOBJ       1006
107 #define DISPID_GLOBAL_ISNULLDISP    1007
108 #define DISPID_GLOBAL_TESTDISP      1008
109 #define DISPID_GLOBAL_REFOBJ        1009
110 #define DISPID_GLOBAL_COUNTER       1010
111 #define DISPID_GLOBAL_PROPARGPUT    1011
112 #define DISPID_GLOBAL_PROPARGPUT1   1012
113 #define DISPID_GLOBAL_COLLOBJ       1013
114 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
115
116 #define DISPID_TESTOBJ_PROPGET      2000
117 #define DISPID_TESTOBJ_PROPPUT      2001
118
119 #define DISPID_COLLOBJ_RESET        3000
120
121 static const WCHAR testW[] = {'t','e','s','t',0};
122 static const WCHAR emptyW[] = {0};
123
124 static BOOL strict_dispid_check, is_english, allow_ui;
125 static const char *test_name = "(null)";
126 static int test_counter;
127 static SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_NOUIERROR;
128
129 static BSTR a2bstr(const char *str)
130 {
131     BSTR ret;
132     int len;
133
134     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
135     ret = SysAllocStringLen(NULL, len-1);
136     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
137
138     return ret;
139 }
140
141 static int strcmp_wa(LPCWSTR strw, const char *stra)
142 {
143     CHAR buf[512];
144     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
145     return lstrcmpA(buf, stra);
146 }
147
148 static const char *debugstr_guid(REFIID riid)
149 {
150     static char buf[50];
151
152     sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
153             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
154             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
155             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
156
157     return buf;
158 }
159
160 static const char *vt2a(VARIANT *v)
161 {
162     if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
163         static char buf[64];
164         sprintf(buf, "%s*", vt2a(V_BYREF(v)));
165         return buf;
166     }
167
168     switch(V_VT(v)) {
169     case VT_EMPTY:
170         return "VT_EMPTY";
171     case VT_NULL:
172         return "VT_NULL";
173     case VT_I2:
174         return "VT_I2";
175     case VT_I4:
176         return "VT_I4";
177     case VT_R8:
178         return "VT_R8";
179     case VT_DATE:
180         return "VT_DATE";
181     case VT_BSTR:
182         return "VT_BSTR";
183     case VT_DISPATCH:
184         return "VT_DISPATCH";
185     case VT_BOOL:
186         return "VT_BOOL";
187     case VT_ARRAY|VT_VARIANT:
188         return "VT_ARRAY|VT_VARIANT";
189     default:
190         ok(0, "unknown vt %d\n", V_VT(v));
191         return NULL;
192     }
193 }
194
195 /* Returns true if the user interface is in English. Note that this does not
196  * presume of the formatting of dates, numbers, etc.
197  */
198 static BOOL is_lang_english(void)
199 {
200     static HMODULE hkernel32 = NULL;
201     static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
202     static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
203
204     if (!hkernel32)
205     {
206         hkernel32 = GetModuleHandleA("kernel32.dll");
207         pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
208         pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
209     }
210     if (pGetThreadUILanguage && PRIMARYLANGID(pGetThreadUILanguage()) != LANG_ENGLISH)
211         return FALSE;
212     if (pGetUserDefaultUILanguage && PRIMARYLANGID(pGetUserDefaultUILanguage()) != LANG_ENGLISH)
213         return FALSE;
214
215     return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
216 }
217
218 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
219 {
220     ok(0, "unexpected call\n");
221     return E_NOINTERFACE;
222 }
223
224 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
225 {
226     return 2;
227 }
228
229 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
230 {
231     return 1;
232 }
233
234 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
235         REFIID riid, void **ppv)
236 {
237     ok(0, "unexpected service %s\n", debugstr_guid(guidService));
238     return E_NOINTERFACE;
239 }
240
241 static const IServiceProviderVtbl ServiceProviderVtbl = {
242     ServiceProvider_QueryInterface,
243     ServiceProvider_AddRef,
244     ServiceProvider_Release,
245     ServiceProvider_QueryService
246 };
247
248 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
249
250 static void test_disp(IDispatch *disp)
251 {
252     DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
253     DISPID named_args[5] = {DISPID_PROPERTYPUT};
254     VARIANT v, args[5];
255     DISPPARAMS dp = {args, named_args};
256     IDispatchEx *dispex;
257     EXCEPINFO ei = {0};
258     BSTR str;
259     HRESULT hres;
260
261     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
262     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
263
264     str = a2bstr("publicProp");
265     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
266     SysFreeString(str);
267     ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
268
269     str = a2bstr("PUBLICPROP");
270     hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
271     SysFreeString(str);
272     ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
273     ok(public_prop_id == id, "id = %d\n", public_prop_id);
274
275     str = a2bstr("publicPROP2");
276     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
277     SysFreeString(str);
278     ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
279
280     str = a2bstr("defValGet");
281     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
282     SysFreeString(str);
283     ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
284     ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
285
286     str = a2bstr("privateProp");
287     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
288     SysFreeString(str);
289     ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
290     ok(id == -1, "id = %d\n", id);
291
292     str = a2bstr("class_initialize");
293     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
294     SysFreeString(str);
295     ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
296
297     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
298     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
299     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
300
301     V_VT(args) = VT_BOOL;
302     V_BOOL(args) = VARIANT_TRUE;
303     dp.cArgs = dp.cNamedArgs = 1;
304     V_VT(&v) = VT_BOOL;
305     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
306     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
307     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
308
309     dp.cArgs = dp.cNamedArgs = 0;
310     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
311     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
312     ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
313     ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
314
315     dp.cArgs = dp.cNamedArgs = 0;
316     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
317     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
318     ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
319     ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
320
321     dp.cArgs = 1;
322     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
323     ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
324     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
325
326     V_VT(args) = VT_BOOL;
327     V_BOOL(args) = VARIANT_FALSE;
328     dp.cArgs = 1;
329     V_VT(&v) = VT_BOOL;
330     hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
331     ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
332
333     str = a2bstr("publicFunction");
334     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
335     SysFreeString(str);
336     ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
337     ok(public_func_id != -1, "public_func_id = -1\n");
338
339     str = a2bstr("publicSub");
340     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
341     SysFreeString(str);
342     ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
343     ok(public_sub_id != -1, "public_func_id = -1\n");
344
345     dp.cArgs = dp.cNamedArgs = 0;
346     hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
347     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
348     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
349     ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
350
351     dp.cArgs = dp.cNamedArgs = 0;
352     hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
353     ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
354     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
355
356     dp.cArgs = dp.cNamedArgs = 0;
357     hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
358     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
359     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
360     ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
361
362     dp.cArgs = dp.cNamedArgs = 0;
363     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
364     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
365     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
366
367     dp.cArgs = dp.cNamedArgs = 0;
368     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
369     ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
370     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
371
372     dp.cArgs = dp.cNamedArgs = 0;
373     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
374     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
375     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
376
377     V_VT(args) = VT_BOOL;
378     V_BOOL(args) = VARIANT_TRUE;
379     dp.cArgs = dp.cNamedArgs = 1;
380     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
381     ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
382
383     dp.cArgs = dp.cNamedArgs = 0;
384     hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
385     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
386     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
387     ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
388
389     dp.cArgs = dp.cNamedArgs = 0;
390     hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
391     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
392     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
393     ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
394
395     dp.cArgs = dp.cNamedArgs = 0;
396     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|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));
399
400     dp.cArgs = dp.cNamedArgs = 0;
401     hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
402     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
403     ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
404
405     str = a2bstr("privateSub");
406     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
407     SysFreeString(str);
408     ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
409     ok(id == -1, "id = %d\n", id);
410
411     str = a2bstr("dynprop");
412     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|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     hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
416     ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
417     ok(id == -1, "id = %d\n", id);
418     SysFreeString(str);
419
420     str = a2bstr("publicProp");
421     hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
422     SysFreeString(str);
423     ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
424
425     id = 0xdeadbeef;
426     str = a2bstr("publicProp");
427     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
428     SysFreeString(str);
429     ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
430     ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
431
432     id = 0xdeadbeef;
433     str = a2bstr("publicprop");
434     hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
435     SysFreeString(str);
436     ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
437     ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
438
439     IDispatchEx_Release(dispex);
440 }
441
442 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
443 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
444 {
445     ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
446 }
447
448 static IDispatchEx enumDisp;
449
450 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
451 {
452     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
453         *ppv = iface;
454         return S_OK;
455     }
456
457     if(IsEqualGUID(riid, &IID_IDispatch)) {
458         *ppv = &enumDisp;
459         return S_OK;
460     }
461
462     ok(0, "unexpected call %s\n", debugstr_guid(riid));
463     return E_NOINTERFACE;
464 }
465
466 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
467 {
468     return 2;
469 }
470
471 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
472 {
473     return 1;
474 }
475
476 static unsigned next_cnt;
477
478 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
479 {
480     if(strict_dispid_check)
481         CHECK_EXPECT2(Next);
482
483     ok(celt == 1, "celt = %d\n", celt);
484     ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
485     ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
486
487     if(next_cnt++ < 3) {
488         V_VT(rgVar) = VT_I2;
489         V_I2(rgVar) = next_cnt;
490         return S_OK;
491     }
492
493     return S_FALSE;
494 }
495
496 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
497 {
498     ok(0, "unexpected call\n");
499     return E_NOTIMPL;
500 }
501
502 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
503 {
504     ok(0, "unexpected call\n");
505     return E_NOTIMPL;
506 }
507
508 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
509 {
510     ok(0, "unexpected call\n");
511     return E_NOTIMPL;
512 }
513
514 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
515     EnumVARIANT_QueryInterface,
516     EnumVARIANT_AddRef,
517     EnumVARIANT_Release,
518     EnumVARIANT_Next,
519     EnumVARIANT_Skip,
520     EnumVARIANT_Reset,
521     EnumVARIANT_Clone
522 };
523
524 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
525
526 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
527 {
528     *ppv = NULL;
529
530     if(IsEqualGUID(riid, &IID_IUnknown)
531        || IsEqualGUID(riid, &IID_IDispatch)
532        || IsEqualGUID(riid, &IID_IDispatchEx))
533         *ppv = iface;
534     else {
535         trace("QI %s\n", debugstr_guid(riid));
536         return E_NOINTERFACE;
537     }
538
539     IUnknown_AddRef((IUnknown*)*ppv);
540     return S_OK;
541 }
542
543 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
544 {
545     return 2;
546 }
547
548 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
549 {
550     return 1;
551 }
552
553 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
554 {
555     ok(0, "unexpected call\n");
556     return E_NOTIMPL;
557 }
558
559 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
560                                               LCID lcid, ITypeInfo **ppTInfo)
561 {
562     ok(0, "unexpected call\n");
563     return E_NOTIMPL;
564 }
565
566 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
567                                                 LPOLESTR *rgszNames, UINT cNames,
568                                                 LCID lcid, DISPID *rgDispId)
569 {
570     ok(0, "unexpected call\n");
571     return E_NOTIMPL;
572 }
573
574 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
575                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
576                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
577 {
578     ok(0, "unexpected call\n");
579     return E_NOTIMPL;
580 }
581
582 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
583 {
584     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
589 {
590     ok(0, "unexpected call\n");
591     return E_NOTIMPL;
592 }
593
594 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
595 {
596     ok(0, "unexpected call\n");
597     return E_NOTIMPL;
598 }
599
600 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
601 {
602     ok(0, "unexpected call\n");
603     return E_NOTIMPL;
604 }
605
606 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
607 {
608     ok(0, "unexpected call\n");
609     return E_NOTIMPL;
610 }
611
612 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
613 {
614     ok(0, "unexpected call\n");
615     return E_NOTIMPL;
616 }
617
618 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
619 {
620     ok(0, "unexpected call\n");
621     return E_NOTIMPL;
622 }
623
624 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
625         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
626 {
627     ok(0, "unexpected call %d\n", id);
628     return E_NOTIMPL;
629 }
630
631 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
632 {
633     if(!strcmp_wa(bstrName, "propget")) {
634         CHECK_EXPECT(testobj_propget_d);
635         test_grfdex(grfdex, fdexNameCaseInsensitive);
636         *pid = DISPID_TESTOBJ_PROPGET;
637         return S_OK;
638     }
639     if(!strcmp_wa(bstrName, "propput")) {
640         CHECK_EXPECT(testobj_propput_d);
641         test_grfdex(grfdex, fdexNameCaseInsensitive);
642         *pid = DISPID_TESTOBJ_PROPPUT;
643         return S_OK;
644     }
645
646     ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
647     return DISP_E_UNKNOWNNAME;
648 }
649
650 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
651         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
652 {
653     switch(id) {
654     case DISPID_TESTOBJ_PROPGET:
655         CHECK_EXPECT(testobj_propget_i);
656
657         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
658         ok(pdp != NULL, "pdp == NULL\n");
659         ok(!pdp->rgvarg, "rgvarg == NULL\n");
660         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
661         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
662         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
663         ok(pvarRes != NULL, "pvarRes == NULL\n");
664         ok(pei != NULL, "pei == NULL\n");
665
666         V_VT(pvarRes) = VT_I2;
667         V_I2(pvarRes) = 10;
668         return S_OK;
669     case DISPID_TESTOBJ_PROPPUT:
670         CHECK_EXPECT(testobj_propput_i);
671
672         ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
673         ok(pdp != NULL, "pdp == NULL\n");
674         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
675         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
676         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
677         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
678         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
679         ok(!pvarRes, "pvarRes != NULL\n");
680         ok(pei != NULL, "pei == NULL\n");
681
682         ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
683         ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
684         return S_OK;
685     }
686
687     ok(0, "unexpected call %d\n", id);
688     return E_FAIL;
689 }
690
691 static IDispatchExVtbl testObjVtbl = {
692     DispatchEx_QueryInterface,
693     DispatchEx_AddRef,
694     DispatchEx_Release,
695     DispatchEx_GetTypeInfoCount,
696     DispatchEx_GetTypeInfo,
697     DispatchEx_GetIDsOfNames,
698     DispatchEx_Invoke,
699     testObj_GetDispID,
700     testObj_InvokeEx,
701     DispatchEx_DeleteMemberByName,
702     DispatchEx_DeleteMemberByDispID,
703     DispatchEx_GetMemberProperties,
704     DispatchEx_GetMemberName,
705     DispatchEx_GetNextDispID,
706     DispatchEx_GetNameSpaceParent
707 };
708
709 static IDispatchEx testObj = { &testObjVtbl };
710
711 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
712 {
713     return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
714 }
715
716 static IDispatchExVtbl enumDispVtbl = {
717     enumDisp_QueryInterface,
718     DispatchEx_AddRef,
719     DispatchEx_Release,
720     DispatchEx_GetTypeInfoCount,
721     DispatchEx_GetTypeInfo,
722     DispatchEx_GetIDsOfNames,
723     DispatchEx_Invoke,
724     DispatchEx_GetDispID,
725     DispatchEx_InvokeEx,
726     DispatchEx_DeleteMemberByName,
727     DispatchEx_DeleteMemberByDispID,
728     DispatchEx_GetMemberProperties,
729     DispatchEx_GetMemberName,
730     DispatchEx_GetNextDispID,
731     DispatchEx_GetNameSpaceParent
732 };
733
734 static IDispatchEx enumDisp = { &enumDispVtbl };
735
736 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
737 {
738     if(!strcmp_wa(bstrName, "reset")) {
739         *pid = DISPID_COLLOBJ_RESET;
740         return S_OK;
741     }
742
743     ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
744     return DISP_E_UNKNOWNNAME;
745 }
746
747 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
748         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
749 {
750     switch(id) {
751     case DISPID_NEWENUM:
752         if(strict_dispid_check)
753             CHECK_EXPECT(collectionobj_newenum_i);
754
755         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
756         ok(pdp != NULL, "pdp == NULL\n");
757         ok(!pdp->rgvarg, "rgvarg == NULL\n");
758         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
759         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
760         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
761         ok(pvarRes != NULL, "pvarRes == NULL\n");
762         ok(pei != NULL, "pei == NULL\n");
763
764         V_VT(pvarRes) = VT_UNKNOWN;
765         V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
766         return S_OK;
767     case DISPID_COLLOBJ_RESET:
768         next_cnt = 0;
769         return S_OK;
770     }
771
772     ok(0, "unexpected call %d\n", id);
773     return E_NOTIMPL;
774 }
775
776 static IDispatchExVtbl collectionObjVtbl = {
777     DispatchEx_QueryInterface,
778     DispatchEx_AddRef,
779     DispatchEx_Release,
780     DispatchEx_GetTypeInfoCount,
781     DispatchEx_GetTypeInfo,
782     DispatchEx_GetIDsOfNames,
783     DispatchEx_Invoke,
784     collectionObj_GetDispID,
785     collectionObj_InvokeEx,
786     DispatchEx_DeleteMemberByName,
787     DispatchEx_DeleteMemberByDispID,
788     DispatchEx_GetMemberProperties,
789     DispatchEx_GetMemberName,
790     DispatchEx_GetNextDispID,
791     DispatchEx_GetNameSpaceParent
792 };
793
794 static IDispatchEx collectionObj = { &collectionObjVtbl };
795
796 static ULONG refobj_ref;
797
798 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
799 {
800     return ++refobj_ref;
801 }
802
803 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
804 {
805     return --refobj_ref;
806 }
807
808 static IDispatchExVtbl RefObjVtbl = {
809     DispatchEx_QueryInterface,
810     RefObj_AddRef,
811     RefObj_Release,
812     DispatchEx_GetTypeInfoCount,
813     DispatchEx_GetTypeInfo,
814     DispatchEx_GetIDsOfNames,
815     DispatchEx_Invoke,
816     DispatchEx_GetDispID,
817     DispatchEx_InvokeEx,
818     DispatchEx_DeleteMemberByName,
819     DispatchEx_DeleteMemberByDispID,
820     DispatchEx_GetMemberProperties,
821     DispatchEx_GetMemberName,
822     DispatchEx_GetNextDispID,
823     DispatchEx_GetNameSpaceParent
824 };
825
826 static IDispatchEx RefObj = { &RefObjVtbl };
827
828 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
829 {
830     if(!strcmp_wa(bstrName, "ok")) {
831         test_grfdex(grfdex, fdexNameCaseInsensitive);
832         *pid = DISPID_GLOBAL_OK;
833         return S_OK;
834     }
835     if(!strcmp_wa(bstrName, "trace")) {
836         test_grfdex(grfdex, fdexNameCaseInsensitive);
837         *pid = DISPID_GLOBAL_TRACE;
838         return S_OK;
839     }
840     if(!strcmp_wa(bstrName, "reportSuccess")) {
841         CHECK_EXPECT(global_success_d);
842         test_grfdex(grfdex, fdexNameCaseInsensitive);
843         *pid = DISPID_GLOBAL_REPORTSUCCESS;
844         return S_OK;
845     }
846     if(!strcmp_wa(bstrName, "getVT")) {
847         test_grfdex(grfdex, fdexNameCaseInsensitive);
848         *pid = DISPID_GLOBAL_GETVT;
849         return S_OK;
850     }
851     if(!strcmp_wa(bstrName, "isEnglishLang")) {
852         test_grfdex(grfdex, fdexNameCaseInsensitive);
853         *pid = DISPID_GLOBAL_ISENGLANG;
854         return S_OK;
855     }
856     if(!strcmp_wa(bstrName, "testObj")) {
857         test_grfdex(grfdex, fdexNameCaseInsensitive);
858         *pid = DISPID_GLOBAL_TESTOBJ;
859         return S_OK;
860     }
861     if(!strcmp_wa(bstrName, "collectionObj")) {
862         test_grfdex(grfdex, fdexNameCaseInsensitive);
863         *pid = DISPID_GLOBAL_COLLOBJ;
864         return S_OK;
865     }
866     if(!strcmp_wa(bstrName, "vbvar")) {
867         CHECK_EXPECT(global_vbvar_d);
868         test_grfdex(grfdex, fdexNameCaseInsensitive);
869         *pid = DISPID_GLOBAL_VBVAR;
870         return S_OK;
871     }
872     if(!strcmp_wa(bstrName, "isNullDisp")) {
873         test_grfdex(grfdex, fdexNameCaseInsensitive);
874         *pid = DISPID_GLOBAL_ISNULLDISP;
875         return S_OK;
876     }
877     if(!strcmp_wa(bstrName, "testDisp")) {
878         test_grfdex(grfdex, fdexNameCaseInsensitive);
879         *pid = DISPID_GLOBAL_TESTDISP;
880         return S_OK;
881     }
882     if(!strcmp_wa(bstrName, "RefObj")) {
883         test_grfdex(grfdex, fdexNameCaseInsensitive);
884         *pid = DISPID_GLOBAL_REFOBJ;
885         return S_OK;
886     }
887     if(!strcmp_wa(bstrName, "propargput")) {
888         CHECK_EXPECT(global_propargput_d);
889         test_grfdex(grfdex, fdexNameCaseInsensitive);
890         *pid = DISPID_GLOBAL_PROPARGPUT;
891         return S_OK;
892     }
893     if(!strcmp_wa(bstrName, "propargput1")) {
894         CHECK_EXPECT(global_propargput1_d);
895         test_grfdex(grfdex, fdexNameCaseInsensitive);
896         *pid = DISPID_GLOBAL_PROPARGPUT1;
897         return S_OK;
898     }
899     if(!strcmp_wa(bstrName, "counter")) {
900         test_grfdex(grfdex, fdexNameCaseInsensitive);
901         *pid = DISPID_GLOBAL_COUNTER;
902         return S_OK;
903     }
904     if(!strcmp_wa(bstrName, "doubleAsString")) {
905         test_grfdex(grfdex, fdexNameCaseInsensitive);
906         *pid = DISPID_GLOBAL_DOUBLEASSTRING;
907         return S_OK;
908     }
909
910     if(strict_dispid_check && strcmp_wa(bstrName, "x"))
911         ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
912     return DISP_E_UNKNOWNNAME;
913 }
914
915 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
916         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
917 {
918     switch(id) {
919     case DISPID_GLOBAL_OK: {
920         VARIANT *b;
921
922         ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
923         ok(pdp != NULL, "pdp == NULL\n");
924         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
925         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
926         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
927         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
928         if(wFlags & INVOKE_PROPERTYGET)
929             ok(pvarRes != NULL, "pvarRes == NULL\n");
930         else
931             ok(!pvarRes, "pvarRes != NULL\n");
932         ok(pei != NULL, "pei == NULL\n");
933
934         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
935
936         b = pdp->rgvarg+1;
937         if(V_VT(b) == (VT_BYREF|VT_VARIANT))
938             b = V_BYREF(b);
939
940         ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
941
942         ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
943         return S_OK;
944     }
945
946      case DISPID_GLOBAL_TRACE:
947         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
948         ok(pdp != NULL, "pdp == NULL\n");
949         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
950         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
951         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
952         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
953         ok(!pvarRes, "pvarRes != NULL\n");
954         ok(pei != NULL, "pei == NULL\n");
955
956         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
957         if(V_VT(pdp->rgvarg) == VT_BSTR)
958             trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
959
960         return S_OK;
961
962     case DISPID_GLOBAL_REPORTSUCCESS:
963         CHECK_EXPECT(global_success_i);
964
965         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
966         ok(pdp != NULL, "pdp == NULL\n");
967         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
968         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
969         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
970         ok(!pvarRes, "pvarRes != NULL\n");
971         ok(pei != NULL, "pei == NULL\n");
972
973         return S_OK;
974
975     case DISPID_GLOBAL_GETVT:
976         ok(pdp != NULL, "pdp == NULL\n");
977         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
978         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
979         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
980         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
981         ok(pvarRes != NULL, "pvarRes == NULL\n");
982         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
983         ok(pei != NULL, "pei == NULL\n");
984
985         V_VT(pvarRes) = VT_BSTR;
986         V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
987         return S_OK;
988
989     case DISPID_GLOBAL_ISENGLANG:
990         ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
991         ok(pdp != NULL, "pdp == NULL\n");
992         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
993         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
994         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
995         ok(pvarRes != NULL, "pvarRes == NULL\n");
996         ok(pei != NULL, "pei == NULL\n");
997
998         V_VT(pvarRes) = VT_BOOL;
999         V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
1000         return S_OK;
1001
1002     case DISPID_GLOBAL_VBVAR:
1003         CHECK_EXPECT(global_vbvar_i);
1004
1005         ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1006         ok(pdp != NULL, "pdp == NULL\n");
1007         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1008         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1009         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1010         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1011         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1012         ok(!pvarRes, "pvarRes != NULL\n");
1013         ok(pei != NULL, "pei == NULL\n");
1014
1015         ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1016         ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1017         return S_OK;
1018
1019     case DISPID_GLOBAL_TESTOBJ:
1020         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1021
1022         ok(pdp != NULL, "pdp == NULL\n");
1023         ok(!pdp->rgvarg, "rgvarg != NULL\n");
1024         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1025         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1026         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1027         ok(pvarRes != NULL, "pvarRes == NULL\n");
1028         ok(pei != NULL, "pei == NULL\n");
1029
1030         V_VT(pvarRes) = VT_DISPATCH;
1031         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1032         return S_OK;
1033
1034     case DISPID_GLOBAL_COLLOBJ:
1035         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1036
1037         ok(pdp != NULL, "pdp == NULL\n");
1038         ok(!pdp->rgvarg, "rgvarg != NULL\n");
1039         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1040         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1041         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1042         ok(pvarRes != NULL, "pvarRes == NULL\n");
1043         ok(pei != NULL, "pei == NULL\n");
1044
1045         V_VT(pvarRes) = VT_DISPATCH;
1046         V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1047         return S_OK;
1048
1049     case DISPID_GLOBAL_REFOBJ:
1050         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1051
1052         ok(pdp != NULL, "pdp == NULL\n");
1053         ok(!pdp->rgvarg, "rgvarg == NULL\n");
1054         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1055         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1056         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1057         ok(pvarRes != NULL, "pvarRes == NULL\n");
1058         ok(pei != NULL, "pei == NULL\n");
1059
1060         IDispatchEx_AddRef(&RefObj);
1061         V_VT(pvarRes) = VT_DISPATCH;
1062         V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1063         return S_OK;
1064
1065     case DISPID_GLOBAL_ISNULLDISP: {
1066         VARIANT *v;
1067
1068         ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1069         ok(pdp != NULL, "pdp == NULL\n");
1070         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1071         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1072         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1073         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1074         ok(pvarRes != NULL, "pvarRes == NULL\n");
1075         ok(pei != NULL, "pei == NULL\n");
1076
1077         v = pdp->rgvarg;
1078         if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1079             v = V_VARIANTREF(v);
1080
1081         ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1082         V_VT(pvarRes) = VT_BOOL;
1083         V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1084         return S_OK;
1085     }
1086
1087     case DISPID_GLOBAL_TESTDISP:
1088         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1089         ok(pdp != NULL, "pdp == NULL\n");
1090         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1091         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1092         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1093         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1094         ok(!pvarRes, "pvarRes != NULL\n");
1095         ok(pei != NULL, "pei == NULL\n");
1096
1097         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1098         test_disp(V_DISPATCH(pdp->rgvarg));
1099         return S_OK;
1100
1101     case DISPID_GLOBAL_PROPARGPUT:
1102         CHECK_EXPECT(global_propargput_i);
1103
1104         ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1105         ok(pdp != NULL, "pdp == NULL\n");
1106         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1107         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1108         ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1109         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1110         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1111         ok(!pvarRes, "pvarRes != NULL\n");
1112         ok(pei != NULL, "pei == NULL\n");
1113
1114         ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1115         ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1116
1117         ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1118         ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1119
1120         ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1121         ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1122         return S_OK;
1123
1124     case DISPID_GLOBAL_PROPARGPUT1:
1125         CHECK_EXPECT(global_propargput1_i);
1126
1127         ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1128         ok(pdp != NULL, "pdp == NULL\n");
1129         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1130         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1131         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1132         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1133         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1134         ok(!pvarRes, "pvarRes != NULL\n");
1135         ok(pei != NULL, "pei == NULL\n");
1136
1137         ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1138         ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1139
1140         ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1141         ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1142
1143         return S_OK;
1144
1145     case DISPID_GLOBAL_COUNTER:
1146         ok(pdp != NULL, "pdp == NULL\n");
1147         todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1148         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1149         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1150         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1151         ok(pvarRes != NULL, "pvarRes == NULL\n");
1152         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1153         ok(pei != NULL, "pei == NULL\n");
1154
1155         V_VT(pvarRes) = VT_I2;
1156         V_I2(pvarRes) = test_counter++;
1157         return S_OK;
1158
1159     case DISPID_GLOBAL_DOUBLEASSTRING:
1160         ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1161         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1162         ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1163         ok(pvarRes != NULL, "pvarRes == NULL\n");
1164
1165         V_VT(pvarRes) = VT_BSTR;
1166         return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1167     }
1168
1169     ok(0, "unexpected call %d\n", id);
1170     return DISP_E_MEMBERNOTFOUND;
1171 }
1172
1173 static IDispatchExVtbl GlobalVtbl = {
1174     DispatchEx_QueryInterface,
1175     DispatchEx_AddRef,
1176     DispatchEx_Release,
1177     DispatchEx_GetTypeInfoCount,
1178     DispatchEx_GetTypeInfo,
1179     DispatchEx_GetIDsOfNames,
1180     DispatchEx_Invoke,
1181     Global_GetDispID,
1182     Global_InvokeEx,
1183     DispatchEx_DeleteMemberByName,
1184     DispatchEx_DeleteMemberByDispID,
1185     DispatchEx_GetMemberProperties,
1186     DispatchEx_GetMemberName,
1187     DispatchEx_GetNextDispID,
1188     DispatchEx_GetNameSpaceParent
1189 };
1190
1191 static IDispatchEx Global = { &GlobalVtbl };
1192
1193 static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
1194 {
1195     ok(0, "unexpected call\n");
1196     return E_NOINTERFACE;
1197 }
1198
1199 static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
1200 {
1201     return 2;
1202 }
1203
1204 static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
1205 {
1206     return 1;
1207 }
1208
1209 static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
1210 {
1211     if(!allow_ui)
1212         CHECK_EXPECT(GetWindow);
1213     *phwnd = NULL;
1214     return S_OK;
1215 }
1216
1217 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
1218 {
1219     if(allow_ui)
1220         return S_OK;
1221
1222     CHECK_EXPECT(EnableModeless);
1223     ok(!fEnable, "fEnable = %x\n", fEnable);
1224     return E_FAIL;
1225 }
1226
1227 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
1228     ActiveScriptSiteWindow_QueryInterface,
1229     ActiveScriptSiteWindow_AddRef,
1230     ActiveScriptSiteWindow_Release,
1231     ActiveScriptSiteWindow_GetWindow,
1232     ActiveScriptSiteWindow_EnableModeless
1233 };
1234
1235 static IActiveScriptSiteWindow ActiveScriptSiteWindow = { &ActiveScriptSiteWindowVtbl };
1236
1237 static HRESULT WINAPI ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl *iface, REFIID riid, void **ppv)
1238 {
1239     ok(0, "unexpected call\n");
1240     return E_NOINTERFACE;
1241 }
1242
1243 static ULONG WINAPI ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl *iface)
1244 {
1245     return 2;
1246 }
1247
1248 static ULONG WINAPI ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl *iface)
1249 {
1250     return 1;
1251 }
1252
1253 static HRESULT WINAPI ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl *iface, SCRIPTUICITEM UicItem,
1254         SCRIPTUICHANDLING *pUicHandling)
1255 {
1256     if(!allow_ui) {
1257         CHECK_EXPECT(GetUIBehavior);
1258         ok(UicItem == SCRIPTUICITEM_MSGBOX, "UidItem = %d\n", UicItem);
1259     }
1260     *pUicHandling = uic_handling;
1261     return S_OK;
1262 }
1263
1264 static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl = {
1265     ActiveScriptSiteUIControl_QueryInterface,
1266     ActiveScriptSiteUIControl_AddRef,
1267     ActiveScriptSiteUIControl_Release,
1268     ActiveScriptSiteUIControl_GetUIBehavior
1269 };
1270
1271 static IActiveScriptSiteUIControl ActiveScriptSiteUIControl = { &ActiveScriptSiteUIControlVtbl };
1272
1273 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1274 {
1275     *ppv = NULL;
1276
1277     if(IsEqualGUID(&IID_IUnknown, riid))
1278         *ppv = iface;
1279     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1280         *ppv = iface;
1281     else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid))
1282         *ppv = &ActiveScriptSiteWindow;
1283     else if(IsEqualGUID(&IID_IActiveScriptSiteUIControl, riid))
1284         *ppv = &ActiveScriptSiteUIControl;
1285     else
1286         return E_NOINTERFACE;
1287
1288     IUnknown_AddRef((IUnknown*)*ppv);
1289     return S_OK;
1290 }
1291
1292 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1293 {
1294     return 2;
1295 }
1296
1297 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1298 {
1299     return 1;
1300 }
1301
1302 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1303 {
1304     *plcid = GetUserDefaultLCID();
1305     return S_OK;
1306 }
1307
1308 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1309         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1310 {
1311     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1312     ok(!ppti, "ppti != NULL\n");
1313
1314     if(strcmp_wa(pstrName, "test"))
1315         ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1316
1317     *ppiunkItem = (IUnknown*)&Global;
1318     return S_OK;
1319 }
1320
1321 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1322 {
1323     return E_NOTIMPL;
1324 }
1325
1326 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1327         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1328 {
1329     return E_NOTIMPL;
1330 }
1331
1332 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1333 {
1334     return E_NOTIMPL;
1335 }
1336
1337 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1338 {
1339     return E_NOTIMPL;
1340 }
1341
1342 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1343 {
1344     return E_NOTIMPL;
1345 }
1346
1347 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1348 {
1349     return E_NOTIMPL;
1350 }
1351
1352 #undef ACTSCPSITE_THIS
1353
1354 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1355     ActiveScriptSite_QueryInterface,
1356     ActiveScriptSite_AddRef,
1357     ActiveScriptSite_Release,
1358     ActiveScriptSite_GetLCID,
1359     ActiveScriptSite_GetItemInfo,
1360     ActiveScriptSite_GetDocVersionString,
1361     ActiveScriptSite_OnScriptTerminate,
1362     ActiveScriptSite_OnStateChange,
1363     ActiveScriptSite_OnScriptError,
1364     ActiveScriptSite_OnEnterScript,
1365     ActiveScriptSite_OnLeaveScript
1366 };
1367
1368 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1369
1370 static IActiveScript *create_script(void)
1371 {
1372     IActiveScript *script;
1373     HRESULT hres;
1374
1375     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1376             &IID_IActiveScript, (void**)&script);
1377     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1378
1379     return script;
1380 }
1381
1382 static IActiveScript *create_and_init_script(DWORD flags)
1383 {
1384     IActiveScriptParse *parser;
1385     IActiveScript *engine;
1386     HRESULT hres;
1387
1388     engine = create_script();
1389     if(!engine)
1390         return NULL;
1391
1392     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1393     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1394
1395     hres = IActiveScriptParse_InitNew(parser);
1396     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1397
1398     IActiveScriptParse_Release(parser);
1399
1400     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1401     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1402
1403     hres = IActiveScript_AddNamedItem(engine, testW,
1404             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1405     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1406
1407     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1408     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1409
1410     return engine;
1411 }
1412
1413 static void close_script(IActiveScript *script)
1414 {
1415     ULONG ref;
1416     HRESULT hres;
1417
1418     hres = IActiveScript_Close(script);
1419     ok(hres == S_OK, "Close failed: %08x\n", hres);
1420
1421     ref = IActiveScript_Release(script);
1422     ok(!ref, "ref=%u\n", ref);
1423 }
1424
1425 static HRESULT parse_script(DWORD flags, BSTR script_str, const WCHAR *delim)
1426 {
1427     IActiveScriptParse *parser;
1428     IActiveScript *engine;
1429     IDispatch *script_disp;
1430     LONG ref;
1431     HRESULT hres;
1432
1433     engine = create_and_init_script(flags);
1434     if(!engine)
1435         return S_OK;
1436
1437     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1438     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1439     if (FAILED(hres))
1440     {
1441         IActiveScript_Release(engine);
1442         return hres;
1443     }
1444
1445     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1446     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1447     ok(script_disp != NULL, "script_disp == NULL\n");
1448     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1449
1450     test_counter = 0;
1451
1452     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, delim, 0, 0, 0, NULL, NULL);
1453
1454     IActiveScript_Close(engine);
1455
1456     IDispatch_Release(script_disp);
1457     IActiveScript_Release(engine);
1458
1459     ref = IActiveScriptParse_Release(parser);
1460     ok(!ref, "ref=%d\n", ref);
1461     return hres;
1462 }
1463
1464 static void parse_script_af(DWORD flags, const char *src)
1465 {
1466     BSTR tmp;
1467     HRESULT hres;
1468
1469     tmp = a2bstr(src);
1470     hres = parse_script(flags, tmp, NULL);
1471     SysFreeString(tmp);
1472     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1473 }
1474
1475 static HRESULT parse_script_ar(const char *src)
1476 {
1477     BSTR tmp;
1478     HRESULT hres;
1479
1480     tmp = a2bstr(src);
1481     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, NULL);
1482     SysFreeString(tmp);
1483     return hres;
1484 }
1485
1486 static void parse_script_a(const char *src)
1487 {
1488     parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1489 }
1490
1491 #define parse_htmlscript_a(a) _parse_htmlscript_a(__LINE__,a)
1492 static void _parse_htmlscript_a(unsigned line, const char *src)
1493 {
1494     BSTR tmp;
1495     HRESULT hres;
1496
1497     static const WCHAR script_delimW[] = {'<','/','S','C','R','I','P','T','>',0};
1498
1499     tmp = a2bstr(src);
1500     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, script_delimW);
1501     SysFreeString(tmp);
1502     ok_(__FILE__,line)(hres == S_OK, "parse_script failed: %08x\n", hres);
1503 }
1504
1505 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1506 {
1507     IDispatchEx *dispex;
1508     IDispatch *disp;
1509     BSTR str;
1510     HRESULT hres;
1511
1512     static const WCHAR delimiterW[] = {'\"',0};
1513
1514     str = a2bstr(src);
1515     hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0,
1516             SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1517     SysFreeString(str);
1518     ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1519     ok(disp != NULL, "disp = NULL\n");
1520
1521     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1522     IDispatch_Release(disp);
1523     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1524
1525     return dispex;
1526 }
1527
1528
1529 static void test_procedures(void)
1530 {
1531     IActiveScriptParseProcedure2 *parse_proc;
1532     DISPPARAMS dp = {NULL};
1533     IActiveScript *script;
1534     IDispatchEx *proc;
1535     EXCEPINFO ei = {0};
1536     VARIANT v;
1537     HRESULT hres;
1538
1539     script = create_and_init_script(0);
1540
1541     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1542     ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1543
1544     proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1545
1546     V_VT(&v) = VT_EMPTY;
1547     hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
1548     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1549
1550     IDispatchEx_Release(proc);
1551
1552     IActiveScriptParseProcedure2_Release(parse_proc);
1553
1554     close_script(script);
1555 }
1556
1557 static void test_gc(void)
1558 {
1559     IActiveScriptParse *parser;
1560     IActiveScript *engine;
1561     BSTR src;
1562     HRESULT hres;
1563
1564     strict_dispid_check = FALSE;
1565
1566     engine = create_script();
1567     if(!engine)
1568         return;
1569
1570     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1571     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1572
1573     hres = IActiveScriptParse_InitNew(parser);
1574     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1575
1576     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1577     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1578
1579     hres = IActiveScript_AddNamedItem(engine, testW,
1580             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1581     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1582
1583     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1584     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1585
1586     src = a2bstr(
1587             "class C\n"
1588             "    Public ref\n"
1589             "    Public Sub Class_Terminate\n"
1590             "        Call reportSuccess()\n"
1591             "    End Sub\n"
1592             "End Class\n"
1593             "Dim x\n"
1594             "set x = new C\n"
1595             "set x.ref = x\n"
1596             "set x = nothing\n");
1597
1598     hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1599     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1600     SysFreeString(src);
1601
1602     SET_EXPECT(global_success_d);
1603     SET_EXPECT(global_success_i);
1604     IActiveScript_Close(engine);
1605     CHECK_CALLED(global_success_d);
1606     CHECK_CALLED(global_success_i);
1607
1608     IActiveScript_Release(engine);
1609     IActiveScriptParse_Release(parser);
1610 }
1611
1612 static void test_msgbox(void)
1613 {
1614     HRESULT hres;
1615
1616     uic_handling = SCRIPTUICHANDLING_NOUIDEFAULT;
1617
1618     SET_EXPECT(GetUIBehavior);
1619     SET_EXPECT(GetWindow);
1620     SET_EXPECT(EnableModeless);
1621     hres = parse_script_ar("MsgBox \"testing...\"");
1622     CLEAR_CALLED(GetUIBehavior);
1623     CLEAR_CALLED(GetWindow);
1624     CLEAR_CALLED(EnableModeless);
1625     if(FAILED(hres)) {
1626         win_skip("Skipping MsgBox tests, broken (probably too old) vbscript\n");
1627         return;
1628     }
1629
1630     SET_EXPECT(GetUIBehavior);
1631     parse_script_a("dim r\n r=MsgBox(\"testing...\")\n Call ok(r=0, \"r=\"&r)");
1632     CHECK_CALLED(GetUIBehavior);
1633
1634     SET_EXPECT(GetUIBehavior);
1635     parse_script_a("MsgBox 10");
1636     CHECK_CALLED(GetUIBehavior);
1637
1638     uic_handling = SCRIPTUICHANDLING_ALLOW;
1639
1640     SET_EXPECT(GetUIBehavior);
1641     SET_EXPECT(GetWindow);
1642     SET_EXPECT(EnableModeless);
1643     hres = parse_script_ar("MsgBox \"testing...\"");
1644     ok(FAILED(hres), "script not failed\n");
1645     CHECK_CALLED(GetUIBehavior);
1646     CHECK_CALLED(GetWindow);
1647     CHECK_CALLED(EnableModeless);
1648
1649     uic_handling = SCRIPTUICHANDLING_NOUIERROR;
1650
1651     SET_EXPECT(GetUIBehavior);
1652     hres = parse_script_ar("MsgBox \"testing...\"");
1653     ok(FAILED(hres), "script not failed\n");
1654     CHECK_CALLED(GetUIBehavior);
1655 }
1656
1657 static HRESULT test_global_vars_ref(BOOL use_close)
1658 {
1659     IActiveScriptParse *parser;
1660     IActiveScript *engine;
1661     BSTR script_str;
1662     LONG ref;
1663     HRESULT hres;
1664
1665     engine = create_script();
1666     if(!engine)
1667         return S_OK;
1668
1669     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1670     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1671     if (FAILED(hres))
1672     {
1673         IActiveScript_Release(engine);
1674         return hres;
1675     }
1676
1677     hres = IActiveScriptParse_InitNew(parser);
1678     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1679
1680     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1681     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1682
1683     hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1684     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1685
1686     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1687     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1688
1689     refobj_ref = 0;
1690
1691     script_str = a2bstr("Dim x\nset x = RefObj\n");
1692     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1693     SysFreeString(script_str);
1694
1695     ok(refobj_ref, "refobj_ref = 0\n");
1696
1697     if(use_close) {
1698         hres = IActiveScript_Close(engine);
1699         ok(hres == S_OK, "Close failed: %08x\n", hres);
1700     }else {
1701         hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1702         ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1703     }
1704
1705     ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1706
1707     IActiveScript_Release(engine);
1708
1709     ref = IActiveScriptParse_Release(parser);
1710     ok(!ref, "ref=%d\n", ref);
1711     return hres;
1712 }
1713
1714 static BSTR get_script_from_file(const char *filename)
1715 {
1716     DWORD size, len;
1717     HANDLE file, map;
1718     const char *file_map;
1719     BSTR ret;
1720
1721     file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1722     if(file == INVALID_HANDLE_VALUE) {
1723         trace("Could not open file: %u\n", GetLastError());
1724         return NULL;
1725     }
1726
1727     size = GetFileSize(file, NULL);
1728
1729     map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1730     CloseHandle(file);
1731     if(map == INVALID_HANDLE_VALUE) {
1732         trace("Could not create file mapping: %u\n", GetLastError());
1733         return NULL;
1734     }
1735
1736     file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1737     CloseHandle(map);
1738     if(!file_map) {
1739         trace("MapViewOfFile failed: %u\n", GetLastError());
1740         return NULL;
1741     }
1742
1743     len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1744     ret = SysAllocStringLen(NULL, len);
1745     MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1746
1747     UnmapViewOfFile(file_map);
1748
1749     return ret;
1750 }
1751
1752 static void run_from_file(const char *filename)
1753 {
1754     BSTR script_str;
1755     HRESULT hres;
1756
1757     script_str = get_script_from_file(filename);
1758     if(!script_str)
1759         return;
1760
1761     strict_dispid_check = FALSE;
1762     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str, NULL);
1763     SysFreeString(script_str);
1764     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1765 }
1766
1767 static void run_from_res(const char *name)
1768 {
1769     const char *data;
1770     DWORD size, len;
1771     BSTR str;
1772     HRSRC src;
1773     HRESULT hres;
1774
1775     strict_dispid_check = FALSE;
1776     test_name = name;
1777
1778     src = FindResourceA(NULL, name, (LPCSTR)40);
1779     ok(src != NULL, "Could not find resource %s\n", name);
1780
1781     size = SizeofResource(NULL, src);
1782     data = LoadResource(NULL, src);
1783
1784     len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1785     str = SysAllocStringLen(NULL, len);
1786     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1787
1788     SET_EXPECT(global_success_d);
1789     SET_EXPECT(global_success_i);
1790     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str, NULL);
1791     CHECK_CALLED(global_success_d);
1792     CHECK_CALLED(global_success_i);
1793
1794     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1795     SysFreeString(str);
1796 }
1797
1798 static void run_tests(void)
1799 {
1800     HRESULT hres;
1801
1802     strict_dispid_check = TRUE;
1803
1804     parse_script_a("");
1805     parse_script_a("' empty ;");
1806
1807     SET_EXPECT(global_success_d);
1808     SET_EXPECT(global_success_i);
1809     parse_script_a("reportSuccess");
1810     CHECK_CALLED(global_success_d);
1811     CHECK_CALLED(global_success_i);
1812
1813     SET_EXPECT(global_success_d);
1814     SET_EXPECT(global_success_i);
1815     parse_script_a("reportSuccess()");
1816     CHECK_CALLED(global_success_d);
1817     CHECK_CALLED(global_success_i);
1818
1819     SET_EXPECT(global_success_d);
1820     SET_EXPECT(global_success_i);
1821     parse_script_a("Call reportSuccess");
1822     CHECK_CALLED(global_success_d);
1823     CHECK_CALLED(global_success_i);
1824
1825     SET_EXPECT(global_success_d);
1826     SET_EXPECT(global_success_i);
1827     parse_script_a("test.reportSuccess()");
1828     CHECK_CALLED(global_success_d);
1829     CHECK_CALLED(global_success_i);
1830
1831     SET_EXPECT(global_vbvar_d);
1832     SET_EXPECT(global_vbvar_i);
1833     parse_script_a("Option Explicit\nvbvar = 3");
1834     CHECK_CALLED(global_vbvar_d);
1835     CHECK_CALLED(global_vbvar_i);
1836
1837     SET_EXPECT(global_vbvar_d);
1838     SET_EXPECT(global_vbvar_i);
1839     parse_script_a("Option Explicit\nvbvar() = 3");
1840     CHECK_CALLED(global_vbvar_d);
1841     CHECK_CALLED(global_vbvar_i);
1842
1843     SET_EXPECT(testobj_propget_d);
1844     SET_EXPECT(testobj_propget_i);
1845     parse_script_a("dim x\nx = testObj.propget");
1846     CHECK_CALLED(testobj_propget_d);
1847     CHECK_CALLED(testobj_propget_i);
1848
1849     SET_EXPECT(testobj_propput_d);
1850     SET_EXPECT(testobj_propput_i);
1851     parse_script_a("testObj.propput = 1");
1852     CHECK_CALLED(testobj_propput_d);
1853     CHECK_CALLED(testobj_propput_i);
1854
1855     SET_EXPECT(global_propargput_d);
1856     SET_EXPECT(global_propargput_i);
1857     parse_script_a("propargput(counter(), counter()) = counter()");
1858     CHECK_CALLED(global_propargput_d);
1859     CHECK_CALLED(global_propargput_i);
1860
1861     SET_EXPECT(global_propargput_d);
1862     SET_EXPECT(global_propargput_i);
1863     parse_script_a("test.propargput(counter(), counter()) = counter()");
1864     CHECK_CALLED(global_propargput_d);
1865     CHECK_CALLED(global_propargput_i);
1866
1867     SET_EXPECT(global_propargput1_d);
1868     SET_EXPECT(global_propargput1_i);
1869     parse_script_a("propargput1 (counter()) = counter()");
1870     CHECK_CALLED(global_propargput1_d);
1871     CHECK_CALLED(global_propargput1_i);
1872
1873     SET_EXPECT(global_propargput1_d);
1874     SET_EXPECT(global_propargput1_i);
1875     parse_script_a("test.propargput1(counter()) = counter()");
1876     CHECK_CALLED(global_propargput1_d);
1877     CHECK_CALLED(global_propargput1_i);
1878
1879     parse_htmlscript_a("<!--");
1880     parse_htmlscript_a(" -->");
1881     parse_htmlscript_a("<!--\ndim x\nx=1\n-->\n");
1882     parse_htmlscript_a("<!--\ndim x\n-->\n<!--\nx=1\n-->\n");
1883
1884     hres = parse_script_ar("<!--");
1885     ok(FAILED(hres), "script didn't fail\n");
1886
1887     SET_EXPECT(global_success_d);
1888     SET_EXPECT(global_success_i);
1889     parse_htmlscript_a("<!--\n<!-- ignore this <> <>\n--> <>\nCall reportSuccess()\n-->\n");
1890     CHECK_CALLED(global_success_d);
1891     CHECK_CALLED(global_success_i);
1892
1893     next_cnt = 0;
1894     SET_EXPECT(collectionobj_newenum_i);
1895     SET_EXPECT(Next);
1896     parse_script_a("for each x in collectionObj\nnext");
1897     CHECK_CALLED(collectionobj_newenum_i);
1898     CHECK_CALLED(Next);
1899     ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1900
1901     parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1902
1903     parse_script_a("x = _    \n3");
1904
1905     test_global_vars_ref(TRUE);
1906     test_global_vars_ref(FALSE);
1907
1908     strict_dispid_check = FALSE;
1909
1910     parse_script_a("Sub testsub\n"
1911                    "x = 1\n"
1912                    "Call ok(x = 1, \"x = \" & x)\n"
1913                    "End Sub\n"
1914                    "Call testsub()");
1915
1916     parse_script_a("Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n");
1917     parse_script_a("Call ok(x = \"\", \"x = \" & x)\n");
1918     parse_script_a("x = y\n"
1919                    "Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n"
1920                    "Call ok(getVT(y) = \"VT_EMPTY*\", \"getVT(y) = \" & getVT(y))");
1921     hres = parse_script_ar("x = y(\"a\")");
1922     ok(FAILED(hres), "script didn't fail\n");
1923
1924     run_from_res("lang.vbs");
1925     run_from_res("api.vbs");
1926     run_from_res("regexp.vbs");
1927
1928     test_procedures();
1929     test_gc();
1930     test_msgbox();
1931 }
1932
1933 static BOOL check_vbscript(void)
1934 {
1935     IRegExp2 *regexp;
1936     IUnknown *unk;
1937     HRESULT hres;
1938
1939     hres = CoCreateInstance(&CLSID_VBScriptRegExp, NULL,
1940             CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1941             &IID_IUnknown, (void**)&unk);
1942     if(hres == REGDB_E_CLASSNOTREG)
1943         return FALSE;
1944     ok(hres == S_OK, "CoCreateInstance(CLSID_VBScriptRegExp) failed: %x\n", hres);
1945
1946     hres = IUnknown_QueryInterface(unk, &IID_IRegExp2, (void**)&regexp);
1947     if(SUCCEEDED(hres))
1948         IRegExp2_Release(regexp);
1949     IUnknown_Release(unk);
1950
1951     return hres == S_OK;
1952 }
1953
1954 START_TEST(run)
1955 {
1956     int argc;
1957     char **argv;
1958
1959     is_english = is_lang_english();
1960     if(!is_english)
1961         skip("Skipping some tests in non-English locale\n");
1962
1963     argc = winetest_get_mainargs(&argv);
1964
1965     CoInitialize(NULL);
1966
1967     if(!check_vbscript()) {
1968         win_skip("Broken engine, probably too old\n");
1969     }else if(argc > 2) {
1970         allow_ui = TRUE;
1971         uic_handling = SCRIPTUICHANDLING_ALLOW;
1972         run_from_file(argv[2]);
1973     }else {
1974         run_tests();
1975     }
1976
1977     CoUninitialize();
1978 }