push a2e7360632735b5a2be8f61a9725e4e6969c5533
[wine/hacks.git] / dlls / jscript / tests / run.c
blobc40653a9b29940f07bd6a57f3d69fb488ed38b32
1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
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.
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.
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
19 #include <stdio.h>
21 #define COBJMACROS
22 #define CONST_VTABLE
24 #include <ole2.h>
25 #include <dispex.h>
26 #include <activscp.h>
28 #include "wine/test.h"
30 static const CLSID CLSID_JScript =
31 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
33 #define DEFINE_EXPECT(func) \
34 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
36 #define SET_EXPECT(func) \
37 expect_ ## func = TRUE
39 #define SET_CALLED(func) \
40 called_ ## func = TRUE
42 #define CHECK_EXPECT2(func) \
43 do { \
44 ok(expect_ ##func, "unexpected call " #func "\n"); \
45 called_ ## func = TRUE; \
46 }while(0)
48 #define CHECK_EXPECT(func) \
49 do { \
50 CHECK_EXPECT2(func); \
51 expect_ ## func = FALSE; \
52 }while(0)
54 #define CHECK_CALLED(func) \
55 do { \
56 ok(called_ ## func, "expected " #func "\n"); \
57 expect_ ## func = called_ ## func = FALSE; \
58 }while(0)
60 DEFINE_EXPECT(global_propget_d);
61 DEFINE_EXPECT(global_propget_i);
62 DEFINE_EXPECT(global_propput_d);
63 DEFINE_EXPECT(global_propput_i);
64 DEFINE_EXPECT(global_success_d);
65 DEFINE_EXPECT(global_success_i);
66 DEFINE_EXPECT(testobj_delete);
68 #define DISPID_GLOBAL_TESTPROPGET 0x1000
69 #define DISPID_GLOBAL_TESTPROPPUT 0x1001
70 #define DISPID_GLOBAL_REPORTSUCCESS 0x1002
71 #define DISPID_GLOBAL_TRACE 0x1003
72 #define DISPID_GLOBAL_OK 0x1004
73 #define DISPID_GLOBAL_GETVT 0x1005
74 #define DISPID_GLOBAL_TESTOBJ 0x1006
76 static const WCHAR testW[] = {'t','e','s','t',0};
78 static BOOL strict_dispid_check;
79 static const char *test_name = "(null)";
81 static const char *debugstr_w(LPCWSTR str)
83 static char buf[1024];
85 if(!str)
86 return "(null)";
88 WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
89 return buf;
92 static BSTR a2bstr(const char *str)
94 BSTR ret;
95 int len;
97 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
98 ret = SysAllocStringLen(NULL, len-1);
99 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
101 return ret;
104 static int strcmp_wa(LPCWSTR strw, const char *stra)
106 CHAR buf[512];
107 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
108 return lstrcmpA(buf, stra);
111 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
113 *ppv = NULL;
115 if(IsEqualGUID(riid, &IID_IUnknown)
116 || IsEqualGUID(riid, &IID_IDispatch)
117 || IsEqualGUID(riid, &IID_IDispatchEx))
118 *ppv = iface;
119 else
120 return E_NOINTERFACE;
122 return S_OK;
125 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
127 return 2;
130 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
132 return 1;
135 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
137 ok(0, "unexpected call\n");
138 return E_NOTIMPL;
141 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
142 LCID lcid, ITypeInfo **ppTInfo)
144 ok(0, "unexpected call\n");
145 return E_NOTIMPL;
148 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
149 LPOLESTR *rgszNames, UINT cNames,
150 LCID lcid, DISPID *rgDispId)
152 ok(0, "unexpected call\n");
153 return E_NOTIMPL;
156 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
157 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
158 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
160 ok(0, "unexpected call\n");
161 return E_NOTIMPL;
164 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
166 ok(0, "unexpected call %s %x\n", debugstr_w(bstrName), grfdex);
167 return E_NOTIMPL;
170 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
172 ok(0, "unexpected call\n");
173 return E_NOTIMPL;
176 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
178 ok(0, "unexpected call\n");
179 return E_NOTIMPL;
182 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
184 ok(0, "unexpected call\n");
185 return E_NOTIMPL;
188 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
190 ok(0, "unexpected call\n");
191 return E_NOTIMPL;
194 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
196 ok(0, "unexpected call\n");
197 return E_NOTIMPL;
200 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
202 ok(0, "unexpected call\n");
203 return E_NOTIMPL;
206 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
207 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
209 ok(0, "unexpected call\n");
210 return E_NOTIMPL;
213 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
215 CHECK_EXPECT(testobj_delete);
217 ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", debugstr_w(bstrName));
218 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
219 return S_OK;
222 static IDispatchExVtbl testObjVtbl = {
223 DispatchEx_QueryInterface,
224 DispatchEx_AddRef,
225 DispatchEx_Release,
226 DispatchEx_GetTypeInfoCount,
227 DispatchEx_GetTypeInfo,
228 DispatchEx_GetIDsOfNames,
229 DispatchEx_Invoke,
230 DispatchEx_GetDispID,
231 DispatchEx_InvokeEx,
232 testObj_DeleteMemberByName,
233 DispatchEx_DeleteMemberByDispID,
234 DispatchEx_GetMemberProperties,
235 DispatchEx_GetMemberName,
236 DispatchEx_GetNextDispID,
237 DispatchEx_GetNameSpaceParent
240 static IDispatchEx testObj = { &testObjVtbl };
242 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
244 if(!strcmp_wa(bstrName, "ok")) {
245 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
246 *pid = DISPID_GLOBAL_OK;
247 return S_OK;
249 if(!strcmp_wa(bstrName, "trace")) {
250 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
251 *pid = DISPID_GLOBAL_TRACE;
252 return S_OK;
254 if(!strcmp_wa(bstrName, "reportSuccess")) {
255 CHECK_EXPECT(global_success_d);
256 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
257 *pid = DISPID_GLOBAL_REPORTSUCCESS;
258 return S_OK;
260 if(!strcmp_wa(bstrName, "testPropGet")) {
261 CHECK_EXPECT(global_propget_d);
262 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
263 *pid = DISPID_GLOBAL_TESTPROPGET;
264 return S_OK;
266 if(!strcmp_wa(bstrName, "testPropPut")) {
267 CHECK_EXPECT(global_propput_d);
268 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
269 *pid = DISPID_GLOBAL_TESTPROPPUT;
270 return S_OK;
272 if(!strcmp_wa(bstrName, "getVT")) {
273 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
274 *pid = DISPID_GLOBAL_GETVT;
275 return S_OK;
277 if(!strcmp_wa(bstrName, "testObj")) {
278 ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
279 *pid = DISPID_GLOBAL_TESTOBJ;
280 return S_OK;
283 if(strict_dispid_check)
284 ok(0, "unexpected call %s\n", debugstr_w(bstrName));
285 return DISP_E_UNKNOWNNAME;
288 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
289 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
291 switch(id) {
292 case DISPID_GLOBAL_OK:
293 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
294 ok(pdp != NULL, "pdp == NULL\n");
295 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
296 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
297 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
298 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
299 if(wFlags & INVOKE_PROPERTYGET)
300 ok(pvarRes != NULL, "pvarRes == NULL\n");
301 else
302 ok(!pvarRes, "pvarRes != NULL\n");
303 ok(pei != NULL, "pei == NULL\n");
305 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
306 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg));
307 ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, debugstr_w(V_BSTR(pdp->rgvarg)));
309 return S_OK;
311 case DISPID_GLOBAL_TRACE:
312 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
313 ok(pdp != NULL, "pdp == NULL\n");
314 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
315 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
316 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
317 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
318 ok(!pvarRes, "pvarRes != NULL\n");
319 ok(pei != NULL, "pei == NULL\n");
321 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
322 if(V_VT(pdp->rgvarg) == VT_BSTR)
323 trace("%s: %s\n", test_name, debugstr_w(V_BSTR(pdp->rgvarg)));
325 return S_OK;
327 case DISPID_GLOBAL_REPORTSUCCESS:
328 CHECK_EXPECT(global_success_i);
330 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
331 ok(pdp != NULL, "pdp == NULL\n");
332 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
333 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
334 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
335 ok(!pvarRes, "pvarRes != NULL\n");
336 ok(pei != NULL, "pei == NULL\n");
338 return S_OK;
340 case DISPID_GLOBAL_TESTPROPGET:
341 CHECK_EXPECT(global_propget_i);
343 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
344 ok(pdp != NULL, "pdp == NULL\n");
345 ok(!pdp->rgvarg, "rgvarg != NULL\n");
346 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
347 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
348 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
349 ok(pvarRes != NULL, "pvarRes == NULL\n");
350 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
351 ok(pei != NULL, "pei == NULL\n");
353 V_VT(pvarRes) = VT_I4;
354 V_I4(pvarRes) = 1;
356 return S_OK;
358 case DISPID_GLOBAL_TESTPROPPUT:
359 CHECK_EXPECT(global_propput_i);
361 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
362 ok(pdp != NULL, "pdp == NULL\n");
363 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
364 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
365 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
366 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
367 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
368 ok(!pvarRes, "pvarRes != NULL\n");
370 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
371 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
372 return S_OK;
374 case DISPID_GLOBAL_GETVT:
375 ok(pdp != NULL, "pdp == NULL\n");
376 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
377 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
378 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
379 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
380 ok(pvarRes != NULL, "pvarRes == NULL\n");
381 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
382 ok(pei != NULL, "pei == NULL\n");
384 V_VT(pvarRes) = VT_BSTR;
385 switch(V_VT(pdp->rgvarg)) {
386 case VT_EMPTY:
387 V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
388 break;
389 case VT_NULL:
390 V_BSTR(pvarRes) = a2bstr("VT_NULL");
391 break;
392 case VT_I4:
393 V_BSTR(pvarRes) = a2bstr("VT_I4");
394 break;
395 case VT_R8:
396 V_BSTR(pvarRes) = a2bstr("VT_R8");
397 break;
398 case VT_BSTR:
399 V_BSTR(pvarRes) = a2bstr("VT_BSTR");
400 break;
401 case VT_DISPATCH:
402 V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
403 break;
404 case VT_BOOL:
405 V_BSTR(pvarRes) = a2bstr("VT_BOOL");
406 break;
407 default:
408 ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
409 return E_FAIL;
412 return S_OK;
414 case DISPID_GLOBAL_TESTOBJ:
415 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
416 ok(pdp != NULL, "pdp == NULL\n");
417 ok(!pdp->rgvarg, "rgvarg != NULL\n");
418 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
419 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
420 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
421 ok(pvarRes != NULL, "pvarRes == NULL\n");
422 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
423 ok(pei != NULL, "pei == NULL\n");
425 V_VT(pvarRes) = VT_DISPATCH;
426 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
427 return S_OK;
430 ok(0, "unexpected call %x\n", id);
431 return DISP_E_MEMBERNOTFOUND;
434 static IDispatchExVtbl GlobalVtbl = {
435 DispatchEx_QueryInterface,
436 DispatchEx_AddRef,
437 DispatchEx_Release,
438 DispatchEx_GetTypeInfoCount,
439 DispatchEx_GetTypeInfo,
440 DispatchEx_GetIDsOfNames,
441 DispatchEx_Invoke,
442 Global_GetDispID,
443 Global_InvokeEx,
444 DispatchEx_DeleteMemberByName,
445 DispatchEx_DeleteMemberByDispID,
446 DispatchEx_GetMemberProperties,
447 DispatchEx_GetMemberName,
448 DispatchEx_GetNextDispID,
449 DispatchEx_GetNameSpaceParent
452 static IDispatchEx Global = { &GlobalVtbl };
454 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
456 *ppv = NULL;
458 if(IsEqualGUID(&IID_IUnknown, riid))
459 *ppv = iface;
460 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
461 *ppv = iface;
462 else
463 return E_NOINTERFACE;
465 IUnknown_AddRef((IUnknown*)*ppv);
466 return S_OK;
469 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
471 return 2;
474 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
476 return 1;
479 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
481 *plcid = GetUserDefaultLCID();
482 return S_OK;
485 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
486 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
488 ok(!lstrcmpW(pstrName, testW), "unexpected pstrName %s\n", debugstr_w(pstrName));
489 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
490 ok(!ppti, "ppti != NULL\n");
492 *ppiunkItem = (IUnknown*)&Global;
493 return S_OK;
496 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
498 return E_NOTIMPL;
501 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
502 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
504 return E_NOTIMPL;
507 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
509 return E_NOTIMPL;
512 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
514 return E_NOTIMPL;
517 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
519 return E_NOTIMPL;
522 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
524 return E_NOTIMPL;
527 #undef ACTSCPSITE_THIS
529 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
530 ActiveScriptSite_QueryInterface,
531 ActiveScriptSite_AddRef,
532 ActiveScriptSite_Release,
533 ActiveScriptSite_GetLCID,
534 ActiveScriptSite_GetItemInfo,
535 ActiveScriptSite_GetDocVersionString,
536 ActiveScriptSite_OnScriptTerminate,
537 ActiveScriptSite_OnStateChange,
538 ActiveScriptSite_OnScriptError,
539 ActiveScriptSite_OnEnterScript,
540 ActiveScriptSite_OnLeaveScript
543 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
545 static IActiveScript *create_script(void)
547 IActiveScript *script;
548 HRESULT hres;
550 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
551 &IID_IActiveScript, (void**)&script);
552 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
554 return script;
557 static void parse_script(BSTR script_str)
559 IActiveScriptParse *parser;
560 IActiveScript *engine;
561 HRESULT hres;
563 engine = create_script();
564 if(!engine)
565 return;
567 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
568 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
570 hres = IActiveScriptParse_InitNew(parser);
571 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
573 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
574 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
576 hres = IActiveScript_AddNamedItem(engine, testW,
577 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
578 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
580 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
581 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
583 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
584 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
586 IActiveScript_Release(engine);
587 IActiveScriptParse_Release(parser);
590 static void parse_script_a(const char *src)
592 BSTR tmp = a2bstr(src);
593 parse_script(tmp);
594 SysFreeString(tmp);
597 static void run_from_res(const char *name)
599 const char *data;
600 DWORD size, len;
601 BSTR str;
602 HRSRC src;
604 strict_dispid_check = FALSE;
605 test_name = name;
607 src = FindResourceA(NULL, name, (LPCSTR)40);
608 ok(src != NULL, "Could not find resource %s\n", name);
610 size = SizeofResource(NULL, src);
611 data = LoadResource(NULL, src);
613 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
614 str = SysAllocStringLen(NULL, len);
615 len = MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
617 SET_EXPECT(global_success_d);
618 SET_EXPECT(global_success_i);
619 parse_script(str);
620 CHECK_CALLED(global_success_d);
621 CHECK_CALLED(global_success_i);
623 SysFreeString(str);
626 static void run_tests(void)
628 strict_dispid_check = TRUE;
630 parse_script_a("");
631 parse_script_a("/* empty */ ;");
633 SET_EXPECT(global_propget_d);
634 SET_EXPECT(global_propget_i);
635 parse_script_a("testPropGet;");
636 CHECK_CALLED(global_propget_d);
637 CHECK_CALLED(global_propget_i);
639 SET_EXPECT(global_propput_d);
640 SET_EXPECT(global_propput_i);
641 parse_script_a("testPropPut = 1;");
642 CHECK_CALLED(global_propput_d);
643 CHECK_CALLED(global_propput_i);
645 SET_EXPECT(global_success_d);
646 SET_EXPECT(global_success_i);
647 parse_script_a("reportSuccess();");
648 CHECK_CALLED(global_success_d);
649 CHECK_CALLED(global_success_i);
651 SET_EXPECT(testobj_delete);
652 parse_script_a("delete testObj.deleteTest;");
653 CHECK_CALLED(testobj_delete);
655 run_from_res("lang.js");
656 run_from_res("api.js");
657 run_from_res("regexp.js");
660 START_TEST(run)
662 CoInitialize(NULL);
664 run_tests();
666 CoUninitialize();