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