[KS]
[reactos.git] / rostests / winetests / jscript / run.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 #include <stdio.h>
20
21 #define COBJMACROS
22 #define CONST_VTABLE
23
24 #include <ole2.h>
25 #include <dispex.h>
26 #include <activscp.h>
27
28 #include "wine/test.h"
29
30 static const CLSID CLSID_JScript =
31 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
32
33 #define DEFINE_EXPECT(func) \
34 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
35
36 #define SET_EXPECT(func) \
37 expect_ ## func = TRUE
38
39 #define SET_CALLED(func) \
40 called_ ## func = TRUE
41
42 #define CHECK_EXPECT2(func) \
43 do { \
44 ok(expect_ ##func, "unexpected call " #func "\n"); \
45 called_ ## func = TRUE; \
46 }while(0)
47
48 #define CHECK_EXPECT(func) \
49 do { \
50 CHECK_EXPECT2(func); \
51 expect_ ## func = FALSE; \
52 }while(0)
53
54 #define CHECK_CALLED(func) \
55 do { \
56 ok(called_ ## func, "expected " #func "\n"); \
57 expect_ ## func = called_ ## func = FALSE; \
58 }while(0)
59
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(global_notexists_d);
67 DEFINE_EXPECT(testobj_delete);
68 DEFINE_EXPECT(testobj_value);
69 DEFINE_EXPECT(testobj_prop_d);
70 DEFINE_EXPECT(testobj_noprop_d);
71 DEFINE_EXPECT(GetItemInfo_testVal);
72
73 #define DISPID_GLOBAL_TESTPROPGET 0x1000
74 #define DISPID_GLOBAL_TESTPROPPUT 0x1001
75 #define DISPID_GLOBAL_REPORTSUCCESS 0x1002
76 #define DISPID_GLOBAL_TRACE 0x1003
77 #define DISPID_GLOBAL_OK 0x1004
78 #define DISPID_GLOBAL_GETVT 0x1005
79 #define DISPID_GLOBAL_TESTOBJ 0x1006
80 #define DISPID_GLOBAL_NULL_BSTR 0x1007
81 #define DISPID_GLOBAL_NULL_DISP 0x1008
82 #define DISPID_GLOBAL_TESTTHIS 0x1009
83 #define DISPID_GLOBAL_TESTTHIS2 0x100a
84 #define DISPID_GLOBAL_INVOKEVERSION 0x100b
85
86 #define DISPID_TESTOBJ_PROP 0x2000
87
88 static const WCHAR testW[] = {'t','e','s','t',0};
89 static const CHAR testA[] = "test";
90 static const WCHAR test_valW[] = {'t','e','s','t','V','a','l',0};
91 static const CHAR test_valA[] = "testVal";
92
93 static BOOL strict_dispid_check;
94 static const char *test_name = "(null)";
95 static IDispatch *script_disp;
96 static int invoke_version;
97
98 static BSTR a2bstr(const char *str)
99 {
100 BSTR ret;
101 int len;
102
103 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
104 ret = SysAllocStringLen(NULL, len-1);
105 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
106
107 return ret;
108 }
109
110 static int strcmp_wa(LPCWSTR strw, const char *stra)
111 {
112 CHAR buf[512];
113 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
114 return lstrcmpA(buf, stra);
115 }
116
117 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
118 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
119 {
120 expect |= invoke_version << 28;
121 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
122 }
123
124 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
125 {
126 *ppv = NULL;
127
128 if(IsEqualGUID(riid, &IID_IUnknown)
129 || IsEqualGUID(riid, &IID_IDispatch)
130 || IsEqualGUID(riid, &IID_IDispatchEx))
131 *ppv = iface;
132 else
133 return E_NOINTERFACE;
134
135 return S_OK;
136 }
137
138 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
139 {
140 return 2;
141 }
142
143 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
144 {
145 return 1;
146 }
147
148 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
149 {
150 ok(0, "unexpected call\n");
151 return E_NOTIMPL;
152 }
153
154 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
155 LCID lcid, ITypeInfo **ppTInfo)
156 {
157 ok(0, "unexpected call\n");
158 return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
162 LPOLESTR *rgszNames, UINT cNames,
163 LCID lcid, DISPID *rgDispId)
164 {
165 ok(0, "unexpected call\n");
166 return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
170 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
171 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
172 {
173 ok(0, "unexpected call\n");
174 return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
178 {
179 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
180 return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
184 {
185 ok(0, "unexpected call\n");
186 return E_NOTIMPL;
187 }
188
189 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
190 {
191 ok(0, "unexpected call\n");
192 return E_NOTIMPL;
193 }
194
195 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
196 {
197 ok(0, "unexpected call\n");
198 return E_NOTIMPL;
199 }
200
201 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
202 {
203 ok(0, "unexpected call\n");
204 return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
208 {
209 ok(0, "unexpected call\n");
210 return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
214 {
215 if(!strcmp_wa(bstrName, "prop")) {
216 CHECK_EXPECT(testobj_prop_d);
217 test_grfdex(grfdex, fdexNameCaseSensitive);
218 *pid = DISPID_TESTOBJ_PROP;
219 return S_OK;
220 }
221 if(!strcmp_wa(bstrName, "noprop")) {
222 CHECK_EXPECT(testobj_noprop_d);
223 test_grfdex(grfdex, fdexNameCaseSensitive);
224 return DISP_E_UNKNOWNNAME;
225 }
226
227 ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
228 return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
232 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
233 {
234 switch(id) {
235 case DISPID_VALUE:
236 CHECK_EXPECT(testobj_value);
237
238 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
239 ok(pdp != NULL, "pdp == NULL\n");
240 ok(!pdp->rgvarg, "rgvarg != NULL\n");
241 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
242 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
243 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
244 ok(pvarRes != NULL, "pvarRes == NULL\n");
245 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
246 ok(pei != NULL, "pei == NULL\n");
247
248 V_VT(pvarRes) = VT_I4;
249 V_I4(pvarRes) = 1;
250 return S_OK;
251 }
252
253 ok(0, "unexpected call %x\n", id);
254 return DISP_E_MEMBERNOTFOUND;
255 }
256
257 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
258 {
259 CHECK_EXPECT(testobj_delete);
260
261 ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
262 test_grfdex(grfdex, fdexNameCaseSensitive);
263 return S_OK;
264 }
265
266 static IDispatchExVtbl testObjVtbl = {
267 DispatchEx_QueryInterface,
268 DispatchEx_AddRef,
269 DispatchEx_Release,
270 DispatchEx_GetTypeInfoCount,
271 DispatchEx_GetTypeInfo,
272 DispatchEx_GetIDsOfNames,
273 DispatchEx_Invoke,
274 testObj_GetDispID,
275 testObj_InvokeEx,
276 testObj_DeleteMemberByName,
277 DispatchEx_DeleteMemberByDispID,
278 DispatchEx_GetMemberProperties,
279 DispatchEx_GetMemberName,
280 DispatchEx_GetNextDispID,
281 DispatchEx_GetNameSpaceParent
282 };
283
284 static IDispatchEx testObj = { &testObjVtbl };
285
286 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
287 {
288 if(!strcmp_wa(bstrName, "ok")) {
289 test_grfdex(grfdex, fdexNameCaseSensitive);
290 *pid = DISPID_GLOBAL_OK;
291 return S_OK;
292 }
293 if(!strcmp_wa(bstrName, "trace")) {
294 test_grfdex(grfdex, fdexNameCaseSensitive);
295 *pid = DISPID_GLOBAL_TRACE;
296 return S_OK;
297 }
298 if(!strcmp_wa(bstrName, "reportSuccess")) {
299 CHECK_EXPECT(global_success_d);
300 test_grfdex(grfdex, fdexNameCaseSensitive);
301 *pid = DISPID_GLOBAL_REPORTSUCCESS;
302 return S_OK;
303 }
304 if(!strcmp_wa(bstrName, "testPropGet")) {
305 CHECK_EXPECT(global_propget_d);
306 test_grfdex(grfdex, fdexNameCaseSensitive);
307 *pid = DISPID_GLOBAL_TESTPROPGET;
308 return S_OK;
309 }
310 if(!strcmp_wa(bstrName, "testPropPut")) {
311 CHECK_EXPECT(global_propput_d);
312 test_grfdex(grfdex, fdexNameCaseSensitive);
313 *pid = DISPID_GLOBAL_TESTPROPPUT;
314 return S_OK;
315 }
316 if(!strcmp_wa(bstrName, "getVT")) {
317 test_grfdex(grfdex, fdexNameCaseSensitive);
318 *pid = DISPID_GLOBAL_GETVT;
319 return S_OK;
320 }
321 if(!strcmp_wa(bstrName, "testObj")) {
322 test_grfdex(grfdex, fdexNameCaseSensitive);
323 *pid = DISPID_GLOBAL_TESTOBJ;
324 return S_OK;
325 }
326 if(!strcmp_wa(bstrName, "createNullBSTR")) {
327 *pid = DISPID_GLOBAL_NULL_BSTR;
328 return S_OK;
329 }
330 if(!strcmp_wa(bstrName, "nullDisp")) {
331 *pid = DISPID_GLOBAL_NULL_DISP;
332 return S_OK;
333 }
334 if(!strcmp_wa(bstrName, "notExists")) {
335 CHECK_EXPECT(global_notexists_d);
336 test_grfdex(grfdex, fdexNameCaseSensitive);
337 return DISP_E_UNKNOWNNAME;
338 }
339
340 if(!strcmp_wa(bstrName, "testThis")) {
341 test_grfdex(grfdex, fdexNameCaseSensitive);
342 *pid = DISPID_GLOBAL_TESTTHIS;
343 return S_OK;
344 }
345
346 if(!strcmp_wa(bstrName, "testThis2")) {
347 test_grfdex(grfdex, fdexNameCaseSensitive);
348 *pid = DISPID_GLOBAL_TESTTHIS2;
349 return S_OK;
350 }
351
352 if(!strcmp_wa(bstrName, "invokeVersion")) {
353 test_grfdex(grfdex, fdexNameCaseSensitive);
354 *pid = DISPID_GLOBAL_INVOKEVERSION;
355 return S_OK;
356 }
357
358 if(strict_dispid_check)
359 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
360 return DISP_E_UNKNOWNNAME;
361 }
362
363 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
364 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
365 {
366 switch(id) {
367 case DISPID_GLOBAL_OK:
368 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
369 ok(pdp != NULL, "pdp == NULL\n");
370 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
371 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
372 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
373 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
374 if(wFlags & INVOKE_PROPERTYGET)
375 ok(pvarRes != NULL, "pvarRes == NULL\n");
376 else
377 ok(!pvarRes, "pvarRes != NULL\n");
378 ok(pei != NULL, "pei == NULL\n");
379
380 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
381 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg));
382 ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
383
384 return S_OK;
385
386 case DISPID_GLOBAL_TRACE:
387 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
388 ok(pdp != NULL, "pdp == NULL\n");
389 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
390 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
391 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
392 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
393 ok(!pvarRes, "pvarRes != NULL\n");
394 ok(pei != NULL, "pei == NULL\n");
395
396 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
397 if(V_VT(pdp->rgvarg) == VT_BSTR)
398 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
399
400 return S_OK;
401
402 case DISPID_GLOBAL_REPORTSUCCESS:
403 CHECK_EXPECT(global_success_i);
404
405 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
406 ok(pdp != NULL, "pdp == NULL\n");
407 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
408 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
409 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
410 ok(!pvarRes, "pvarRes != NULL\n");
411 ok(pei != NULL, "pei == NULL\n");
412
413 return S_OK;
414
415 case DISPID_GLOBAL_TESTPROPGET:
416 CHECK_EXPECT(global_propget_i);
417
418 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
419 ok(pdp != NULL, "pdp == NULL\n");
420 ok(!pdp->rgvarg, "rgvarg != NULL\n");
421 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
422 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
423 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
424 ok(pvarRes != NULL, "pvarRes == NULL\n");
425 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
426 ok(pei != NULL, "pei == NULL\n");
427
428 V_VT(pvarRes) = VT_I4;
429 V_I4(pvarRes) = 1;
430
431 return S_OK;
432
433 case DISPID_GLOBAL_TESTPROPPUT:
434 CHECK_EXPECT(global_propput_i);
435
436 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
437 ok(pdp != NULL, "pdp == NULL\n");
438 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
439 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
440 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
441 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
442 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
443 ok(!pvarRes, "pvarRes != NULL\n");
444
445 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
446 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
447 return S_OK;
448
449 case DISPID_GLOBAL_GETVT:
450 ok(pdp != NULL, "pdp == NULL\n");
451 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
452 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
453 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
454 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
455 ok(pvarRes != NULL, "pvarRes == NULL\n");
456 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
457 ok(pei != NULL, "pei == NULL\n");
458
459 V_VT(pvarRes) = VT_BSTR;
460 switch(V_VT(pdp->rgvarg)) {
461 case VT_EMPTY:
462 V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
463 break;
464 case VT_NULL:
465 V_BSTR(pvarRes) = a2bstr("VT_NULL");
466 break;
467 case VT_I4:
468 V_BSTR(pvarRes) = a2bstr("VT_I4");
469 break;
470 case VT_R8:
471 V_BSTR(pvarRes) = a2bstr("VT_R8");
472 break;
473 case VT_BSTR:
474 V_BSTR(pvarRes) = a2bstr("VT_BSTR");
475 break;
476 case VT_DISPATCH:
477 V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
478 break;
479 case VT_BOOL:
480 V_BSTR(pvarRes) = a2bstr("VT_BOOL");
481 break;
482 default:
483 ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
484 return E_FAIL;
485 }
486
487 return S_OK;
488
489 case DISPID_GLOBAL_TESTOBJ:
490 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
491 ok(pdp != NULL, "pdp == NULL\n");
492 ok(!pdp->rgvarg, "rgvarg != NULL\n");
493 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
494 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
495 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
496 ok(pvarRes != NULL, "pvarRes == NULL\n");
497 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
498 ok(pei != NULL, "pei == NULL\n");
499
500 V_VT(pvarRes) = VT_DISPATCH;
501 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
502 return S_OK;
503
504 case DISPID_GLOBAL_NULL_BSTR:
505 if(pvarRes) {
506 V_VT(pvarRes) = VT_BSTR;
507 V_BSTR(pvarRes) = NULL;
508 }
509 return S_OK;
510
511 case DISPID_GLOBAL_NULL_DISP:
512 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
513 ok(pdp != NULL, "pdp == NULL\n");
514 ok(!pdp->rgvarg, "rgvarg != NULL\n");
515 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
516 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
517 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
518 ok(pvarRes != NULL, "pvarRes == NULL\n");
519 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
520 ok(pei != NULL, "pei == NULL\n");
521
522 V_VT(pvarRes) = VT_DISPATCH;
523 V_DISPATCH(pvarRes) = NULL;
524 return S_OK;
525
526 case DISPID_GLOBAL_TESTTHIS:
527 ok(pdp != NULL, "pdp == NULL\n");
528 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
529 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
530 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
531 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
532 ok(pvarRes == NULL, "pvarRes != NULL\n");
533 ok(pei != NULL, "pei == NULL\n");
534
535 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
536 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
537
538 return S_OK;
539
540 case DISPID_GLOBAL_TESTTHIS2:
541 ok(pdp != NULL, "pdp == NULL\n");
542 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
543 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
544 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
545 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
546 ok(pvarRes == NULL, "pvarRes != NULL\n");
547 ok(pei != NULL, "pei == NULL\n");
548
549 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
550 ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
551 ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
552
553 return S_OK;
554
555 case DISPID_GLOBAL_INVOKEVERSION:
556 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
557 ok(pdp != NULL, "pdp == NULL\n");
558 ok(!pdp->rgvarg, "rgvarg != NULL\n");
559 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
560 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
561 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
562 ok(pvarRes != NULL, "pvarRes == NULL\n");
563 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
564 ok(pei != NULL, "pei == NULL\n");
565
566 V_VT(pvarRes) = VT_I4;
567 V_I4(pvarRes) = invoke_version;
568
569 return S_OK;
570
571 }
572
573 ok(0, "unexpected call %x\n", id);
574 return DISP_E_MEMBERNOTFOUND;
575 }
576
577 static IDispatchExVtbl GlobalVtbl = {
578 DispatchEx_QueryInterface,
579 DispatchEx_AddRef,
580 DispatchEx_Release,
581 DispatchEx_GetTypeInfoCount,
582 DispatchEx_GetTypeInfo,
583 DispatchEx_GetIDsOfNames,
584 DispatchEx_Invoke,
585 Global_GetDispID,
586 Global_InvokeEx,
587 DispatchEx_DeleteMemberByName,
588 DispatchEx_DeleteMemberByDispID,
589 DispatchEx_GetMemberProperties,
590 DispatchEx_GetMemberName,
591 DispatchEx_GetNextDispID,
592 DispatchEx_GetNameSpaceParent
593 };
594
595 static IDispatchEx Global = { &GlobalVtbl };
596
597 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
598 {
599 *ppv = NULL;
600
601 if(IsEqualGUID(&IID_IUnknown, riid))
602 *ppv = iface;
603 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
604 *ppv = iface;
605 else
606 return E_NOINTERFACE;
607
608 IUnknown_AddRef((IUnknown*)*ppv);
609 return S_OK;
610 }
611
612 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
613 {
614 return 2;
615 }
616
617 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
618 {
619 return 1;
620 }
621
622 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
623 {
624 *plcid = GetUserDefaultLCID();
625 return S_OK;
626 }
627
628 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
629 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
630 {
631 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
632 ok(!ppti, "ppti != NULL\n");
633
634 if(!strcmp_wa(pstrName, test_valA))
635 CHECK_EXPECT(GetItemInfo_testVal);
636 else if(strcmp_wa(pstrName, testA))
637 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
638
639 *ppiunkItem = (IUnknown*)&Global;
640 return S_OK;
641 }
642
643 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
644 {
645 return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
649 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
650 {
651 return E_NOTIMPL;
652 }
653
654 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
655 {
656 return E_NOTIMPL;
657 }
658
659 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
660 {
661 return E_NOTIMPL;
662 }
663
664 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
665 {
666 return E_NOTIMPL;
667 }
668
669 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
670 {
671 return E_NOTIMPL;
672 }
673
674 #undef ACTSCPSITE_THIS
675
676 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
677 ActiveScriptSite_QueryInterface,
678 ActiveScriptSite_AddRef,
679 ActiveScriptSite_Release,
680 ActiveScriptSite_GetLCID,
681 ActiveScriptSite_GetItemInfo,
682 ActiveScriptSite_GetDocVersionString,
683 ActiveScriptSite_OnScriptTerminate,
684 ActiveScriptSite_OnStateChange,
685 ActiveScriptSite_OnScriptError,
686 ActiveScriptSite_OnEnterScript,
687 ActiveScriptSite_OnLeaveScript
688 };
689
690 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
691
692 static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
693 {
694 IActiveScriptProperty *script_prop;
695 HRESULT hres;
696
697 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
698 (void**)&script_prop);
699 ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
700
701 hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
702 IActiveScriptProperty_Release(script_prop);
703
704 return hres;
705 }
706
707 static IActiveScript *create_script(void)
708 {
709 IActiveScript *script;
710 VARIANT v;
711 HRESULT hres;
712
713 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
714 &IID_IActiveScript, (void**)&script);
715 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
716
717 V_VT(&v) = VT_I4;
718 V_I4(&v) = invoke_version;
719 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
720 ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
721 if(invoke_version && FAILED(hres)) {
722 IActiveScript_Release(script);
723 return NULL;
724 }
725
726 return script;
727 }
728
729 static HRESULT parse_script(DWORD flags, BSTR script_str)
730 {
731 IActiveScriptParse *parser;
732 IActiveScript *engine;
733 HRESULT hres;
734
735 engine = create_script();
736 if(!engine)
737 return S_OK;
738
739 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
740 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
741 if (FAILED(hres))
742 {
743 IActiveScript_Release(engine);
744 return hres;
745 }
746
747 hres = IActiveScriptParse64_InitNew(parser);
748 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
749
750 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
751 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
752
753 hres = IActiveScript_AddNamedItem(engine, testW,
754 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
755 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
756
757 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
758 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
759
760 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
761 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
762 ok(script_disp != NULL, "script_disp == NULL\n");
763 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
764
765 hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
766
767 IDispatch_Release(script_disp);
768 IActiveScript_Release(engine);
769 IUnknown_Release(parser);
770
771 return hres;
772 }
773
774 static HRESULT parse_htmlscript(BSTR script_str)
775 {
776 IActiveScriptParse *parser;
777 IActiveScript *engine;
778 HRESULT hres;
779 BSTR tmp = a2bstr("</SCRIPT>");
780
781 engine = create_script();
782 if(!engine)
783 return E_FAIL;
784
785 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
786 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
787 if (FAILED(hres))
788 {
789 IActiveScript_Release(engine);
790 return E_FAIL;
791 }
792
793 hres = IActiveScriptParse64_InitNew(parser);
794 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
795
796 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
797 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
798
799 hres = IActiveScript_AddNamedItem(engine, testW,
800 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
801 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
802
803 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
804 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
805
806 hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL);
807
808 IActiveScript_Release(engine);
809 IUnknown_Release(parser);
810 SysFreeString(tmp);
811
812 return hres;
813 }
814
815 static void parse_script_af(DWORD flags, const char *src)
816 {
817 BSTR tmp;
818 HRESULT hres;
819
820 tmp = a2bstr(src);
821 hres = parse_script(flags, tmp);
822 SysFreeString(tmp);
823 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
824 }
825
826 static void parse_script_a(const char *src)
827 {
828 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
829 }
830
831 static HRESULT parse_htmlscript_a(const char *src)
832 {
833 HRESULT hres;
834 BSTR tmp = a2bstr(src);
835 hres = parse_htmlscript(tmp);
836 SysFreeString(tmp);
837
838 return hres;
839 }
840
841 static BSTR get_script_from_file(const char *filename)
842 {
843 DWORD size, len;
844 HANDLE file, map;
845 const char *file_map;
846 BSTR ret;
847
848 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
849 if(file == INVALID_HANDLE_VALUE) {
850 trace("Could not open file: %u\n", GetLastError());
851 return NULL;
852 }
853
854 size = GetFileSize(file, NULL);
855
856 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
857 CloseHandle(file);
858 if(map == INVALID_HANDLE_VALUE) {
859 trace("Could not create file mapping: %u\n", GetLastError());
860 return NULL;
861 }
862
863 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
864 CloseHandle(map);
865 if(!file_map) {
866 trace("MapViewOfFile failed: %u\n", GetLastError());
867 return NULL;
868 }
869
870 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
871 ret = SysAllocStringLen(NULL, len);
872 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
873
874 UnmapViewOfFile(file_map);
875
876 return ret;
877 }
878
879 static void run_from_file(const char *filename)
880 {
881 BSTR script_str;
882 HRESULT hres;
883
884 script_str = get_script_from_file(filename);
885 if(!script_str)
886 return;
887
888 strict_dispid_check = FALSE;
889 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
890 SysFreeString(script_str);
891 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
892 }
893
894 static void run_from_res(const char *name)
895 {
896 const char *data;
897 DWORD size, len;
898 BSTR str;
899 HRSRC src;
900 HRESULT hres;
901
902 strict_dispid_check = FALSE;
903 test_name = name;
904
905 src = FindResourceA(NULL, name, (LPCSTR)40);
906 ok(src != NULL, "Could not find resource %s\n", name);
907
908 size = SizeofResource(NULL, src);
909 data = LoadResource(NULL, src);
910
911 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
912 str = SysAllocStringLen(NULL, len);
913 len = MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
914
915 SET_EXPECT(global_success_d);
916 SET_EXPECT(global_success_i);
917 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
918 CHECK_CALLED(global_success_d);
919 CHECK_CALLED(global_success_i);
920
921 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
922 SysFreeString(str);
923 }
924
925 static void test_isvisible(BOOL global_members)
926 {
927 IActiveScriptParse *parser;
928 IActiveScript *engine;
929 HRESULT hres;
930
931 static const WCHAR script_textW[] =
932 {'v','a','r',' ','v',' ','=',' ','t','e','s','t','V','a','l',';',0};
933
934 engine = create_script();
935 if(!engine)
936 return;
937
938 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
939 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
940 if (FAILED(hres))
941 {
942 IActiveScript_Release(engine);
943 return;
944 }
945
946 hres = IActiveScriptParse64_InitNew(parser);
947 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
948
949 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
950 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
951
952 if(global_members)
953 SET_EXPECT(GetItemInfo_testVal);
954 hres = IActiveScript_AddNamedItem(engine, test_valW,
955 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
956 (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
957 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
958 if(global_members)
959 CHECK_CALLED(GetItemInfo_testVal);
960
961 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
962 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
963
964 if(!global_members)
965 SET_EXPECT(GetItemInfo_testVal);
966 hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
967 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
968 if(!global_members)
969 CHECK_CALLED(GetItemInfo_testVal);
970
971 hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
972 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
973
974 IActiveScript_Release(engine);
975 IUnknown_Release(parser);
976 }
977
978 static void run_tests(void)
979 {
980 HRESULT hres;
981
982 if(invoke_version) {
983 IActiveScript *script;
984
985 script = create_script();
986 if(!script) {
987 win_skip("Could not create script\n");
988 return;
989 }
990 IActiveScript_Release(script);
991 }
992
993 strict_dispid_check = TRUE;
994
995 parse_script_a("");
996 parse_script_a("/* empty */ ;");
997
998 SET_EXPECT(global_propget_d);
999 SET_EXPECT(global_propget_i);
1000 parse_script_a("testPropGet;");
1001 CHECK_CALLED(global_propget_d);
1002 CHECK_CALLED(global_propget_i);
1003
1004 SET_EXPECT(global_propput_d);
1005 SET_EXPECT(global_propput_i);
1006 parse_script_a("testPropPut = 1;");
1007 CHECK_CALLED(global_propput_d);
1008 CHECK_CALLED(global_propput_i);
1009
1010 SET_EXPECT(global_success_d);
1011 SET_EXPECT(global_success_i);
1012 parse_script_a("reportSuccess();");
1013 CHECK_CALLED(global_success_d);
1014 CHECK_CALLED(global_success_i);
1015
1016 SET_EXPECT(testobj_delete);
1017 parse_script_a("delete testObj.deleteTest;");
1018 CHECK_CALLED(testobj_delete);
1019
1020 parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
1021
1022 parse_script_a("function reportSuccess() {}; reportSuccess();");
1023
1024 SET_EXPECT(global_propget_d);
1025 parse_script_a("var testPropGet");
1026 CHECK_CALLED(global_propget_d);
1027
1028 SET_EXPECT(global_notexists_d);
1029 parse_script_a("var notExists; notExists = 1;");
1030 CHECK_CALLED(global_notexists_d);
1031
1032 parse_script_a("function f() { var testPropGet; }");
1033
1034 parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
1035
1036 SET_EXPECT(testobj_prop_d);
1037 parse_script_a("ok(('prop' in testObj) === true, 'prop is not in testObj');");
1038 CHECK_CALLED(testobj_prop_d);
1039
1040 SET_EXPECT(testobj_noprop_d);
1041 parse_script_a("ok(('noprop' in testObj) === false, 'noprop is in testObj');");
1042 CHECK_CALLED(testobj_noprop_d);
1043
1044 SET_EXPECT(testobj_value);
1045 parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
1046 CHECK_CALLED(testobj_value);
1047
1048 SET_EXPECT(testobj_value);
1049 parse_script_a("ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
1050 CHECK_CALLED(testobj_value);
1051
1052 SET_EXPECT(global_propget_d);
1053 SET_EXPECT(global_propget_i);
1054 parse_script_a("this.testPropGet;");
1055 CHECK_CALLED(global_propget_d);
1056 CHECK_CALLED(global_propget_i);
1057
1058 SET_EXPECT(global_propget_d);
1059 SET_EXPECT(global_propget_i);
1060 parse_script_a("(function () { this.testPropGet; })();");
1061 CHECK_CALLED(global_propget_d);
1062 CHECK_CALLED(global_propget_i);
1063
1064 parse_script_a("testThis(this);");
1065 parse_script_a("(function () { testThis(this); })();");
1066
1067 run_from_res("lang.js");
1068 run_from_res("api.js");
1069 run_from_res("regexp.js");
1070
1071 test_isvisible(FALSE);
1072 test_isvisible(TRUE);
1073
1074 parse_script_af(0, "test.testThis2(this);");
1075 parse_script_af(0, "(function () { test.testThis2(this); })();");
1076
1077 hres = parse_htmlscript_a("<!--");
1078 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1079 hres = parse_htmlscript_a("-->");
1080 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1081 hres = parse_htmlscript_a("<!--\nvar a=1;\n-->\n");
1082 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1083 hres = parse_htmlscript_a("<!--\n<!-- ignore this\n-->\n");
1084 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1085 hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n");
1086 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1087 hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n");
1088 ok(hres != S_OK, "ParseScriptText have not failed\n");
1089 }
1090
1091 static BOOL check_jscript(void)
1092 {
1093 BSTR str;
1094 HRESULT hres;
1095
1096 str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
1097 hres = parse_script(0, str);
1098 SysFreeString(str);
1099
1100 return hres == S_OK;
1101 }
1102
1103 START_TEST(run)
1104 {
1105 int argc;
1106 char **argv;
1107
1108 argc = winetest_get_mainargs(&argv);
1109
1110 CoInitialize(NULL);
1111
1112 if(!check_jscript()) {
1113 win_skip("Broken engine, probably too old\n");
1114 }else if(argc > 2) {
1115 run_from_file(argv[2]);
1116 }else {
1117 trace("invoke version 0\n");
1118 invoke_version = 0;
1119 run_tests();
1120
1121 trace("invoke version 2\n");
1122 invoke_version = 2;
1123 run_tests();
1124 }
1125
1126 CoUninitialize();
1127 }