uxtheme: Remove unused variable.
[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 #ifdef _WIN64
31
32 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
33 #define IActiveScriptParse_Release IActiveScriptParse64_Release
34 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
35 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
36 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
37 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
38
39 #else
40
41 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
42 #define IActiveScriptParse_Release IActiveScriptParse32_Release
43 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
44 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
45 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
46 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
47
48 #endif
49
50 static const CLSID CLSID_JScript =
51     {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
52 static const CLSID CLSID_JScriptEncode =
53     {0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
54
55 #define DEFINE_EXPECT(func) \
56     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
57
58 #define SET_EXPECT(func) \
59     expect_ ## func = TRUE
60
61 #define CHECK_EXPECT2(func) \
62     do { \
63         ok(expect_ ##func, "unexpected call " #func "\n"); \
64         called_ ## func = TRUE; \
65     }while(0)
66
67 #define CHECK_EXPECT(func) \
68     do { \
69         CHECK_EXPECT2(func); \
70         expect_ ## func = FALSE; \
71     }while(0)
72
73 #define CHECK_CALLED(func) \
74     do { \
75         ok(called_ ## func, "expected " #func "\n"); \
76         expect_ ## func = called_ ## func = FALSE; \
77     }while(0)
78
79 DEFINE_EXPECT(global_propget_d);
80 DEFINE_EXPECT(global_propget_i);
81 DEFINE_EXPECT(global_propput_d);
82 DEFINE_EXPECT(global_propput_i);
83 DEFINE_EXPECT(global_propdelete_d);
84 DEFINE_EXPECT(global_success_d);
85 DEFINE_EXPECT(global_success_i);
86 DEFINE_EXPECT(global_notexists_d);
87 DEFINE_EXPECT(global_propargput_d);
88 DEFINE_EXPECT(global_propargput_i);
89 DEFINE_EXPECT(global_testargtypes_i);
90 DEFINE_EXPECT(puredisp_prop_d);
91 DEFINE_EXPECT(puredisp_noprop_d);
92 DEFINE_EXPECT(testobj_delete);
93 DEFINE_EXPECT(testobj_value);
94 DEFINE_EXPECT(testobj_prop_d);
95 DEFINE_EXPECT(testobj_withprop_d);
96 DEFINE_EXPECT(testobj_withprop_i);
97 DEFINE_EXPECT(testobj_noprop_d);
98 DEFINE_EXPECT(testobj_onlydispid_d);
99 DEFINE_EXPECT(testobj_onlydispid_i);
100 DEFINE_EXPECT(GetItemInfo_testVal);
101 DEFINE_EXPECT(ActiveScriptSite_OnScriptError);
102 DEFINE_EXPECT(invoke_func);
103 DEFINE_EXPECT(DeleteMemberByDispID);
104
105 #define DISPID_GLOBAL_TESTPROPGET   0x1000
106 #define DISPID_GLOBAL_TESTPROPPUT   0x1001
107 #define DISPID_GLOBAL_REPORTSUCCESS 0x1002
108 #define DISPID_GLOBAL_TRACE         0x1003
109 #define DISPID_GLOBAL_OK            0x1004
110 #define DISPID_GLOBAL_GETVT         0x1005
111 #define DISPID_GLOBAL_TESTOBJ       0x1006
112 #define DISPID_GLOBAL_GETNULLBSTR   0x1007
113 #define DISPID_GLOBAL_NULL_DISP     0x1008
114 #define DISPID_GLOBAL_TESTTHIS      0x1009
115 #define DISPID_GLOBAL_TESTTHIS2     0x100a
116 #define DISPID_GLOBAL_INVOKEVERSION 0x100b
117 #define DISPID_GLOBAL_CREATEARRAY   0x100c
118 #define DISPID_GLOBAL_PROPGETFUNC   0x100d
119 #define DISPID_GLOBAL_OBJECT_FLAG   0x100e
120 #define DISPID_GLOBAL_ISWIN64       0x100f
121 #define DISPID_GLOBAL_PUREDISP      0x1010
122 #define DISPID_GLOBAL_ISNULLBSTR    0x1011
123 #define DISPID_GLOBAL_PROPARGPUT    0x1012
124 #define DISPID_GLOBAL_SHORTPROP     0x1013
125 #define DISPID_GLOBAL_GETSHORT      0x1014
126 #define DISPID_GLOBAL_TESTARGTYPES  0x1015
127 #define DISPID_GLOBAL_INTPROP       0x1016
128
129 #define DISPID_GLOBAL_TESTPROPDELETE  0x2000
130
131 #define DISPID_TESTOBJ_PROP         0x2000
132 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
133 #define DISPID_TESTOBJ_WITHPROP     0x2002
134
135 #define JS_E_INVALID_CHAR 0x800a03f6
136
137 static const WCHAR testW[] = {'t','e','s','t',0};
138 static const CHAR testA[] = "test";
139 static const WCHAR test_valW[] = {'t','e','s','t','V','a','l',0};
140 static const CHAR test_valA[] = "testVal";
141 static const WCHAR emptyW[] = {0};
142
143 static BOOL strict_dispid_check;
144 static const char *test_name = "(null)";
145 static IDispatch *script_disp;
146 static int invoke_version;
147 static IActiveScriptError *script_error;
148 static const CLSID *engine_clsid = &CLSID_JScript;
149
150 /* Returns true if the user interface is in English. Note that this does not
151  * presume of the formatting of dates, numbers, etc.
152  */
153 static BOOL is_lang_english(void)
154 {
155     static HMODULE hkernel32 = NULL;
156     static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
157     static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
158
159     if (!hkernel32)
160     {
161         hkernel32 = GetModuleHandleA("kernel32.dll");
162         pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
163         pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
164     }
165     if (pGetThreadUILanguage)
166         return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
167     if (pGetUserDefaultUILanguage)
168         return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
169
170     return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
171 }
172
173 static BSTR a2bstr(const char *str)
174 {
175     BSTR ret;
176     int len;
177
178     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
179     ret = SysAllocStringLen(NULL, len-1);
180     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
181
182     return ret;
183 }
184
185 static int strcmp_wa(LPCWSTR strw, const char *stra)
186 {
187     CHAR buf[512];
188     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
189     return lstrcmpA(buf, stra);
190 }
191
192 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
193 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
194 {
195     expect |= invoke_version << 28;
196     ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
197 }
198
199 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
200 {
201     *ppv = NULL;
202
203     if(IsEqualGUID(riid, &IID_IUnknown)
204        || IsEqualGUID(riid, &IID_IDispatch)
205        || IsEqualGUID(riid, &IID_IDispatchEx))
206         *ppv = iface;
207     else
208         return E_NOINTERFACE;
209
210     return S_OK;
211 }
212
213 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
214 {
215     return 2;
216 }
217
218 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
219 {
220     return 1;
221 }
222
223 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
224 {
225     ok(0, "unexpected call\n");
226     return E_NOTIMPL;
227 }
228
229 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
230                                               LCID lcid, ITypeInfo **ppTInfo)
231 {
232     ok(0, "unexpected call\n");
233     return E_NOTIMPL;
234 }
235
236 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
237                                                 LPOLESTR *rgszNames, UINT cNames,
238                                                 LCID lcid, DISPID *rgDispId)
239 {
240     ok(IsEqualGUID(riid, &IID_NULL), "Expected IID_NULL\n");
241     ok(cNames==1, "cNames = %d\n", cNames);
242
243     if(!strcmp_wa(*rgszNames, "prop")) {
244         CHECK_EXPECT(puredisp_prop_d);
245         *rgDispId = DISPID_TESTOBJ_PROP;
246         return S_OK;
247     } else if(!strcmp_wa(*rgszNames, "noprop")) {
248         CHECK_EXPECT(puredisp_noprop_d);
249         return DISP_E_UNKNOWNNAME;
250     }
251
252     ok(0, "unexpected call\n");
253     return E_NOTIMPL;
254 }
255
256 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
257                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
258                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
259 {
260     ok(0, "unexpected call\n");
261     return E_NOTIMPL;
262 }
263
264 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
265 {
266     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
267     return E_NOTIMPL;
268 }
269
270 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
271 {
272     ok(0, "unexpected call\n");
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
277 {
278     ok(0, "unexpected call\n");
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
283 {
284     ok(0, "unexpected call\n");
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
289 {
290     ok(0, "unexpected call\n");
291     return E_NOTIMPL;
292 }
293
294 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
295 {
296     ok(0, "unexpected call\n");
297     return E_NOTIMPL;
298 }
299
300 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
301 {
302     if(!strcmp_wa(bstrName, "prop")) {
303         CHECK_EXPECT(testobj_prop_d);
304         test_grfdex(grfdex, fdexNameCaseSensitive);
305         *pid = DISPID_TESTOBJ_PROP;
306         return S_OK;
307     }
308     if(!strcmp_wa(bstrName, "withProp")) {
309         CHECK_EXPECT(testobj_withprop_d);
310         test_grfdex(grfdex, fdexNameCaseSensitive|fdexNameImplicit);
311         *pid = DISPID_TESTOBJ_WITHPROP;
312         return S_OK;
313     }
314     if(!strcmp_wa(bstrName, "noprop")) {
315         CHECK_EXPECT(testobj_noprop_d);
316         test_grfdex(grfdex, fdexNameCaseSensitive);
317         return DISP_E_UNKNOWNNAME;
318     }
319     if(!strcmp_wa(bstrName, "onlyDispID")) {
320         if(strict_dispid_check)
321             CHECK_EXPECT(testobj_onlydispid_d);
322         test_grfdex(grfdex, fdexNameCaseSensitive);
323         *pid = DISPID_TESTOBJ_ONLYDISPID;
324         return S_OK;
325     }
326
327     ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
328     return E_NOTIMPL;
329 }
330
331 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
332         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
333 {
334     ok(pspCaller != NULL, "pspCaller = NULL\n");
335
336     switch(id) {
337     case DISPID_VALUE:
338         ok(pdp != NULL, "pdp == NULL\n");
339         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
340         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
341         ok(pvarRes != NULL, "pvarRes == NULL\n");
342         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
343         ok(pei != NULL, "pei == NULL\n");
344
345         switch(wFlags) {
346         case INVOKE_PROPERTYGET:
347             CHECK_EXPECT(testobj_value);
348             ok(!pdp->rgvarg, "rgvarg != NULL\n");
349             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
350             break;
351         case INVOKE_FUNC:
352             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
353             break;
354         case INVOKE_FUNC|INVOKE_PROPERTYGET:
355             ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
356             break;
357         default:
358             ok(0, "invalid flag (%x)\n", wFlags);
359         }
360
361         V_VT(pvarRes) = VT_I4;
362         V_I4(pvarRes) = 1;
363         return S_OK;
364     case DISPID_TESTOBJ_ONLYDISPID:
365         if(strict_dispid_check)
366             CHECK_EXPECT(testobj_onlydispid_i);
367         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
368         ok(pdp != NULL, "pdp == NULL\n");
369         ok(!pdp->rgvarg, "rgvarg != NULL\n");
370         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
371         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
372         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
373         ok(pvarRes != NULL, "pvarRes == NULL\n");
374         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
375         ok(pei != NULL, "pei == NULL\n");
376         return DISP_E_MEMBERNOTFOUND;
377      case DISPID_TESTOBJ_WITHPROP:
378         CHECK_EXPECT(testobj_withprop_i);
379
380         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
381         ok(pdp != NULL, "pdp == NULL\n");
382         ok(!pdp->rgvarg, "rgvarg != NULL\n");
383         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
384         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
385         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
386         ok(pvarRes != NULL, "pvarRes == NULL\n");
387         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
388         ok(pei != NULL, "pei == NULL\n");
389
390         V_VT(pvarRes) = VT_I4;
391         V_I4(pvarRes) = 1;
392
393         return S_OK;
394     }
395
396     ok(0, "unexpected call %x\n", id);
397     return DISP_E_MEMBERNOTFOUND;
398 }
399
400 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
401 {
402     CHECK_EXPECT(testobj_delete);
403
404     ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
405     test_grfdex(grfdex, fdexNameCaseSensitive);
406     return S_OK;
407 }
408
409 static IDispatchExVtbl testObjVtbl = {
410     DispatchEx_QueryInterface,
411     DispatchEx_AddRef,
412     DispatchEx_Release,
413     DispatchEx_GetTypeInfoCount,
414     DispatchEx_GetTypeInfo,
415     DispatchEx_GetIDsOfNames,
416     DispatchEx_Invoke,
417     testObj_GetDispID,
418     testObj_InvokeEx,
419     testObj_DeleteMemberByName,
420     DispatchEx_DeleteMemberByDispID,
421     DispatchEx_GetMemberProperties,
422     DispatchEx_GetMemberName,
423     DispatchEx_GetNextDispID,
424     DispatchEx_GetNameSpaceParent
425 };
426
427 static IDispatchEx testObj = { &testObjVtbl };
428
429 static HRESULT WINAPI pureDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
430 {
431     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) {
432         *ppv = iface;
433         return S_OK;
434     }
435
436     *ppv = NULL;
437     return E_NOINTERFACE;
438 }
439
440 static IDispatchExVtbl pureDispVtbl = {
441     pureDisp_QueryInterface,
442     DispatchEx_AddRef,
443     DispatchEx_Release,
444     DispatchEx_GetTypeInfoCount,
445     DispatchEx_GetTypeInfo,
446     DispatchEx_GetIDsOfNames,
447     DispatchEx_Invoke
448 };
449
450 static IDispatchEx pureDisp = { &pureDispVtbl };
451
452 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
453 {
454     if(!strcmp_wa(bstrName, "ok")) {
455         test_grfdex(grfdex, fdexNameCaseSensitive);
456         *pid = DISPID_GLOBAL_OK;
457         return S_OK;
458     }
459     if(!strcmp_wa(bstrName, "trace")) {
460         test_grfdex(grfdex, fdexNameCaseSensitive);
461         *pid = DISPID_GLOBAL_TRACE;
462         return S_OK;
463     }
464     if(!strcmp_wa(bstrName, "reportSuccess")) {
465         CHECK_EXPECT(global_success_d);
466         test_grfdex(grfdex, fdexNameCaseSensitive);
467         *pid = DISPID_GLOBAL_REPORTSUCCESS;
468         return S_OK;
469     }
470     if(!strcmp_wa(bstrName, "testPropGet")) {
471         CHECK_EXPECT(global_propget_d);
472         test_grfdex(grfdex, fdexNameCaseSensitive);
473         *pid = DISPID_GLOBAL_TESTPROPGET;
474         return S_OK;
475     }
476     if(!strcmp_wa(bstrName, "testPropPut")) {
477         CHECK_EXPECT(global_propput_d);
478         test_grfdex(grfdex, fdexNameCaseSensitive);
479         *pid = DISPID_GLOBAL_TESTPROPPUT;
480         return S_OK;
481     }
482     if(!strcmp_wa(bstrName, "testPropDelete")) {
483         CHECK_EXPECT(global_propdelete_d);
484         test_grfdex(grfdex, fdexNameCaseSensitive);
485         *pid = DISPID_GLOBAL_TESTPROPDELETE;
486         return S_OK;
487     }
488     if(!strcmp_wa(bstrName, "getVT")) {
489         test_grfdex(grfdex, fdexNameCaseSensitive);
490         *pid = DISPID_GLOBAL_GETVT;
491         return S_OK;
492     }
493     if(!strcmp_wa(bstrName, "testObj")) {
494         test_grfdex(grfdex, fdexNameCaseSensitive);
495         *pid = DISPID_GLOBAL_TESTOBJ;
496         return S_OK;
497     }
498     if(!strcmp_wa(bstrName, "getNullBSTR")) {
499         *pid = DISPID_GLOBAL_GETNULLBSTR;
500         return S_OK;
501     }
502     if(!strcmp_wa(bstrName, "isNullBSTR")) {
503         *pid = DISPID_GLOBAL_ISNULLBSTR;
504         return S_OK;
505     }
506     if(!strcmp_wa(bstrName, "nullDisp")) {
507         *pid = DISPID_GLOBAL_NULL_DISP;
508         return S_OK;
509     }
510     if(!strcmp_wa(bstrName, "notExists")) {
511         CHECK_EXPECT(global_notexists_d);
512         test_grfdex(grfdex, fdexNameCaseSensitive);
513         return DISP_E_UNKNOWNNAME;
514     }
515
516     if(!strcmp_wa(bstrName, "testThis")) {
517         test_grfdex(grfdex, fdexNameCaseSensitive);
518         *pid = DISPID_GLOBAL_TESTTHIS;
519         return S_OK;
520     }
521
522     if(!strcmp_wa(bstrName, "testThis2")) {
523         test_grfdex(grfdex, fdexNameCaseSensitive);
524         *pid = DISPID_GLOBAL_TESTTHIS2;
525         return S_OK;
526     }
527
528     if(!strcmp_wa(bstrName, "invokeVersion")) {
529         test_grfdex(grfdex, fdexNameCaseSensitive);
530         *pid = DISPID_GLOBAL_INVOKEVERSION;
531         return S_OK;
532     }
533     if(!strcmp_wa(bstrName, "createArray")) {
534         test_grfdex(grfdex, fdexNameCaseSensitive);
535         *pid = DISPID_GLOBAL_CREATEARRAY;
536         return S_OK;
537     }
538     if(!strcmp_wa(bstrName, "propGetFunc")) {
539         test_grfdex(grfdex, fdexNameCaseSensitive);
540         *pid = DISPID_GLOBAL_PROPGETFUNC;
541         return S_OK;
542     }
543     if(!strcmp_wa(bstrName, "objectFlag")) {
544         test_grfdex(grfdex, fdexNameCaseSensitive);
545         *pid = DISPID_GLOBAL_OBJECT_FLAG;
546         return S_OK;
547     }
548
549     if(!strcmp_wa(bstrName, "isWin64")) {
550         test_grfdex(grfdex, fdexNameCaseSensitive);
551         *pid = DISPID_GLOBAL_ISWIN64;
552         return S_OK;
553     }
554
555     if(!strcmp_wa(bstrName, "pureDisp")) {
556         test_grfdex(grfdex, fdexNameCaseSensitive);
557         *pid = DISPID_GLOBAL_PUREDISP;
558         return S_OK;
559     }
560
561     if(!strcmp_wa(bstrName, "propArgPutG")) {
562         CHECK_EXPECT(global_propargput_d);
563         test_grfdex(grfdex, fdexNameCaseSensitive);
564         *pid = DISPID_GLOBAL_PROPARGPUT;
565         return S_OK;
566     }
567
568     if(!strcmp_wa(bstrName, "propArgPutO")) {
569         CHECK_EXPECT(global_propargput_d);
570         test_grfdex(grfdex, fdexNameEnsure|fdexNameCaseSensitive);
571         *pid = DISPID_GLOBAL_PROPARGPUT;
572         return S_OK;
573     }
574
575     if(!strcmp_wa(bstrName, "shortProp")) {
576         *pid = DISPID_GLOBAL_SHORTPROP;
577         return S_OK;
578     }
579
580     if(!strcmp_wa(bstrName, "getShort")) {
581         *pid = DISPID_GLOBAL_GETSHORT;
582         return S_OK;
583     }
584
585     if(!strcmp_wa(bstrName, "testArgTypes")) {
586         *pid = DISPID_GLOBAL_TESTARGTYPES;
587         return S_OK;
588     }
589
590     if(!strcmp_wa(bstrName, "intProp")) {
591         *pid = DISPID_GLOBAL_INTPROP;
592         return S_OK;
593     }
594
595     if(strict_dispid_check && strcmp_wa(bstrName, "t"))
596         ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
597     return DISP_E_UNKNOWNNAME;
598 }
599
600 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
601         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
602 {
603     ok(pspCaller != NULL, "pspCaller = NULL\n");
604
605     switch(id) {
606     case DISPID_GLOBAL_OK:
607         ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
608         ok(pdp != NULL, "pdp == NULL\n");
609         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
610         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
611         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
612         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
613         if(wFlags & INVOKE_PROPERTYGET)
614             ok(pvarRes != NULL, "pvarRes == NULL\n");
615         else
616             ok(!pvarRes, "pvarRes != NULL\n");
617         ok(pei != NULL, "pei == NULL\n");
618
619         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
620         ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
621         ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
622
623         return S_OK;
624
625      case DISPID_GLOBAL_TRACE:
626         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
627         ok(pdp != NULL, "pdp == NULL\n");
628         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
629         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
630         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
631         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
632         ok(!pvarRes, "pvarRes != NULL\n");
633         ok(pei != NULL, "pei == NULL\n");
634
635         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
636         if(V_VT(pdp->rgvarg) == VT_BSTR)
637             trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
638
639         return S_OK;
640
641     case DISPID_GLOBAL_REPORTSUCCESS:
642         CHECK_EXPECT(global_success_i);
643
644         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
645         ok(pdp != NULL, "pdp == NULL\n");
646         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
647         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
648         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
649         ok(!pvarRes, "pvarRes != NULL\n");
650         ok(pei != NULL, "pei == NULL\n");
651
652         return S_OK;
653
654      case DISPID_GLOBAL_TESTPROPGET:
655         CHECK_EXPECT(global_propget_i);
656
657         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
658         ok(pdp != NULL, "pdp == NULL\n");
659         ok(!pdp->rgvarg, "rgvarg != NULL\n");
660         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
661         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
662         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
663         ok(pvarRes != NULL, "pvarRes == NULL\n");
664         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
665         ok(pei != NULL, "pei == NULL\n");
666
667         V_VT(pvarRes) = VT_I4;
668         V_I4(pvarRes) = 1;
669
670         return S_OK;
671
672     case DISPID_GLOBAL_TESTPROPPUT:
673         CHECK_EXPECT(global_propput_i);
674
675         ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
676         ok(pdp != NULL, "pdp == NULL\n");
677         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
678         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
679         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
680         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
681         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
682         ok(!pvarRes, "pvarRes != NULL\n");
683
684         ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
685         ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
686         return S_OK;
687
688      case DISPID_GLOBAL_GETVT:
689         ok(pdp != NULL, "pdp == NULL\n");
690         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
691         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
692         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
693         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
694         ok(pvarRes != NULL, "pvarRes == NULL\n");
695         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
696         ok(pei != NULL, "pei == NULL\n");
697
698         V_VT(pvarRes) = VT_BSTR;
699         switch(V_VT(pdp->rgvarg)) {
700         case VT_EMPTY:
701             V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
702             break;
703         case VT_NULL:
704             V_BSTR(pvarRes) = a2bstr("VT_NULL");
705             break;
706         case VT_I4:
707             V_BSTR(pvarRes) = a2bstr("VT_I4");
708             break;
709         case VT_R8:
710             V_BSTR(pvarRes) = a2bstr("VT_R8");
711             break;
712         case VT_BSTR:
713             V_BSTR(pvarRes) = a2bstr("VT_BSTR");
714             break;
715         case VT_DISPATCH:
716             V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
717             break;
718         case VT_BOOL:
719             V_BSTR(pvarRes) = a2bstr("VT_BOOL");
720             break;
721         case VT_ARRAY|VT_VARIANT:
722             V_BSTR(pvarRes) = a2bstr("VT_ARRAY|VT_VARIANT");
723             break;
724         default:
725             ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
726             return E_FAIL;
727         }
728
729         return S_OK;
730
731     case DISPID_GLOBAL_TESTOBJ:
732         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
733         ok(pdp != NULL, "pdp == NULL\n");
734         ok(!pdp->rgvarg, "rgvarg != NULL\n");
735         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
736         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
737         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
738         ok(pvarRes != NULL, "pvarRes == NULL\n");
739         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
740         ok(pei != NULL, "pei == NULL\n");
741
742         V_VT(pvarRes) = VT_DISPATCH;
743         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
744         return S_OK;
745
746     case DISPID_GLOBAL_PUREDISP:
747         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
748         ok(pdp != NULL, "pdp == NULL\n");
749         ok(!pdp->rgvarg, "rgvarg != NULL\n");
750         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
751         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
752         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
753         ok(pvarRes != NULL, "pvarRes == NULL\n");
754         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
755         ok(pei != NULL, "pei == NULL\n");
756
757         V_VT(pvarRes) = VT_DISPATCH;
758         V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
759         return S_OK;
760
761     case DISPID_GLOBAL_GETNULLBSTR:
762         if(pvarRes) {
763             V_VT(pvarRes) = VT_BSTR;
764             V_BSTR(pvarRes) = NULL;
765         }
766         return S_OK;
767
768     case DISPID_GLOBAL_ISNULLBSTR:
769         ok(pdp != NULL, "pdp == NULL\n");
770         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
771         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
772         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
773         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
774         ok(pvarRes != NULL, "pvarRes == NULL\n");
775         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
776         ok(pei != NULL, "pei == NULL\n");
777         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
778
779         V_VT(pvarRes) = VT_BOOL;
780         V_BOOL(pvarRes) = V_BSTR(pdp->rgvarg) ? VARIANT_FALSE : VARIANT_TRUE;
781         return S_OK;
782
783     case DISPID_GLOBAL_ISWIN64:
784         if(pvarRes) {
785             V_VT(pvarRes) = VT_BOOL;
786             V_BOOL(pvarRes) = sizeof(void*) == 8 ? VARIANT_TRUE : VARIANT_FALSE;
787         }
788         return S_OK;
789
790     case DISPID_GLOBAL_NULL_DISP:
791         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
792         ok(pdp != NULL, "pdp == NULL\n");
793         ok(!pdp->rgvarg, "rgvarg != NULL\n");
794         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
795         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
796         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
797         ok(pvarRes != NULL, "pvarRes == NULL\n");
798         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
799         ok(pei != NULL, "pei == NULL\n");
800
801         V_VT(pvarRes) = VT_DISPATCH;
802         V_DISPATCH(pvarRes) = NULL;
803         return S_OK;
804
805     case DISPID_GLOBAL_TESTTHIS:
806         ok(pdp != NULL, "pdp == NULL\n");
807         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
808         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
809         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
810         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
811         ok(pvarRes == NULL, "pvarRes != NULL\n");
812         ok(pei != NULL, "pei == NULL\n");
813
814         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
815         ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
816
817         return S_OK;
818
819     case DISPID_GLOBAL_TESTTHIS2:
820         ok(pdp != NULL, "pdp == NULL\n");
821         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
822         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
823         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
824         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
825         ok(pvarRes == NULL, "pvarRes != NULL\n");
826         ok(pei != NULL, "pei == NULL\n");
827
828         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
829         ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
830         ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
831
832         return S_OK;
833
834      case DISPID_GLOBAL_INVOKEVERSION:
835         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
836         ok(pdp != NULL, "pdp == NULL\n");
837         ok(!pdp->rgvarg, "rgvarg != NULL\n");
838         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
839         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
840         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
841         ok(pvarRes != NULL, "pvarRes == NULL\n");
842         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
843         ok(pei != NULL, "pei == NULL\n");
844
845         V_VT(pvarRes) = VT_I4;
846         V_I4(pvarRes) = invoke_version;
847
848         return S_OK;
849
850     case DISPID_GLOBAL_CREATEARRAY: {
851         SAFEARRAYBOUND bound[2];
852         VARIANT *data;
853         int i,j;
854
855         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
856         ok(pdp != NULL, "pdp == NULL\n");
857         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
858         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
859         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
860         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
861         ok(pvarRes != NULL, "pvarRes == NULL\n");
862         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
863         ok(pei != NULL, "pei == NULL\n");
864
865         bound[0].lLbound = 0;
866         bound[0].cElements = 5;
867         bound[1].lLbound = 2;
868         bound[1].cElements = 2;
869
870         V_VT(pvarRes) = VT_ARRAY|VT_VARIANT;
871         V_ARRAY(pvarRes) = SafeArrayCreate(VT_VARIANT, 2, bound);
872
873         SafeArrayAccessData(V_ARRAY(pvarRes), (void**)&data);
874         for(i=0; i<5; i++) {
875             for(j=2; j<4; j++) {
876                 V_VT(data) = VT_I4;
877                 V_I4(data) = i*10+j;
878                 data++;
879             }
880         }
881         SafeArrayUnaccessData(V_ARRAY(pvarRes));
882
883         return S_OK;
884     }
885
886     case DISPID_GLOBAL_PROPGETFUNC:
887         switch(wFlags) {
888         case INVOKE_FUNC:
889             CHECK_EXPECT(invoke_func);
890             break;
891         case INVOKE_FUNC|INVOKE_PROPERTYGET:
892             ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
893             ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
894             break;
895         default:
896             ok(0, "invalid flag (%x)\n", wFlags);
897         }
898
899         ok(pdp != NULL, "pdp == NULL\n");
900         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
901         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
902         ok(pei != NULL, "pei == NULL\n");
903
904         if(pvarRes) {
905             ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
906             V_VT(pvarRes) = VT_I4;
907             V_I4(pvarRes) = pdp->cArgs;
908         }
909
910         return S_OK;
911
912     case DISPID_GLOBAL_PROPARGPUT:
913         CHECK_EXPECT(global_propargput_i);
914         ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
915         ok(pdp != NULL, "pdp == NULL\n");
916         ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
917         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
918         ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
919         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
920         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
921         ok(!pvarRes, "pvarRes != NULL\n");
922         ok(pei != NULL, "pei == NULL\n");
923
924         ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
925         ok(V_I4(pdp->rgvarg) == 2, "V_I4(pdp->rgvarg) = %d\n", V_I4(pdp->rgvarg));
926
927         ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
928         ok(V_I4(pdp->rgvarg+1) == 1, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
929
930         ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
931         ok(V_I4(pdp->rgvarg+2) == 0, "V_I4(pdp->rgvarg+2) = %d\n", V_I4(pdp->rgvarg+2));
932         return S_OK;
933
934     case DISPID_GLOBAL_OBJECT_FLAG: {
935         IDispatchEx *dispex;
936         BSTR str;
937         HRESULT hres;
938
939         hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
940         ok(hres == S_OK, "hres = %x\n", hres);
941
942         str = a2bstr("Object");
943         hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
944         SysFreeString(str);
945         ok(hres == S_OK, "hres = %x\n", hres);
946
947         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
948         ok(hres == S_OK, "hres = %x\n", hres);
949
950         V_VT(pvarRes) = VT_EMPTY;
951         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
952         ok(hres == S_OK, "hres = %x\n", hres);
953         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
954         VariantClear(pvarRes);
955
956         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
957         ok(hres == S_OK, "hres = %x\n", hres);
958
959         V_VT(pvarRes) = VT_EMPTY;
960         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
961         ok(hres == S_OK, "hres = %x\n", hres);
962         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
963         VariantClear(pvarRes);
964
965         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
966         ok(hres == S_OK, "hres = %x\n", hres);
967
968         V_VT(pvarRes) = VT_EMPTY;
969         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
970         ok(hres == E_INVALIDARG, "hres = %x\n", hres);
971
972         V_VT(pvarRes) = VT_EMPTY;
973         hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
974         ok(hres == S_OK, "hres = %x\n", hres);
975         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
976         IDispatchEx_Release(dispex);
977         return S_OK;
978     }
979     case DISPID_GLOBAL_SHORTPROP:
980     case DISPID_GLOBAL_GETSHORT:
981         V_VT(pvarRes) = VT_I2;
982         V_I2(pvarRes) = 10;
983         return S_OK;
984
985     case DISPID_GLOBAL_INTPROP:
986         V_VT(pvarRes) = VT_INT;
987         V_INT(pvarRes) = 22;
988         return S_OK;
989
990     case DISPID_GLOBAL_TESTARGTYPES: {
991         VARIANT args[2];
992         DISPPARAMS dp = {args, NULL, sizeof(args)/sizeof(*args), 0};
993         HRESULT hres;
994
995         CHECK_EXPECT(global_testargtypes_i);
996         ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
997         ok(pdp != NULL, "pdp == NULL\n");
998         ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
999         ok(pdp->cArgs == 5, "cArgs = %d\n", pdp->cArgs);
1000         ok(!pvarRes, "pvarRes != NULL\n");
1001
1002         ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1003         ok(V_I4(pdp->rgvarg+1) == 10, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
1004
1005         ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1006         ok(V_I4(pdp->rgvarg+2) == 10, "V_I4(pdp->rgvarg+2) = %d\n", V_I4(pdp->rgvarg+2));
1007
1008         ok(V_VT(pdp->rgvarg+3) == VT_I4, "V_VT(pdp->rgvarg+3) = %d\n", V_VT(pdp->rgvarg+3));
1009         ok(V_I4(pdp->rgvarg+3) == 22, "V_I4(pdp->rgvarg+3) = %d\n", V_I4(pdp->rgvarg+3));
1010
1011         ok(V_VT(pdp->rgvarg+4) == VT_I4, "V_VT(pdp->rgvarg+4) = %d\n", V_VT(pdp->rgvarg+4));
1012         ok(V_I4(pdp->rgvarg+4) == 22, "V_I4(pdp->rgvarg+4) = %d\n", V_I4(pdp->rgvarg+4));
1013
1014         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1015
1016         V_VT(args) = VT_I2;
1017         V_I2(args) = 2;
1018         V_VT(args+1) = VT_INT;
1019         V_INT(args+1) = 22;
1020         hres = IDispatch_Invoke(V_DISPATCH(pdp->rgvarg), DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
1021         ok(hres == S_OK, "Invoke failed: %08x\n", hres);
1022
1023         return S_OK;
1024     }
1025     }
1026
1027     ok(0, "unexpected call %x\n", id);
1028     return DISP_E_MEMBERNOTFOUND;
1029 }
1030
1031 static HRESULT WINAPI Global_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
1032 {
1033     CHECK_EXPECT(DeleteMemberByDispID);
1034     ok(id == DISPID_GLOBAL_TESTPROPDELETE, "id = %d\n", id);
1035     return S_OK;
1036 }
1037
1038 static IDispatchExVtbl GlobalVtbl = {
1039     DispatchEx_QueryInterface,
1040     DispatchEx_AddRef,
1041     DispatchEx_Release,
1042     DispatchEx_GetTypeInfoCount,
1043     DispatchEx_GetTypeInfo,
1044     DispatchEx_GetIDsOfNames,
1045     DispatchEx_Invoke,
1046     Global_GetDispID,
1047     Global_InvokeEx,
1048     DispatchEx_DeleteMemberByName,
1049     Global_DeleteMemberByDispID,
1050     DispatchEx_GetMemberProperties,
1051     DispatchEx_GetMemberName,
1052     DispatchEx_GetNextDispID,
1053     DispatchEx_GetNameSpaceParent
1054 };
1055
1056 static IDispatchEx Global = { &GlobalVtbl };
1057
1058 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1059 {
1060     *ppv = NULL;
1061
1062     if(IsEqualGUID(&IID_IUnknown, riid))
1063         *ppv = iface;
1064     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1065         *ppv = iface;
1066     else
1067         return E_NOINTERFACE;
1068
1069     IUnknown_AddRef((IUnknown*)*ppv);
1070     return S_OK;
1071 }
1072
1073 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1074 {
1075     return 2;
1076 }
1077
1078 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1079 {
1080     return 1;
1081 }
1082
1083 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1084 {
1085     *plcid = GetUserDefaultLCID();
1086     return S_OK;
1087 }
1088
1089 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1090         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1091 {
1092     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1093     ok(!ppti, "ppti != NULL\n");
1094
1095     if(!strcmp_wa(pstrName, test_valA))
1096         CHECK_EXPECT(GetItemInfo_testVal);
1097     else if(strcmp_wa(pstrName, testA))
1098         ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1099
1100     *ppiunkItem = (IUnknown*)&Global;
1101     return S_OK;
1102 }
1103
1104 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1105 {
1106     return E_NOTIMPL;
1107 }
1108
1109 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1110         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1111 {
1112     return E_NOTIMPL;
1113 }
1114
1115 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1116 {
1117     return E_NOTIMPL;
1118 }
1119
1120 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1121 {
1122     return E_NOTIMPL;
1123 }
1124
1125 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1126 {
1127     return E_NOTIMPL;
1128 }
1129
1130 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1131 {
1132     return E_NOTIMPL;
1133 }
1134
1135 #undef ACTSCPSITE_THIS
1136
1137 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1138     ActiveScriptSite_QueryInterface,
1139     ActiveScriptSite_AddRef,
1140     ActiveScriptSite_Release,
1141     ActiveScriptSite_GetLCID,
1142     ActiveScriptSite_GetItemInfo,
1143     ActiveScriptSite_GetDocVersionString,
1144     ActiveScriptSite_OnScriptTerminate,
1145     ActiveScriptSite_OnStateChange,
1146     ActiveScriptSite_OnScriptError,
1147     ActiveScriptSite_OnEnterScript,
1148     ActiveScriptSite_OnLeaveScript
1149 };
1150
1151 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1152
1153 static HRESULT WINAPI ActiveScriptSite_OnScriptError_CheckError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1154 {
1155     ok(pscripterror != NULL, "ActiveScriptSite_OnScriptError -- expected pscripterror to be set, got NULL\n");
1156
1157     script_error = pscripterror;
1158     IActiveScriptError_AddRef(script_error);
1159
1160     CHECK_EXPECT(ActiveScriptSite_OnScriptError);
1161
1162     return S_OK;
1163 }
1164
1165 static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl = {
1166     ActiveScriptSite_QueryInterface,
1167     ActiveScriptSite_AddRef,
1168     ActiveScriptSite_Release,
1169     ActiveScriptSite_GetLCID,
1170     ActiveScriptSite_GetItemInfo,
1171     ActiveScriptSite_GetDocVersionString,
1172     ActiveScriptSite_OnScriptTerminate,
1173     ActiveScriptSite_OnStateChange,
1174     ActiveScriptSite_OnScriptError_CheckError,
1175     ActiveScriptSite_OnEnterScript,
1176     ActiveScriptSite_OnLeaveScript
1177 };
1178
1179 static IActiveScriptSite ActiveScriptSite_CheckError = { &ActiveScriptSite_CheckErrorVtbl };
1180
1181 static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
1182 {
1183     IActiveScriptProperty *script_prop;
1184     HRESULT hres;
1185
1186     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
1187             (void**)&script_prop);
1188     ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
1189
1190     hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
1191     IActiveScriptProperty_Release(script_prop);
1192
1193     return hres;
1194 }
1195
1196 static IActiveScript *create_script(void)
1197 {
1198     IActiveScript *script;
1199     VARIANT v;
1200     HRESULT hres;
1201
1202     hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1203             &IID_IActiveScript, (void**)&script);
1204     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1205
1206     V_VT(&v) = VT_I4;
1207     V_I4(&v) = invoke_version;
1208     hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
1209     ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
1210     if(invoke_version && FAILED(hres)) {
1211         IActiveScript_Release(script);
1212         return NULL;
1213     }
1214
1215     return script;
1216 }
1217
1218 static HRESULT parse_script(DWORD flags, BSTR script_str)
1219 {
1220     IActiveScriptParse *parser;
1221     IActiveScript *engine;
1222     HRESULT hres;
1223
1224     engine = create_script();
1225     if(!engine)
1226         return S_OK;
1227
1228     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1229     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1230     if (FAILED(hres))
1231     {
1232         IActiveScript_Release(engine);
1233         return hres;
1234     }
1235
1236     hres = IActiveScriptParse_InitNew(parser);
1237     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1238
1239     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1240     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1241
1242     hres = IActiveScript_AddNamedItem(engine, testW,
1243             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1244     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1245
1246     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1247     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1248
1249     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1250     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1251     ok(script_disp != NULL, "script_disp == NULL\n");
1252     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1253
1254     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1255
1256     IDispatch_Release(script_disp);
1257     IActiveScript_Release(engine);
1258     IActiveScriptParse_Release(parser);
1259
1260     return hres;
1261 }
1262
1263 static HRESULT invoke_procedure(const char *argsa, const char *sourcea, DISPPARAMS *dp)
1264 {
1265     IActiveScriptParseProcedure2 *parse_proc;
1266     IActiveScriptParse *parser;
1267     IActiveScript *engine;
1268     IDispatchEx *dispex;
1269     EXCEPINFO ei = {0};
1270     BSTR source, args;
1271     IDispatch *disp;
1272     VARIANT res;
1273     HRESULT hres;
1274
1275     engine = create_script();
1276     if(!engine)
1277         return S_OK;
1278
1279     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1280     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1281
1282     hres = IActiveScriptParse_InitNew(parser);
1283     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1284
1285     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1286     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1287
1288     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1289     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1290
1291     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1292     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1293
1294     source = a2bstr(sourcea);
1295     args = argsa ? a2bstr(argsa) : NULL;
1296     hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, source, args, emptyW, NULL, NULL, NULL, 0, 0,
1297         SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1298     ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1299     SysFreeString(source);
1300     SysFreeString(args);
1301
1302     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1303     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1304     IDispatch_Release(disp);
1305
1306     V_VT(&res) = VT_EMPTY;
1307     hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_METHOD, dp, &res, &ei, NULL);
1308     ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1309     ok(V_VT(&res) == VT_BOOL && V_BOOL(&res), "InvokeEx returned vt %d (%x)\n", V_VT(&res), V_I4(&res));
1310     IDispatchEx_Release(dispex);
1311
1312     IActiveScriptParseProcedure2_Release(parse_proc);
1313     IActiveScript_Release(engine);
1314     IActiveScriptParse_Release(parser);
1315
1316     return hres;
1317 }
1318
1319 static HRESULT parse_htmlscript(BSTR script_str)
1320 {
1321     IActiveScriptParse *parser;
1322     IActiveScript *engine;
1323     HRESULT hres;
1324     BSTR tmp = a2bstr("</SCRIPT>");
1325
1326     engine = create_script();
1327     if(!engine)
1328         return E_FAIL;
1329
1330     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1331     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1332     if (FAILED(hres))
1333     {
1334         IActiveScript_Release(engine);
1335         return E_FAIL;
1336     }
1337
1338     hres = IActiveScriptParse_InitNew(parser);
1339     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1340
1341     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1342     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1343
1344     hres = IActiveScript_AddNamedItem(engine, testW,
1345             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1346     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1347
1348     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1349     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1350
1351     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL);
1352
1353     IActiveScript_Release(engine);
1354     IActiveScriptParse_Release(parser);
1355     SysFreeString(tmp);
1356
1357     return hres;
1358 }
1359
1360 static void test_IActiveScriptError(IActiveScriptError *error, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
1361 {
1362     HRESULT hres;
1363     DWORD source_context;
1364     ULONG line_number;
1365     LONG char_position;
1366     BSTR linetext;
1367     EXCEPINFO excep;
1368
1369     /* IActiveScriptError_GetSourcePosition */
1370
1371     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, NULL);
1372     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1373
1374     source_context = 0xdeadbeef;
1375     hres = IActiveScriptError_GetSourcePosition(error, &source_context, NULL, NULL);
1376     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1377     ok(source_context == 0, "IActiveScriptError_GetSourcePosition -- source_context: expected 0, got 0x%08x\n", source_context);
1378
1379     line_number = 0xdeadbeef;
1380     hres = IActiveScriptError_GetSourcePosition(error, NULL, &line_number, NULL);
1381     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1382     ok(line_number == line, "IActiveScriptError_GetSourcePosition -- line_number: expected %d, got %d\n", line, line_number);
1383
1384     char_position = 0xdeadbeef;
1385     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, &char_position);
1386     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1387     ok(char_position == pos, "IActiveScriptError_GetSourcePosition -- char_position: expected %d, got %d\n", pos, char_position);
1388
1389     /* IActiveScriptError_GetSourceLineText */
1390
1391     hres = IActiveScriptError_GetSourceLineText(error, NULL);
1392     ok(hres == E_POINTER, "IActiveScriptError_GetSourceLineText -- hres: expected E_POINTER, got 0x%08x\n", hres);
1393
1394     linetext = NULL;
1395     hres = IActiveScriptError_GetSourceLineText(error, &linetext);
1396     if (line_text) {
1397         ok(hres == S_OK, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1398         ok(linetext != NULL && !lstrcmpW(linetext, line_text),
1399            "IActiveScriptError_GetSourceLineText -- expected %s, got %s\n", wine_dbgstr_w(line_text), wine_dbgstr_w(linetext));
1400     } else {
1401         ok(hres == E_FAIL, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1402         ok(linetext == NULL,
1403            "IActiveScriptError_GetSourceLineText -- expected NULL, got %s\n", wine_dbgstr_w(linetext));
1404     }
1405     SysFreeString(linetext);
1406
1407     /* IActiveScriptError_GetExceptionInfo */
1408
1409     hres = IActiveScriptError_GetExceptionInfo(error, NULL);
1410     ok(hres == E_POINTER, "IActiveScriptError_GetExceptionInfo -- hres: expected E_POINTER, got 0x%08x\n", hres);
1411
1412     excep.wCode = 0xdead;
1413     excep.wReserved = 0xdead;
1414     excep.bstrSource = (BSTR)0xdeadbeef;
1415     excep.bstrDescription = (BSTR)0xdeadbeef;
1416     excep.bstrHelpFile = (BSTR)0xdeadbeef;
1417     excep.dwHelpContext = 0xdeadbeef;
1418     excep.pvReserved = (void *)0xdeadbeef;
1419     excep.pfnDeferredFillIn = (void *)0xdeadbeef;
1420     excep.scode = 0xdeadbeef;
1421
1422     hres = IActiveScriptError_GetExceptionInfo(error, &excep);
1423     ok(hres == S_OK, "IActiveScriptError_GetExceptionInfo -- hres: expected S_OK, got 0x%08x\n", hres);
1424
1425     ok(excep.wCode == 0, "IActiveScriptError_GetExceptionInfo -- excep.wCode: expected 0, got 0x%08x\n", excep.wCode);
1426     ok(excep.wReserved == 0, "IActiveScriptError_GetExceptionInfo -- excep.wReserved: expected 0, got %d\n", excep.wReserved);
1427     if (!is_lang_english())
1428         skip("Non-english UI (test with hardcoded strings)\n");
1429     else {
1430         ok(excep.bstrSource != NULL && !lstrcmpW(excep.bstrSource, script_source),
1431            "IActiveScriptError_GetExceptionInfo -- excep.bstrSource is not valid: expected %s, got %s\n",
1432            wine_dbgstr_w(script_source), wine_dbgstr_w(excep.bstrSource));
1433         ok(excep.bstrDescription != NULL && !lstrcmpW(excep.bstrDescription, description),
1434            "IActiveScriptError_GetExceptionInfo -- excep.bstrDescription is not valid: got %s\n", wine_dbgstr_w(excep.bstrDescription));
1435     }
1436     ok(excep.bstrHelpFile == NULL,
1437        "IActiveScriptError_GetExceptionInfo -- excep.bstrHelpFile: expected NULL, got %s\n", wine_dbgstr_w(excep.bstrHelpFile));
1438     ok(excep.dwHelpContext == 0, "IActiveScriptError_GetExceptionInfo -- excep.dwHelpContext: expected 0, got %d\n", excep.dwHelpContext);
1439     ok(excep.pvReserved == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pvReserved: expected NULL, got %p\n", excep.pvReserved);
1440     ok(excep.pfnDeferredFillIn == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pfnDeferredFillIn: expected NULL, got %p\n", excep.pfnDeferredFillIn);
1441     ok(excep.scode == errorcode, "IActiveScriptError_GetExceptionInfo -- excep.scode: expected 0x%08x, got 0x%08x\n", errorcode, excep.scode);
1442
1443     SysFreeString(excep.bstrSource);
1444     SysFreeString(excep.bstrDescription);
1445     SysFreeString(excep.bstrHelpFile);
1446 }
1447
1448 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)
1449 {
1450     IActiveScriptParse *parser;
1451     IActiveScript *engine;
1452     HRESULT hres;
1453
1454     engine = create_script();
1455     if(!engine)
1456         return;
1457
1458     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1459     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1460     if (FAILED(hres))
1461     {
1462         IActiveScript_Release(engine);
1463         return;
1464     }
1465
1466     hres = IActiveScriptParse_InitNew(parser);
1467     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1468
1469     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite_CheckError);
1470     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1471
1472     hres = IActiveScript_AddNamedItem(engine, testW,
1473             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1474     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1475
1476     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1477     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1478
1479     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1480     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1481     ok(script_disp != NULL, "script_disp == NULL\n");
1482     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1483
1484     script_error = NULL;
1485     SET_EXPECT(ActiveScriptSite_OnScriptError);
1486     hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1487     todo_wine ok(hres == 0x80020101, "parse_script_with_error should have returned 0x80020101, got: 0x%08x\n", hres);
1488     todo_wine CHECK_CALLED(ActiveScriptSite_OnScriptError);
1489
1490     if (script_error)
1491     {
1492         test_IActiveScriptError(script_error, errorcode, line, pos, script_source, description, line_text);
1493
1494         IActiveScriptError_Release(script_error);
1495     }
1496
1497     IDispatch_Release(script_disp);
1498     IActiveScript_Release(engine);
1499     IActiveScriptParse_Release(parser);
1500 }
1501
1502 static void parse_script_af(DWORD flags, const char *src)
1503 {
1504     BSTR tmp;
1505     HRESULT hres;
1506
1507     tmp = a2bstr(src);
1508     hres = parse_script(flags, tmp);
1509     SysFreeString(tmp);
1510     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1511 }
1512
1513 static void parse_script_a(const char *src)
1514 {
1515     parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1516 }
1517
1518 static void parse_script_with_error_a(const char *src, SCODE errorcode, ULONG line, LONG pos, LPCSTR source, LPCSTR desc, LPCSTR linetext)
1519 {
1520     BSTR tmp, script_source, description, line_text;
1521
1522     tmp = a2bstr(src);
1523     script_source = a2bstr(source);
1524     description = a2bstr(desc);
1525     line_text = a2bstr(linetext);
1526
1527     parse_script_with_error(SCRIPTITEM_GLOBALMEMBERS, tmp, errorcode, line, pos, script_source, description, line_text);
1528
1529     SysFreeString(line_text);
1530     SysFreeString(description);
1531     SysFreeString(script_source);
1532     SysFreeString(tmp);
1533 }
1534
1535 static HRESULT parse_htmlscript_a(const char *src)
1536 {
1537     HRESULT hres;
1538     BSTR tmp = a2bstr(src);
1539     hres = parse_htmlscript(tmp);
1540     SysFreeString(tmp);
1541
1542     return hres;
1543 }
1544
1545 static BSTR get_script_from_file(const char *filename)
1546 {
1547     DWORD size, len;
1548     HANDLE file, map;
1549     const char *file_map;
1550     BSTR ret;
1551
1552     file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1553     if(file == INVALID_HANDLE_VALUE) {
1554         trace("Could not open file: %u\n", GetLastError());
1555         return NULL;
1556     }
1557
1558     size = GetFileSize(file, NULL);
1559
1560     map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1561     CloseHandle(file);
1562     if(map == INVALID_HANDLE_VALUE) {
1563         trace("Could not create file mapping: %u\n", GetLastError());
1564         return NULL;
1565     }
1566
1567     file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1568     CloseHandle(map);
1569     if(!file_map) {
1570         trace("MapViewOfFile failed: %u\n", GetLastError());
1571         return NULL;
1572     }
1573
1574     len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1575     ret = SysAllocStringLen(NULL, len);
1576     MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1577
1578     UnmapViewOfFile(file_map);
1579
1580     return ret;
1581 }
1582
1583 static void run_from_file(const char *filename)
1584 {
1585     BSTR script_str;
1586     HRESULT hres;
1587
1588     script_str = get_script_from_file(filename);
1589     if(!script_str)
1590         return;
1591
1592     strict_dispid_check = FALSE;
1593     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1594     SysFreeString(script_str);
1595     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1596 }
1597
1598 static void run_from_res(const char *name)
1599 {
1600     const char *data;
1601     DWORD size, len;
1602     BSTR str;
1603     HRSRC src;
1604     HRESULT hres;
1605
1606     strict_dispid_check = FALSE;
1607     test_name = name;
1608
1609     src = FindResourceA(NULL, name, (LPCSTR)40);
1610     ok(src != NULL, "Could not find resource %s\n", name);
1611
1612     size = SizeofResource(NULL, src);
1613     data = LoadResource(NULL, src);
1614
1615     len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1616     str = SysAllocStringLen(NULL, len);
1617     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1618
1619     SET_EXPECT(global_success_d);
1620     SET_EXPECT(global_success_i);
1621     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1622     CHECK_CALLED(global_success_d);
1623     CHECK_CALLED(global_success_i);
1624
1625     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1626     SysFreeString(str);
1627 }
1628
1629 static void test_isvisible(BOOL global_members)
1630 {
1631     IActiveScriptParse *parser;
1632     IActiveScript *engine;
1633     HRESULT hres;
1634
1635     static const WCHAR script_textW[] =
1636         {'v','a','r',' ','v',' ','=',' ','t','e','s','t','V','a','l',';',0};
1637
1638     engine = create_script();
1639     if(!engine)
1640         return;
1641
1642     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1643     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1644     if (FAILED(hres))
1645     {
1646         IActiveScript_Release(engine);
1647         return;
1648     }
1649
1650     hres = IActiveScriptParse_InitNew(parser);
1651     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1652
1653     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1654     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1655
1656     if(global_members)
1657         SET_EXPECT(GetItemInfo_testVal);
1658     hres = IActiveScript_AddNamedItem(engine, test_valW,
1659             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
1660             (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
1661     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1662     if(global_members)
1663         CHECK_CALLED(GetItemInfo_testVal);
1664
1665     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1666     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1667
1668     if(!global_members)
1669         SET_EXPECT(GetItemInfo_testVal);
1670     hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1671     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1672     if(!global_members)
1673         CHECK_CALLED(GetItemInfo_testVal);
1674
1675     hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1676     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1677
1678     IActiveScript_Release(engine);
1679     IActiveScriptParse_Release(parser);
1680 }
1681
1682 static BOOL run_tests(void)
1683 {
1684     HRESULT hres;
1685
1686     if(invoke_version) {
1687         IActiveScript *script;
1688
1689         script = create_script();
1690         if(!script) {
1691             win_skip("Could not create script\n");
1692             return FALSE;
1693         }
1694         IActiveScript_Release(script);
1695     }
1696
1697     strict_dispid_check = TRUE;
1698
1699     parse_script_a("");
1700     parse_script_a("/* empty */ ;");
1701
1702     SET_EXPECT(global_propget_d);
1703     SET_EXPECT(global_propget_i);
1704     parse_script_a("testPropGet;");
1705     CHECK_CALLED(global_propget_d);
1706     CHECK_CALLED(global_propget_i);
1707
1708     SET_EXPECT(global_propput_d);
1709     SET_EXPECT(global_propput_i);
1710     parse_script_a("testPropPut = 1;");
1711     CHECK_CALLED(global_propput_d);
1712     CHECK_CALLED(global_propput_i);
1713
1714     SET_EXPECT(global_success_d);
1715     SET_EXPECT(global_success_i);
1716     parse_script_a("reportSuccess();");
1717     CHECK_CALLED(global_success_d);
1718     CHECK_CALLED(global_success_i);
1719
1720     SET_EXPECT(testobj_delete);
1721     parse_script_a("delete testObj.deleteTest;");
1722     CHECK_CALLED(testobj_delete);
1723
1724     SET_EXPECT(global_propdelete_d);
1725     SET_EXPECT(DeleteMemberByDispID);
1726     parse_script_a("delete testPropDelete;");
1727     CHECK_CALLED(global_propdelete_d);
1728     CHECK_CALLED(DeleteMemberByDispID);
1729
1730     parse_script_a("(function reportSuccess() {})()");
1731
1732     parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
1733
1734     parse_script_a("function reportSuccess() {}; reportSuccess();");
1735
1736     SET_EXPECT(global_propget_d);
1737     parse_script_a("var testPropGet");
1738     CHECK_CALLED(global_propget_d);
1739
1740     SET_EXPECT(global_propget_d);
1741     parse_script_a("eval('var testPropGet;');");
1742     CHECK_CALLED(global_propget_d);
1743
1744     SET_EXPECT(global_notexists_d);
1745     parse_script_a("var notExists; notExists = 1;");
1746     CHECK_CALLED(global_notexists_d);
1747
1748     parse_script_a("function f() { var testPropGet; }");
1749     parse_script_a("(function () { var testPropGet; })();");
1750     parse_script_a("(function () { eval('var testPropGet;'); })();");
1751
1752     SET_EXPECT(invoke_func);
1753     parse_script_a("ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
1754     CHECK_CALLED(invoke_func);
1755     parse_script_a("ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
1756     parse_script_a("ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
1757     SET_EXPECT(invoke_func);
1758     parse_script_a("ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
1759     CHECK_CALLED(invoke_func);
1760     parse_script_a("ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
1761     SET_EXPECT(invoke_func);
1762     parse_script_a("propGetFunc(1);");
1763     CHECK_CALLED(invoke_func);
1764
1765     parse_script_a("objectFlag(1).toString();");
1766
1767     parse_script_a("(function() { var tmp = (function () { return testObj; })()(1);})();");
1768     parse_script_a("(function() { var tmp = (function () { return testObj; })()();})();");
1769
1770     parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
1771
1772     SET_EXPECT(testobj_prop_d);
1773     parse_script_a("ok(('prop' in testObj) === true, 'prop is not in testObj');");
1774     CHECK_CALLED(testobj_prop_d);
1775
1776     SET_EXPECT(testobj_noprop_d);
1777     parse_script_a("ok(('noprop' in testObj) === false, 'noprop is in testObj');");
1778     CHECK_CALLED(testobj_noprop_d);
1779
1780     SET_EXPECT(testobj_prop_d);
1781     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'prop') === true, 'hasOwnProperty(\\\"prop\\\") returned false');");
1782     CHECK_CALLED(testobj_prop_d);
1783
1784     SET_EXPECT(testobj_noprop_d);
1785     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1786     CHECK_CALLED(testobj_noprop_d);
1787
1788     SET_EXPECT(puredisp_prop_d);
1789     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'prop') === true, 'hasOwnProperty(\\\"noprop\\\") returned false');");
1790     CHECK_CALLED(puredisp_prop_d);
1791
1792     SET_EXPECT(puredisp_noprop_d);
1793     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1794     CHECK_CALLED(puredisp_noprop_d);
1795
1796     SET_EXPECT(testobj_value);
1797     parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
1798     CHECK_CALLED(testobj_value);
1799
1800     SET_EXPECT(testobj_value);
1801     parse_script_a("ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
1802     CHECK_CALLED(testobj_value);
1803
1804     SET_EXPECT(global_propget_d);
1805     SET_EXPECT(global_propget_i);
1806     parse_script_a("this.testPropGet;");
1807     CHECK_CALLED(global_propget_d);
1808     CHECK_CALLED(global_propget_i);
1809
1810     SET_EXPECT(global_propget_d);
1811     SET_EXPECT(global_propget_i);
1812     parse_script_a("(function () { this.testPropGet; })();");
1813     CHECK_CALLED(global_propget_d);
1814     CHECK_CALLED(global_propget_i);
1815
1816     parse_script_a("testThis(this);");
1817     parse_script_a("(function () { testThis(this); })();");
1818     parse_script_a("function x() { testThis(this); }; x();");
1819     parse_script_a("var t = {func: function () { ok(this === t, 'this !== t'); }}; with(t) { func(); }");
1820     parse_script_a("function x() { testThis(this); }; with({y: 1}) { x(); }");
1821     parse_script_a("(function () { function x() { testThis(this);} x(); })();");
1822
1823     SET_EXPECT(testobj_onlydispid_d);
1824     SET_EXPECT(testobj_onlydispid_i);
1825     parse_script_a("ok(typeof(testObj.onlyDispID) === 'unknown', 'unexpected typeof(testObj.onlyDispID)');");
1826     CHECK_CALLED(testobj_onlydispid_d);
1827     CHECK_CALLED(testobj_onlydispid_i);
1828
1829     SET_EXPECT(global_propargput_d);
1830     SET_EXPECT(global_propargput_i);
1831     parse_script_a("var t=0; propArgPutG(t++, t++) = t++;");
1832     CHECK_CALLED(global_propargput_d);
1833     CHECK_CALLED(global_propargput_i);
1834
1835     SET_EXPECT(global_propargput_d);
1836     SET_EXPECT(global_propargput_i);
1837     parse_script_a("var t=0; test.propArgPutO(t++, t++) = t++;");
1838     CHECK_CALLED(global_propargput_d);
1839     CHECK_CALLED(global_propargput_i);
1840
1841     SET_EXPECT(global_testargtypes_i);
1842     parse_script_a("testArgTypes(intProp(), intProp, getShort(), shortProp, function(i,s) {"
1843                    "    ok(getVT(i) === 'VT_I4', 'getVT(i) = ' + getVT(i));"
1844                    "    ok(getVT(s) === 'VT_I4', 'getVT(s) = ' + getVT(s));"
1845                    "});");
1846     CHECK_CALLED(global_testargtypes_i);
1847
1848     SET_EXPECT(testobj_withprop_d);
1849     SET_EXPECT(testobj_withprop_i);
1850     parse_script_a("var t = (function () { with(testObj) { return withProp; }})(); ok(t === 1, 't = ' + t);");
1851     CHECK_CALLED(testobj_withprop_d);
1852     CHECK_CALLED(testobj_withprop_i);
1853
1854     run_from_res("lang.js");
1855     run_from_res("api.js");
1856     run_from_res("regexp.js");
1857     run_from_res("cc.js");
1858
1859     test_isvisible(FALSE);
1860     test_isvisible(TRUE);
1861
1862     parse_script_af(0, "test.testThis2(this);");
1863     parse_script_af(0, "(function () { test.testThis2(this); })();");
1864
1865     hres = parse_htmlscript_a("<!--");
1866     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1867     hres = parse_htmlscript_a("-->");
1868     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1869     hres = parse_htmlscript_a("<!--\nvar a=1;\n-->\n");
1870     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1871     hres = parse_htmlscript_a("<!--\n<!-- ignore this\n-->\n");
1872     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1873     hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n");
1874     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1875     hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n");
1876     ok(hres != S_OK, "ParseScriptText have not failed\n");
1877
1878     parse_script_with_error_a(
1879         "?",
1880         0x800a03ea, 0, 0,
1881         "Microsoft JScript compilation error",
1882         "Syntax error",
1883         "?");
1884
1885     parse_script_with_error_a(
1886         "var a=1;\nif(a\n-->0) a=5;\n",
1887         0x800a03ee, 2, 0,
1888         "Microsoft JScript compilation error",
1889         "Expected ')'",
1890         "-->0) a=5;");
1891
1892     parse_script_with_error_a(
1893         "new 3;",
1894         0x800a01bd, 0, 0,
1895         "Microsoft JScript runtime error",
1896         "Object doesn't support this action",
1897         NULL);
1898
1899     parse_script_with_error_a(
1900         "new null;",
1901         0x800a138f, 0, 0,
1902         "Microsoft JScript runtime error",
1903         "Object expected",
1904         NULL);
1905
1906     parse_script_with_error_a(
1907         "var a;\nnew null;",
1908         0x800a138f, 1, 0,
1909         "Microsoft JScript runtime error",
1910         "Object expected",
1911         NULL);
1912
1913     parse_script_with_error_a(
1914         "var a; new null;",
1915         0x800a138f, 0, 7,
1916         "Microsoft JScript runtime error",
1917         "Object expected",
1918         NULL);
1919
1920     return TRUE;
1921 }
1922
1923 static void test_parse_proc(void)
1924 {
1925     VARIANT args[2];
1926     DISPPARAMS dp = {args};
1927
1928     dp.cArgs = 0;
1929     invoke_procedure(NULL, "return true;", &dp);
1930
1931     dp.cArgs = 1;
1932     V_VT(args) = VT_EMPTY;
1933     invoke_procedure(NULL, "return arguments.length == 1;", &dp);
1934
1935     V_VT(args) = VT_BOOL;
1936     V_BOOL(args) = VARIANT_TRUE;
1937     invoke_procedure(" x ", "return x;", &dp);
1938
1939     dp.cArgs = 2;
1940     V_VT(args) = VT_I4;
1941     V_I4(args) = 2;
1942     V_VT(args+1) = VT_I4;
1943     V_I4(args+1) = 1;
1944     invoke_procedure(" _x1 , y_2", "return _x1 === 1 && y_2 === 2;", &dp);
1945 }
1946
1947 static void run_encoded_tests(void)
1948 {
1949     BSTR src;
1950     HRESULT hres;
1951
1952     engine_clsid = &CLSID_JScriptEncode;
1953
1954     SET_EXPECT(global_success_d);
1955     SET_EXPECT(global_success_i);
1956     /*             |reportSuccess();                           | */
1957     parse_script_a("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1958     CHECK_CALLED(global_success_d);
1959     CHECK_CALLED(global_success_i);
1960
1961     SET_EXPECT(global_success_d);
1962     SET_EXPECT(global_success_i);
1963     parse_script_a("reportSuccess();");
1964     CHECK_CALLED(global_success_d);
1965     CHECK_CALLED(global_success_i);
1966
1967     SET_EXPECT(global_success_d);
1968     SET_EXPECT(global_success_i);
1969     /*                   |Success                         | */
1970     parse_script_a("report#@~^BwAAAA==j!m^\x7f/k2QIAAA==^#~@();");
1971     CHECK_CALLED(global_success_d);
1972     CHECK_CALLED(global_success_i);
1973
1974     SET_EXPECT(global_success_d);
1975     SET_EXPECT(global_success_i);
1976     /*             |\r\n\treportSuccess();\r\n                        | */
1977     parse_script_a("#@~^GQAAAA==@#@&d.\x7fwKDYUE1^+k/c#p@#@&OAYAAA==^#~@");
1978     CHECK_CALLED(global_success_d);
1979     CHECK_CALLED(global_success_i);
1980
1981     /*                   v                                   */
1982     src = a2bstr("#@~^EAA*AA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1983     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1984     SysFreeString(src);
1985     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1986
1987     /*                      vv                                 */
1988     src = a2bstr("#@~^EAAAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1989     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1990     SysFreeString(src);
1991     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1992
1993     /*                      v                                */
1994     src = a2bstr("#@~^EAAAAA^=.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1995     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1996     SysFreeString(src);
1997     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1998
1999     /*                                     v                 */
2000     src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1ekd`*iAQYAAA==^#~@");
2001     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
2002     SysFreeString(src);
2003     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
2004
2005     /*                                                    vv  */
2006     src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^~#@");
2007     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
2008     SysFreeString(src);
2009     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
2010 }
2011
2012 static BOOL check_jscript(void)
2013 {
2014     IActiveScriptProperty *script_prop;
2015     BSTR str;
2016     HRESULT hres;
2017
2018     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2019             &IID_IActiveScriptProperty, (void**)&script_prop);
2020     if(FAILED(hres))
2021         return FALSE;
2022     IActiveScriptProperty_Release(script_prop);
2023
2024     str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
2025     hres = parse_script(0, str);
2026     SysFreeString(str);
2027
2028     return hres == S_OK;
2029 }
2030
2031 START_TEST(run)
2032 {
2033     int argc;
2034     char **argv;
2035
2036     argc = winetest_get_mainargs(&argv);
2037
2038     CoInitialize(NULL);
2039
2040     if(!check_jscript()) {
2041         win_skip("Broken engine, probably too old\n");
2042     }else if(argc > 2) {
2043         invoke_version = 2;
2044         run_from_file(argv[2]);
2045     }else {
2046         trace("invoke version 0\n");
2047         invoke_version = 0;
2048         run_tests();
2049
2050         trace("invoke version 2\n");
2051         invoke_version = 2;
2052         if(run_tests()) {
2053             trace("JSctipt.Encode tests...\n");
2054             run_encoded_tests();
2055             trace("ParseProcedureText tests...\n");
2056             test_parse_proc();
2057         }
2058     }
2059
2060     CoUninitialize();
2061 }