dsound: Avoid signed-unsigned integer comparisons.
[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 "wine/test.h"
29
30 #ifdef _WIN64
31
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
38
39 #else
40
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
47
48 #endif
49
50 extern const CLSID CLSID_VBScript;
51
52 #define DEFINE_EXPECT(func) \
53     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
54
55 #define SET_EXPECT(func) \
56     expect_ ## func = TRUE
57
58 #define CHECK_EXPECT2(func) \
59     do { \
60         ok(expect_ ##func, "unexpected call " #func "\n"); \
61         called_ ## func = TRUE; \
62     }while(0)
63
64 #define CHECK_EXPECT(func) \
65     do { \
66         CHECK_EXPECT2(func); \
67         expect_ ## func = FALSE; \
68     }while(0)
69
70 #define CHECK_CALLED(func) \
71     do { \
72         ok(called_ ## func, "expected " #func "\n"); \
73         expect_ ## func = called_ ## func = FALSE; \
74     }while(0)
75
76 #define CLEAR_CALLED(func) \
77     expect_ ## func = called_ ## func = FALSE
78
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);
96
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
112
113 #define DISPID_TESTOBJ_PROPGET      2000
114 #define DISPID_TESTOBJ_PROPPUT      2001
115
116 #define DISPID_COLLOBJ_RESET        3000
117
118 static const WCHAR testW[] = {'t','e','s','t',0};
119 static const WCHAR emptyW[] = {0};
120
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;
125
126 static BSTR a2bstr(const char *str)
127 {
128     BSTR ret;
129     int len;
130
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);
134
135     return ret;
136 }
137
138 static int strcmp_wa(LPCWSTR strw, const char *stra)
139 {
140     CHAR buf[512];
141     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
142     return lstrcmpA(buf, stra);
143 }
144
145 static const char *debugstr_guid(REFIID riid)
146 {
147     static char buf[50];
148
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]);
153
154     return buf;
155 }
156
157 static const char *vt2a(VARIANT *v)
158 {
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;
163     }
164
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;
189     }
190 }
191
192 /* Returns true if the user interface is in English. Note that this does not
193  * presume of the formatting of dates, numbers, etc.
194  */
195 static BOOL is_lang_english(void)
196 {
197     static HMODULE hkernel32 = NULL;
198     static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
199     static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
200
201     if (!hkernel32)
202     {
203         hkernel32 = GetModuleHandleA("kernel32.dll");
204         pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
205         pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
206     }
207     if (pGetThreadUILanguage && PRIMARYLANGID(pGetThreadUILanguage()) != LANG_ENGLISH)
208         return FALSE;
209     if (pGetUserDefaultUILanguage && PRIMARYLANGID(pGetUserDefaultUILanguage()) != LANG_ENGLISH)
210         return FALSE;
211
212     return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
213 }
214
215 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
216 {
217     ok(0, "unexpected call\n");
218     return E_NOINTERFACE;
219 }
220
221 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
222 {
223     return 2;
224 }
225
226 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
227 {
228     return 1;
229 }
230
231 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
232         REFIID riid, void **ppv)
233 {
234     ok(0, "unexpected service %s\n", debugstr_guid(guidService));
235     return E_NOINTERFACE;
236 }
237
238 static const IServiceProviderVtbl ServiceProviderVtbl = {
239     ServiceProvider_QueryInterface,
240     ServiceProvider_AddRef,
241     ServiceProvider_Release,
242     ServiceProvider_QueryService
243 };
244
245 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
246
247 static void test_disp(IDispatch *disp)
248 {
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;
257
258     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
259     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
260
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);
265
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);
271
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);
276
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);
282
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);
288
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);
293
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));
297
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));
305
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));
311
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));
317
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));
322
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);
329
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");
335
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");
341
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));
347
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));
352
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));
358
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));
363
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));
368
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));
373
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);
379
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));
385
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));
391
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));
396
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));
401
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);
407
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);
416
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);
421
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);
428
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);
435
436     IDispatchEx_Release(dispex);
437 }
438
439 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
440 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
441 {
442     ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
443 }
444
445 static IDispatchEx enumDisp;
446
447 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
448 {
449     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
450         *ppv = iface;
451         return S_OK;
452     }
453
454     if(IsEqualGUID(riid, &IID_IDispatch)) {
455         *ppv = &enumDisp;
456         return S_OK;
457     }
458
459     ok(0, "unexpected call %s\n", debugstr_guid(riid));
460     return E_NOINTERFACE;
461 }
462
463 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
464 {
465     return 2;
466 }
467
468 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
469 {
470     return 1;
471 }
472
473 static unsigned next_cnt;
474
475 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
476 {
477     if(strict_dispid_check)
478         CHECK_EXPECT2(Next);
479
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);
483
484     if(next_cnt++ < 3) {
485         V_VT(rgVar) = VT_I2;
486         V_I2(rgVar) = next_cnt;
487         return S_OK;
488     }
489
490     return S_FALSE;
491 }
492
493 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
494 {
495     ok(0, "unexpected call\n");
496     return E_NOTIMPL;
497 }
498
499 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
500 {
501     ok(0, "unexpected call\n");
502     return E_NOTIMPL;
503 }
504
505 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
506 {
507     ok(0, "unexpected call\n");
508     return E_NOTIMPL;
509 }
510
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
519 };
520
521 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
522
523 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
524 {
525     *ppv = NULL;
526
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;
534     }
535
536     IUnknown_AddRef((IUnknown*)*ppv);
537     return S_OK;
538 }
539
540 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
541 {
542     return 2;
543 }
544
545 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
546 {
547     return 1;
548 }
549
550 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
551 {
552     ok(0, "unexpected call\n");
553     return E_NOTIMPL;
554 }
555
556 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
557                                               LCID lcid, ITypeInfo **ppTInfo)
558 {
559     ok(0, "unexpected call\n");
560     return E_NOTIMPL;
561 }
562
563 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
564                                                 LPOLESTR *rgszNames, UINT cNames,
565                                                 LCID lcid, DISPID *rgDispId)
566 {
567     ok(0, "unexpected call\n");
568     return E_NOTIMPL;
569 }
570
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)
574 {
575     ok(0, "unexpected call\n");
576     return E_NOTIMPL;
577 }
578
579 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
580 {
581     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
582     return E_NOTIMPL;
583 }
584
585 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
586 {
587     ok(0, "unexpected call\n");
588     return E_NOTIMPL;
589 }
590
591 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
592 {
593     ok(0, "unexpected call\n");
594     return E_NOTIMPL;
595 }
596
597 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
598 {
599     ok(0, "unexpected call\n");
600     return E_NOTIMPL;
601 }
602
603 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
604 {
605     ok(0, "unexpected call\n");
606     return E_NOTIMPL;
607 }
608
609 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
610 {
611     ok(0, "unexpected call\n");
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
616 {
617     ok(0, "unexpected call\n");
618     return E_NOTIMPL;
619 }
620
621 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
622         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
623 {
624     ok(0, "unexpected call %d\n", id);
625     return E_NOTIMPL;
626 }
627
628 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
629 {
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;
635     }
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;
641     }
642
643     ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
644     return DISP_E_UNKNOWNNAME;
645 }
646
647 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
648         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
649 {
650     switch(id) {
651     case DISPID_TESTOBJ_PROPGET:
652         CHECK_EXPECT(testobj_propget_i);
653
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");
662
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);
668
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");
678
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;
682     }
683
684     ok(0, "unexpected call %d\n", id);
685     return E_FAIL;
686 }
687
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
704 };
705
706 static IDispatchEx testObj = { &testObjVtbl };
707
708 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
709 {
710     return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
711 }
712
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
729 };
730
731 static IDispatchEx enumDisp = { &enumDispVtbl };
732
733 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
734 {
735     if(!strcmp_wa(bstrName, "reset")) {
736         *pid = DISPID_COLLOBJ_RESET;
737         return S_OK;
738     }
739
740     ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
741     return DISP_E_UNKNOWNNAME;
742 }
743
744 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
745         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
746 {
747     switch(id) {
748     case DISPID_NEWENUM:
749         if(strict_dispid_check)
750             CHECK_EXPECT(collectionobj_newenum_i);
751
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");
760
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;
767     }
768
769     ok(0, "unexpected call %d\n", id);
770     return E_NOTIMPL;
771 }
772
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
789 };
790
791 static IDispatchEx collectionObj = { &collectionObjVtbl };
792
793 static ULONG refobj_ref;
794
795 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
796 {
797     return ++refobj_ref;
798 }
799
800 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
801 {
802     return --refobj_ref;
803 }
804
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
821 };
822
823 static IDispatchEx RefObj = { &RefObjVtbl };
824
825 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
826 {
827     if(!strcmp_wa(bstrName, "ok")) {
828         test_grfdex(grfdex, fdexNameCaseInsensitive);
829         *pid = DISPID_GLOBAL_OK;
830         return S_OK;
831     }
832     if(!strcmp_wa(bstrName, "trace")) {
833         test_grfdex(grfdex, fdexNameCaseInsensitive);
834         *pid = DISPID_GLOBAL_TRACE;
835         return S_OK;
836     }
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;
842     }
843     if(!strcmp_wa(bstrName, "getVT")) {
844         test_grfdex(grfdex, fdexNameCaseInsensitive);
845         *pid = DISPID_GLOBAL_GETVT;
846         return S_OK;
847     }
848     if(!strcmp_wa(bstrName, "isEnglishLang")) {
849         test_grfdex(grfdex, fdexNameCaseInsensitive);
850         *pid = DISPID_GLOBAL_ISENGLANG;
851         return S_OK;
852     }
853     if(!strcmp_wa(bstrName, "testObj")) {
854         test_grfdex(grfdex, fdexNameCaseInsensitive);
855         *pid = DISPID_GLOBAL_TESTOBJ;
856         return S_OK;
857     }
858     if(!strcmp_wa(bstrName, "collectionObj")) {
859         test_grfdex(grfdex, fdexNameCaseInsensitive);
860         *pid = DISPID_GLOBAL_COLLOBJ;
861         return S_OK;
862     }
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;
868     }
869     if(!strcmp_wa(bstrName, "isNullDisp")) {
870         test_grfdex(grfdex, fdexNameCaseInsensitive);
871         *pid = DISPID_GLOBAL_ISNULLDISP;
872         return S_OK;
873     }
874     if(!strcmp_wa(bstrName, "testDisp")) {
875         test_grfdex(grfdex, fdexNameCaseInsensitive);
876         *pid = DISPID_GLOBAL_TESTDISP;
877         return S_OK;
878     }
879     if(!strcmp_wa(bstrName, "RefObj")) {
880         test_grfdex(grfdex, fdexNameCaseInsensitive);
881         *pid = DISPID_GLOBAL_REFOBJ;
882         return S_OK;
883     }
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;
889     }
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;
895     }
896     if(!strcmp_wa(bstrName, "counter")) {
897         test_grfdex(grfdex, fdexNameCaseInsensitive);
898         *pid = DISPID_GLOBAL_COUNTER;
899         return S_OK;
900     }
901     if(!strcmp_wa(bstrName, "doubleAsString")) {
902         test_grfdex(grfdex, fdexNameCaseInsensitive);
903         *pid = DISPID_GLOBAL_DOUBLEASSTRING;
904         return S_OK;
905     }
906
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;
910 }
911
912 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
913         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
914 {
915     switch(id) {
916     case DISPID_GLOBAL_OK: {
917         VARIANT *b;
918
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");
930
931         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
932
933         b = pdp->rgvarg+1;
934         if(V_VT(b) == (VT_BYREF|VT_VARIANT))
935             b = V_BYREF(b);
936
937         ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
938
939         ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
940         return S_OK;
941     }
942
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");
952
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)));
956
957         return S_OK;
958
959     case DISPID_GLOBAL_REPORTSUCCESS:
960         CHECK_EXPECT(global_success_i);
961
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");
969
970         return S_OK;
971
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");
981
982         V_VT(pvarRes) = VT_BSTR;
983         V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
984         return S_OK;
985
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");
994
995         V_VT(pvarRes) = VT_BOOL;
996         V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
997         return S_OK;
998
999     case DISPID_GLOBAL_VBVAR:
1000         CHECK_EXPECT(global_vbvar_i);
1001
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");
1011
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;
1015
1016     case DISPID_GLOBAL_TESTOBJ:
1017         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1018
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");
1026
1027         V_VT(pvarRes) = VT_DISPATCH;
1028         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1029         return S_OK;
1030
1031     case DISPID_GLOBAL_COLLOBJ:
1032         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1033
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");
1041
1042         V_VT(pvarRes) = VT_DISPATCH;
1043         V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1044         return S_OK;
1045
1046     case DISPID_GLOBAL_REFOBJ:
1047         ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1048
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");
1056
1057         IDispatchEx_AddRef(&RefObj);
1058         V_VT(pvarRes) = VT_DISPATCH;
1059         V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1060         return S_OK;
1061
1062     case DISPID_GLOBAL_ISNULLDISP: {
1063         VARIANT *v;
1064
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");
1073
1074         v = pdp->rgvarg;
1075         if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1076             v = V_VARIANTREF(v);
1077
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;
1082     }
1083
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");
1093
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;
1097
1098     case DISPID_GLOBAL_PROPARGPUT:
1099         CHECK_EXPECT(global_propargput_i);
1100
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");
1110
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));
1113
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));
1116
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;
1120
1121     case DISPID_GLOBAL_PROPARGPUT1:
1122         CHECK_EXPECT(global_propargput1_i);
1123
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");
1133
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));
1136
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));
1139
1140         return S_OK;
1141
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");
1151
1152         V_VT(pvarRes) = VT_I2;
1153         V_I2(pvarRes) = test_counter++;
1154         return S_OK;
1155
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");
1161
1162         V_VT(pvarRes) = VT_BSTR;
1163         return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1164     }
1165
1166     ok(0, "unexpected call %d\n", id);
1167     return DISP_E_MEMBERNOTFOUND;
1168 }
1169
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
1186 };
1187
1188 static IDispatchEx Global = { &GlobalVtbl };
1189
1190 static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
1191 {
1192     ok(0, "unexpected call\n");
1193     return E_NOINTERFACE;
1194 }
1195
1196 static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
1197 {
1198     return 2;
1199 }
1200
1201 static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
1202 {
1203     return 1;
1204 }
1205
1206 static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
1207 {
1208     if(!allow_ui)
1209         CHECK_EXPECT(GetWindow);
1210     *phwnd = NULL;
1211     return S_OK;
1212 }
1213
1214 static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
1215 {
1216     if(allow_ui)
1217         return S_OK;
1218
1219     CHECK_EXPECT(EnableModeless);
1220     ok(!fEnable, "fEnable = %x\n", fEnable);
1221     return E_FAIL;
1222 }
1223
1224 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
1225     ActiveScriptSiteWindow_QueryInterface,
1226     ActiveScriptSiteWindow_AddRef,
1227     ActiveScriptSiteWindow_Release,
1228     ActiveScriptSiteWindow_GetWindow,
1229     ActiveScriptSiteWindow_EnableModeless
1230 };
1231
1232 static IActiveScriptSiteWindow ActiveScriptSiteWindow = { &ActiveScriptSiteWindowVtbl };
1233
1234 static HRESULT WINAPI ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl *iface, REFIID riid, void **ppv)
1235 {
1236     ok(0, "unexpected call\n");
1237     return E_NOINTERFACE;
1238 }
1239
1240 static ULONG WINAPI ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl *iface)
1241 {
1242     return 2;
1243 }
1244
1245 static ULONG WINAPI ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl *iface)
1246 {
1247     return 1;
1248 }
1249
1250 static HRESULT WINAPI ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl *iface, SCRIPTUICITEM UicItem,
1251         SCRIPTUICHANDLING *pUicHandling)
1252 {
1253     if(!allow_ui) {
1254         CHECK_EXPECT(GetUIBehavior);
1255         ok(UicItem == SCRIPTUICITEM_MSGBOX, "UidItem = %d\n", UicItem);
1256     }
1257     *pUicHandling = uic_handling;
1258     return S_OK;
1259 }
1260
1261 static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl = {
1262     ActiveScriptSiteUIControl_QueryInterface,
1263     ActiveScriptSiteUIControl_AddRef,
1264     ActiveScriptSiteUIControl_Release,
1265     ActiveScriptSiteUIControl_GetUIBehavior
1266 };
1267
1268 static IActiveScriptSiteUIControl ActiveScriptSiteUIControl = { &ActiveScriptSiteUIControlVtbl };
1269
1270 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1271 {
1272     *ppv = NULL;
1273
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;
1284
1285     IUnknown_AddRef((IUnknown*)*ppv);
1286     return S_OK;
1287 }
1288
1289 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1290 {
1291     return 2;
1292 }
1293
1294 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1295 {
1296     return 1;
1297 }
1298
1299 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1300 {
1301     *plcid = GetUserDefaultLCID();
1302     return S_OK;
1303 }
1304
1305 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1306         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1307 {
1308     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1309     ok(!ppti, "ppti != NULL\n");
1310
1311     if(strcmp_wa(pstrName, "test"))
1312         ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1313
1314     *ppiunkItem = (IUnknown*)&Global;
1315     return S_OK;
1316 }
1317
1318 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1319 {
1320     return E_NOTIMPL;
1321 }
1322
1323 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1324         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1325 {
1326     return E_NOTIMPL;
1327 }
1328
1329 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1330 {
1331     return E_NOTIMPL;
1332 }
1333
1334 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1335 {
1336     return E_NOTIMPL;
1337 }
1338
1339 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1340 {
1341     return E_NOTIMPL;
1342 }
1343
1344 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1345 {
1346     return E_NOTIMPL;
1347 }
1348
1349 #undef ACTSCPSITE_THIS
1350
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
1363 };
1364
1365 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1366
1367 static IActiveScript *create_script(void)
1368 {
1369     IActiveScript *script;
1370     HRESULT hres;
1371
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);
1375
1376     return script;
1377 }
1378
1379 static IActiveScript *create_and_init_script(DWORD flags)
1380 {
1381     IActiveScriptParse *parser;
1382     IActiveScript *engine;
1383     HRESULT hres;
1384
1385     engine = create_script();
1386     if(!engine)
1387         return NULL;
1388
1389     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1390     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1391
1392     hres = IActiveScriptParse_InitNew(parser);
1393     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1394
1395     IActiveScriptParse_Release(parser);
1396
1397     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1398     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1399
1400     hres = IActiveScript_AddNamedItem(engine, testW,
1401             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1402     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1403
1404     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1405     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1406
1407     return engine;
1408 }
1409
1410 static void close_script(IActiveScript *script)
1411 {
1412     ULONG ref;
1413     HRESULT hres;
1414
1415     hres = IActiveScript_Close(script);
1416     ok(hres == S_OK, "Close failed: %08x\n", hres);
1417
1418     ref = IActiveScript_Release(script);
1419     ok(!ref, "ref=%u\n", ref);
1420 }
1421
1422 static HRESULT parse_script(DWORD flags, BSTR script_str, const WCHAR *delim)
1423 {
1424     IActiveScriptParse *parser;
1425     IActiveScript *engine;
1426     IDispatch *script_disp;
1427     LONG ref;
1428     HRESULT hres;
1429
1430     engine = create_and_init_script(flags);
1431     if(!engine)
1432         return S_OK;
1433
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))
1437     {
1438         IActiveScript_Release(engine);
1439         return hres;
1440     }
1441
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");
1446
1447     test_counter = 0;
1448
1449     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, delim, 0, 0, 0, NULL, NULL);
1450
1451     IActiveScript_Close(engine);
1452
1453     IDispatch_Release(script_disp);
1454     IActiveScript_Release(engine);
1455
1456     ref = IActiveScriptParse_Release(parser);
1457     ok(!ref, "ref=%d\n", ref);
1458     return hres;
1459 }
1460
1461 static void parse_script_af(DWORD flags, const char *src)
1462 {
1463     BSTR tmp;
1464     HRESULT hres;
1465
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);
1470 }
1471
1472 static HRESULT parse_script_ar(const char *src)
1473 {
1474     BSTR tmp;
1475     HRESULT hres;
1476
1477     tmp = a2bstr(src);
1478     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, NULL);
1479     SysFreeString(tmp);
1480     return hres;
1481 }
1482
1483 static void parse_script_a(const char *src)
1484 {
1485     parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1486 }
1487
1488 #define parse_htmlscript_a(a) _parse_htmlscript_a(__LINE__,a)
1489 static void _parse_htmlscript_a(unsigned line, const char *src)
1490 {
1491     BSTR tmp;
1492     HRESULT hres;
1493
1494     static const WCHAR script_delimW[] = {'<','/','S','C','R','I','P','T','>',0};
1495
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);
1500 }
1501
1502 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1503 {
1504     IDispatchEx *dispex;
1505     IDispatch *disp;
1506     BSTR str;
1507     HRESULT hres;
1508
1509     static const WCHAR delimiterW[] = {'\"',0};
1510
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");
1517
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);
1521
1522     return dispex;
1523 }
1524
1525
1526 static void test_procedures(void)
1527 {
1528     IActiveScriptParseProcedure2 *parse_proc;
1529     DISPPARAMS dp = {NULL};
1530     IActiveScript *script;
1531     IDispatchEx *proc;
1532     EXCEPINFO ei = {0};
1533     VARIANT v;
1534     HRESULT hres;
1535
1536     script = create_and_init_script(0);
1537
1538     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1539     ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1540
1541     proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1542
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);
1546
1547     IDispatchEx_Release(proc);
1548
1549     IActiveScriptParseProcedure2_Release(parse_proc);
1550
1551     close_script(script);
1552 }
1553
1554 static void test_gc(void)
1555 {
1556     IActiveScriptParse *parser;
1557     IActiveScript *engine;
1558     BSTR src;
1559     HRESULT hres;
1560
1561     strict_dispid_check = FALSE;
1562
1563     engine = create_script();
1564     if(!engine)
1565         return;
1566
1567     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1568     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1569
1570     hres = IActiveScriptParse_InitNew(parser);
1571     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1572
1573     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1574     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1575
1576     hres = IActiveScript_AddNamedItem(engine, testW,
1577             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1578     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1579
1580     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1581     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1582
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");
1594
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);
1598
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);
1604
1605     IActiveScript_Release(engine);
1606     IActiveScriptParse_Release(parser);
1607 }
1608
1609 static void test_msgbox(void)
1610 {
1611     HRESULT hres;
1612
1613     uic_handling = SCRIPTUICHANDLING_NOUIDEFAULT;
1614
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;
1625     }
1626
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);
1630
1631     SET_EXPECT(GetUIBehavior);
1632     parse_script_a("MsgBox 10");
1633     CHECK_CALLED(GetUIBehavior);
1634
1635     uic_handling = SCRIPTUICHANDLING_ALLOW;
1636
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);
1645
1646     uic_handling = SCRIPTUICHANDLING_NOUIERROR;
1647
1648     SET_EXPECT(GetUIBehavior);
1649     hres = parse_script_ar("MsgBox \"testing...\"");
1650     ok(FAILED(hres), "script not failed\n");
1651     CHECK_CALLED(GetUIBehavior);
1652 }
1653
1654 static HRESULT test_global_vars_ref(BOOL use_close)
1655 {
1656     IActiveScriptParse *parser;
1657     IActiveScript *engine;
1658     BSTR script_str;
1659     LONG ref;
1660     HRESULT hres;
1661
1662     engine = create_script();
1663     if(!engine)
1664         return S_OK;
1665
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))
1669     {
1670         IActiveScript_Release(engine);
1671         return hres;
1672     }
1673
1674     hres = IActiveScriptParse_InitNew(parser);
1675     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1676
1677     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1678     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1679
1680     hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1681     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1682
1683     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1684     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1685
1686     refobj_ref = 0;
1687
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);
1691
1692     ok(refobj_ref, "refobj_ref = 0\n");
1693
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);
1700     }
1701
1702     ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1703
1704     IActiveScript_Release(engine);
1705
1706     ref = IActiveScriptParse_Release(parser);
1707     ok(!ref, "ref=%d\n", ref);
1708     return hres;
1709 }
1710
1711 static BSTR get_script_from_file(const char *filename)
1712 {
1713     DWORD size, len;
1714     HANDLE file, map;
1715     const char *file_map;
1716     BSTR ret;
1717
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;
1722     }
1723
1724     size = GetFileSize(file, NULL);
1725
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;
1731     }
1732
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;
1738     }
1739
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);
1743
1744     UnmapViewOfFile(file_map);
1745
1746     return ret;
1747 }
1748
1749 static void run_from_file(const char *filename)
1750 {
1751     BSTR script_str;
1752     HRESULT hres;
1753
1754     script_str = get_script_from_file(filename);
1755     if(!script_str)
1756         return;
1757
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);
1762 }
1763
1764 static void run_from_res(const char *name)
1765 {
1766     const char *data;
1767     DWORD size, len;
1768     BSTR str;
1769     HRSRC src;
1770     HRESULT hres;
1771
1772     strict_dispid_check = FALSE;
1773     test_name = name;
1774
1775     src = FindResourceA(NULL, name, (LPCSTR)40);
1776     ok(src != NULL, "Could not find resource %s\n", name);
1777
1778     size = SizeofResource(NULL, src);
1779     data = LoadResource(NULL, src);
1780
1781     len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1782     str = SysAllocStringLen(NULL, len);
1783     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1784
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);
1790
1791     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1792     SysFreeString(str);
1793 }
1794
1795 static void run_tests(void)
1796 {
1797     HRESULT hres;
1798
1799     strict_dispid_check = TRUE;
1800
1801     parse_script_a("");
1802     parse_script_a("' empty ;");
1803
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);
1809
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);
1815
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);
1821
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);
1827
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);
1833
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);
1839
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);
1845
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);
1851
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);
1857
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);
1863
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);
1869
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);
1875
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");
1880
1881     hres = parse_script_ar("<!--");
1882     ok(FAILED(hres), "script didn't fail\n");
1883
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);
1889
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);
1897
1898     parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1899
1900     parse_script_a("x = _    \n3");
1901
1902     test_global_vars_ref(TRUE);
1903     test_global_vars_ref(FALSE);
1904
1905     strict_dispid_check = FALSE;
1906
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()");
1912
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");
1920
1921     run_from_res("lang.vbs");
1922     run_from_res("api.vbs");
1923
1924     test_procedures();
1925     test_gc();
1926     test_msgbox();
1927 }
1928
1929 static BOOL check_vbscript(void)
1930 {
1931     IActiveScriptParseProcedure2 *vbscript;
1932     HRESULT hres;
1933
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);
1938
1939     return hres == S_OK;
1940 }
1941
1942 START_TEST(run)
1943 {
1944     int argc;
1945     char **argv;
1946
1947     is_english = is_lang_english();
1948     if(!is_english)
1949         skip("Skipping some tests in non-English locale\n");
1950
1951     argc = winetest_get_mainargs(&argv);
1952
1953     CoInitialize(NULL);
1954
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();
1963     }
1964
1965     CoUninitialize();
1966 }