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