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