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