[VBSCRIPT_WINETEST] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / modules / rostests / winetests / vbscript / 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 }