jscript: Added IActiveScript::GetScriptDispatch implementation.
[wine] / dlls / jscript / tests / jscript.c
1 /*
2  * Copyright 2008 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 static const CLSID CLSID_JScript =
33     {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
34
35 #define DEFINE_EXPECT(func) \
36     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
37
38 #define SET_EXPECT(func) \
39     expect_ ## func = TRUE
40
41 #define SET_CALLED(func) \
42     called_ ## func = TRUE
43
44 #define CHECK_EXPECT2(func) \
45     do { \
46         ok(expect_ ##func, "unexpected call " #func "\n"); \
47         called_ ## func = TRUE; \
48     }while(0)
49
50 #define CHECK_EXPECT(func) \
51     do { \
52         CHECK_EXPECT2(func); \
53         expect_ ## func = FALSE; \
54     }while(0)
55
56 #define CHECK_CALLED(func) \
57     do { \
58         ok(called_ ## func, "expected " #func "\n"); \
59         expect_ ## func = called_ ## func = FALSE; \
60     }while(0)
61
62 DEFINE_EXPECT(GetLCID);
63 DEFINE_EXPECT(OnStateChange_STARTED);
64 DEFINE_EXPECT(OnStateChange_CLOSED);
65 DEFINE_EXPECT(OnStateChange_INITIALIZED);
66 DEFINE_EXPECT(OnEnterScript);
67 DEFINE_EXPECT(OnLeaveScript);
68
69 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
70 {
71     *ppv = NULL;
72
73     if(IsEqualGUID(&IID_IUnknown, riid))
74         *ppv = iface;
75     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
76         *ppv = iface;
77     else
78         return E_NOINTERFACE;
79
80     IUnknown_AddRef((IUnknown*)*ppv);
81     return S_OK;
82 }
83
84 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
85 {
86     return 2;
87 }
88
89 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
90 {
91     return 1;
92 }
93
94 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
95 {
96     CHECK_EXPECT(GetLCID);
97     return E_NOTIMPL;
98 }
99
100 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
101         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
102 {
103     ok(0, "unexpected call\n");
104     return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
108 {
109     ok(0, "unexpected call\n");
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
114         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
115 {
116     ok(0, "unexpected call\n");
117     return E_NOTIMPL;
118 }
119
120 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
121 {
122     switch(ssScriptState) {
123     case SCRIPTSTATE_STARTED:
124         CHECK_EXPECT(OnStateChange_STARTED);
125         return S_OK;
126     case SCRIPTSTATE_CLOSED:
127         CHECK_EXPECT(OnStateChange_CLOSED);
128         return S_OK;
129     case SCRIPTSTATE_INITIALIZED:
130         CHECK_EXPECT(OnStateChange_INITIALIZED);
131         return S_OK;
132     default:
133         ok(0, "unexpected call %d\n", ssScriptState);
134     }
135
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
140 {
141     ok(0, "unexpected call\n");
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
146 {
147     CHECK_EXPECT(OnEnterScript);
148     return S_OK;
149 }
150
151 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
152 {
153     CHECK_EXPECT(OnLeaveScript);
154     return S_OK;
155 }
156
157 #undef ACTSCPSITE_THIS
158
159 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
160     ActiveScriptSite_QueryInterface,
161     ActiveScriptSite_AddRef,
162     ActiveScriptSite_Release,
163     ActiveScriptSite_GetLCID,
164     ActiveScriptSite_GetItemInfo,
165     ActiveScriptSite_GetDocVersionString,
166     ActiveScriptSite_OnScriptTerminate,
167     ActiveScriptSite_OnStateChange,
168     ActiveScriptSite_OnScriptError,
169     ActiveScriptSite_OnEnterScript,
170     ActiveScriptSite_OnLeaveScript
171 };
172
173 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
174
175 static void test_script_dispatch(IActiveScript *script, BOOL initialized)
176 {
177     IDispatchEx *dispex;
178     IDispatch *disp;
179     HRESULT hres;
180
181     disp = (void*)0xdeadbeef;
182     hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
183     if(!initialized) {
184         ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
185         ok(!disp, "disp != NULL\n");
186         return;
187     }
188
189     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
190     if(FAILED(hres))
191         return;
192
193     ok(disp != NULL, "disp == NULL\n");
194     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
195     IDispatch_Release(disp);
196     ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres);
197
198     IDispatchEx_Release(dispex);
199 }
200
201 static void test_safety(IUnknown *unk)
202 {
203     IObjectSafety *safety;
204     DWORD supported, enabled;
205     HRESULT hres;
206
207     hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety);
208     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
209     if(FAILED(hres))
210         return;
211
212     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL);
213     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
214     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled);
215     ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
216
217     supported = enabled = 0xdeadbeef;
218     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &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_IActiveScript, &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_IActiveScriptParse, &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     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
239             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER
240                 |INTERFACESAFE_FOR_UNTRUSTED_CALLER,
241             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
242     ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
243
244     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
245             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
246             INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
247     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
248
249     supported = enabled = 0xdeadbeef;
250     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
251     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
252     ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
253        "supported=%x\n", supported);
254     ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
255        "enabled=%x\n", enabled);
256
257     IObjectSafety_Release(safety);
258 }
259
260 static void test_jscript(void)
261 {
262     IActiveScriptParse *parse;
263     IActiveScript *script;
264     IUnknown *unk;
265     ULONG ref;
266     HRESULT hres;
267
268     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
269             &IID_IUnknown, (void**)&unk);
270     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
271     if(FAILED(hres))
272         return;
273
274     hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script);
275     ok(hres == S_OK, "Could not get IActiveScript: %08x\n", hres);
276
277     hres = IUnknown_QueryInterface(unk, &IID_IActiveScriptParse, (void**)&parse);
278     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
279
280     test_safety(unk);
281
282     hres = IActiveScriptParse_InitNew(parse);
283     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
284
285     hres = IActiveScriptParse_InitNew(parse);
286     ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
287
288     hres = IActiveScript_SetScriptSite(script, NULL);
289     ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres);
290
291     test_script_dispatch(script, FALSE);
292
293     SET_EXPECT(GetLCID);
294     SET_EXPECT(OnStateChange_INITIALIZED);
295     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
296     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
297     CHECK_CALLED(GetLCID);
298     CHECK_CALLED(OnStateChange_INITIALIZED);
299
300     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
301     ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
302
303     test_script_dispatch(script, TRUE);
304
305     SET_EXPECT(OnStateChange_CLOSED);
306     hres = IActiveScript_Close(script);
307     ok(hres == S_OK, "Close failed: %08x\n", hres);
308     CHECK_CALLED(OnStateChange_CLOSED);
309
310     test_script_dispatch(script, FALSE);
311
312     IActiveScriptParse_Release(parse);
313     IActiveScript_Release(script);
314
315     ref = IUnknown_Release(unk);
316     ok(!ref, "ref = %d\n", ref);
317 }
318
319 START_TEST(jscript)
320 {
321     CoInitialize(NULL);
322
323     test_jscript();
324
325     CoUninitialize();
326 }