vbscript: Added SetScriptState implementation.
[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
27 #include "wine/test.h"
28
29 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
30
31 #define DEFINE_EXPECT(func) \
32     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
33
34 #define SET_EXPECT(func) \
35     expect_ ## func = TRUE
36
37 #define SET_CALLED(func) \
38     called_ ## func = TRUE
39
40 #define CHECK_EXPECT2(func) \
41     do { \
42         ok(expect_ ##func, "unexpected call " #func "\n"); \
43         called_ ## func = TRUE; \
44     }while(0)
45
46 #define CHECK_EXPECT(func) \
47     do { \
48         CHECK_EXPECT2(func); \
49         expect_ ## func = FALSE; \
50     }while(0)
51
52 #define CHECK_CALLED(func) \
53     do { \
54         ok(called_ ## func, "expected " #func "\n"); \
55         expect_ ## func = called_ ## func = FALSE; \
56     }while(0)
57
58 DEFINE_EXPECT(GetLCID);
59 DEFINE_EXPECT(OnStateChange_UNINITIALIZED);
60 DEFINE_EXPECT(OnStateChange_STARTED);
61 DEFINE_EXPECT(OnStateChange_CONNECTED);
62 DEFINE_EXPECT(OnStateChange_DISCONNECTED);
63 DEFINE_EXPECT(OnStateChange_CLOSED);
64 DEFINE_EXPECT(OnStateChange_INITIALIZED);
65 DEFINE_EXPECT(OnEnterScript);
66 DEFINE_EXPECT(OnLeaveScript);
67
68 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8);
69
70 #define test_state(s,ss) _test_state(__LINE__,s,ss)
71 static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate)
72 {
73     SCRIPTSTATE state = -1;
74     HRESULT hres;
75
76     hres = IActiveScript_GetScriptState(script, &state);
77     ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres);
78     ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);
79 }
80
81 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
82 {
83     *ppv = NULL;
84
85     if(IsEqualGUID(&IID_IUnknown, riid))
86         *ppv = iface;
87     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
88         *ppv = iface;
89     else
90         return E_NOINTERFACE;
91
92     IUnknown_AddRef((IUnknown*)*ppv);
93     return S_OK;
94 }
95
96 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
97 {
98     return 2;
99 }
100
101 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
102 {
103     return 1;
104 }
105
106 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
107 {
108     CHECK_EXPECT(GetLCID);
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
113         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
114 {
115     ok(0, "unexpected call\n");
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
120 {
121     ok(0, "unexpected call\n");
122     return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
126         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
127 {
128     ok(0, "unexpected call\n");
129     return E_NOTIMPL;
130 }
131
132 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
133 {
134     switch(ssScriptState) {
135     case SCRIPTSTATE_UNINITIALIZED:
136         CHECK_EXPECT(OnStateChange_UNINITIALIZED);
137         return S_OK;
138     case SCRIPTSTATE_STARTED:
139         CHECK_EXPECT(OnStateChange_STARTED);
140         return S_OK;
141     case SCRIPTSTATE_CONNECTED:
142         CHECK_EXPECT(OnStateChange_CONNECTED);
143         return S_OK;
144     case SCRIPTSTATE_DISCONNECTED:
145         CHECK_EXPECT(OnStateChange_DISCONNECTED);
146         return S_OK;
147     case SCRIPTSTATE_CLOSED:
148         CHECK_EXPECT(OnStateChange_CLOSED);
149         return S_OK;
150     case SCRIPTSTATE_INITIALIZED:
151         CHECK_EXPECT(OnStateChange_INITIALIZED);
152         return S_OK;
153     default:
154         ok(0, "unexpected call %d\n", ssScriptState);
155     }
156
157     return E_NOTIMPL;
158 }
159
160 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
161 {
162     ok(0, "unexpected call\n");
163     return E_NOTIMPL;
164 }
165
166 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
167 {
168     CHECK_EXPECT(OnEnterScript);
169     return S_OK;
170 }
171
172 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
173 {
174     CHECK_EXPECT(OnLeaveScript);
175     return S_OK;
176 }
177
178 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
179     ActiveScriptSite_QueryInterface,
180     ActiveScriptSite_AddRef,
181     ActiveScriptSite_Release,
182     ActiveScriptSite_GetLCID,
183     ActiveScriptSite_GetItemInfo,
184     ActiveScriptSite_GetDocVersionString,
185     ActiveScriptSite_OnScriptTerminate,
186     ActiveScriptSite_OnStateChange,
187     ActiveScriptSite_OnScriptError,
188     ActiveScriptSite_OnEnterScript,
189     ActiveScriptSite_OnLeaveScript
190 };
191
192 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
193
194 static void test_safety(IActiveScript *script)
195 {
196     IObjectSafety *safety;
197     DWORD supported, enabled;
198     HRESULT hres;
199
200     hres = IActiveScript_QueryInterface(script, &IID_IObjectSafety, (void**)&safety);
201     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
202     if(FAILED(hres))
203         return;
204
205     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL);
206     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
207     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled);
208     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
209
210     supported = enabled = 0xdeadbeef;
211     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, &enabled);
212     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
213     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
214        "supported=%x\n", supported);
215     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
216
217     supported = enabled = 0xdeadbeef;
218     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScript, &supported, &enabled);
219     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
220     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
221        "supported=%x\n", supported);
222     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
223
224     supported = enabled = 0xdeadbeef;
225     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &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     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
232             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER
233                 |INTERFACESAFE_FOR_UNTRUSTED_CALLER,
234             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
235     ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
236
237     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
238             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
239             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
240     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
241
242     supported = enabled = 0xdeadbeef;
243     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
244     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
245     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
246        "supported=%x\n", supported);
247     ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
248        "enabled=%x\n", enabled);
249
250     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
251     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
252
253     supported = enabled = 0xdeadbeef;
254     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
255     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
256     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
257        "supported=%x\n", supported);
258     ok(enabled == (INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
259
260     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
261             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, 0);
262     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
263
264     supported = enabled = 0xdeadbeef;
265     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
266     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
267     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
268        "supported=%x\n", supported);
269     ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
270
271     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
272             INTERFACE_USES_DISPEX, 0);
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 == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
281
282     IObjectSafety_Release(safety);
283 }
284
285 static IActiveScript *create_vbscript(void)
286 {
287     IActiveScript *ret;
288     HRESULT hres;
289
290     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
291             &IID_IActiveScript, (void**)&ret);
292     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
293
294     return ret;
295 }
296
297 static void test_vbscript(void)
298 {
299     IActiveScriptParse *parser;
300     IActiveScript *vbscript;
301     ULONG ref;
302     HRESULT hres;
303
304     vbscript = create_vbscript();
305
306     hres = IActiveScript_QueryInterface(vbscript, &IID_IActiveScriptParse, (void**)&parser);
307     ok(hres == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hres);
308
309     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
310     test_safety(vbscript);
311
312     SET_EXPECT(GetLCID);
313     hres = IActiveScript_SetScriptSite(vbscript, &ActiveScriptSite);
314     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
315     CHECK_CALLED(GetLCID);
316
317     test_state(vbscript, SCRIPTSTATE_UNINITIALIZED);
318
319     SET_EXPECT(OnStateChange_INITIALIZED);
320     hres = IActiveScriptParse64_InitNew(parser);
321     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
322     CHECK_CALLED(OnStateChange_INITIALIZED);
323
324     test_state(vbscript, SCRIPTSTATE_INITIALIZED);
325
326     hres = IActiveScriptParse64_InitNew(parser);
327     ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
328
329     SET_EXPECT(OnStateChange_CONNECTED);
330     hres = IActiveScript_SetScriptState(vbscript, SCRIPTSTATE_CONNECTED);
331     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
332     CHECK_CALLED(OnStateChange_CONNECTED);
333
334     test_state(vbscript, SCRIPTSTATE_CONNECTED);
335
336     SET_EXPECT(OnStateChange_DISCONNECTED);
337     SET_EXPECT(OnStateChange_INITIALIZED);
338     SET_EXPECT(OnStateChange_CLOSED);
339     hres = IActiveScript_Close(vbscript);
340     ok(hres == S_OK, "Close failed: %08x\n", hres);
341     todo_wine
342     CHECK_CALLED(OnStateChange_DISCONNECTED);
343     todo_wine
344     CHECK_CALLED(OnStateChange_INITIALIZED);
345     CHECK_CALLED(OnStateChange_CLOSED);
346
347     test_state(vbscript, SCRIPTSTATE_CLOSED);
348
349     IActiveScriptParse64_Release(parser);
350
351     ref = IActiveScript_Release(vbscript);
352     ok(!ref, "ref = %d\n", ref);
353 }
354
355 static BOOL check_vbscript(void)
356 {
357     IActiveScript *vbscript;
358     HRESULT hres;
359
360     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
361             &IID_IActiveScript, (void**)&vbscript);
362     if(SUCCEEDED(hres))
363         IActiveScript_Release(vbscript);
364
365     return hres == S_OK;
366 }
367
368 START_TEST(vbscript)
369 {
370     CoInitialize(NULL);
371
372     if(check_vbscript())
373         test_vbscript();
374     else
375         win_skip("VBScript engine not available\n");
376
377     CoUninitialize();
378 }