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