jscript: Use bytecode for calls on identifier and member expressions.
[wine] / dlls / jscript / tests / 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(puredisp_prop_d);
68 DEFINE_EXPECT(puredisp_noprop_d);
69 DEFINE_EXPECT(testobj_delete);
70 DEFINE_EXPECT(testobj_value);
71 DEFINE_EXPECT(testobj_prop_d);
72 DEFINE_EXPECT(testobj_noprop_d);
73 DEFINE_EXPECT(testobj_onlydispid_d);
74 DEFINE_EXPECT(testobj_onlydispid_i);
75 DEFINE_EXPECT(GetItemInfo_testVal);
76 DEFINE_EXPECT(ActiveScriptSite_OnScriptError);
77 DEFINE_EXPECT(invoke_func);
78
79 #define DISPID_GLOBAL_TESTPROPGET   0x1000
80 #define DISPID_GLOBAL_TESTPROPPUT   0x1001
81 #define DISPID_GLOBAL_REPORTSUCCESS 0x1002
82 #define DISPID_GLOBAL_TRACE         0x1003
83 #define DISPID_GLOBAL_OK            0x1004
84 #define DISPID_GLOBAL_GETVT         0x1005
85 #define DISPID_GLOBAL_TESTOBJ       0x1006
86 #define DISPID_GLOBAL_NULL_BSTR     0x1007
87 #define DISPID_GLOBAL_NULL_DISP     0x1008
88 #define DISPID_GLOBAL_TESTTHIS      0x1009
89 #define DISPID_GLOBAL_TESTTHIS2     0x100a
90 #define DISPID_GLOBAL_INVOKEVERSION 0x100b
91 #define DISPID_GLOBAL_CREATEARRAY   0x100c
92 #define DISPID_GLOBAL_PROPGETFUNC   0x100d
93 #define DISPID_GLOBAL_OBJECT_FLAG   0x100e
94 #define DISPID_GLOBAL_ISWIN64       0x100f
95 #define DISPID_GLOBAL_PUREDISP      0x1010
96
97 #define DISPID_TESTOBJ_PROP         0x2000
98 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
99
100 static const WCHAR testW[] = {'t','e','s','t',0};
101 static const CHAR testA[] = "test";
102 static const WCHAR test_valW[] = {'t','e','s','t','V','a','l',0};
103 static const CHAR test_valA[] = "testVal";
104
105 static BOOL strict_dispid_check;
106 static const char *test_name = "(null)";
107 static IDispatch *script_disp;
108 static int invoke_version;
109 static IActiveScriptError *script_error;
110
111 /* Returns true if the user interface is in English. Note that this does not
112  * presume of the formatting of dates, numbers, etc.
113  */
114 static BOOL is_lang_english(void)
115 {
116     static HMODULE hkernel32 = NULL;
117     static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
118     static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
119
120     if (!hkernel32)
121     {
122         hkernel32 = GetModuleHandleA("kernel32.dll");
123         pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
124         pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
125     }
126     if (pGetThreadUILanguage)
127         return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
128     if (pGetUserDefaultUILanguage)
129         return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
130
131     return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
132 }
133
134 static BSTR a2bstr(const char *str)
135 {
136     BSTR ret;
137     int len;
138
139     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
140     ret = SysAllocStringLen(NULL, len-1);
141     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
142
143     return ret;
144 }
145
146 static int strcmp_wa(LPCWSTR strw, const char *stra)
147 {
148     CHAR buf[512];
149     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
150     return lstrcmpA(buf, stra);
151 }
152
153 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
154 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
155 {
156     expect |= invoke_version << 28;
157     ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
158 }
159
160 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
161 {
162     *ppv = NULL;
163
164     if(IsEqualGUID(riid, &IID_IUnknown)
165        || IsEqualGUID(riid, &IID_IDispatch)
166        || IsEqualGUID(riid, &IID_IDispatchEx))
167         *ppv = iface;
168     else
169         return E_NOINTERFACE;
170
171     return S_OK;
172 }
173
174 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
175 {
176     return 2;
177 }
178
179 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
180 {
181     return 1;
182 }
183
184 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
185 {
186     ok(0, "unexpected call\n");
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
191                                               LCID lcid, ITypeInfo **ppTInfo)
192 {
193     ok(0, "unexpected call\n");
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
198                                                 LPOLESTR *rgszNames, UINT cNames,
199                                                 LCID lcid, DISPID *rgDispId)
200 {
201     ok(IsEqualGUID(riid, &IID_NULL), "Expected IID_NULL\n");
202     ok(cNames==1, "cNames = %d\n", cNames);
203
204     if(!strcmp_wa(*rgszNames, "prop")) {
205         CHECK_EXPECT(puredisp_prop_d);
206         *rgDispId = DISPID_TESTOBJ_PROP;
207         return S_OK;
208     } else if(!strcmp_wa(*rgszNames, "noprop")) {
209         CHECK_EXPECT(puredisp_noprop_d);
210         return DISP_E_UNKNOWNNAME;
211     }
212
213     ok(0, "unexpected call\n");
214     return E_NOTIMPL;
215 }
216
217 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
218                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
219                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
220 {
221     ok(0, "unexpected call\n");
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
226 {
227     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
228     return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
232 {
233     ok(0, "unexpected call\n");
234     return E_NOTIMPL;
235 }
236
237 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
238 {
239     ok(0, "unexpected call\n");
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
244 {
245     ok(0, "unexpected call\n");
246     return E_NOTIMPL;
247 }
248
249 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
250 {
251     ok(0, "unexpected call\n");
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
256 {
257     ok(0, "unexpected call\n");
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
262 {
263     if(!strcmp_wa(bstrName, "prop")) {
264         CHECK_EXPECT(testobj_prop_d);
265         test_grfdex(grfdex, fdexNameCaseSensitive);
266         *pid = DISPID_TESTOBJ_PROP;
267         return S_OK;
268     }
269     if(!strcmp_wa(bstrName, "noprop")) {
270         CHECK_EXPECT(testobj_noprop_d);
271         test_grfdex(grfdex, fdexNameCaseSensitive);
272         return DISP_E_UNKNOWNNAME;
273     }
274     if(!strcmp_wa(bstrName, "onlyDispID")) {
275         if(strict_dispid_check)
276             CHECK_EXPECT(testobj_onlydispid_d);
277         test_grfdex(grfdex, fdexNameCaseSensitive);
278         *pid = DISPID_TESTOBJ_ONLYDISPID;
279         return S_OK;
280     }
281
282     ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
283     return E_NOTIMPL;
284 }
285
286 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
287         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
288 {
289     switch(id) {
290     case DISPID_VALUE:
291         ok(pdp != NULL, "pdp == NULL\n");
292         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
293         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
294         ok(pvarRes != NULL, "pvarRes == NULL\n");
295         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
296         ok(pei != NULL, "pei == NULL\n");
297
298         switch(wFlags) {
299         case INVOKE_PROPERTYGET:
300             CHECK_EXPECT(testobj_value);
301             ok(!pdp->rgvarg, "rgvarg != NULL\n");
302             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
303             break;
304         case INVOKE_FUNC:
305             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
306             break;
307         case INVOKE_FUNC|INVOKE_PROPERTYGET:
308             ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
309             break;
310         default:
311             ok(0, "invalid flag (%x)\n", wFlags);
312         }
313
314         V_VT(pvarRes) = VT_I4;
315         V_I4(pvarRes) = 1;
316         return S_OK;
317     case DISPID_TESTOBJ_ONLYDISPID:
318         if(strict_dispid_check)
319             CHECK_EXPECT(testobj_onlydispid_i);
320         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
321         ok(pdp != NULL, "pdp == NULL\n");
322         ok(!pdp->rgvarg, "rgvarg != NULL\n");
323         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
324         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
325         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
326         ok(pvarRes != NULL, "pvarRes == NULL\n");
327         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
328         ok(pei != NULL, "pei == NULL\n");
329         return DISP_E_MEMBERNOTFOUND;
330     }
331
332     ok(0, "unexpected call %x\n", id);
333     return DISP_E_MEMBERNOTFOUND;
334 }
335
336 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
337 {
338     CHECK_EXPECT(testobj_delete);
339
340     ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
341     test_grfdex(grfdex, fdexNameCaseSensitive);
342     return S_OK;
343 }
344
345 static IDispatchExVtbl testObjVtbl = {
346     DispatchEx_QueryInterface,
347     DispatchEx_AddRef,
348     DispatchEx_Release,
349     DispatchEx_GetTypeInfoCount,
350     DispatchEx_GetTypeInfo,
351     DispatchEx_GetIDsOfNames,
352     DispatchEx_Invoke,
353     testObj_GetDispID,
354     testObj_InvokeEx,
355     testObj_DeleteMemberByName,
356     DispatchEx_DeleteMemberByDispID,
357     DispatchEx_GetMemberProperties,
358     DispatchEx_GetMemberName,
359     DispatchEx_GetNextDispID,
360     DispatchEx_GetNameSpaceParent
361 };
362
363 static IDispatchEx testObj = { &testObjVtbl };
364
365 static HRESULT WINAPI pureDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
366 {
367     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) {
368         *ppv = iface;
369         return S_OK;
370     }
371
372     *ppv = NULL;
373     return E_NOINTERFACE;
374 }
375
376 static IDispatchExVtbl pureDispVtbl = {
377     pureDisp_QueryInterface,
378     DispatchEx_AddRef,
379     DispatchEx_Release,
380     DispatchEx_GetTypeInfoCount,
381     DispatchEx_GetTypeInfo,
382     DispatchEx_GetIDsOfNames,
383     DispatchEx_Invoke
384 };
385
386 static IDispatchEx pureDisp = { &pureDispVtbl };
387
388 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
389 {
390     if(!strcmp_wa(bstrName, "ok")) {
391         test_grfdex(grfdex, fdexNameCaseSensitive);
392         *pid = DISPID_GLOBAL_OK;
393         return S_OK;
394     }
395     if(!strcmp_wa(bstrName, "trace")) {
396         test_grfdex(grfdex, fdexNameCaseSensitive);
397         *pid = DISPID_GLOBAL_TRACE;
398         return S_OK;
399     }
400     if(!strcmp_wa(bstrName, "reportSuccess")) {
401         CHECK_EXPECT(global_success_d);
402         test_grfdex(grfdex, fdexNameCaseSensitive);
403         *pid = DISPID_GLOBAL_REPORTSUCCESS;
404         return S_OK;
405     }
406     if(!strcmp_wa(bstrName, "testPropGet")) {
407         CHECK_EXPECT(global_propget_d);
408         test_grfdex(grfdex, fdexNameCaseSensitive);
409         *pid = DISPID_GLOBAL_TESTPROPGET;
410         return S_OK;
411     }
412     if(!strcmp_wa(bstrName, "testPropPut")) {
413         CHECK_EXPECT(global_propput_d);
414         test_grfdex(grfdex, fdexNameCaseSensitive);
415         *pid = DISPID_GLOBAL_TESTPROPPUT;
416         return S_OK;
417     }
418     if(!strcmp_wa(bstrName, "getVT")) {
419         test_grfdex(grfdex, fdexNameCaseSensitive);
420         *pid = DISPID_GLOBAL_GETVT;
421         return S_OK;
422     }
423     if(!strcmp_wa(bstrName, "testObj")) {
424         test_grfdex(grfdex, fdexNameCaseSensitive);
425         *pid = DISPID_GLOBAL_TESTOBJ;
426         return S_OK;
427     }
428     if(!strcmp_wa(bstrName, "createNullBSTR")) {
429         *pid = DISPID_GLOBAL_NULL_BSTR;
430         return S_OK;
431     }
432     if(!strcmp_wa(bstrName, "nullDisp")) {
433         *pid = DISPID_GLOBAL_NULL_DISP;
434         return S_OK;
435     }
436     if(!strcmp_wa(bstrName, "notExists")) {
437         CHECK_EXPECT(global_notexists_d);
438         test_grfdex(grfdex, fdexNameCaseSensitive);
439         return DISP_E_UNKNOWNNAME;
440     }
441
442     if(!strcmp_wa(bstrName, "testThis")) {
443         test_grfdex(grfdex, fdexNameCaseSensitive);
444         *pid = DISPID_GLOBAL_TESTTHIS;
445         return S_OK;
446     }
447
448     if(!strcmp_wa(bstrName, "testThis2")) {
449         test_grfdex(grfdex, fdexNameCaseSensitive);
450         *pid = DISPID_GLOBAL_TESTTHIS2;
451         return S_OK;
452     }
453
454     if(!strcmp_wa(bstrName, "invokeVersion")) {
455         test_grfdex(grfdex, fdexNameCaseSensitive);
456         *pid = DISPID_GLOBAL_INVOKEVERSION;
457         return S_OK;
458     }
459     if(!strcmp_wa(bstrName, "createArray")) {
460         test_grfdex(grfdex, fdexNameCaseSensitive);
461         *pid = DISPID_GLOBAL_CREATEARRAY;
462         return S_OK;
463     }
464     if(!strcmp_wa(bstrName, "propGetFunc")) {
465         test_grfdex(grfdex, fdexNameCaseSensitive);
466         *pid = DISPID_GLOBAL_PROPGETFUNC;
467         return S_OK;
468     }
469     if(!strcmp_wa(bstrName, "objectFlag")) {
470         test_grfdex(grfdex, fdexNameCaseSensitive);
471         *pid = DISPID_GLOBAL_OBJECT_FLAG;
472         return S_OK;
473     }
474
475     if(!strcmp_wa(bstrName, "isWin64")) {
476         test_grfdex(grfdex, fdexNameCaseSensitive);
477         *pid = DISPID_GLOBAL_ISWIN64;
478         return S_OK;
479     }
480
481     if(!strcmp_wa(bstrName, "pureDisp")) {
482         test_grfdex(grfdex, fdexNameCaseSensitive);
483         *pid = DISPID_GLOBAL_PUREDISP;
484         return S_OK;
485     }
486
487     if(strict_dispid_check)
488         ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
489     return DISP_E_UNKNOWNNAME;
490 }
491
492 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
493         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
494 {
495     switch(id) {
496     case DISPID_GLOBAL_OK:
497         ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
498         ok(pdp != NULL, "pdp == NULL\n");
499         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
500         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
501         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
502         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
503         if(wFlags & INVOKE_PROPERTYGET)
504             ok(pvarRes != NULL, "pvarRes == NULL\n");
505         else
506             ok(!pvarRes, "pvarRes != NULL\n");
507         ok(pei != NULL, "pei == NULL\n");
508
509         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
510         ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg));
511         ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
512
513         return S_OK;
514
515      case DISPID_GLOBAL_TRACE:
516         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
517         ok(pdp != NULL, "pdp == NULL\n");
518         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
519         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
520         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
521         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
522         ok(!pvarRes, "pvarRes != NULL\n");
523         ok(pei != NULL, "pei == NULL\n");
524
525         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
526         if(V_VT(pdp->rgvarg) == VT_BSTR)
527             trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
528
529         return S_OK;
530
531     case DISPID_GLOBAL_REPORTSUCCESS:
532         CHECK_EXPECT(global_success_i);
533
534         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
535         ok(pdp != NULL, "pdp == NULL\n");
536         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
537         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
538         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
539         ok(!pvarRes, "pvarRes != NULL\n");
540         ok(pei != NULL, "pei == NULL\n");
541
542         return S_OK;
543
544      case DISPID_GLOBAL_TESTPROPGET:
545         CHECK_EXPECT(global_propget_i);
546
547         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
548         ok(pdp != NULL, "pdp == NULL\n");
549         ok(!pdp->rgvarg, "rgvarg != NULL\n");
550         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
551         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
552         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
553         ok(pvarRes != NULL, "pvarRes == NULL\n");
554         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
555         ok(pei != NULL, "pei == NULL\n");
556
557         V_VT(pvarRes) = VT_I4;
558         V_I4(pvarRes) = 1;
559
560         return S_OK;
561
562     case DISPID_GLOBAL_TESTPROPPUT:
563         CHECK_EXPECT(global_propput_i);
564
565         ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
566         ok(pdp != NULL, "pdp == NULL\n");
567         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
568         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
569         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
570         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
571         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
572         ok(!pvarRes, "pvarRes != NULL\n");
573
574         ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
575         ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
576         return S_OK;
577
578      case DISPID_GLOBAL_GETVT:
579         ok(pdp != NULL, "pdp == NULL\n");
580         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
581         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
582         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
583         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
584         ok(pvarRes != NULL, "pvarRes == NULL\n");
585         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
586         ok(pei != NULL, "pei == NULL\n");
587
588         V_VT(pvarRes) = VT_BSTR;
589         switch(V_VT(pdp->rgvarg)) {
590         case VT_EMPTY:
591             V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
592             break;
593         case VT_NULL:
594             V_BSTR(pvarRes) = a2bstr("VT_NULL");
595             break;
596         case VT_I4:
597             V_BSTR(pvarRes) = a2bstr("VT_I4");
598             break;
599         case VT_R8:
600             V_BSTR(pvarRes) = a2bstr("VT_R8");
601             break;
602         case VT_BSTR:
603             V_BSTR(pvarRes) = a2bstr("VT_BSTR");
604             break;
605         case VT_DISPATCH:
606             V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
607             break;
608         case VT_BOOL:
609             V_BSTR(pvarRes) = a2bstr("VT_BOOL");
610             break;
611         case VT_ARRAY|VT_VARIANT:
612             V_BSTR(pvarRes) = a2bstr("VT_ARRAY|VT_VARIANT");
613             break;
614         default:
615             ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
616             return E_FAIL;
617         }
618
619         return S_OK;
620
621     case DISPID_GLOBAL_TESTOBJ:
622         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
623         ok(pdp != NULL, "pdp == NULL\n");
624         ok(!pdp->rgvarg, "rgvarg != NULL\n");
625         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
626         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
627         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
628         ok(pvarRes != NULL, "pvarRes == NULL\n");
629         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
630         ok(pei != NULL, "pei == NULL\n");
631
632         V_VT(pvarRes) = VT_DISPATCH;
633         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
634         return S_OK;
635
636     case DISPID_GLOBAL_PUREDISP:
637         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
638         ok(pdp != NULL, "pdp == NULL\n");
639         ok(!pdp->rgvarg, "rgvarg != NULL\n");
640         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
641         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
642         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
643         ok(pvarRes != NULL, "pvarRes == NULL\n");
644         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
645         ok(pei != NULL, "pei == NULL\n");
646
647         V_VT(pvarRes) = VT_DISPATCH;
648         V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
649         return S_OK;
650
651     case DISPID_GLOBAL_NULL_BSTR:
652         if(pvarRes) {
653             V_VT(pvarRes) = VT_BSTR;
654             V_BSTR(pvarRes) = NULL;
655         }
656         return S_OK;
657
658     case DISPID_GLOBAL_ISWIN64:
659         if(pvarRes) {
660             V_VT(pvarRes) = VT_BOOL;
661             V_BOOL(pvarRes) = sizeof(void*) == 8 ? VARIANT_TRUE : VARIANT_FALSE;
662         }
663         return S_OK;
664
665     case DISPID_GLOBAL_NULL_DISP:
666         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
667         ok(pdp != NULL, "pdp == NULL\n");
668         ok(!pdp->rgvarg, "rgvarg != NULL\n");
669         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
670         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
671         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
672         ok(pvarRes != NULL, "pvarRes == NULL\n");
673         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
674         ok(pei != NULL, "pei == NULL\n");
675
676         V_VT(pvarRes) = VT_DISPATCH;
677         V_DISPATCH(pvarRes) = NULL;
678         return S_OK;
679
680     case DISPID_GLOBAL_TESTTHIS:
681         ok(pdp != NULL, "pdp == NULL\n");
682         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
683         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
684         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
685         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
686         ok(pvarRes == NULL, "pvarRes != NULL\n");
687         ok(pei != NULL, "pei == NULL\n");
688
689         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
690         ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
691
692         return S_OK;
693
694     case DISPID_GLOBAL_TESTTHIS2:
695         ok(pdp != NULL, "pdp == NULL\n");
696         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
697         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
698         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
699         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
700         ok(pvarRes == NULL, "pvarRes != NULL\n");
701         ok(pei != NULL, "pei == NULL\n");
702
703         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
704         ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
705         ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
706
707         return S_OK;
708
709      case DISPID_GLOBAL_INVOKEVERSION:
710         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
711         ok(pdp != NULL, "pdp == NULL\n");
712         ok(!pdp->rgvarg, "rgvarg != NULL\n");
713         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
714         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
715         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
716         ok(pvarRes != NULL, "pvarRes == NULL\n");
717         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
718         ok(pei != NULL, "pei == NULL\n");
719
720         V_VT(pvarRes) = VT_I4;
721         V_I4(pvarRes) = invoke_version;
722
723         return S_OK;
724
725     case DISPID_GLOBAL_CREATEARRAY: {
726         SAFEARRAYBOUND bound[2];
727         VARIANT *data;
728         int i,j;
729
730         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
731         ok(pdp != NULL, "pdp == NULL\n");
732         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
733         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
734         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
735         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
736         ok(pvarRes != NULL, "pvarRes == NULL\n");
737         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
738         ok(pei != NULL, "pei == NULL\n");
739
740         bound[0].lLbound = 0;
741         bound[0].cElements = 5;
742         bound[1].lLbound = 2;
743         bound[1].cElements = 2;
744
745         V_VT(pvarRes) = VT_ARRAY|VT_VARIANT;
746         V_ARRAY(pvarRes) = SafeArrayCreate(VT_VARIANT, 2, bound);
747
748         SafeArrayAccessData(V_ARRAY(pvarRes), (void**)&data);
749         for(i=0; i<5; i++) {
750             for(j=2; j<4; j++) {
751                 V_VT(data) = VT_I4;
752                 V_I4(data) = i*10+j;
753                 data++;
754             }
755         }
756         SafeArrayUnaccessData(V_ARRAY(pvarRes));
757
758         return S_OK;
759     }
760
761     case DISPID_GLOBAL_PROPGETFUNC:
762         switch(wFlags) {
763         case INVOKE_FUNC:
764             CHECK_EXPECT(invoke_func);
765             break;
766         case INVOKE_FUNC|INVOKE_PROPERTYGET:
767             ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
768             ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
769             break;
770         default:
771             ok(0, "invalid flag (%x)\n", wFlags);
772         }
773
774         ok(pdp != NULL, "pdp == NULL\n");
775         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
776         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
777         ok(pei != NULL, "pei == NULL\n");
778
779         if(pvarRes) {
780             ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
781             V_VT(pvarRes) = VT_I4;
782             V_I4(pvarRes) = pdp->cArgs;
783         }
784
785         return S_OK;
786
787     case DISPID_GLOBAL_OBJECT_FLAG: {
788         IDispatchEx *dispex;
789         BSTR str;
790         HRESULT hres;
791
792         hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
793         ok(hres == S_OK, "hres = %x\n", hres);
794
795         str = a2bstr("Object");
796         hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
797         SysFreeString(str);
798         ok(hres == S_OK, "hres = %x\n", hres);
799
800         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
801         ok(hres == S_OK, "hres = %x\n", hres);
802
803         V_VT(pvarRes) = VT_EMPTY;
804         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
805         ok(hres == S_OK, "hres = %x\n", hres);
806         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
807         VariantClear(pvarRes);
808
809         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
810         ok(hres == S_OK, "hres = %x\n", hres);
811
812         V_VT(pvarRes) = VT_EMPTY;
813         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
814         ok(hres == S_OK, "hres = %x\n", hres);
815         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
816         VariantClear(pvarRes);
817
818         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
819         ok(hres == S_OK, "hres = %x\n", hres);
820
821         V_VT(pvarRes) = VT_EMPTY;
822         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
823         ok(hres == E_INVALIDARG, "hres = %x\n", hres);
824
825         V_VT(pvarRes) = VT_EMPTY;
826         hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
827         ok(hres == S_OK, "hres = %x\n", hres);
828         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
829         IDispatchEx_Release(dispex);
830         return S_OK;
831     }
832     }
833
834     ok(0, "unexpected call %x\n", id);
835     return DISP_E_MEMBERNOTFOUND;
836 }
837
838 static IDispatchExVtbl GlobalVtbl = {
839     DispatchEx_QueryInterface,
840     DispatchEx_AddRef,
841     DispatchEx_Release,
842     DispatchEx_GetTypeInfoCount,
843     DispatchEx_GetTypeInfo,
844     DispatchEx_GetIDsOfNames,
845     DispatchEx_Invoke,
846     Global_GetDispID,
847     Global_InvokeEx,
848     DispatchEx_DeleteMemberByName,
849     DispatchEx_DeleteMemberByDispID,
850     DispatchEx_GetMemberProperties,
851     DispatchEx_GetMemberName,
852     DispatchEx_GetNextDispID,
853     DispatchEx_GetNameSpaceParent
854 };
855
856 static IDispatchEx Global = { &GlobalVtbl };
857
858 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
859 {
860     *ppv = NULL;
861
862     if(IsEqualGUID(&IID_IUnknown, riid))
863         *ppv = iface;
864     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
865         *ppv = iface;
866     else
867         return E_NOINTERFACE;
868
869     IUnknown_AddRef((IUnknown*)*ppv);
870     return S_OK;
871 }
872
873 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
874 {
875     return 2;
876 }
877
878 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
879 {
880     return 1;
881 }
882
883 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
884 {
885     *plcid = GetUserDefaultLCID();
886     return S_OK;
887 }
888
889 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
890         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
891 {
892     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
893     ok(!ppti, "ppti != NULL\n");
894
895     if(!strcmp_wa(pstrName, test_valA))
896         CHECK_EXPECT(GetItemInfo_testVal);
897     else if(strcmp_wa(pstrName, testA))
898         ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
899
900     *ppiunkItem = (IUnknown*)&Global;
901     return S_OK;
902 }
903
904 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
905 {
906     return E_NOTIMPL;
907 }
908
909 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
910         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
911 {
912     return E_NOTIMPL;
913 }
914
915 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
916 {
917     return E_NOTIMPL;
918 }
919
920 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
921 {
922     return E_NOTIMPL;
923 }
924
925 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
926 {
927     return E_NOTIMPL;
928 }
929
930 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
931 {
932     return E_NOTIMPL;
933 }
934
935 #undef ACTSCPSITE_THIS
936
937 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
938     ActiveScriptSite_QueryInterface,
939     ActiveScriptSite_AddRef,
940     ActiveScriptSite_Release,
941     ActiveScriptSite_GetLCID,
942     ActiveScriptSite_GetItemInfo,
943     ActiveScriptSite_GetDocVersionString,
944     ActiveScriptSite_OnScriptTerminate,
945     ActiveScriptSite_OnStateChange,
946     ActiveScriptSite_OnScriptError,
947     ActiveScriptSite_OnEnterScript,
948     ActiveScriptSite_OnLeaveScript
949 };
950
951 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
952
953 static HRESULT WINAPI ActiveScriptSite_OnScriptError_CheckError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
954 {
955     ok(pscripterror != NULL, "ActiveScriptSite_OnScriptError -- expected pscripterror to be set, got NULL\n");
956
957     script_error = pscripterror;
958     IUnknown_AddRef(script_error);
959
960     CHECK_EXPECT(ActiveScriptSite_OnScriptError);
961
962     return S_OK;
963 }
964
965 static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl = {
966     ActiveScriptSite_QueryInterface,
967     ActiveScriptSite_AddRef,
968     ActiveScriptSite_Release,
969     ActiveScriptSite_GetLCID,
970     ActiveScriptSite_GetItemInfo,
971     ActiveScriptSite_GetDocVersionString,
972     ActiveScriptSite_OnScriptTerminate,
973     ActiveScriptSite_OnStateChange,
974     ActiveScriptSite_OnScriptError_CheckError,
975     ActiveScriptSite_OnEnterScript,
976     ActiveScriptSite_OnLeaveScript
977 };
978
979 static IActiveScriptSite ActiveScriptSite_CheckError = { &ActiveScriptSite_CheckErrorVtbl };
980
981 static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
982 {
983     IActiveScriptProperty *script_prop;
984     HRESULT hres;
985
986     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
987             (void**)&script_prop);
988     ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
989
990     hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
991     IActiveScriptProperty_Release(script_prop);
992
993     return hres;
994 }
995
996 static IActiveScript *create_script(void)
997 {
998     IActiveScript *script;
999     VARIANT v;
1000     HRESULT hres;
1001
1002     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1003             &IID_IActiveScript, (void**)&script);
1004     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1005
1006     V_VT(&v) = VT_I4;
1007     V_I4(&v) = invoke_version;
1008     hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
1009     ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
1010     if(invoke_version && FAILED(hres)) {
1011         IActiveScript_Release(script);
1012         return NULL;
1013     }
1014
1015     return script;
1016 }
1017
1018 static HRESULT parse_script(DWORD flags, BSTR script_str)
1019 {
1020     IActiveScriptParse *parser;
1021     IActiveScript *engine;
1022     HRESULT hres;
1023
1024     engine = create_script();
1025     if(!engine)
1026         return S_OK;
1027
1028     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1029     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1030     if (FAILED(hres))
1031     {
1032         IActiveScript_Release(engine);
1033         return hres;
1034     }
1035
1036     hres = IActiveScriptParse64_InitNew(parser);
1037     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1038
1039     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1040     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1041
1042     hres = IActiveScript_AddNamedItem(engine, testW,
1043             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1044     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1045
1046     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1047     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1048
1049     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1050     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1051     ok(script_disp != NULL, "script_disp == NULL\n");
1052     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1053
1054     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1055
1056     IDispatch_Release(script_disp);
1057     IActiveScript_Release(engine);
1058     IUnknown_Release(parser);
1059
1060     return hres;
1061 }
1062
1063 static HRESULT parse_htmlscript(BSTR script_str)
1064 {
1065     IActiveScriptParse *parser;
1066     IActiveScript *engine;
1067     HRESULT hres;
1068     BSTR tmp = a2bstr("</SCRIPT>");
1069
1070     engine = create_script();
1071     if(!engine)
1072         return E_FAIL;
1073
1074     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1075     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1076     if (FAILED(hres))
1077     {
1078         IActiveScript_Release(engine);
1079         return E_FAIL;
1080     }
1081
1082     hres = IActiveScriptParse64_InitNew(parser);
1083     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1084
1085     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1086     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1087
1088     hres = IActiveScript_AddNamedItem(engine, testW,
1089             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1090     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1091
1092     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1093     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1094
1095     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL);
1096
1097     IActiveScript_Release(engine);
1098     IUnknown_Release(parser);
1099     SysFreeString(tmp);
1100
1101     return hres;
1102 }
1103
1104 static void test_IActiveScriptError(IActiveScriptError *error, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
1105 {
1106     HRESULT hres;
1107     DWORD source_context;
1108     ULONG line_number;
1109     LONG char_position;
1110     BSTR linetext;
1111     EXCEPINFO excep;
1112
1113     /* IActiveScriptError_GetSourcePosition */
1114
1115     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, NULL);
1116     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1117
1118     source_context = 0xdeadbeef;
1119     hres = IActiveScriptError_GetSourcePosition(error, &source_context, NULL, NULL);
1120     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1121     ok(source_context == 0, "IActiveScriptError_GetSourcePosition -- source_context: expected 0, got 0x%08x\n", source_context);
1122
1123     line_number = 0xdeadbeef;
1124     hres = IActiveScriptError_GetSourcePosition(error, NULL, &line_number, NULL);
1125     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1126     ok(line_number == line, "IActiveScriptError_GetSourcePosition -- line_number: expected %d, got %d\n", line, line_number);
1127
1128     char_position = 0xdeadbeef;
1129     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, &char_position);
1130     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1131     ok(char_position == pos, "IActiveScriptError_GetSourcePosition -- char_position: expected %d, got %d\n", pos, char_position);
1132
1133     /* IActiveScriptError_GetSourceLineText */
1134
1135     hres = IActiveScriptError_GetSourceLineText(error, NULL);
1136     ok(hres == E_POINTER, "IActiveScriptError_GetSourceLineText -- hres: expected E_POINTER, got 0x%08x\n", hres);
1137
1138     linetext = NULL;
1139     hres = IActiveScriptError_GetSourceLineText(error, &linetext);
1140     if (line_text) {
1141         ok(hres == S_OK, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1142         ok(linetext != NULL && !lstrcmpW(linetext, line_text),
1143            "IActiveScriptError_GetSourceLineText -- expected %s, got %s\n", wine_dbgstr_w(line_text), wine_dbgstr_w(linetext));
1144     } else {
1145         ok(hres == E_FAIL, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1146         ok(linetext == NULL,
1147            "IActiveScriptError_GetSourceLineText -- expected NULL, got %s\n", wine_dbgstr_w(linetext));
1148     }
1149     SysFreeString(linetext);
1150
1151     /* IActiveScriptError_GetExceptionInfo */
1152
1153     hres = IActiveScriptError_GetExceptionInfo(error, NULL);
1154     ok(hres == E_POINTER, "IActiveScriptError_GetExceptionInfo -- hres: expected E_POINTER, got 0x%08x\n", hres);
1155
1156     excep.wCode = 0xdead;
1157     excep.wReserved = 0xdead;
1158     excep.bstrSource = (BSTR)0xdeadbeef;
1159     excep.bstrDescription = (BSTR)0xdeadbeef;
1160     excep.bstrHelpFile = (BSTR)0xdeadbeef;
1161     excep.dwHelpContext = 0xdeadbeef;
1162     excep.pvReserved = (void *)0xdeadbeef;
1163     excep.pfnDeferredFillIn = (void *)0xdeadbeef;
1164     excep.scode = 0xdeadbeef;
1165
1166     hres = IActiveScriptError_GetExceptionInfo(error, &excep);
1167     ok(hres == S_OK, "IActiveScriptError_GetExceptionInfo -- hres: expected S_OK, got 0x%08x\n", hres);
1168
1169     ok(excep.wCode == 0, "IActiveScriptError_GetExceptionInfo -- excep.wCode: expected 0, got 0x%08x\n", excep.wCode);
1170     ok(excep.wReserved == 0, "IActiveScriptError_GetExceptionInfo -- excep.wReserved: expected 0, got %d\n", excep.wReserved);
1171     if (!is_lang_english())
1172         skip("Non-english UI (test with hardcoded strings)\n");
1173     else {
1174         ok(excep.bstrSource != NULL && !lstrcmpW(excep.bstrSource, script_source),
1175            "IActiveScriptError_GetExceptionInfo -- excep.bstrSource is not valid: expected %s, got %s\n",
1176            wine_dbgstr_w(script_source), wine_dbgstr_w(excep.bstrSource));
1177         ok(excep.bstrDescription != NULL && !lstrcmpW(excep.bstrDescription, description),
1178            "IActiveScriptError_GetExceptionInfo -- excep.bstrDescription is not valid: got %s\n", wine_dbgstr_w(excep.bstrDescription));
1179     }
1180     ok(excep.bstrHelpFile == NULL,
1181        "IActiveScriptError_GetExceptionInfo -- excep.bstrHelpFile: expected NULL, got %s\n", wine_dbgstr_w(excep.bstrHelpFile));
1182     ok(excep.dwHelpContext == 0, "IActiveScriptError_GetExceptionInfo -- excep.dwHelpContext: expected 0, got %d\n", excep.dwHelpContext);
1183     ok(excep.pvReserved == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pvReserved: expected NULL, got %p\n", excep.pvReserved);
1184     ok(excep.pfnDeferredFillIn == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pfnDeferredFillIn: expected NULL, got %p\n", excep.pfnDeferredFillIn);
1185     ok(excep.scode == errorcode, "IActiveScriptError_GetExceptionInfo -- excep.scode: expected 0x%08x, got 0x%08x\n", errorcode, excep.scode);
1186
1187     SysFreeString(excep.bstrSource);
1188     SysFreeString(excep.bstrDescription);
1189     SysFreeString(excep.bstrHelpFile);
1190 }
1191
1192 static void parse_script_with_error(DWORD flags, BSTR script_str, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
1193 {
1194     IActiveScriptParse *parser;
1195     IActiveScript *engine;
1196     HRESULT hres;
1197
1198     engine = create_script();
1199     if(!engine)
1200         return;
1201
1202     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1203     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1204     if (FAILED(hres))
1205     {
1206         IActiveScript_Release(engine);
1207         return;
1208     }
1209
1210     hres = IActiveScriptParse64_InitNew(parser);
1211     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1212
1213     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite_CheckError);
1214     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1215
1216     hres = IActiveScript_AddNamedItem(engine, testW,
1217             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1218     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1219
1220     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1221     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1222
1223     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1224     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1225     ok(script_disp != NULL, "script_disp == NULL\n");
1226     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1227
1228     script_error = NULL;
1229     SET_EXPECT(ActiveScriptSite_OnScriptError);
1230     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1231     todo_wine ok(hres == 0x80020101, "parse_script_with_error should have returned 0x80020101, got: 0x%08x\n", hres);
1232     todo_wine CHECK_CALLED(ActiveScriptSite_OnScriptError);
1233
1234     if (script_error)
1235     {
1236         test_IActiveScriptError(script_error, errorcode, line, pos, script_source, description, line_text);
1237
1238         IUnknown_Release(script_error);
1239     }
1240
1241     IDispatch_Release(script_disp);
1242     IActiveScript_Release(engine);
1243     IUnknown_Release(parser);
1244 }
1245
1246 static void parse_script_af(DWORD flags, const char *src)
1247 {
1248     BSTR tmp;
1249     HRESULT hres;
1250
1251     tmp = a2bstr(src);
1252     hres = parse_script(flags, tmp);
1253     SysFreeString(tmp);
1254     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1255 }
1256
1257 static void parse_script_a(const char *src)
1258 {
1259     parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1260 }
1261
1262 static void parse_script_with_error_a(const char *src, SCODE errorcode, ULONG line, LONG pos, LPCSTR source, LPCSTR desc, LPCSTR linetext)
1263 {
1264     BSTR tmp, script_source, description, line_text;
1265
1266     tmp = a2bstr(src);
1267     script_source = a2bstr(source);
1268     description = a2bstr(desc);
1269     line_text = a2bstr(linetext);
1270
1271     parse_script_with_error(SCRIPTITEM_GLOBALMEMBERS, tmp, errorcode, line, pos, script_source, description, line_text);
1272
1273     SysFreeString(line_text);
1274     SysFreeString(description);
1275     SysFreeString(script_source);
1276     SysFreeString(tmp);
1277 }
1278
1279 static HRESULT parse_htmlscript_a(const char *src)
1280 {
1281     HRESULT hres;
1282     BSTR tmp = a2bstr(src);
1283     hres = parse_htmlscript(tmp);
1284     SysFreeString(tmp);
1285
1286     return hres;
1287 }
1288
1289 static BSTR get_script_from_file(const char *filename)
1290 {
1291     DWORD size, len;
1292     HANDLE file, map;
1293     const char *file_map;
1294     BSTR ret;
1295
1296     file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1297     if(file == INVALID_HANDLE_VALUE) {
1298         trace("Could not open file: %u\n", GetLastError());
1299         return NULL;
1300     }
1301
1302     size = GetFileSize(file, NULL);
1303
1304     map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1305     CloseHandle(file);
1306     if(map == INVALID_HANDLE_VALUE) {
1307         trace("Could not create file mapping: %u\n", GetLastError());
1308         return NULL;
1309     }
1310
1311     file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1312     CloseHandle(map);
1313     if(!file_map) {
1314         trace("MapViewOfFile failed: %u\n", GetLastError());
1315         return NULL;
1316     }
1317
1318     len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1319     ret = SysAllocStringLen(NULL, len);
1320     MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1321
1322     UnmapViewOfFile(file_map);
1323
1324     return ret;
1325 }
1326
1327 static void run_from_file(const char *filename)
1328 {
1329     BSTR script_str;
1330     HRESULT hres;
1331
1332     script_str = get_script_from_file(filename);
1333     if(!script_str)
1334         return;
1335
1336     strict_dispid_check = FALSE;
1337     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1338     SysFreeString(script_str);
1339     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1340 }
1341
1342 static void run_from_res(const char *name)
1343 {
1344     const char *data;
1345     DWORD size, len;
1346     BSTR str;
1347     HRSRC src;
1348     HRESULT hres;
1349
1350     strict_dispid_check = FALSE;
1351     test_name = name;
1352
1353     src = FindResourceA(NULL, name, (LPCSTR)40);
1354     ok(src != NULL, "Could not find resource %s\n", name);
1355
1356     size = SizeofResource(NULL, src);
1357     data = LoadResource(NULL, src);
1358
1359     len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1360     str = SysAllocStringLen(NULL, len);
1361     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1362
1363     SET_EXPECT(global_success_d);
1364     SET_EXPECT(global_success_i);
1365     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1366     CHECK_CALLED(global_success_d);
1367     CHECK_CALLED(global_success_i);
1368
1369     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1370     SysFreeString(str);
1371 }
1372
1373 static void test_isvisible(BOOL global_members)
1374 {
1375     IActiveScriptParse *parser;
1376     IActiveScript *engine;
1377     HRESULT hres;
1378
1379     static const WCHAR script_textW[] =
1380         {'v','a','r',' ','v',' ','=',' ','t','e','s','t','V','a','l',';',0};
1381
1382     engine = create_script();
1383     if(!engine)
1384         return;
1385
1386     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1387     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1388     if (FAILED(hres))
1389     {
1390         IActiveScript_Release(engine);
1391         return;
1392     }
1393
1394     hres = IActiveScriptParse64_InitNew(parser);
1395     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1396
1397     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1398     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1399
1400     if(global_members)
1401         SET_EXPECT(GetItemInfo_testVal);
1402     hres = IActiveScript_AddNamedItem(engine, test_valW,
1403             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
1404             (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
1405     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1406     if(global_members)
1407         CHECK_CALLED(GetItemInfo_testVal);
1408
1409     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1410     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1411
1412     if(!global_members)
1413         SET_EXPECT(GetItemInfo_testVal);
1414     hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1415     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1416     if(!global_members)
1417         CHECK_CALLED(GetItemInfo_testVal);
1418
1419     hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1420     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1421
1422     IActiveScript_Release(engine);
1423     IUnknown_Release(parser);
1424 }
1425
1426 static void run_tests(void)
1427 {
1428     HRESULT hres;
1429
1430     if(invoke_version) {
1431         IActiveScript *script;
1432
1433         script = create_script();
1434         if(!script) {
1435             win_skip("Could not create script\n");
1436             return;
1437         }
1438         IActiveScript_Release(script);
1439     }
1440
1441     strict_dispid_check = TRUE;
1442
1443     parse_script_a("");
1444     parse_script_a("/* empty */ ;");
1445
1446     SET_EXPECT(global_propget_d);
1447     SET_EXPECT(global_propget_i);
1448     parse_script_a("testPropGet;");
1449     CHECK_CALLED(global_propget_d);
1450     CHECK_CALLED(global_propget_i);
1451
1452     SET_EXPECT(global_propput_d);
1453     SET_EXPECT(global_propput_i);
1454     parse_script_a("testPropPut = 1;");
1455     CHECK_CALLED(global_propput_d);
1456     CHECK_CALLED(global_propput_i);
1457
1458     SET_EXPECT(global_success_d);
1459     SET_EXPECT(global_success_i);
1460     parse_script_a("reportSuccess();");
1461     CHECK_CALLED(global_success_d);
1462     CHECK_CALLED(global_success_i);
1463
1464     SET_EXPECT(testobj_delete);
1465     parse_script_a("delete testObj.deleteTest;");
1466     CHECK_CALLED(testobj_delete);
1467
1468     parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
1469
1470     parse_script_a("function reportSuccess() {}; reportSuccess();");
1471
1472     SET_EXPECT(global_propget_d);
1473     parse_script_a("var testPropGet");
1474     CHECK_CALLED(global_propget_d);
1475
1476     SET_EXPECT(global_propget_d);
1477     parse_script_a("eval('var testPropGet;');");
1478     CHECK_CALLED(global_propget_d);
1479
1480     SET_EXPECT(global_notexists_d);
1481     parse_script_a("var notExists; notExists = 1;");
1482     CHECK_CALLED(global_notexists_d);
1483
1484     parse_script_a("function f() { var testPropGet; }");
1485     parse_script_a("(function () { var testPropGet; })();");
1486     parse_script_a("(function () { eval('var testPropGet;'); })();");
1487
1488     SET_EXPECT(invoke_func);
1489     parse_script_a("ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
1490     CHECK_CALLED(invoke_func);
1491     parse_script_a("ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
1492     parse_script_a("ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
1493     SET_EXPECT(invoke_func);
1494     parse_script_a("ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
1495     CHECK_CALLED(invoke_func);
1496     parse_script_a("ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
1497     SET_EXPECT(invoke_func);
1498     parse_script_a("propGetFunc(1);");
1499     CHECK_CALLED(invoke_func);
1500
1501     parse_script_a("objectFlag(1).toString();");
1502
1503     parse_script_a("(function() { var tmp = (function () { return testObj; })()(1);})();");
1504     parse_script_a("(function() { var tmp = (function () { return testObj; })()();})();");
1505
1506     parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
1507
1508     SET_EXPECT(testobj_prop_d);
1509     parse_script_a("ok(('prop' in testObj) === true, 'prop is not in testObj');");
1510     CHECK_CALLED(testobj_prop_d);
1511
1512     SET_EXPECT(testobj_noprop_d);
1513     parse_script_a("ok(('noprop' in testObj) === false, 'noprop is in testObj');");
1514     CHECK_CALLED(testobj_noprop_d);
1515
1516     SET_EXPECT(testobj_prop_d);
1517     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'prop') === true, 'hasOwnProperty(\\\"prop\\\") returned false');");
1518     CHECK_CALLED(testobj_prop_d);
1519
1520     SET_EXPECT(testobj_noprop_d);
1521     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1522     CHECK_CALLED(testobj_noprop_d);
1523
1524     SET_EXPECT(puredisp_prop_d);
1525     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'prop') === true, 'hasOwnProperty(\\\"noprop\\\") returned false');");
1526     CHECK_CALLED(puredisp_prop_d);
1527
1528     SET_EXPECT(puredisp_noprop_d);
1529     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1530     CHECK_CALLED(puredisp_noprop_d);
1531
1532     SET_EXPECT(testobj_value);
1533     parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
1534     CHECK_CALLED(testobj_value);
1535
1536     SET_EXPECT(testobj_value);
1537     parse_script_a("ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
1538     CHECK_CALLED(testobj_value);
1539
1540     SET_EXPECT(global_propget_d);
1541     SET_EXPECT(global_propget_i);
1542     parse_script_a("this.testPropGet;");
1543     CHECK_CALLED(global_propget_d);
1544     CHECK_CALLED(global_propget_i);
1545
1546     SET_EXPECT(global_propget_d);
1547     SET_EXPECT(global_propget_i);
1548     parse_script_a("(function () { this.testPropGet; })();");
1549     CHECK_CALLED(global_propget_d);
1550     CHECK_CALLED(global_propget_i);
1551
1552     parse_script_a("testThis(this);");
1553     parse_script_a("(function () { testThis(this); })();");
1554
1555     SET_EXPECT(testobj_onlydispid_d);
1556     SET_EXPECT(testobj_onlydispid_i);
1557     parse_script_a("ok(typeof(testObj.onlyDispID) === 'unknown', 'unexpected typeof(testObj.onlyDispID)');");
1558     CHECK_CALLED(testobj_onlydispid_d);
1559     CHECK_CALLED(testobj_onlydispid_i);
1560
1561     run_from_res("lang.js");
1562     run_from_res("api.js");
1563     run_from_res("regexp.js");
1564     run_from_res("cc.js");
1565
1566     test_isvisible(FALSE);
1567     test_isvisible(TRUE);
1568
1569     parse_script_af(0, "test.testThis2(this);");
1570     parse_script_af(0, "(function () { test.testThis2(this); })();");
1571
1572     hres = parse_htmlscript_a("<!--");
1573     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1574     hres = parse_htmlscript_a("-->");
1575     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1576     hres = parse_htmlscript_a("<!--\nvar a=1;\n-->\n");
1577     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1578     hres = parse_htmlscript_a("<!--\n<!-- ignore this\n-->\n");
1579     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1580     hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n");
1581     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1582     hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n");
1583     ok(hres != S_OK, "ParseScriptText have not failed\n");
1584
1585     parse_script_with_error_a(
1586         "?",
1587         0x800a03ea, 0, 0,
1588         "Microsoft JScript compilation error",
1589         "Syntax error",
1590         "?");
1591
1592     parse_script_with_error_a(
1593         "var a=1;\nif(a\n-->0) a=5;\n",
1594         0x800a03ee, 2, 0,
1595         "Microsoft JScript compilation error",
1596         "Expected ')'",
1597         "-->0) a=5;");
1598
1599     parse_script_with_error_a(
1600         "new 3;",
1601         0x800a01bd, 0, 0,
1602         "Microsoft JScript runtime error",
1603         "Object doesn't support this action",
1604         NULL);
1605
1606     parse_script_with_error_a(
1607         "new null;",
1608         0x800a138f, 0, 0,
1609         "Microsoft JScript runtime error",
1610         "Object expected",
1611         NULL);
1612
1613     parse_script_with_error_a(
1614         "var a;\nnew null;",
1615         0x800a138f, 1, 0,
1616         "Microsoft JScript runtime error",
1617         "Object expected",
1618         NULL);
1619
1620     parse_script_with_error_a(
1621         "var a; new null;",
1622         0x800a138f, 0, 7,
1623         "Microsoft JScript runtime error",
1624         "Object expected",
1625         NULL);
1626 }
1627
1628 static BOOL check_jscript(void)
1629 {
1630     IActiveScriptProperty *script_prop;
1631     BSTR str;
1632     HRESULT hres;
1633
1634     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1635             &IID_IActiveScriptProperty, (void**)&script_prop);
1636     if(FAILED(hres))
1637         return FALSE;
1638     IActiveScriptProperty_Release(script_prop);
1639
1640     str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
1641     hres = parse_script(0, str);
1642     SysFreeString(str);
1643
1644     return hres == S_OK;
1645 }
1646
1647 START_TEST(run)
1648 {
1649     int argc;
1650     char **argv;
1651
1652     argc = winetest_get_mainargs(&argv);
1653
1654     CoInitialize(NULL);
1655
1656     if(!check_jscript()) {
1657         win_skip("Broken engine, probably too old\n");
1658     }else if(argc > 2) {
1659         run_from_file(argv[2]);
1660     }else {
1661         trace("invoke version 0\n");
1662         invoke_version = 0;
1663         run_tests();
1664
1665         trace("invoke version 2\n");
1666         invoke_version = 2;
1667         run_tests();
1668     }
1669
1670     CoUninitialize();
1671 }