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