vbscript/tests: Use proper helpers for iface calls.
[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 "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
37 #else
38
39 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
40 #define IActiveScriptParse_Release IActiveScriptParse32_Release
41 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
42 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
43
44 #endif
45
46 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
47
48 #define DEFINE_EXPECT(func) \
49     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
50
51 #define SET_EXPECT(func) \
52     expect_ ## func = TRUE
53
54 #define CHECK_EXPECT2(func) \
55     do { \
56         ok(expect_ ##func, "unexpected call " #func "\n"); \
57         called_ ## func = TRUE; \
58     }while(0)
59
60 #define CHECK_EXPECT(func) \
61     do { \
62         CHECK_EXPECT2(func); \
63         expect_ ## func = FALSE; \
64     }while(0)
65
66 #define CHECK_CALLED(func) \
67     do { \
68         ok(called_ ## func, "expected " #func "\n"); \
69         expect_ ## func = called_ ## func = FALSE; \
70     }while(0)
71
72 DEFINE_EXPECT(GetLCID);
73 DEFINE_EXPECT(OnStateChange_UNINITIALIZED);
74 DEFINE_EXPECT(OnStateChange_STARTED);
75 DEFINE_EXPECT(OnStateChange_CONNECTED);
76 DEFINE_EXPECT(OnStateChange_DISCONNECTED);
77 DEFINE_EXPECT(OnStateChange_CLOSED);
78 DEFINE_EXPECT(OnStateChange_INITIALIZED);
79 DEFINE_EXPECT(OnEnterScript);
80 DEFINE_EXPECT(OnLeaveScript);
81
82 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8);
83
84 #define test_state(s,ss) _test_state(__LINE__,s,ss)
85 static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate)
86 {
87     SCRIPTSTATE state = -1;
88     HRESULT hres;
89
90     hres = IActiveScript_GetScriptState(script, &state);
91     ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres);
92     ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);
93 }
94
95 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
96 {
97     *ppv = NULL;
98
99     if(IsEqualGUID(&IID_IUnknown, riid))
100         *ppv = iface;
101     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
102         *ppv = iface;
103     else
104         return E_NOINTERFACE;
105
106     IUnknown_AddRef((IUnknown*)*ppv);
107     return S_OK;
108 }
109
110 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
111 {
112     return 2;
113 }
114
115 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
116 {
117     return 1;
118 }
119
120 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
121 {
122     CHECK_EXPECT(GetLCID);
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
127         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
128 {
129     ok(0, "unexpected call\n");
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
134 {
135     ok(0, "unexpected call\n");
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
140         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
141 {
142     ok(0, "unexpected call\n");
143     return E_NOTIMPL;
144 }
145
146 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
147 {
148     switch(ssScriptState) {
149     case SCRIPTSTATE_UNINITIALIZED:
150         CHECK_EXPECT(OnStateChange_UNINITIALIZED);
151         return S_OK;
152     case SCRIPTSTATE_STARTED:
153         CHECK_EXPECT(OnStateChange_STARTED);
154         return S_OK;
155     case SCRIPTSTATE_CONNECTED:
156         CHECK_EXPECT(OnStateChange_CONNECTED);
157         return S_OK;
158     case SCRIPTSTATE_DISCONNECTED:
159         CHECK_EXPECT(OnStateChange_DISCONNECTED);
160         return S_OK;
161     case SCRIPTSTATE_CLOSED:
162         CHECK_EXPECT(OnStateChange_CLOSED);
163         return S_OK;
164     case SCRIPTSTATE_INITIALIZED:
165         CHECK_EXPECT(OnStateChange_INITIALIZED);
166         return S_OK;
167     default:
168         ok(0, "unexpected call %d\n", ssScriptState);
169     }
170
171     return E_NOTIMPL;
172 }
173
174 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
175 {
176     ok(0, "unexpected call\n");
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
181 {
182     CHECK_EXPECT(OnEnterScript);
183     return S_OK;
184 }
185
186 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
187 {
188     CHECK_EXPECT(OnLeaveScript);
189     return S_OK;
190 }
191
192 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
193     ActiveScriptSite_QueryInterface,
194     ActiveScriptSite_AddRef,
195     ActiveScriptSite_Release,
196     ActiveScriptSite_GetLCID,
197     ActiveScriptSite_GetItemInfo,
198     ActiveScriptSite_GetDocVersionString,
199     ActiveScriptSite_OnScriptTerminate,
200     ActiveScriptSite_OnStateChange,
201     ActiveScriptSite_OnScriptError,
202     ActiveScriptSite_OnEnterScript,
203     ActiveScriptSite_OnLeaveScript
204 };
205
206 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
207
208 static void test_safety(IActiveScript *script)
209 {
210     IObjectSafety *safety;
211     DWORD supported, enabled;
212     HRESULT hres;
213
214     hres = IActiveScript_QueryInterface(script, &IID_IObjectSafety, (void**)&safety);
215     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
216     if(FAILED(hres))
217         return;
218
219     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL);
220     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
221     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled);
222     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
223
224     supported = enabled = 0xdeadbeef;
225     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, &enabled);
226     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
227     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
228        "supported=%x\n", supported);
229     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
230
231     supported = enabled = 0xdeadbeef;
232     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScript, &supported, &enabled);
233     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
234     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
235        "supported=%x\n", supported);
236     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
237
238     supported = enabled = 0xdeadbeef;
239     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
240     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
241     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
242        "supported=%x\n", supported);
243     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
244
245     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
246             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER
247                 |INTERFACESAFE_FOR_UNTRUSTED_CALLER,
248             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
249     ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
250
251     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
252             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
253             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
254     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
255
256     supported = enabled = 0xdeadbeef;
257     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
258     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
259     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
260        "supported=%x\n", supported);
261     ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
262        "enabled=%x\n", enabled);
263
264     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
265     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
266
267     supported = enabled = 0xdeadbeef;
268     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
269     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
270     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
271        "supported=%x\n", supported);
272     ok(enabled == (INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
273
274     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
275             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, 0);
276     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
277
278     supported = enabled = 0xdeadbeef;
279     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
280     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
281     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
282        "supported=%x\n", supported);
283     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
284
285     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
286             INTERFACE_USES_DISPEX, 0);
287     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
288
289     supported = enabled = 0xdeadbeef;
290     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
291     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
292     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
293        "supported=%x\n", supported);
294     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
295
296     IObjectSafety_Release(safety);
297 }
298
299 static IDispatchEx *get_script_dispatch(IActiveScript *script)
300 {
301     IDispatchEx *dispex;
302     IDispatch *disp;
303     HRESULT hres;
304
305     disp = (void*)0xdeadbeef;
306     hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
307     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
308     if(FAILED(hres))
309         return NULL;
310
311     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
312     IDispatch_Release(disp);
313     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
314     return dispex;
315 }
316
317 static void test_no_script_dispatch(IActiveScript *script)
318 {
319     IDispatch *disp;
320     HRESULT hres;
321
322     disp = (void*)0xdeadbeef;
323     hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
324     ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
325     ok(!disp, "disp != NULL\n");
326 }
327
328 static IActiveScript *create_vbscript(void)
329 {
330     IActiveScript *ret;
331     HRESULT hres;
332
333     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
334             &IID_IActiveScript, (void**)&ret);
335     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
336
337     return ret;
338 }
339
340 static void test_vbscript(void)
341 {
342     IActiveScriptParse *parser;
343     IActiveScript *vbscript;
344     ULONG ref;
345     HRESULT hres;
346
347     vbscript = create_vbscript();
348
349     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
350     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
351
352     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
353     test_safety(vbscript);
354
355     SET_EXPECT(GetLCID);
356     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
357     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
358     CHECK_CALLED(GetLCID);
359
360     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
361
362     SET_EXPECT(OnStateChange_INITIALIZED);
363     hres = IActiveScriptParse_InitNew(parser);
364     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
365     CHECK_CALLED(OnStateChange_INITIALIZED);
366
367     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
368
369     hres = IActiveScriptParse_InitNew(parser);
370     ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
371
372     SET_EXPECT(OnStateChange_CONNECTED);
373     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
374     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
375     CHECK_CALLED(OnStateChange_CONNECTED);
376
377     test_state(vbscript, SCRIPTSTATE_CONNECTED);
378
379     SET_EXPECT(OnStateChange_DISCONNECTED);
380     SET_EXPECT(OnStateChange_INITIALIZED);
381     SET_EXPECT(OnStateChange_CLOSED);
382     hres = IActiveScript_Close(vbscript);
383     ok(hres == S_OK, "Close failed: %08x\n", hres);
384     CHECK_CALLED(OnStateChange_DISCONNECTED);
385     CHECK_CALLED(OnStateChange_INITIALIZED);
386     CHECK_CALLED(OnStateChange_CLOSED);
387
388     test_state(vbscript, SCRIPTSTATE_CLOSED);
389     test_no_script_dispatch(vbscript);
390
391     IActiveScriptParse_Release(parser);
392
393     ref = IActiveScript_Release(vbscript);
394     ok(!ref, "ref = %d\n", ref);
395 }
396
397 static void test_vbscript_uninitializing(void)
398 {
399     IActiveScriptParse *parse;
400     IActiveScript *script;
401     IDispatchEx *dispex;
402     ULONG ref;
403     HRESULT hres;
404
405     static const WCHAR script_textW[] =
406         {'F','u','n','c','t','i','o','n',' ','f','\n','E','n','d',' ','F','u','n','c','t','i','o','n','\n',0};
407
408     script = create_vbscript();
409
410     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
411     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
412
413     test_state(script, SCRIPTSTATE_UNINITIALIZED);
414
415     hres = IActiveScriptParse_InitNew(parse);
416     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
417
418     SET_EXPECT(GetLCID);
419     SET_EXPECT(OnStateChange_INITIALIZED);
420     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
421     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
422     CHECK_CALLED(GetLCID);
423     CHECK_CALLED(OnStateChange_INITIALIZED);
424
425     test_state(script, SCRIPTSTATE_INITIALIZED);
426
427     hres = IActiveScriptParse_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL);
428     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
429
430     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
431     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
432
433     SET_EXPECT(OnStateChange_UNINITIALIZED);
434     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
435     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
436     CHECK_CALLED(OnStateChange_UNINITIALIZED);
437
438     test_state(script, SCRIPTSTATE_UNINITIALIZED);
439
440     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
441     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
442
443     SET_EXPECT(GetLCID);
444     SET_EXPECT(OnStateChange_INITIALIZED);
445     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
446     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
447     CHECK_CALLED(GetLCID);
448     CHECK_CALLED(OnStateChange_INITIALIZED);
449
450     SET_EXPECT(OnStateChange_CONNECTED);
451     SET_EXPECT(OnEnterScript);
452     SET_EXPECT(OnLeaveScript);
453     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
454     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
455     CHECK_CALLED(OnStateChange_CONNECTED);
456     CHECK_CALLED(OnEnterScript);
457     CHECK_CALLED(OnLeaveScript);
458
459     test_state(script, SCRIPTSTATE_CONNECTED);
460
461     dispex = get_script_dispatch(script);
462     ok(dispex != NULL, "dispex == NULL\n");
463     if(dispex)
464         IDispatchEx_Release(dispex);
465
466     SET_EXPECT(OnStateChange_DISCONNECTED);
467     SET_EXPECT(OnStateChange_INITIALIZED);
468     SET_EXPECT(OnStateChange_UNINITIALIZED);
469     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
470     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
471     CHECK_CALLED(OnStateChange_DISCONNECTED);
472     CHECK_CALLED(OnStateChange_INITIALIZED);
473     CHECK_CALLED(OnStateChange_UNINITIALIZED);
474
475     test_state(script, SCRIPTSTATE_UNINITIALIZED);
476
477     hres = IActiveScript_Close(script);
478     ok(hres == S_OK, "Close failed: %08x\n", hres);
479
480     test_state(script, SCRIPTSTATE_CLOSED);
481
482     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
483     ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres);
484
485     test_state(script, SCRIPTSTATE_CLOSED);
486
487     SET_EXPECT(GetLCID);
488     SET_EXPECT(OnStateChange_INITIALIZED);
489     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
490     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
491     CHECK_CALLED(GetLCID);
492     CHECK_CALLED(OnStateChange_INITIALIZED);
493
494     test_state(script, SCRIPTSTATE_INITIALIZED);
495
496     SET_EXPECT(OnStateChange_CLOSED);
497     hres = IActiveScript_Close(script);
498     ok(hres == S_OK, "Close failed: %08x\n", hres);
499     CHECK_CALLED(OnStateChange_CLOSED);
500
501     test_state(script, SCRIPTSTATE_CLOSED);
502
503     IActiveScriptParse_Release(parse);
504
505     ref = IActiveScript_Release(script);
506     ok(!ref, "ref = %d\n", ref);
507 }
508
509 static void test_vbscript_release(void)
510 {
511     IActiveScriptParse *parser;
512     IActiveScript *vbscript;
513     ULONG ref;
514     HRESULT hres;
515
516     vbscript = create_vbscript();
517
518     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
519     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
520
521     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
522     test_safety(vbscript);
523
524     SET_EXPECT(GetLCID);
525     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
526     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
527     CHECK_CALLED(GetLCID);
528
529     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
530
531     SET_EXPECT(OnStateChange_INITIALIZED);
532     hres = IActiveScriptParse_InitNew(parser);
533     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
534     CHECK_CALLED(OnStateChange_INITIALIZED);
535
536     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
537
538     SET_EXPECT(OnStateChange_CONNECTED);
539     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
540     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
541     CHECK_CALLED(OnStateChange_CONNECTED);
542
543     test_state(vbscript, SCRIPTSTATE_CONNECTED);
544
545     IActiveScriptParse_Release(parser);
546
547     SET_EXPECT(OnStateChange_DISCONNECTED);
548     SET_EXPECT(OnStateChange_INITIALIZED);
549     SET_EXPECT(OnStateChange_CLOSED);
550     ref = IActiveScript_Release(vbscript);
551     ok(!ref, "ref = %d\n", ref);
552     CHECK_CALLED(OnStateChange_DISCONNECTED);
553     CHECK_CALLED(OnStateChange_INITIALIZED);
554     CHECK_CALLED(OnStateChange_CLOSED);
555 }
556
557 static void test_vbscript_simplecreate(void)
558 {
559     IActiveScript *script;
560     ULONG ref;
561     HRESULT hres;
562
563     script = create_vbscript();
564
565     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
566     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
567
568     ref = IActiveScript_Release(script);
569     ok(!ref, "ref = %d\n", ref);
570 }
571
572 static void test_vbscript_initializing(void)
573 {
574     IActiveScriptParse *parse;
575     IActiveScript *script;
576     ULONG ref;
577     HRESULT hres;
578
579     script = create_vbscript();
580
581     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
582     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
583
584     test_state(script, SCRIPTSTATE_UNINITIALIZED);
585
586     SET_EXPECT(GetLCID);
587     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
588     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
589     CHECK_CALLED(GetLCID);
590
591     SET_EXPECT(OnStateChange_INITIALIZED);
592     hres = IActiveScriptParse_InitNew(parse);
593     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
594     CHECK_CALLED(OnStateChange_INITIALIZED);
595
596     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
597     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
598
599     SET_EXPECT(OnStateChange_CLOSED);
600     hres = IActiveScript_Close(script);
601     ok(hres == S_OK, "Close failed: %08x\n", hres);
602     CHECK_CALLED(OnStateChange_CLOSED);
603
604     test_state(script, SCRIPTSTATE_CLOSED);
605
606     IActiveScriptParse_Release(parse);
607
608     ref = IActiveScript_Release(script);
609     ok(!ref, "ref = %d\n", ref);
610 }
611
612 static BOOL check_vbscript(void)
613 {
614     IActiveScript *vbscript;
615     HRESULT hres;
616
617     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
618             &IID_IActiveScript, (void**)&vbscript);
619     if(SUCCEEDED(hres))
620         IActiveScript_Release(vbscript);
621
622     return hres == S_OK;
623 }
624
625 START_TEST(vbscript)
626 {
627     CoInitialize(NULL);
628
629     if(check_vbscript()) {
630         test_vbscript();
631         test_vbscript_uninitializing();
632         test_vbscript_release();
633         test_vbscript_simplecreate();
634         test_vbscript_initializing();
635     }else {
636         win_skip("VBScript engine not available\n");
637     }
638
639     CoUninitialize();
640 }