Release 1.5.29.
[wine] / dlls / vbscript / tests / vbscript.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 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <initguid.h>
23 #include <ole2.h>
24 #include <activscp.h>
25 #include <objsafe.h>
26 #include <dispex.h>
27
28 #include "vbsregexp55.h"
29
30 #include "wine/test.h"
31
32 #ifdef _WIN64
33
34 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
35 #define IActiveScriptParse_Release IActiveScriptParse64_Release
36 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
37 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
38 #define IActiveScriptParseProcedure2_Release \
39     IActiveScriptParseProcedure2_64_Release
40
41 #else
42
43 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
44 #define IActiveScriptParse_Release IActiveScriptParse32_Release
45 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
46 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
47 #define IActiveScriptParseProcedure2_Release \
48     IActiveScriptParseProcedure2_32_Release
49
50 #endif
51
52 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
53
54 #define DEFINE_EXPECT(func) \
55     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
56
57 #define SET_EXPECT(func) \
58     expect_ ## func = TRUE
59
60 #define CHECK_EXPECT2(func) \
61     do { \
62         ok(expect_ ##func, "unexpected call " #func "\n"); \
63         called_ ## func = TRUE; \
64     }while(0)
65
66 #define CHECK_EXPECT(func) \
67     do { \
68         CHECK_EXPECT2(func); \
69         expect_ ## func = FALSE; \
70     }while(0)
71
72 #define CHECK_CALLED(func) \
73     do { \
74         ok(called_ ## func, "expected " #func "\n"); \
75         expect_ ## func = called_ ## func = FALSE; \
76     }while(0)
77
78 DEFINE_EXPECT(GetLCID);
79 DEFINE_EXPECT(OnStateChange_UNINITIALIZED);
80 DEFINE_EXPECT(OnStateChange_STARTED);
81 DEFINE_EXPECT(OnStateChange_CONNECTED);
82 DEFINE_EXPECT(OnStateChange_DISCONNECTED);
83 DEFINE_EXPECT(OnStateChange_CLOSED);
84 DEFINE_EXPECT(OnStateChange_INITIALIZED);
85 DEFINE_EXPECT(OnEnterScript);
86 DEFINE_EXPECT(OnLeaveScript);
87
88 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8);
89 DEFINE_GUID(CLSID_VBScriptRegExp, 0x3f4daca4, 0x160d, 0x11d2, 0xa8,0xe9, 0x00,0x10,0x4b,0x36,0x5c,0x9f);
90
91 static BSTR a2bstr(const char *str)
92 {
93     BSTR ret;
94     int len;
95
96     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
97     ret = SysAllocStringLen(NULL, len-1);
98     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
99
100     return ret;
101 }
102
103 #define test_state(s,ss) _test_state(__LINE__,s,ss)
104 static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate)
105 {
106     SCRIPTSTATE state = -1;
107     HRESULT hres;
108
109     hres = IActiveScript_GetScriptState(script, &state);
110     ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres);
111     ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);
112 }
113
114 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
115 {
116     *ppv = NULL;
117
118     if(IsEqualGUID(&IID_IUnknown, riid))
119         *ppv = iface;
120     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
121         *ppv = iface;
122     else
123         return E_NOINTERFACE;
124
125     IUnknown_AddRef((IUnknown*)*ppv);
126     return S_OK;
127 }
128
129 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
130 {
131     return 2;
132 }
133
134 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
135 {
136     return 1;
137 }
138
139 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
140 {
141     CHECK_EXPECT(GetLCID);
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
146         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
147 {
148     ok(0, "unexpected call\n");
149     return E_NOTIMPL;
150 }
151
152 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
153 {
154     ok(0, "unexpected call\n");
155     return E_NOTIMPL;
156 }
157
158 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
159         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
160 {
161     ok(0, "unexpected call\n");
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
166 {
167     switch(ssScriptState) {
168     case SCRIPTSTATE_UNINITIALIZED:
169         CHECK_EXPECT(OnStateChange_UNINITIALIZED);
170         return S_OK;
171     case SCRIPTSTATE_STARTED:
172         CHECK_EXPECT(OnStateChange_STARTED);
173         return S_OK;
174     case SCRIPTSTATE_CONNECTED:
175         CHECK_EXPECT(OnStateChange_CONNECTED);
176         return S_OK;
177     case SCRIPTSTATE_DISCONNECTED:
178         CHECK_EXPECT(OnStateChange_DISCONNECTED);
179         return S_OK;
180     case SCRIPTSTATE_CLOSED:
181         CHECK_EXPECT(OnStateChange_CLOSED);
182         return S_OK;
183     case SCRIPTSTATE_INITIALIZED:
184         CHECK_EXPECT(OnStateChange_INITIALIZED);
185         return S_OK;
186     default:
187         ok(0, "unexpected call %d\n", ssScriptState);
188     }
189
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
194 {
195     ok(0, "unexpected call\n");
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
200 {
201     CHECK_EXPECT(OnEnterScript);
202     return S_OK;
203 }
204
205 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
206 {
207     CHECK_EXPECT(OnLeaveScript);
208     return S_OK;
209 }
210
211 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
212     ActiveScriptSite_QueryInterface,
213     ActiveScriptSite_AddRef,
214     ActiveScriptSite_Release,
215     ActiveScriptSite_GetLCID,
216     ActiveScriptSite_GetItemInfo,
217     ActiveScriptSite_GetDocVersionString,
218     ActiveScriptSite_OnScriptTerminate,
219     ActiveScriptSite_OnStateChange,
220     ActiveScriptSite_OnScriptError,
221     ActiveScriptSite_OnEnterScript,
222     ActiveScriptSite_OnLeaveScript
223 };
224
225 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
226
227 static void test_safety(IActiveScript *script)
228 {
229     IObjectSafety *safety;
230     DWORD supported, enabled;
231     HRESULT hres;
232
233     hres = IActiveScript_QueryInterface(script, &IID_IObjectSafety, (void**)&safety);
234     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
235     if(FAILED(hres))
236         return;
237
238     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL);
239     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
240     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled);
241     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
242
243     supported = enabled = 0xdeadbeef;
244     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, &enabled);
245     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
246     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
247        "supported=%x\n", supported);
248     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
249
250     supported = enabled = 0xdeadbeef;
251     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScript, &supported, &enabled);
252     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
253     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
254        "supported=%x\n", supported);
255     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
256
257     supported = enabled = 0xdeadbeef;
258     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
259     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
260     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
261        "supported=%x\n", supported);
262     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
263
264     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
265             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER
266                 |INTERFACESAFE_FOR_UNTRUSTED_CALLER,
267             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
268     ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
269
270     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
271             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
272             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
273     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
274
275     supported = enabled = 0xdeadbeef;
276     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
277     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
278     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
279        "supported=%x\n", supported);
280     ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
281        "enabled=%x\n", enabled);
282
283     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
284     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
285
286     supported = enabled = 0xdeadbeef;
287     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
288     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
289     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
290        "supported=%x\n", supported);
291     ok(enabled == (INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
292
293     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
294             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, 0);
295     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
296
297     supported = enabled = 0xdeadbeef;
298     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
299     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
300     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
301        "supported=%x\n", supported);
302     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
303
304     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
305             INTERFACE_USES_DISPEX, 0);
306     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
307
308     supported = enabled = 0xdeadbeef;
309     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
310     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
311     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
312        "supported=%x\n", supported);
313     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
314
315     IObjectSafety_Release(safety);
316 }
317
318 static IDispatchEx *get_script_dispatch(IActiveScript *script)
319 {
320     IDispatchEx *dispex;
321     IDispatch *disp;
322     HRESULT hres;
323
324     disp = (void*)0xdeadbeef;
325     hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
326     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
327     if(FAILED(hres))
328         return NULL;
329
330     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
331     IDispatch_Release(disp);
332     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
333     return dispex;
334 }
335
336 static void parse_script(IActiveScriptParse *parse, const char *src)
337 {
338     BSTR str;
339     HRESULT hres;
340
341     SET_EXPECT(OnEnterScript);
342     SET_EXPECT(OnLeaveScript);
343
344     str = a2bstr(src);
345     hres = IActiveScriptParse_ParseScriptText(parse, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
346     SysFreeString(str);
347     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
348
349     CHECK_CALLED(OnEnterScript);
350     CHECK_CALLED(OnLeaveScript);
351 }
352
353 #define get_disp_id(a,b,c,d) _get_disp_id(__LINE__,a,b,c,d)
354 static void _get_disp_id(unsigned line, IDispatchEx *dispex, const char *name, HRESULT exhres, DISPID *id)
355 {
356     DISPID id2;
357     BSTR str;
358     HRESULT hres;
359
360     str = a2bstr(name);
361     hres = IDispatchEx_GetDispID(dispex, str, 0, id);
362     ok_(__FILE__,line)(hres == exhres, "GetDispID(%s) returned %08x, expected %08x\n", name, hres, exhres);
363
364     hres = IDispatchEx_GetIDsOfNames(dispex, &IID_NULL, &str, 1, 0, &id2);
365     SysFreeString(str);
366     ok_(__FILE__,line)(hres == exhres, "GetIDsOfNames(%s) returned %08x, expected %08x\n", name, hres, exhres);
367     ok_(__FILE__,line)(*id == id2, "GetIDsOfNames(%s) id != id2\n", name);
368 }
369
370 static void test_no_script_dispatch(IActiveScript *script)
371 {
372     IDispatch *disp;
373     HRESULT hres;
374
375     disp = (void*)0xdeadbeef;
376     hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
377     ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
378     ok(!disp, "disp != NULL\n");
379 }
380
381 static IActiveScript *create_vbscript(void)
382 {
383     IActiveScript *ret;
384     HRESULT hres;
385
386     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
387             &IID_IActiveScript, (void**)&ret);
388     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
389
390     return ret;
391 }
392
393 static void test_scriptdisp(void)
394 {
395     IActiveScriptParse *parser;
396     IDispatchEx *script_disp;
397     IActiveScript *vbscript;
398     DISPID id, id2;
399     DISPPARAMS dp;
400     EXCEPINFO ei;
401     VARIANT v;
402     ULONG ref;
403     HRESULT hres;
404
405     vbscript = create_vbscript();
406
407     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
408     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
409
410     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
411     test_safety(vbscript);
412
413     SET_EXPECT(GetLCID);
414     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
415     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
416     CHECK_CALLED(GetLCID);
417
418     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
419
420     SET_EXPECT(OnStateChange_INITIALIZED);
421     hres = IActiveScriptParse_InitNew(parser);
422     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
423     CHECK_CALLED(OnStateChange_INITIALIZED);
424
425     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
426
427     SET_EXPECT(OnStateChange_CONNECTED);
428     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
429     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
430     CHECK_CALLED(OnStateChange_CONNECTED);
431
432     test_state(vbscript, SCRIPTSTATE_CONNECTED);
433
434     script_disp = get_script_dispatch(vbscript);
435
436     id = 100;
437     get_disp_id(script_disp, "LCase", DISP_E_UNKNOWNNAME, &id);
438     ok(id == -1, "id = %d, expected -1\n", id);
439
440     get_disp_id(script_disp, "globalVariable", DISP_E_UNKNOWNNAME, &id);
441     parse_script(parser, "dim globalVariable\nglobalVariable = 3");
442     get_disp_id(script_disp, "globalVariable", S_OK, &id);
443
444     memset(&dp, 0, sizeof(dp));
445     memset(&ei, 0, sizeof(ei));
446     V_VT(&v) = VT_EMPTY;
447     hres = IDispatchEx_InvokeEx(script_disp, id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
448     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
449     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
450     ok(V_I2(&v) == 3, "V_I2(v) = %d\n", V_I2(&v));
451
452     get_disp_id(script_disp, "globalVariable2", DISP_E_UNKNOWNNAME, &id);
453     parse_script(parser, "globalVariable2 = 4");
454     get_disp_id(script_disp, "globalVariable2", S_OK, &id);
455
456     get_disp_id(script_disp, "globalFunction", DISP_E_UNKNOWNNAME, &id);
457     parse_script(parser, "function globalFunction()\nglobalFunction=5\nend function");
458     get_disp_id(script_disp, "globalFunction", S_OK, &id);
459
460     SET_EXPECT(OnEnterScript);
461     SET_EXPECT(OnLeaveScript);
462
463     memset(&dp, 0, sizeof(dp));
464     memset(&ei, 0, sizeof(ei));
465     V_VT(&v) = VT_EMPTY;
466     hres = IDispatchEx_InvokeEx(script_disp, id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
467     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
468     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
469     ok(V_I2(&v) == 5, "V_I2(v) = %d\n", V_I2(&v));
470
471     CHECK_CALLED(OnEnterScript);
472     CHECK_CALLED(OnLeaveScript);
473
474     SET_EXPECT(OnEnterScript);
475     SET_EXPECT(OnLeaveScript);
476
477     memset(&dp, 0, sizeof(dp));
478     memset(&ei, 0, sizeof(ei));
479     V_VT(&v) = VT_EMPTY;
480     hres = IDispatchEx_Invoke(script_disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
481     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
482     ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
483     ok(V_I2(&v) == 5, "V_I2(v) = %d\n", V_I2(&v));
484
485     CHECK_CALLED(OnEnterScript);
486     CHECK_CALLED(OnLeaveScript);
487
488     get_disp_id(script_disp, "globalSub", DISP_E_UNKNOWNNAME, &id);
489     parse_script(parser, "sub globalSub()\nend sub");
490     get_disp_id(script_disp, "globalSub", S_OK, &id);
491     get_disp_id(script_disp, "globalSub", S_OK, &id2);
492     ok(id == id2, "id != id2\n");
493
494     get_disp_id(script_disp, "constVariable", DISP_E_UNKNOWNNAME, &id);
495     parse_script(parser, "const constVariable = 6");
496     get_disp_id(script_disp, "ConstVariable", S_OK, &id);
497     get_disp_id(script_disp, "Constvariable", S_OK, &id2);
498     ok(id == id2, "id != id2\n");
499
500     IDispatchEx_Release(script_disp);
501
502     IActiveScriptParse_Release(parser);
503
504     SET_EXPECT(OnStateChange_DISCONNECTED);
505     SET_EXPECT(OnStateChange_INITIALIZED);
506     SET_EXPECT(OnStateChange_CLOSED);
507     hres = IActiveScript_Close(vbscript);
508     ok(hres == S_OK, "Close failed: %08x\n", hres);
509     CHECK_CALLED(OnStateChange_DISCONNECTED);
510     CHECK_CALLED(OnStateChange_INITIALIZED);
511     CHECK_CALLED(OnStateChange_CLOSED);
512
513     ref = IActiveScript_Release(vbscript);
514     ok(!ref, "ref = %d\n", ref);
515 }
516
517 static void test_vbscript(void)
518 {
519     IActiveScriptParseProcedure2 *parse_proc;
520     IActiveScriptParse *parser;
521     IActiveScript *vbscript;
522     ULONG ref;
523     HRESULT hres;
524
525     vbscript = create_vbscript();
526
527     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
528     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
529
530     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
531     test_safety(vbscript);
532
533     SET_EXPECT(GetLCID);
534     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
535     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
536     CHECK_CALLED(GetLCID);
537
538     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
539
540     SET_EXPECT(OnStateChange_INITIALIZED);
541     hres = IActiveScriptParse_InitNew(parser);
542     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
543     CHECK_CALLED(OnStateChange_INITIALIZED);
544
545     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
546
547     hres = IActiveScriptParse_InitNew(parser);
548     ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
549
550     SET_EXPECT(OnStateChange_CONNECTED);
551     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
552     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
553     CHECK_CALLED(OnStateChange_CONNECTED);
554
555     test_state(vbscript, SCRIPTSTATE_CONNECTED);
556
557     SET_EXPECT(OnStateChange_DISCONNECTED);
558     SET_EXPECT(OnStateChange_INITIALIZED);
559     SET_EXPECT(OnStateChange_CLOSED);
560     hres = IActiveScript_Close(vbscript);
561     ok(hres == S_OK, "Close failed: %08x\n", hres);
562     CHECK_CALLED(OnStateChange_DISCONNECTED);
563     CHECK_CALLED(OnStateChange_INITIALIZED);
564     CHECK_CALLED(OnStateChange_CLOSED);
565
566     test_state(vbscript, SCRIPTSTATE_CLOSED);
567     test_no_script_dispatch(vbscript);
568
569     IActiveScriptParse_Release(parser);
570
571     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParseProcedure, (void**)&parse_proc);
572     ok(hres == E_NOINTERFACE, "Got IActiveScriptParseProcedure interface, expected E_NOTIMPL\n");
573
574     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
575     ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 interface\n");
576     IActiveScriptParseProcedure2_Release(parse_proc);
577
578     ref = IActiveScript_Release(vbscript);
579     ok(!ref, "ref = %d\n", ref);
580 }
581
582 static void test_vbscript_uninitializing(void)
583 {
584     IActiveScriptParse *parse;
585     IActiveScript *script;
586     IDispatchEx *dispex;
587     ULONG ref;
588     HRESULT hres;
589
590     static const WCHAR script_textW[] =
591         {'F','u','n','c','t','i','o','n',' ','f','\n','E','n','d',' ','F','u','n','c','t','i','o','n','\n',0};
592
593     script = create_vbscript();
594
595     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
596     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
597
598     test_state(script, SCRIPTSTATE_UNINITIALIZED);
599
600     hres = IActiveScriptParse_InitNew(parse);
601     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
602
603     SET_EXPECT(GetLCID);
604     SET_EXPECT(OnStateChange_INITIALIZED);
605     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
606     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
607     CHECK_CALLED(GetLCID);
608     CHECK_CALLED(OnStateChange_INITIALIZED);
609
610     test_state(script, SCRIPTSTATE_INITIALIZED);
611
612     hres = IActiveScriptParse_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL);
613     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
614
615     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
616     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
617
618     SET_EXPECT(OnStateChange_UNINITIALIZED);
619     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
620     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
621     CHECK_CALLED(OnStateChange_UNINITIALIZED);
622
623     test_state(script, SCRIPTSTATE_UNINITIALIZED);
624
625     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
626     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
627
628     SET_EXPECT(GetLCID);
629     SET_EXPECT(OnStateChange_INITIALIZED);
630     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
631     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
632     CHECK_CALLED(GetLCID);
633     CHECK_CALLED(OnStateChange_INITIALIZED);
634
635     SET_EXPECT(OnStateChange_CONNECTED);
636     SET_EXPECT(OnEnterScript);
637     SET_EXPECT(OnLeaveScript);
638     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
639     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
640     CHECK_CALLED(OnStateChange_CONNECTED);
641     CHECK_CALLED(OnEnterScript);
642     CHECK_CALLED(OnLeaveScript);
643
644     test_state(script, SCRIPTSTATE_CONNECTED);
645
646     dispex = get_script_dispatch(script);
647     ok(dispex != NULL, "dispex == NULL\n");
648     if(dispex)
649         IDispatchEx_Release(dispex);
650
651     SET_EXPECT(OnStateChange_DISCONNECTED);
652     SET_EXPECT(OnStateChange_INITIALIZED);
653     SET_EXPECT(OnStateChange_UNINITIALIZED);
654     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
655     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
656     CHECK_CALLED(OnStateChange_DISCONNECTED);
657     CHECK_CALLED(OnStateChange_INITIALIZED);
658     CHECK_CALLED(OnStateChange_UNINITIALIZED);
659
660     test_state(script, SCRIPTSTATE_UNINITIALIZED);
661
662     hres = IActiveScript_Close(script);
663     ok(hres == S_OK, "Close failed: %08x\n", hres);
664
665     test_state(script, SCRIPTSTATE_CLOSED);
666
667     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
668     ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres);
669
670     test_state(script, SCRIPTSTATE_CLOSED);
671
672     SET_EXPECT(GetLCID);
673     SET_EXPECT(OnStateChange_INITIALIZED);
674     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
675     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
676     CHECK_CALLED(GetLCID);
677     CHECK_CALLED(OnStateChange_INITIALIZED);
678
679     test_state(script, SCRIPTSTATE_INITIALIZED);
680
681     SET_EXPECT(OnStateChange_CLOSED);
682     hres = IActiveScript_Close(script);
683     ok(hres == S_OK, "Close failed: %08x\n", hres);
684     CHECK_CALLED(OnStateChange_CLOSED);
685
686     test_state(script, SCRIPTSTATE_CLOSED);
687
688     IActiveScriptParse_Release(parse);
689
690     ref = IActiveScript_Release(script);
691     ok(!ref, "ref = %d\n", ref);
692 }
693
694 static void test_vbscript_release(void)
695 {
696     IActiveScriptParse *parser;
697     IActiveScript *vbscript;
698     ULONG ref;
699     HRESULT hres;
700
701     vbscript = create_vbscript();
702
703     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
704     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
705
706     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
707     test_safety(vbscript);
708
709     SET_EXPECT(GetLCID);
710     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
711     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
712     CHECK_CALLED(GetLCID);
713
714     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
715
716     SET_EXPECT(OnStateChange_INITIALIZED);
717     hres = IActiveScriptParse_InitNew(parser);
718     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
719     CHECK_CALLED(OnStateChange_INITIALIZED);
720
721     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
722
723     SET_EXPECT(OnStateChange_CONNECTED);
724     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
725     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
726     CHECK_CALLED(OnStateChange_CONNECTED);
727
728     test_state(vbscript, SCRIPTSTATE_CONNECTED);
729
730     IActiveScriptParse_Release(parser);
731
732     SET_EXPECT(OnStateChange_DISCONNECTED);
733     SET_EXPECT(OnStateChange_INITIALIZED);
734     SET_EXPECT(OnStateChange_CLOSED);
735     ref = IActiveScript_Release(vbscript);
736     ok(!ref, "ref = %d\n", ref);
737     CHECK_CALLED(OnStateChange_DISCONNECTED);
738     CHECK_CALLED(OnStateChange_INITIALIZED);
739     CHECK_CALLED(OnStateChange_CLOSED);
740 }
741
742 static void test_vbscript_simplecreate(void)
743 {
744     IActiveScript *script;
745     ULONG ref;
746     HRESULT hres;
747
748     script = create_vbscript();
749
750     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
751     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
752
753     ref = IActiveScript_Release(script);
754     ok(!ref, "ref = %d\n", ref);
755 }
756
757 static void test_vbscript_initializing(void)
758 {
759     IActiveScriptParse *parse;
760     IActiveScript *script;
761     ULONG ref;
762     HRESULT hres;
763
764     script = create_vbscript();
765
766     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
767     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
768
769     test_state(script, SCRIPTSTATE_UNINITIALIZED);
770
771     SET_EXPECT(GetLCID);
772     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
773     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
774     CHECK_CALLED(GetLCID);
775
776     SET_EXPECT(OnStateChange_INITIALIZED);
777     hres = IActiveScriptParse_InitNew(parse);
778     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
779     CHECK_CALLED(OnStateChange_INITIALIZED);
780
781     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
782     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
783
784     SET_EXPECT(OnStateChange_CLOSED);
785     hres = IActiveScript_Close(script);
786     ok(hres == S_OK, "Close failed: %08x\n", hres);
787     CHECK_CALLED(OnStateChange_CLOSED);
788
789     test_state(script, SCRIPTSTATE_CLOSED);
790
791     IActiveScriptParse_Release(parse);
792
793     ref = IActiveScript_Release(script);
794     ok(!ref, "ref = %d\n", ref);
795 }
796
797 static void test_RegExp(void)
798 {
799     IRegExp2 *regexp;
800     IMatchCollection2 *mc;
801     IMatch2 *match;
802     ISubMatches *sm;
803     IEnumVARIANT *ev;
804     IUnknown *unk;
805     IDispatch *disp;
806     HRESULT hres;
807     BSTR bstr;
808     LONG count;
809     VARIANT v;
810     ULONG fetched;
811
812     hres = CoCreateInstance(&CLSID_VBScriptRegExp, NULL,
813             CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
814             &IID_IUnknown, (void**)&unk);
815     if(hres == REGDB_E_CLASSNOTREG) {
816         win_skip("VBScriptRegExp is not registered\n");
817         return;
818     }
819     ok(hres == S_OK, "CoCreateInstance(CLSID_VBScriptRegExp) failed: %x\n", hres);
820
821     hres = IUnknown_QueryInterface(unk, &IID_IRegExp2, (void**)&regexp);
822     if(hres == E_NOINTERFACE) {
823         win_skip("IRegExp2 interface is not available\n");
824         return;
825     }
826     ok(hres == S_OK, "QueryInterface(IID_IRegExp2) failed: %x\n", hres);
827     IUnknown_Release(unk);
828
829     hres = IRegExp2_QueryInterface(regexp, &IID_IRegExp, (void**)&unk);
830     ok(hres == S_OK, "QueryInterface(IID_IRegExp) returned %x\n", hres);
831     IUnknown_Release(unk);
832
833     hres = IRegExp2_QueryInterface(regexp, &IID_IDispatchEx, (void**)&unk);
834     ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDispatchEx) returned %x\n", hres);
835
836     hres = IRegExp2_get_Pattern(regexp, &bstr);
837     ok(bstr == NULL, "bstr != NULL\n");
838     ok(hres == S_OK, "get_Pattern returned %x, expected S_OK\n", hres);
839
840     hres = IRegExp2_get_Pattern(regexp, NULL);
841     ok(hres == E_POINTER, "get_Pattern returned %x, expected E_POINTER\n", hres);
842
843     hres = IRegExp2_get_IgnoreCase(regexp, NULL);
844     ok(hres == E_POINTER, "get_IgnoreCase returned %x, expected E_POINTER\n", hres);
845
846     hres = IRegExp2_get_Global(regexp, NULL);
847     ok(hres == E_POINTER, "get_Global returned %x, expected E_POINTER\n", hres);
848
849     hres = IRegExp2_Execute(regexp, NULL, &disp);
850     ok(hres == S_OK, "Execute returned %x, expected S_OK\n", hres);
851     hres = IDispatch_QueryInterface(disp, &IID_IMatchCollection2, (void**)&mc);
852     ok(hres == S_OK, "QueryInterface(IID_IMatchCollection2) returned %x\n", hres);
853     IDispatch_Release(disp);
854
855     hres = IMatchCollection2_QueryInterface(mc, &IID_IMatchCollection, (void**)&unk);
856     ok(hres == S_OK, "QueryInterface(IID_IMatchCollection) returned %x\n", hres);
857     IUnknown_Release(unk);
858
859     hres = IMatchCollection2_get_Count(mc, NULL);
860     ok(hres == E_POINTER, "get_Count returned %x, expected E_POINTER\n", hres);
861
862     hres = IMatchCollection2_get_Count(mc, &count);
863     ok(hres == S_OK, "get_Count returned %x, expected S_OK\n", hres);
864     ok(count == 1, "count = %d\n", count);
865
866     hres = IMatchCollection2_get_Item(mc, 1, &disp);
867     ok(hres == E_INVALIDARG, "get_Item returned %x, expected E_INVALIDARG\n", hres);
868
869     hres = IMatchCollection2_get_Item(mc, 1, NULL);
870     ok(hres == E_POINTER, "get_Item returned %x, expected E_POINTER\n", hres);
871
872     hres = IMatchCollection2_get_Item(mc, 0, &disp);
873     ok(hres == S_OK, "get_Item returned %x, expected S_OK\n", hres);
874     hres = IDispatch_QueryInterface(disp, &IID_IMatch2, (void**)&match);
875     ok(hres == S_OK, "QueryInterface(IID_IMatch2) returned %x\n", hres);
876     IDispatch_Release(disp);
877
878     hres = IMatch2_QueryInterface(match, &IID_IMatch, (void**)&unk);
879     ok(hres == S_OK, "QueryInterface(IID_IMatch) returned %x\n", hres);
880     IUnknown_Release(unk);
881
882     hres = IMatch2_get_Value(match, NULL);
883     ok(hres == E_POINTER, "get_Value returned %x, expected E_POINTER\n", hres);
884
885     hres = IMatch2_get_FirstIndex(match, NULL);
886     ok(hres == E_POINTER, "get_FirstIndex returned %x, expected E_POINTER\n", hres);
887
888     hres = IMatch2_get_Length(match, NULL);
889     ok(hres == E_POINTER, "get_Length returned %x, expected E_POINTER\n", hres);
890
891     hres = IMatch2_get_SubMatches(match, NULL);
892     ok(hres == E_POINTER, "get_SubMatches returned %x, expected E_POINTER\n", hres);
893
894     hres = IMatch2_get_SubMatches(match, &disp);
895     ok(hres == S_OK, "get_SubMatches returned %x, expected S_OK\n", hres);
896     IMatch2_Release(match);
897     hres = IDispatch_QueryInterface(disp, &IID_ISubMatches, (void**)&sm);
898     ok(hres == S_OK, "QueryInterface(IID_ISubMatches) returned %x\n", hres);
899     IDispatch_Release(disp);
900
901     hres = ISubMatches_get_Item(sm, 0, &v);
902     ok(hres == E_INVALIDARG, "get_Item returned %x, expected E_INVALIDARG\n", hres);
903
904     hres = ISubMatches_get_Item(sm, 0, NULL);
905     ok(hres == E_POINTER, "get_Item returned %x, expected E_POINTER\n", hres);
906
907     hres = ISubMatches_get_Count(sm, NULL);
908     ok(hres == E_POINTER, "get_Count returned %x, expected E_POINTER\n", hres);
909     ISubMatches_Release(sm);
910
911     hres = IMatchCollection2_get__NewEnum(mc, &unk);
912     ok(hres == S_OK, "get__NewEnum returned %x, expected S_OK\n", hres);
913     hres = IUnknown_QueryInterface(unk, &IID_IEnumVARIANT, (void**)&ev);
914     ok(hres == S_OK, "QueryInterface(IID_IEnumVARIANT) returned %x\n", hres);
915     IUnknown_Release(unk);
916     IMatchCollection2_Release(mc);
917
918     hres = IEnumVARIANT_Skip(ev, 2);
919     ok(hres == S_OK, "Skip returned %x\n", hres);
920
921     hres = IEnumVARIANT_Next(ev, 1, &v, &fetched);
922     ok(hres == S_FALSE, "Next returned %x, expected S_FALSE\n", hres);
923     ok(fetched == 0, "fetched = %d\n", fetched);
924
925     hres = IEnumVARIANT_Skip(ev, -1);
926     ok(hres == S_OK, "Skip returned %x\n", hres);
927
928     hres = IEnumVARIANT_Next(ev, 1, &v, &fetched);
929     ok(hres == S_OK, "Next returned %x\n", hres);
930     ok(fetched == 1, "fetched = %d\n", fetched);
931     VariantClear(&v);
932     IEnumVARIANT_Release(ev);
933
934     IRegExp2_Release(regexp);
935 }
936
937 static BOOL check_vbscript(void)
938 {
939     IActiveScriptParseProcedure2 *vbscript;
940     HRESULT hres;
941
942     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
943             &IID_IActiveScriptParseProcedure2, (void**)&vbscript);
944     if(SUCCEEDED(hres))
945         IActiveScriptParseProcedure2_Release(vbscript);
946
947     return hres == S_OK;
948 }
949
950 START_TEST(vbscript)
951 {
952     CoInitialize(NULL);
953
954     if(check_vbscript()) {
955         test_vbscript();
956         test_vbscript_uninitializing();
957         test_vbscript_release();
958         test_vbscript_simplecreate();
959         test_vbscript_initializing();
960         test_scriptdisp();
961         test_RegExp();
962     }else {
963         win_skip("VBScript engine not available or too old\n");
964     }
965
966     CoUninitialize();
967 }