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