2 * Copyright 2011 Jacek Caban for CodeWeavers
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.
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.
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
28 #include "vbsregexp55.h"
30 #include "wine/test.h"
34 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
35 #define IActiveScriptParse_Release IActiveScriptParse64_Release
36 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
37 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
38 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
39 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
43 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
44 #define IActiveScriptParse_Release IActiveScriptParse32_Release
45 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
46 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
47 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
48 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
52 extern const CLSID CLSID_VBScript
;
53 extern const CLSID CLSID_VBScriptRegExp
;
55 #define DEFINE_EXPECT(func) \
56 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
58 #define SET_EXPECT(func) \
59 expect_ ## func = TRUE
61 #define CHECK_EXPECT2(func) \
63 ok(expect_ ##func, "unexpected call " #func "\n"); \
64 called_ ## func = TRUE; \
67 #define CHECK_EXPECT(func) \
69 CHECK_EXPECT2(func); \
70 expect_ ## func = FALSE; \
73 #define CHECK_CALLED(func) \
75 ok(called_ ## func, "expected " #func "\n"); \
76 expect_ ## func = called_ ## func = FALSE; \
79 #define CLEAR_CALLED(func) \
80 expect_ ## func = called_ ## func = FALSE
82 DEFINE_EXPECT(global_success_d
);
83 DEFINE_EXPECT(global_success_i
);
84 DEFINE_EXPECT(global_vbvar_d
);
85 DEFINE_EXPECT(global_vbvar_i
);
86 DEFINE_EXPECT(global_letobj_i
);
87 DEFINE_EXPECT(global_setobj_i
);
88 DEFINE_EXPECT(testobj_propget_d
);
89 DEFINE_EXPECT(testobj_propget_i
);
90 DEFINE_EXPECT(testobj_propput_d
);
91 DEFINE_EXPECT(testobj_propput_i
);
92 DEFINE_EXPECT(testobj_value_i
);
93 DEFINE_EXPECT(global_propargput_d
);
94 DEFINE_EXPECT(global_propargput_i
);
95 DEFINE_EXPECT(global_propargput1_d
);
96 DEFINE_EXPECT(global_propargput1_i
);
97 DEFINE_EXPECT(global_testoptionalarg_i
);
98 DEFINE_EXPECT(collectionobj_newenum_i
);
100 DEFINE_EXPECT(GetWindow
);
101 DEFINE_EXPECT(GetUIBehavior
);
102 DEFINE_EXPECT(EnableModeless
);
103 DEFINE_EXPECT(OnScriptError
);
105 #define DISPID_GLOBAL_REPORTSUCCESS 1000
106 #define DISPID_GLOBAL_TRACE 1001
107 #define DISPID_GLOBAL_OK 1002
108 #define DISPID_GLOBAL_GETVT 1003
109 #define DISPID_GLOBAL_ISENGLANG 1004
110 #define DISPID_GLOBAL_VBVAR 1005
111 #define DISPID_GLOBAL_TESTOBJ 1006
112 #define DISPID_GLOBAL_ISNULLDISP 1007
113 #define DISPID_GLOBAL_TESTDISP 1008
114 #define DISPID_GLOBAL_REFOBJ 1009
115 #define DISPID_GLOBAL_COUNTER 1010
116 #define DISPID_GLOBAL_PROPARGPUT 1011
117 #define DISPID_GLOBAL_PROPARGPUT1 1012
118 #define DISPID_GLOBAL_COLLOBJ 1013
119 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
120 #define DISPID_GLOBAL_TESTARRAY 1015
121 #define DISPID_GLOBAL_THROWINT 1016
122 #define DISPID_GLOBAL_TESTOPTIONALARG 1017
123 #define DISPID_GLOBAL_LETOBJ 1018
124 #define DISPID_GLOBAL_SETOBJ 1019
125 #define DISPID_GLOBAL_TODO_WINE_OK 1020
126 #define DISPID_GLOBAL_WEEKSTARTDAY 1021
128 #define DISPID_TESTOBJ_PROPGET 2000
129 #define DISPID_TESTOBJ_PROPPUT 2001
131 #define DISPID_COLLOBJ_RESET 3000
133 #define FACILITY_VBS 0xa
134 #define MAKE_VBSERROR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_VBS, code)
136 static const WCHAR testW
[] = {'t','e','s','t',0};
137 static const WCHAR emptyW
[] = {0};
139 static BOOL strict_dispid_check
, is_english
, allow_ui
;
140 static int first_day_of_week
;
141 static const char *test_name
= "(null)";
142 static int test_counter
;
143 static SCRIPTUICHANDLING uic_handling
= SCRIPTUICHANDLING_NOUIERROR
;
144 static IDispatchEx testObj
;
145 static HRESULT onerror_hres
= E_NOTIMPL
;
147 static BSTR
a2bstr(const char *str
)
152 len
= MultiByteToWideChar(CP_ACP
, 0, str
, -1, NULL
, 0);
153 ret
= SysAllocStringLen(NULL
, len
-1);
154 MultiByteToWideChar(CP_ACP
, 0, str
, -1, ret
, len
);
159 static int strcmp_wa(LPCWSTR strw
, const char *stra
)
162 WideCharToMultiByte(CP_ACP
, 0, strw
, -1, buf
, sizeof(buf
), 0, 0);
163 return lstrcmpA(buf
, stra
);
166 static const char *vt2a(VARIANT
*v
)
168 if(V_VT(v
) == (VT_BYREF
|VT_VARIANT
)) {
170 sprintf(buf
, "%s*", vt2a(V_BYREF(v
)));
194 return "VT_DISPATCH";
197 case VT_ARRAY
|VT_VARIANT
:
198 return "VT_ARRAY|VT_VARIANT";
199 case VT_ARRAY
|VT_BYREF
|VT_VARIANT
:
200 return "VT_ARRAY|VT_BYREF|VT_VARIANT";
204 ok(0, "unknown vt %d\n", V_VT(v
));
209 /* Sets is_english to true if the user interface is in English. Note that this
210 * does not presume the formatting of dates, numbers, etc.
211 * Sets first_day_of_week to 1 if Sunday, 2 if Monday, and so on.
213 static void detect_locale(void)
215 HMODULE kernel32
= GetModuleHandleA("kernel32.dll");
216 LANGID (WINAPI
*pGetThreadUILanguage
)(void) = (void*)GetProcAddress(kernel32
, "GetThreadUILanguage");
218 is_english
= ((!pGetThreadUILanguage
|| PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH
) &&
219 PRIMARYLANGID(GetUserDefaultUILanguage()) == LANG_ENGLISH
&&
220 PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH
);
222 GetLocaleInfoA(pGetThreadUILanguage
? pGetThreadUILanguage() : GetUserDefaultUILanguage(),
223 LOCALE_IFIRSTDAYOFWEEK
| LOCALE_RETURN_NUMBER
,
224 (void*)&first_day_of_week
, sizeof(first_day_of_week
));
225 first_day_of_week
= 1 + (first_day_of_week
+ 1) % 7;
228 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
230 ok(0, "unexpected call\n");
231 return E_NOINTERFACE
;
234 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
239 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
244 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
, REFGUID guidService
,
245 REFIID riid
, void **ppv
)
247 ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService
));
248 return E_NOINTERFACE
;
251 static const IServiceProviderVtbl ServiceProviderVtbl
= {
252 ServiceProvider_QueryInterface
,
253 ServiceProvider_AddRef
,
254 ServiceProvider_Release
,
255 ServiceProvider_QueryService
258 static IServiceProvider caller_sp
= { &ServiceProviderVtbl
};
260 static void test_disp(IDispatch
*disp
)
262 DISPID id
, public_prop_id
, public_prop2_id
, public_func_id
, public_sub_id
, defvalget_id
, gs_getter_id
;
263 DISPID named_args
[5] = {DISPID_PROPERTYPUT
};
265 DISPPARAMS dp
= {args
, named_args
};
271 hres
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
272 ok(hres
== S_OK
, "Could not get IDispatchEx iface: %08x\n", hres
);
274 str
= a2bstr("publicProp");
275 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &public_prop_id
);
277 ok(hres
== S_OK
, "GetDispID(publicProp) failed: %08x\n", hres
);
279 str
= a2bstr("PUBLICPROP");
280 hres
= IDispatchEx_GetDispID(dispex
, str
, 0, &id
);
282 ok(hres
== S_OK
, "GetDispID(PUBLICPROP) failed: %08x\n", hres
);
283 ok(public_prop_id
== id
, "id = %d\n", public_prop_id
);
285 str
= a2bstr("publicPROP2");
286 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &public_prop2_id
);
288 ok(hres
== S_OK
, "GetDispID(publicProp2) failed: %08x\n", hres
);
290 str
= a2bstr("defValGet");
291 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &defvalget_id
);
293 ok(hres
== S_OK
, "GetDispID(defValGet) failed: %08x\n", hres
);
294 ok(defvalget_id
== DISPID_VALUE
, "id = %d\n", defvalget_id
);
296 str
= a2bstr("privateProp");
297 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &id
);
299 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
300 ok(id
== -1, "id = %d\n", id
);
302 str
= a2bstr("class_initialize");
303 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &id
);
305 ok(hres
== S_OK
, "GetDispID(publicProp2) failed: %08x\n", hres
);
307 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
308 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
309 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
311 V_VT(args
) = VT_BOOL
;
312 V_BOOL(args
) = VARIANT_TRUE
;
313 dp
.cArgs
= dp
.cNamedArgs
= 1;
315 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUT
, &dp
, &v
, &ei
, NULL
);
316 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
317 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
319 dp
.cArgs
= dp
.cNamedArgs
= 0;
320 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
321 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
322 ok(V_VT(&v
) == VT_BOOL
, "V_VT(v) = %d\n", V_VT(&v
));
323 ok(V_BOOL(&v
), "V_BOOL(v) = %x\n", V_BOOL(&v
));
325 dp
.cArgs
= dp
.cNamedArgs
= 0;
326 hres
= IDispatchEx_Invoke(dispex
, public_prop_id
, &IID_NULL
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
327 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
328 ok(V_VT(&v
) == VT_BOOL
, "V_VT(v) = %d\n", V_VT(&v
));
329 ok(V_BOOL(&v
), "V_BOOL(v) = %x\n", V_BOOL(&v
));
331 dp
.cArgs
= dp
.cNamedArgs
= 0;
332 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
333 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
334 ok(V_VT(&v
) == VT_BOOL
, "V_VT(v) = %d\n", V_VT(&v
));
335 ok(V_BOOL(&v
), "V_BOOL(v) = %x\n", V_BOOL(&v
));
338 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
339 ok(hres
== DISP_E_MEMBERNOTFOUND
, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres
);
340 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
342 SET_EXPECT(testobj_value_i
);
343 V_VT(args
) = VT_DISPATCH
;
344 V_DISPATCH(args
) = (IDispatch
*)&testObj
;
345 dp
.cArgs
= dp
.cNamedArgs
= 1;
346 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
347 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
348 CHECK_CALLED(testobj_value_i
);
350 dp
.cArgs
= dp
.cNamedArgs
= 0;
351 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
352 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
353 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
354 ok(V_I2(&v
) == 0, "V_I2(v) = %d\n", V_I2(&v
));
356 V_VT(args
) = VT_DISPATCH
;
357 V_DISPATCH(args
) = (IDispatch
*)&testObj
;
358 dp
.cArgs
= dp
.cNamedArgs
= 1;
359 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUT
|DISPATCH_PROPERTYPUTREF
, &dp
, NULL
, &ei
, NULL
);
360 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
362 V_VT(args
) = VT_DISPATCH
;
363 V_DISPATCH(args
) = (IDispatch
*)&testObj
;
364 dp
.cArgs
= dp
.cNamedArgs
= 1;
365 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUTREF
, &dp
, NULL
, &ei
, NULL
);
366 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
368 dp
.cArgs
= dp
.cNamedArgs
= 0;
369 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
370 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
371 ok(V_VT(&v
) == VT_DISPATCH
, "V_VT(v) = %d\n", V_VT(&v
));
372 ok(V_DISPATCH(&v
) == (IDispatch
*)&testObj
, "V_DISPATCH(v) != testObj\n");
374 V_VT(args
) = VT_BOOL
;
375 V_BOOL(args
) = VARIANT_TRUE
;
376 dp
.cArgs
= dp
.cNamedArgs
= 1;
377 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUT
|DISPATCH_PROPERTYPUTREF
, &dp
, NULL
, &ei
, NULL
);
378 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
380 dp
.cArgs
= dp
.cNamedArgs
= 0;
381 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
382 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
383 ok(V_VT(&v
) == VT_BOOL
, "V_VT(v) = %d\n", V_VT(&v
));
384 ok(V_BOOL(&v
) == VARIANT_TRUE
, "V_BOOL(v) = %x\n", V_BOOL(&v
));
386 V_VT(args
) = VT_BOOL
;
387 V_BOOL(args
) = VARIANT_FALSE
;
388 dp
.cArgs
= dp
.cNamedArgs
= 1;
389 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUTREF
, &dp
, NULL
, &ei
, NULL
);
390 ok(hres
== DISP_E_EXCEPTION
, "InvokeEx failed: %08x, expected DISP_E_EXCEPTION\n", hres
);
392 V_VT(args
) = VT_BOOL
;
393 V_BOOL(args
) = VARIANT_FALSE
;
397 hres
= IDispatchEx_InvokeEx(dispex
, public_prop_id
, 0, DISPATCH_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
398 ok(hres
== DISP_E_PARAMNOTOPTIONAL
, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres
);
400 str
= a2bstr("publicFunction");
401 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &public_func_id
);
403 ok(hres
== S_OK
, "GetDispID(publicFunction) failed: %08x\n", hres
);
404 ok(public_func_id
!= -1, "public_func_id = -1\n");
406 str
= a2bstr("publicSub");
407 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &public_sub_id
);
409 ok(hres
== S_OK
, "GetDispID(publicSub) failed: %08x\n", hres
);
410 ok(public_sub_id
!= -1, "public_func_id = -1\n");
412 dp
.cArgs
= dp
.cNamedArgs
= 0;
413 hres
= IDispatchEx_InvokeEx(dispex
, public_func_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
414 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
415 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
416 ok(V_I2(&v
) == 4, "V_I2(v) = %d\n", V_I2(&v
));
418 dp
.cArgs
= dp
.cNamedArgs
= 0;
419 hres
= IDispatchEx_InvokeEx(dispex
, public_func_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
420 ok(hres
== DISP_E_MEMBERNOTFOUND
, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres
);
421 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
423 dp
.cArgs
= dp
.cNamedArgs
= 0;
424 hres
= IDispatchEx_InvokeEx(dispex
, public_func_id
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
425 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
426 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
427 ok(V_I2(&v
) == 4, "V_I2(v) = %d\n", V_I2(&v
));
429 dp
.cArgs
= dp
.cNamedArgs
= 0;
430 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
431 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
432 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
434 dp
.cArgs
= dp
.cNamedArgs
= 0;
435 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
436 ok(hres
== DISP_E_MEMBERNOTFOUND
, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres
);
437 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
439 dp
.cArgs
= dp
.cNamedArgs
= 0;
440 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
441 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
442 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
444 V_VT(args
) = VT_BOOL
;
445 V_BOOL(args
) = VARIANT_TRUE
;
446 dp
.cArgs
= dp
.cNamedArgs
= 1;
447 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
448 ok(FAILED(hres
), "InvokeEx succeeded: %08x\n", hres
);
450 dp
.cArgs
= dp
.cNamedArgs
= 0;
451 hres
= IDispatchEx_InvokeEx(dispex
, public_func_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
452 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
453 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
454 ok(V_I2(&v
) == 4, "V_I2(v) = %d\n", V_I2(&v
));
456 dp
.cArgs
= dp
.cNamedArgs
= 0;
457 hres
= IDispatchEx_InvokeEx(dispex
, public_func_id
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
458 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
459 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
460 ok(V_I2(&v
) == 4, "V_I2(v) = %d\n", V_I2(&v
));
462 dp
.cArgs
= dp
.cNamedArgs
= 0;
463 hres
= IDispatchEx_Invoke(dispex
, public_func_id
, &IID_NULL
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
464 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
465 ok(V_VT(&v
) == VT_I2
, "V_VT(v) = %d\n", V_VT(&v
));
466 ok(V_I2(&v
) == 4, "V_I2(v) = %d\n", V_I2(&v
));
468 dp
.cArgs
= dp
.cNamedArgs
= 0;
469 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
470 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
471 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
473 dp
.cArgs
= dp
.cNamedArgs
= 0;
474 hres
= IDispatchEx_InvokeEx(dispex
, public_sub_id
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
475 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
476 ok(V_VT(&v
) == VT_EMPTY
, "V_VT(v) = %d\n", V_VT(&v
));
478 str
= a2bstr("privateSub");
479 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &id
);
481 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
482 ok(id
== -1, "id = %d\n", id
);
484 str
= a2bstr("dynprop");
485 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
|fdexNameEnsure
, &id
);
486 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
487 ok(id
== -1, "id = %d\n", id
);
488 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameEnsure
, &id
);
489 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
490 ok(id
== -1, "id = %d\n", id
);
493 str
= a2bstr("publicProp");
494 hres
= IDispatchEx_GetDispID(dispex
, str
, 0x80000000|fdexNameCaseInsensitive
, &public_prop_id
);
496 ok(hres
== S_OK
, "GetDispID(publicProp) failed: %08x\n", hres
);
499 str
= a2bstr("publicProp");
500 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseSensitive
, &id
);
502 ok(hres
== S_OK
, "GetDispID(publicProp) failed: %08x\n", hres
);
503 ok(id
== public_prop_id
, "id = %d, expected %d\n", id
, public_prop_id
);
506 str
= a2bstr("publicprop");
507 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseSensitive
, &id
);
509 ok(hres
== S_OK
, "GetDispID(publicProp) failed: %08x\n", hres
);
510 ok(id
== public_prop_id
, "id = %d, expected %d\n", id
, public_prop_id
);
512 str
= a2bstr("gsGetProp");
513 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseInsensitive
, &gs_getter_id
);
515 ok(hres
== S_OK
, "GetDispID(publicFunction) failed: %08x\n", hres
);
516 ok(gs_getter_id
!= -1, "gs_getter_id = -1\n");
518 V_VT(args
) = VT_BOOL
;
519 V_BOOL(args
) = VARIANT_TRUE
;
523 hres
= IDispatchEx_InvokeEx(dispex
, gs_getter_id
, 0, DISPATCH_PROPERTYGET
, &dp
, &v
, &ei
, NULL
);
524 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
525 ok(V_VT(&v
) == VT_BOOL
&& V_BOOL(&v
), "V_VT(v) = %d\n", V_VT(&v
));
527 hres
= IDispatchEx_InvokeEx(dispex
, gs_getter_id
, 0, DISPATCH_PROPERTYGET
, &dp
, NULL
, &ei
, NULL
);
528 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
530 V_VT(args
) = VT_BOOL
;
531 V_BOOL(args
) = VARIANT_FALSE
;
534 hres
= IDispatchEx_InvokeEx(dispex
, gs_getter_id
, 0, DISPATCH_PROPERTYGET
|DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
535 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
536 ok(V_VT(&v
) == VT_BOOL
&& !V_BOOL(&v
), "V_VT(v) = %d\n", V_VT(&v
));
538 V_VT(args
) = VT_BOOL
;
539 V_BOOL(args
) = VARIANT_TRUE
;
542 hres
= IDispatchEx_InvokeEx(dispex
, gs_getter_id
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, NULL
);
543 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
544 ok(V_VT(&v
) == VT_BOOL
&& V_BOOL(&v
), "V_VT(v) = %d\n", V_VT(&v
));
546 IDispatchEx_Release(dispex
);
549 static void test_safearray(SAFEARRAY
*safearray
, unsigned indims
)
551 int i
, exdims
= indims
;
555 ok(safearray
->cDims
== exdims
, "safearray->cDims = %d, expected %d\n", safearray
->cDims
, exdims
);
557 ok(safearray
->fFeatures
== (FADF_VARIANT
|FADF_HAVEVARTYPE
|FADF_FIXEDSIZE
|FADF_STATIC
),
558 "safearray->fFeatures = %x\n", safearray
->fFeatures
);
559 ok(safearray
->cbElements
== sizeof(VARIANT
), "safearray->cbElements = %x\n", safearray
->cbElements
);
560 ok(!safearray
->cLocks
, "safearray->cLocks = %x\n", safearray
->cLocks
);
562 for(i
=0; i
< safearray
->cDims
; i
++) {
563 ok(safearray
->rgsabound
[i
].cElements
== (indims
? i
+4 : 1), "safearray->rgsabound[%d].cElements = %d\n", i
,
564 safearray
->rgsabound
[i
].cElements
);
565 ok(!safearray
->rgsabound
[i
].lLbound
, "safearray->rgsabound[%d].lLbound = %d\n", i
, safearray
->rgsabound
[i
].lLbound
);
569 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
570 static void _test_grfdex(unsigned line
, DWORD grfdex
, DWORD expect
)
572 ok_(__FILE__
,line
)(grfdex
== expect
, "grfdex = %x, expected %x\n", grfdex
, expect
);
575 static IDispatchEx enumDisp
;
577 static HRESULT WINAPI
EnumVARIANT_QueryInterface(IEnumVARIANT
*iface
, REFIID riid
, void **ppv
)
579 if(IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IEnumVARIANT
)) {
584 if(IsEqualGUID(riid
, &IID_IDispatch
)) {
589 ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid
));
590 return E_NOINTERFACE
;
593 static ULONG WINAPI
EnumVARIANT_AddRef(IEnumVARIANT
*iface
)
598 static ULONG WINAPI
EnumVARIANT_Release(IEnumVARIANT
*iface
)
603 static unsigned next_cnt
;
605 static HRESULT WINAPI
EnumVARIANT_Next(IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*rgVar
, ULONG
*pCeltFetched
)
607 if(strict_dispid_check
)
610 ok(celt
== 1, "celt = %d\n", celt
);
611 ok(V_VT(rgVar
) == VT_EMPTY
, "V_VT(rgVar) = %d\n", V_VT(rgVar
));
612 ok(!pCeltFetched
, "pCeltFetched = %p\n", pCeltFetched
);
616 V_I2(rgVar
) = next_cnt
;
623 static HRESULT WINAPI
EnumVARIANT_Skip(IEnumVARIANT
*iface
, ULONG celt
)
625 ok(0, "unexpected call\n");
629 static HRESULT WINAPI
EnumVARIANT_Reset(IEnumVARIANT
*iface
)
631 ok(0, "unexpected call\n");
635 static HRESULT WINAPI
EnumVARIANT_Clone(IEnumVARIANT
*iface
, IEnumVARIANT
**ppEnum
)
637 ok(0, "unexpected call\n");
641 static const IEnumVARIANTVtbl EnumVARIANTVtbl
= {
642 EnumVARIANT_QueryInterface
,
651 static IEnumVARIANT enumObj
= { &EnumVARIANTVtbl
};
653 static HRESULT WINAPI
DispatchEx_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
657 if(IsEqualGUID(riid
, &IID_IUnknown
)
658 || IsEqualGUID(riid
, &IID_IDispatch
)
659 || IsEqualGUID(riid
, &IID_IDispatchEx
))
662 trace("QI %s\n", wine_dbgstr_guid(riid
));
663 return E_NOINTERFACE
;
666 IUnknown_AddRef((IUnknown
*)*ppv
);
670 static ULONG WINAPI
DispatchEx_AddRef(IDispatchEx
*iface
)
675 static ULONG WINAPI
DispatchEx_Release(IDispatchEx
*iface
)
680 static HRESULT WINAPI
DispatchEx_GetTypeInfoCount(IDispatchEx
*iface
, UINT
*pctinfo
)
682 ok(0, "unexpected call\n");
686 static HRESULT WINAPI
DispatchEx_GetTypeInfo(IDispatchEx
*iface
, UINT iTInfo
,
687 LCID lcid
, ITypeInfo
**ppTInfo
)
689 ok(0, "unexpected call\n");
693 static HRESULT WINAPI
DispatchEx_GetIDsOfNames(IDispatchEx
*iface
, REFIID riid
,
694 LPOLESTR
*rgszNames
, UINT cNames
,
695 LCID lcid
, DISPID
*rgDispId
)
697 ok(0, "unexpected call\n");
701 static HRESULT WINAPI
DispatchEx_Invoke(IDispatchEx
*iface
, DISPID dispIdMember
,
702 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
703 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
705 ok(0, "unexpected call\n");
709 static HRESULT WINAPI
DispatchEx_DeleteMemberByName(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
)
711 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName
), grfdex
);
715 static HRESULT WINAPI
DispatchEx_DeleteMemberByDispID(IDispatchEx
*iface
, DISPID id
)
717 ok(0, "unexpected call\n");
721 static HRESULT WINAPI
DispatchEx_GetMemberProperties(IDispatchEx
*iface
, DISPID id
, DWORD grfdexFetch
, DWORD
*pgrfdex
)
723 ok(0, "unexpected call\n");
727 static HRESULT WINAPI
DispatchEx_GetMemberName(IDispatchEx
*iface
, DISPID id
, BSTR
*pbstrName
)
729 ok(0, "unexpected call\n");
733 static HRESULT WINAPI
DispatchEx_GetNextDispID(IDispatchEx
*iface
, DWORD grfdex
, DISPID id
, DISPID
*pid
)
735 ok(0, "unexpected call\n");
739 static HRESULT WINAPI
DispatchEx_GetNameSpaceParent(IDispatchEx
*iface
, IUnknown
**ppunk
)
741 ok(0, "unexpected call\n");
745 static HRESULT WINAPI
DispatchEx_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
747 ok(0, "unexpected call\n");
751 static HRESULT WINAPI
DispatchEx_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
752 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
754 ok(0, "unexpected call %d\n", id
);
758 static HRESULT WINAPI
testObj_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
760 if(!strcmp_wa(bstrName
, "propget")) {
761 CHECK_EXPECT(testobj_propget_d
);
762 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
763 *pid
= DISPID_TESTOBJ_PROPGET
;
766 if(!strcmp_wa(bstrName
, "propput")) {
767 CHECK_EXPECT(testobj_propput_d
);
768 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
769 *pid
= DISPID_TESTOBJ_PROPPUT
;
773 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName
));
774 return DISP_E_UNKNOWNNAME
;
777 static HRESULT WINAPI
testObj_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
778 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
785 CHECK_EXPECT(testobj_value_i
);
787 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
788 ok(pdp
!= NULL
, "pdp == NULL\n");
789 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
790 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
791 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
792 ok(pei
!= NULL
, "pei == NULL\n");
794 for(i
=0; i
<pdp
->cArgs
; i
++) {
795 arg
= pdp
->rgvarg
+pdp
->cArgs
-i
-1;
796 ok(V_VT(arg
) == VT_I2
, "V_VT(arg) = %d\n", V_VT(arg
));
797 ok(V_I2(arg
) == i
+1, "V_I2(arg) = %d\n", V_I2(arg
));
800 V_VT(pvarRes
) = VT_I2
;
801 V_I2(pvarRes
) = pdp
->cArgs
;
804 case DISPID_TESTOBJ_PROPGET
:
805 CHECK_EXPECT(testobj_propget_i
);
807 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
808 ok(pdp
!= NULL
, "pdp == NULL\n");
809 ok(!pdp
->rgvarg
, "rgvarg == NULL\n");
810 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
811 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
812 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
813 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
814 ok(pei
!= NULL
, "pei == NULL\n");
816 V_VT(pvarRes
) = VT_I2
;
819 case DISPID_TESTOBJ_PROPPUT
:
820 CHECK_EXPECT(testobj_propput_i
);
822 ok(wFlags
== DISPATCH_PROPERTYPUT
, "wFlags = %x\n", wFlags
);
823 ok(pdp
!= NULL
, "pdp == NULL\n");
824 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
825 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
826 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
827 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
828 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
829 ok(!pvarRes
, "pvarRes != NULL\n");
830 ok(pei
!= NULL
, "pei == NULL\n");
832 ok(V_VT(pdp
->rgvarg
) == VT_I2
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
833 ok(V_I2(pdp
->rgvarg
) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp
->rgvarg
));
837 ok(0, "unexpected call %d\n", id
);
841 static IDispatchExVtbl testObjVtbl
= {
842 DispatchEx_QueryInterface
,
845 DispatchEx_GetTypeInfoCount
,
846 DispatchEx_GetTypeInfo
,
847 DispatchEx_GetIDsOfNames
,
851 DispatchEx_DeleteMemberByName
,
852 DispatchEx_DeleteMemberByDispID
,
853 DispatchEx_GetMemberProperties
,
854 DispatchEx_GetMemberName
,
855 DispatchEx_GetNextDispID
,
856 DispatchEx_GetNameSpaceParent
859 static IDispatchEx testObj
= { &testObjVtbl
};
861 static HRESULT WINAPI
enumDisp_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
863 return IEnumVARIANT_QueryInterface(&enumObj
, riid
, ppv
);
866 static IDispatchExVtbl enumDispVtbl
= {
867 enumDisp_QueryInterface
,
870 DispatchEx_GetTypeInfoCount
,
871 DispatchEx_GetTypeInfo
,
872 DispatchEx_GetIDsOfNames
,
874 DispatchEx_GetDispID
,
876 DispatchEx_DeleteMemberByName
,
877 DispatchEx_DeleteMemberByDispID
,
878 DispatchEx_GetMemberProperties
,
879 DispatchEx_GetMemberName
,
880 DispatchEx_GetNextDispID
,
881 DispatchEx_GetNameSpaceParent
884 static IDispatchEx enumDisp
= { &enumDispVtbl
};
886 static HRESULT WINAPI
collectionObj_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
888 if(!strcmp_wa(bstrName
, "reset")) {
889 *pid
= DISPID_COLLOBJ_RESET
;
893 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName
));
894 return DISP_E_UNKNOWNNAME
;
897 static HRESULT WINAPI
collectionObj_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
898 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
902 if(strict_dispid_check
)
903 CHECK_EXPECT(collectionobj_newenum_i
);
905 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
906 ok(pdp
!= NULL
, "pdp == NULL\n");
907 ok(!pdp
->rgvarg
, "rgvarg == NULL\n");
908 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
909 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
910 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
911 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
912 ok(pei
!= NULL
, "pei == NULL\n");
914 V_VT(pvarRes
) = VT_UNKNOWN
;
915 V_UNKNOWN(pvarRes
) = (IUnknown
*)&enumObj
;
917 case DISPID_COLLOBJ_RESET
:
922 ok(0, "unexpected call %d\n", id
);
926 static IDispatchExVtbl collectionObjVtbl
= {
927 DispatchEx_QueryInterface
,
930 DispatchEx_GetTypeInfoCount
,
931 DispatchEx_GetTypeInfo
,
932 DispatchEx_GetIDsOfNames
,
934 collectionObj_GetDispID
,
935 collectionObj_InvokeEx
,
936 DispatchEx_DeleteMemberByName
,
937 DispatchEx_DeleteMemberByDispID
,
938 DispatchEx_GetMemberProperties
,
939 DispatchEx_GetMemberName
,
940 DispatchEx_GetNextDispID
,
941 DispatchEx_GetNameSpaceParent
944 static IDispatchEx collectionObj
= { &collectionObjVtbl
};
946 static ULONG refobj_ref
;
948 static ULONG WINAPI
RefObj_AddRef(IDispatchEx
*iface
)
953 static ULONG WINAPI
RefObj_Release(IDispatchEx
*iface
)
958 static IDispatchExVtbl RefObjVtbl
= {
959 DispatchEx_QueryInterface
,
962 DispatchEx_GetTypeInfoCount
,
963 DispatchEx_GetTypeInfo
,
964 DispatchEx_GetIDsOfNames
,
966 DispatchEx_GetDispID
,
968 DispatchEx_DeleteMemberByName
,
969 DispatchEx_DeleteMemberByDispID
,
970 DispatchEx_GetMemberProperties
,
971 DispatchEx_GetMemberName
,
972 DispatchEx_GetNextDispID
,
973 DispatchEx_GetNameSpaceParent
976 static IDispatchEx RefObj
= { &RefObjVtbl
};
978 static HRESULT WINAPI
Global_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
980 if(!strcmp_wa(bstrName
, "ok")) {
981 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
982 *pid
= DISPID_GLOBAL_OK
;
985 if(!strcmp_wa(bstrName
, "todo_wine_ok")) {
986 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
987 *pid
= DISPID_GLOBAL_TODO_WINE_OK
;
990 if(!strcmp_wa(bstrName
, "trace")) {
991 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
992 *pid
= DISPID_GLOBAL_TRACE
;
995 if(!strcmp_wa(bstrName
, "reportSuccess")) {
996 CHECK_EXPECT(global_success_d
);
997 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
998 *pid
= DISPID_GLOBAL_REPORTSUCCESS
;
1001 if(!strcmp_wa(bstrName
, "getVT")) {
1002 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1003 *pid
= DISPID_GLOBAL_GETVT
;
1006 if(!strcmp_wa(bstrName
, "isEnglishLang")) {
1007 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1008 *pid
= DISPID_GLOBAL_ISENGLANG
;
1011 if(!strcmp_wa(bstrName
, "firstDayOfWeek")) {
1012 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1013 *pid
= DISPID_GLOBAL_WEEKSTARTDAY
;
1016 if(!strcmp_wa(bstrName
, "testObj")) {
1017 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1018 *pid
= DISPID_GLOBAL_TESTOBJ
;
1021 if(!strcmp_wa(bstrName
, "collectionObj")) {
1022 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1023 *pid
= DISPID_GLOBAL_COLLOBJ
;
1026 if(!strcmp_wa(bstrName
, "vbvar")) {
1027 CHECK_EXPECT(global_vbvar_d
);
1028 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1029 *pid
= DISPID_GLOBAL_VBVAR
;
1032 if(!strcmp_wa(bstrName
, "letobj")) {
1033 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1034 *pid
= DISPID_GLOBAL_LETOBJ
;
1037 if(!strcmp_wa(bstrName
, "setobj")) {
1038 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1039 *pid
= DISPID_GLOBAL_SETOBJ
;
1042 if(!strcmp_wa(bstrName
, "isNullDisp")) {
1043 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1044 *pid
= DISPID_GLOBAL_ISNULLDISP
;
1047 if(!strcmp_wa(bstrName
, "testDisp")) {
1048 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1049 *pid
= DISPID_GLOBAL_TESTDISP
;
1052 if(!strcmp_wa(bstrName
, "RefObj")) {
1053 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1054 *pid
= DISPID_GLOBAL_REFOBJ
;
1057 if(!strcmp_wa(bstrName
, "propargput")) {
1058 CHECK_EXPECT(global_propargput_d
);
1059 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1060 *pid
= DISPID_GLOBAL_PROPARGPUT
;
1063 if(!strcmp_wa(bstrName
, "propargput1")) {
1064 CHECK_EXPECT(global_propargput1_d
);
1065 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1066 *pid
= DISPID_GLOBAL_PROPARGPUT1
;
1069 if(!strcmp_wa(bstrName
, "counter")) {
1070 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1071 *pid
= DISPID_GLOBAL_COUNTER
;
1074 if(!strcmp_wa(bstrName
, "doubleAsString")) {
1075 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1076 *pid
= DISPID_GLOBAL_DOUBLEASSTRING
;
1079 if(!strcmp_wa(bstrName
, "testArray")) {
1080 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1081 *pid
= DISPID_GLOBAL_TESTARRAY
;
1084 if(!strcmp_wa(bstrName
, "throwInt")) {
1085 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1086 *pid
= DISPID_GLOBAL_THROWINT
;
1089 if(!strcmp_wa(bstrName
, "testOptionalArg")) {
1090 test_grfdex(grfdex
, fdexNameCaseInsensitive
);
1091 *pid
= DISPID_GLOBAL_TESTOPTIONALARG
;
1095 if(strict_dispid_check
&& strcmp_wa(bstrName
, "x"))
1096 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName
), grfdex
);
1097 return DISP_E_UNKNOWNNAME
;
1100 static HRESULT WINAPI
Global_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
1101 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
1104 case DISPID_GLOBAL_TODO_WINE_OK
:
1105 case DISPID_GLOBAL_OK
: {
1108 ok(wFlags
== INVOKE_FUNC
|| wFlags
== (INVOKE_FUNC
|INVOKE_PROPERTYGET
), "wFlags = %x\n", wFlags
);
1109 ok(pdp
!= NULL
, "pdp == NULL\n");
1110 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1111 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1112 ok(pdp
->cArgs
== 2, "cArgs = %d\n", pdp
->cArgs
);
1113 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1114 if(wFlags
& INVOKE_PROPERTYGET
)
1115 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1117 ok(!pvarRes
, "pvarRes != NULL\n");
1118 ok(pei
!= NULL
, "pei == NULL\n");
1120 ok(V_VT(pdp
->rgvarg
) == VT_BSTR
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1123 if(V_VT(b
) == (VT_BYREF
|VT_VARIANT
))
1126 ok(V_VT(b
) == VT_BOOL
, "V_VT(b) = %d\n", V_VT(b
));
1128 todo_wine_if(id
== DISPID_GLOBAL_TODO_WINE_OK
)
1129 ok(V_BOOL(b
), "%s: %s\n", test_name
, wine_dbgstr_w(V_BSTR(pdp
->rgvarg
)));
1133 case DISPID_GLOBAL_TRACE
:
1134 ok(wFlags
== INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1135 ok(pdp
!= NULL
, "pdp == NULL\n");
1136 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1137 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1138 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1139 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1140 ok(!pvarRes
, "pvarRes != NULL\n");
1141 ok(pei
!= NULL
, "pei == NULL\n");
1143 ok(V_VT(pdp
->rgvarg
) == VT_BSTR
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1144 if(V_VT(pdp
->rgvarg
) == VT_BSTR
)
1145 trace("%s: %s\n", test_name
, wine_dbgstr_w(V_BSTR(pdp
->rgvarg
)));
1149 case DISPID_GLOBAL_REPORTSUCCESS
:
1150 CHECK_EXPECT(global_success_i
);
1152 ok(wFlags
== INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1153 ok(pdp
!= NULL
, "pdp == NULL\n");
1154 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1155 ok(pdp
->cArgs
== 0, "cArgs = %d\n", pdp
->cArgs
);
1156 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1157 ok(!pvarRes
, "pvarRes != NULL\n");
1158 ok(pei
!= NULL
, "pei == NULL\n");
1162 case DISPID_GLOBAL_GETVT
:
1163 ok(pdp
!= NULL
, "pdp == NULL\n");
1164 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1165 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1166 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1167 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1168 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1169 ok(V_VT(pvarRes
) == VT_EMPTY
, "V_VT(pvarRes) = %d\n", V_VT(pvarRes
));
1170 ok(pei
!= NULL
, "pei == NULL\n");
1172 V_VT(pvarRes
) = VT_BSTR
;
1173 V_BSTR(pvarRes
) = a2bstr(vt2a(pdp
->rgvarg
));
1176 case DISPID_GLOBAL_ISENGLANG
:
1177 ok(wFlags
== (INVOKE_FUNC
|INVOKE_PROPERTYGET
), "wFlags = %x\n", wFlags
);
1178 ok(pdp
!= NULL
, "pdp == NULL\n");
1179 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1180 ok(pdp
->cArgs
== 0, "cArgs = %d\n", pdp
->cArgs
);
1181 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1182 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1183 ok(pei
!= NULL
, "pei == NULL\n");
1185 V_VT(pvarRes
) = VT_BOOL
;
1186 V_BOOL(pvarRes
) = is_english
? VARIANT_TRUE
: VARIANT_FALSE
;
1189 case DISPID_GLOBAL_WEEKSTARTDAY
:
1190 V_VT(pvarRes
) = VT_I4
;
1191 V_I4(pvarRes
) = first_day_of_week
;
1194 case DISPID_GLOBAL_VBVAR
:
1195 CHECK_EXPECT(global_vbvar_i
);
1197 ok(wFlags
== DISPATCH_PROPERTYPUT
, "wFlags = %x\n", wFlags
);
1198 ok(pdp
!= NULL
, "pdp == NULL\n");
1199 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1200 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
1201 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1202 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1203 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
1204 ok(!pvarRes
, "pvarRes != NULL\n");
1205 ok(pei
!= NULL
, "pei == NULL\n");
1207 ok(V_VT(pdp
->rgvarg
) == VT_I2
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1208 ok(V_I2(pdp
->rgvarg
) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp
->rgvarg
));
1211 case DISPID_GLOBAL_LETOBJ
:
1212 CHECK_EXPECT(global_letobj_i
);
1214 ok(wFlags
== DISPATCH_PROPERTYPUT
, "wFlags = %x\n", wFlags
);
1215 ok(pdp
!= NULL
, "pdp == NULL\n");
1216 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1217 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
1218 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1219 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1220 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
1221 ok(!pvarRes
, "pvarRes != NULL\n");
1222 ok(pei
!= NULL
, "pei == NULL\n");
1224 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1225 ok(V_DISPATCH(pdp
->rgvarg
) == (IDispatch
*)&testObj
, "V_DISPATCH(psp->rgvargs) != testObj\n");
1228 case DISPID_GLOBAL_SETOBJ
:
1229 CHECK_EXPECT(global_setobj_i
);
1231 ok(wFlags
== DISPATCH_PROPERTYPUTREF
, "wFlags = %x\n", wFlags
);
1232 ok(pdp
!= NULL
, "pdp == NULL\n");
1233 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1234 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
1235 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1236 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1237 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
1238 ok(!pvarRes
, "pvarRes != NULL\n");
1239 ok(pei
!= NULL
, "pei == NULL\n");
1241 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1242 ok(V_DISPATCH(pdp
->rgvarg
) == (IDispatch
*)&testObj
, "V_DISPATCH(psp->rgvargs) != testObj\n");
1245 case DISPID_GLOBAL_TESTOBJ
:
1246 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
1248 ok(pdp
!= NULL
, "pdp == NULL\n");
1249 ok(!pdp
->rgvarg
, "rgvarg != NULL\n");
1250 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1251 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
1252 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1253 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1254 ok(pei
!= NULL
, "pei == NULL\n");
1256 V_VT(pvarRes
) = VT_DISPATCH
;
1257 V_DISPATCH(pvarRes
) = (IDispatch
*)&testObj
;
1260 case DISPID_GLOBAL_COLLOBJ
:
1261 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
1263 ok(pdp
!= NULL
, "pdp == NULL\n");
1264 ok(!pdp
->rgvarg
, "rgvarg != NULL\n");
1265 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1266 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
1267 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1268 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1269 ok(pei
!= NULL
, "pei == NULL\n");
1271 V_VT(pvarRes
) = VT_DISPATCH
;
1272 V_DISPATCH(pvarRes
) = (IDispatch
*)&collectionObj
;
1275 case DISPID_GLOBAL_REFOBJ
:
1276 ok(wFlags
== (DISPATCH_PROPERTYGET
|DISPATCH_METHOD
), "wFlags = %x\n", wFlags
);
1278 ok(pdp
!= NULL
, "pdp == NULL\n");
1279 ok(!pdp
->rgvarg
, "rgvarg == NULL\n");
1280 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1281 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
1282 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1283 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1284 ok(pei
!= NULL
, "pei == NULL\n");
1286 IDispatchEx_AddRef(&RefObj
);
1287 V_VT(pvarRes
) = VT_DISPATCH
;
1288 V_DISPATCH(pvarRes
) = (IDispatch
*)&RefObj
;
1291 case DISPID_GLOBAL_ISNULLDISP
: {
1294 ok(wFlags
== (INVOKE_FUNC
|INVOKE_PROPERTYGET
), "wFlags = %x\n", wFlags
);
1295 ok(pdp
!= NULL
, "pdp == NULL\n");
1296 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1297 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1298 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1299 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1300 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1301 ok(pei
!= NULL
, "pei == NULL\n");
1304 if(V_VT(v
) == (VT_VARIANT
|VT_BYREF
))
1305 v
= V_VARIANTREF(v
);
1307 ok(V_VT(v
) == VT_DISPATCH
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1308 V_VT(pvarRes
) = VT_BOOL
;
1309 V_BOOL(pvarRes
) = V_DISPATCH(v
) ? VARIANT_FALSE
: VARIANT_TRUE
;
1313 case DISPID_GLOBAL_TESTDISP
:
1314 ok(wFlags
== INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1315 ok(pdp
!= NULL
, "pdp == NULL\n");
1316 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1317 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1318 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1319 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1320 ok(!pvarRes
, "pvarRes != NULL\n");
1321 ok(pei
!= NULL
, "pei == NULL\n");
1323 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1324 test_disp(V_DISPATCH(pdp
->rgvarg
));
1327 case DISPID_GLOBAL_PROPARGPUT
:
1328 CHECK_EXPECT(global_propargput_i
);
1330 ok(wFlags
== DISPATCH_PROPERTYPUT
, "wFlags = %x\n", wFlags
);
1331 ok(pdp
!= NULL
, "pdp == NULL\n");
1332 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1333 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
1334 ok(pdp
->cArgs
== 3, "cArgs = %d\n", pdp
->cArgs
);
1335 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1336 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
1337 ok(!pvarRes
, "pvarRes != NULL\n");
1338 ok(pei
!= NULL
, "pei == NULL\n");
1340 ok(V_VT(pdp
->rgvarg
) == VT_I2
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1341 ok(V_I2(pdp
->rgvarg
) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp
->rgvarg
));
1343 ok(V_VT(pdp
->rgvarg
+1) == VT_I2
, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp
->rgvarg
+1));
1344 ok(V_I2(pdp
->rgvarg
+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp
->rgvarg
+1));
1346 ok(V_VT(pdp
->rgvarg
+2) == VT_I2
, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp
->rgvarg
+2));
1347 ok(V_I2(pdp
->rgvarg
+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp
->rgvarg
+2));
1350 case DISPID_GLOBAL_PROPARGPUT1
:
1351 CHECK_EXPECT(global_propargput1_i
);
1353 ok(wFlags
== DISPATCH_PROPERTYPUT
, "wFlags = %x\n", wFlags
);
1354 ok(pdp
!= NULL
, "pdp == NULL\n");
1355 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1356 ok(pdp
->rgdispidNamedArgs
!= NULL
, "rgdispidNamedArgs == NULL\n");
1357 ok(pdp
->cArgs
== 2, "cArgs = %d\n", pdp
->cArgs
);
1358 ok(pdp
->cNamedArgs
== 1, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1359 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_PROPERTYPUT
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
1360 ok(!pvarRes
, "pvarRes != NULL\n");
1361 ok(pei
!= NULL
, "pei == NULL\n");
1363 ok(V_VT(pdp
->rgvarg
) == VT_I2
, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1364 ok(V_I2(pdp
->rgvarg
) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp
->rgvarg
));
1366 ok(V_VT(pdp
->rgvarg
+1) == VT_I2
, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp
->rgvarg
+1));
1367 ok(V_I2(pdp
->rgvarg
+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp
->rgvarg
+1));
1371 case DISPID_GLOBAL_COUNTER
:
1372 ok(pdp
!= NULL
, "pdp == NULL\n");
1373 todo_wine
ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1374 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1375 ok(!pdp
->cArgs
, "cArgs = %d\n", pdp
->cArgs
);
1376 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1377 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1378 ok(V_VT(pvarRes
) == VT_EMPTY
, "V_VT(pvarRes) = %d\n", V_VT(pvarRes
));
1379 ok(pei
!= NULL
, "pei == NULL\n");
1381 V_VT(pvarRes
) = VT_I2
;
1382 V_I2(pvarRes
) = test_counter
++;
1385 case DISPID_GLOBAL_DOUBLEASSTRING
:
1386 ok(wFlags
== (INVOKE_FUNC
|INVOKE_PROPERTYGET
), "wFlags = %x\n", wFlags
);
1387 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1388 ok(V_VT(pdp
->rgvarg
) == VT_R8
, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
1389 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
1391 V_VT(pvarRes
) = VT_BSTR
;
1392 return VarBstrFromR8(V_R8(pdp
->rgvarg
), 0, 0, &V_BSTR(pvarRes
));
1394 case DISPID_GLOBAL_TESTARRAY
:
1395 ok(wFlags
== INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1396 ok(pdp
!= NULL
, "pdp == NULL\n");
1397 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1398 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1399 ok(pdp
->cArgs
== 2, "cArgs = %d\n", pdp
->cArgs
);
1400 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1401 ok(!pvarRes
, "pvarRes != NULL\n");
1402 ok(pei
!= NULL
, "pei == NULL\n");
1404 ok(V_VT(pdp
->rgvarg
+1) == VT_I2
, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp
->rgvarg
+1));
1405 ok(V_VT(pdp
->rgvarg
) == (VT_BYREF
|VT_VARIANT
), "V_VT(psp->rgvargs) = %d\n", V_VT(pdp
->rgvarg
));
1406 ok(V_VT(V_VARIANTREF(pdp
->rgvarg
)) == (VT_ARRAY
|VT_BYREF
|VT_VARIANT
),
1407 "V_VT(V_VARIANTREF(psp->rgvargs)) = %d\n", V_VT(V_VARIANTREF(pdp
->rgvarg
)));
1408 if(V_I2(pdp
->rgvarg
+1) == -1)
1409 ok(!*V_ARRAYREF(V_VARIANTREF(pdp
->rgvarg
)), "*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)) != NULL\n");
1411 test_safearray(*V_ARRAYREF(V_VARIANTREF(pdp
->rgvarg
)), V_I2(pdp
->rgvarg
+1));
1414 case DISPID_GLOBAL_THROWINT
: {
1415 VARIANT
*v
= pdp
->rgvarg
;
1418 ok((wFlags
& ~INVOKE_PROPERTYGET
) == INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1419 ok(pdp
!= NULL
, "pdp == NULL\n");
1420 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1421 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1422 ok(pdp
->cArgs
== 1, "cArgs = %d\n", pdp
->cArgs
);
1423 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1424 ok(pei
!= NULL
, "pei == NULL\n");
1426 ok(V_VT(pvarRes
) == VT_EMPTY
, "V_VT(pvarRes) = %d\n", V_VT(pvarRes
));
1427 V_VT(pvarRes
) = VT_BOOL
;
1428 V_BOOL(pvarRes
) = VARIANT_FALSE
;
1431 if(V_VT(v
) == (VT_VARIANT
|VT_BYREF
))
1432 v
= V_VARIANTREF(v
);
1442 ok(0, "unexpected vt %d\n", V_VT(v
));
1443 return E_INVALIDARG
;
1449 case DISPID_GLOBAL_TESTOPTIONALARG
: {
1453 CHECK_EXPECT(global_testoptionalarg_i
);
1455 ok(wFlags
== INVOKE_FUNC
, "wFlags = %x\n", wFlags
);
1456 ok(pdp
!= NULL
, "pdp == NULL\n");
1457 ok(pdp
->rgvarg
!= NULL
, "rgvarg == NULL\n");
1458 ok(!pdp
->rgdispidNamedArgs
, "rgdispidNamedArgs != NULL\n");
1459 ok(pdp
->cArgs
== 3, "cArgs = %d\n", pdp
->cArgs
);
1460 ok(!pdp
->cNamedArgs
, "cNamedArgs = %d\n", pdp
->cNamedArgs
);
1461 ok(!pvarRes
, "pvarRes != NULL\n");
1462 ok(pei
!= NULL
, "pei == NULL\n");
1464 ok(V_VT(pdp
->rgvarg
) == VT_I2
, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
1465 opt
= V_I2(pdp
->rgvarg
);
1466 ok(opt
== 1 || opt
== 2, "opt = %d\n", opt
);
1467 v
= pdp
->rgvarg
+pdp
->cArgs
-opt
;
1468 ok(V_VT(v
) == VT_ERROR
, "V_VT(v) = %d\n", V_VT(v
));
1469 ok(V_ERROR(v
) == DISP_E_PARAMNOTFOUND
, "V_ERROR(v) = %08x\n", V_ERROR(v
));
1474 ok(0, "unexpected call %d\n", id
);
1475 return DISP_E_MEMBERNOTFOUND
;
1478 static IDispatchExVtbl GlobalVtbl
= {
1479 DispatchEx_QueryInterface
,
1482 DispatchEx_GetTypeInfoCount
,
1483 DispatchEx_GetTypeInfo
,
1484 DispatchEx_GetIDsOfNames
,
1488 DispatchEx_DeleteMemberByName
,
1489 DispatchEx_DeleteMemberByDispID
,
1490 DispatchEx_GetMemberProperties
,
1491 DispatchEx_GetMemberName
,
1492 DispatchEx_GetNextDispID
,
1493 DispatchEx_GetNameSpaceParent
1496 static IDispatchEx Global
= { &GlobalVtbl
};
1498 static HRESULT WINAPI
ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow
*iface
, REFIID riid
, void **ppv
)
1500 ok(0, "unexpected call\n");
1501 return E_NOINTERFACE
;
1504 static ULONG WINAPI
ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow
*iface
)
1509 static ULONG WINAPI
ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow
*iface
)
1514 static HRESULT WINAPI
ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow
*iface
, HWND
*phwnd
)
1517 CHECK_EXPECT(GetWindow
);
1522 static HRESULT WINAPI
ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow
*iface
, BOOL fEnable
)
1527 CHECK_EXPECT(EnableModeless
);
1528 ok(!fEnable
, "fEnable = %x\n", fEnable
);
1532 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
= {
1533 ActiveScriptSiteWindow_QueryInterface
,
1534 ActiveScriptSiteWindow_AddRef
,
1535 ActiveScriptSiteWindow_Release
,
1536 ActiveScriptSiteWindow_GetWindow
,
1537 ActiveScriptSiteWindow_EnableModeless
1540 static IActiveScriptSiteWindow ActiveScriptSiteWindow
= { &ActiveScriptSiteWindowVtbl
};
1542 static HRESULT WINAPI
ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl
*iface
, REFIID riid
, void **ppv
)
1544 ok(0, "unexpected call\n");
1545 return E_NOINTERFACE
;
1548 static ULONG WINAPI
ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl
*iface
)
1553 static ULONG WINAPI
ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl
*iface
)
1558 static HRESULT WINAPI
ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl
*iface
, SCRIPTUICITEM UicItem
,
1559 SCRIPTUICHANDLING
*pUicHandling
)
1562 CHECK_EXPECT(GetUIBehavior
);
1563 ok(UicItem
== SCRIPTUICITEM_MSGBOX
, "UidItem = %d\n", UicItem
);
1565 *pUicHandling
= uic_handling
;
1569 static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl
= {
1570 ActiveScriptSiteUIControl_QueryInterface
,
1571 ActiveScriptSiteUIControl_AddRef
,
1572 ActiveScriptSiteUIControl_Release
,
1573 ActiveScriptSiteUIControl_GetUIBehavior
1576 static IActiveScriptSiteUIControl ActiveScriptSiteUIControl
= { &ActiveScriptSiteUIControlVtbl
};
1578 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
1582 if(IsEqualGUID(&IID_IUnknown
, riid
))
1584 else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
))
1586 else if(IsEqualGUID(&IID_IActiveScriptSiteWindow
, riid
))
1587 *ppv
= &ActiveScriptSiteWindow
;
1588 else if(IsEqualGUID(&IID_IActiveScriptSiteUIControl
, riid
))
1589 *ppv
= &ActiveScriptSiteUIControl
;
1591 return E_NOINTERFACE
;
1593 IUnknown_AddRef((IUnknown
*)*ppv
);
1597 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
1602 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
1607 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*plcid
)
1609 *plcid
= GetUserDefaultLCID();
1613 static HRESULT WINAPI
ActiveScriptSite_GetItemInfo(IActiveScriptSite
*iface
, LPCOLESTR pstrName
,
1614 DWORD dwReturnMask
, IUnknown
**ppiunkItem
, ITypeInfo
**ppti
)
1616 ok(dwReturnMask
== SCRIPTINFO_IUNKNOWN
, "unexpected dwReturnMask %x\n", dwReturnMask
);
1617 ok(!ppti
, "ppti != NULL\n");
1619 if(strcmp_wa(pstrName
, "test"))
1620 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName
));
1622 *ppiunkItem
= (IUnknown
*)&Global
;
1626 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*pbstrVersion
)
1631 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
,
1632 const VARIANT
*pvarResult
, const EXCEPINFO
*pexcepinfo
)
1637 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE ssScriptState
)
1642 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*pscripterror
)
1644 HRESULT hr
= onerror_hres
;
1646 if(!expect_OnScriptError
) {
1651 hres
= IActiveScriptError_GetSourcePosition(pscripterror
, NULL
, &line
, NULL
);
1653 hres
= IActiveScriptError_GetExceptionInfo(pscripterror
, &info
);
1655 trace("Error in line %u: %s\n", line
+1, wine_dbgstr_w(info
.bstrDescription
));
1658 CHECK_EXPECT(OnScriptError
);
1659 onerror_hres
= E_NOTIMPL
;
1664 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
1669 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
1674 #undef ACTSCPSITE_THIS
1676 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
= {
1677 ActiveScriptSite_QueryInterface
,
1678 ActiveScriptSite_AddRef
,
1679 ActiveScriptSite_Release
,
1680 ActiveScriptSite_GetLCID
,
1681 ActiveScriptSite_GetItemInfo
,
1682 ActiveScriptSite_GetDocVersionString
,
1683 ActiveScriptSite_OnScriptTerminate
,
1684 ActiveScriptSite_OnStateChange
,
1685 ActiveScriptSite_OnScriptError
,
1686 ActiveScriptSite_OnEnterScript
,
1687 ActiveScriptSite_OnLeaveScript
1690 static IActiveScriptSite ActiveScriptSite
= { &ActiveScriptSiteVtbl
};
1692 static IActiveScript
*create_script(void)
1694 IActiveScript
*script
;
1697 hres
= CoCreateInstance(&CLSID_VBScript
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
1698 &IID_IActiveScript
, (void**)&script
);
1699 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
1704 static IActiveScript
*create_and_init_script(DWORD flags
)
1706 IActiveScriptParse
*parser
;
1707 IActiveScript
*engine
;
1710 engine
= create_script();
1714 hres
= IActiveScript_QueryInterface(engine
, &IID_IActiveScriptParse
, (void**)&parser
);
1715 ok(hres
== S_OK
, "Could not get IActiveScriptParse: %08x\n", hres
);
1717 hres
= IActiveScriptParse_InitNew(parser
);
1718 ok(hres
== S_OK
, "InitNew failed: %08x\n", hres
);
1720 IActiveScriptParse_Release(parser
);
1722 hres
= IActiveScript_SetScriptSite(engine
, &ActiveScriptSite
);
1723 ok(hres
== S_OK
, "SetScriptSite failed: %08x\n", hres
);
1725 hres
= IActiveScript_AddNamedItem(engine
, testW
,
1726 SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|flags
);
1727 ok(hres
== S_OK
, "AddNamedItem failed: %08x\n", hres
);
1729 hres
= IActiveScript_SetScriptState(engine
, SCRIPTSTATE_STARTED
);
1730 ok(hres
== S_OK
, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres
);
1735 static void close_script(IActiveScript
*script
)
1740 hres
= IActiveScript_Close(script
);
1741 ok(hres
== S_OK
, "Close failed: %08x\n", hres
);
1743 ref
= IActiveScript_Release(script
);
1744 ok(!ref
, "ref=%u\n", ref
);
1747 static HRESULT
parse_script(DWORD flags
, BSTR script_str
, const WCHAR
*delim
)
1749 IActiveScriptParse
*parser
;
1750 IActiveScript
*engine
;
1751 IDispatch
*script_disp
;
1755 engine
= create_and_init_script(flags
);
1759 hres
= IActiveScript_QueryInterface(engine
, &IID_IActiveScriptParse
, (void**)&parser
);
1760 ok(hres
== S_OK
, "Could not get IActiveScriptParse: %08x\n", hres
);
1763 IActiveScript_Release(engine
);
1767 hres
= IActiveScript_GetScriptDispatch(engine
, NULL
, &script_disp
);
1768 ok(hres
== S_OK
, "GetScriptDispatch failed: %08x\n", hres
);
1769 ok(script_disp
!= NULL
, "script_disp == NULL\n");
1770 ok(script_disp
!= (IDispatch
*)&Global
, "script_disp == Global\n");
1774 hres
= IActiveScriptParse_ParseScriptText(parser
, script_str
, NULL
, NULL
, delim
, 0, 0, 0, NULL
, NULL
);
1776 IActiveScript_Close(engine
);
1778 IDispatch_Release(script_disp
);
1779 IActiveScript_Release(engine
);
1781 ref
= IActiveScriptParse_Release(parser
);
1782 ok(!ref
, "ref=%d\n", ref
);
1786 static void parse_script_af(DWORD flags
, const char *src
)
1792 hres
= parse_script(flags
, tmp
, NULL
);
1794 ok(hres
== S_OK
, "parse_script failed: %08x\n", hres
);
1797 static HRESULT
parse_script_ar(const char *src
)
1803 hres
= parse_script(SCRIPTITEM_GLOBALMEMBERS
, tmp
, NULL
);
1808 static void parse_script_a(const char *src
)
1810 parse_script_af(SCRIPTITEM_GLOBALMEMBERS
, src
);
1813 #define parse_htmlscript_a(a) _parse_htmlscript_a(__LINE__,a)
1814 static void _parse_htmlscript_a(unsigned line
, const char *src
)
1819 static const WCHAR script_delimW
[] = {'<','/','S','C','R','I','P','T','>',0};
1822 hres
= parse_script(SCRIPTITEM_GLOBALMEMBERS
, tmp
, script_delimW
);
1824 ok_(__FILE__
,line
)(hres
== S_OK
, "parse_script failed: %08x\n", hres
);
1827 static IDispatchEx
*parse_procedure(IActiveScriptParseProcedure2
*parse_proc
, const char *src
)
1829 IDispatchEx
*dispex
;
1834 static const WCHAR delimiterW
[] = {'\"',0};
1837 hres
= IActiveScriptParseProcedure2_ParseProcedureText(parse_proc
, str
, NULL
, emptyW
, NULL
, NULL
, delimiterW
, 0, 0,
1838 SCRIPTPROC_HOSTMANAGESSOURCE
|SCRIPTPROC_IMPLICIT_THIS
|SCRIPTPROC_IMPLICIT_PARENTS
, &disp
);
1840 ok(hres
== S_OK
, "ParseProcedureText failed: %08x\n", hres
);
1841 ok(disp
!= NULL
, "disp = NULL\n");
1843 hres
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
1844 IDispatch_Release(disp
);
1845 ok(hres
== S_OK
, "Could not get IDispatchEx iface: %08x\n", hres
);
1851 static void test_procedures(void)
1853 IActiveScriptParseProcedure2
*parse_proc
;
1854 DISPPARAMS dp
= {NULL
};
1855 IActiveScript
*script
;
1861 script
= create_and_init_script(0);
1863 hres
= IActiveScript_QueryInterface(script
, &IID_IActiveScriptParseProcedure2
, (void**)&parse_proc
);
1864 ok(hres
== S_OK
, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres
);
1866 proc
= parse_procedure(parse_proc
, "dim x\nif true then x=false");
1868 V_VT(&v
) = VT_EMPTY
;
1869 hres
= IDispatchEx_InvokeEx(proc
, DISPID_VALUE
, 0, DISPATCH_METHOD
, &dp
, &v
, &ei
, &caller_sp
);
1870 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1872 IDispatchEx_Release(proc
);
1874 IActiveScriptParseProcedure2_Release(parse_proc
);
1876 close_script(script
);
1879 static void test_gc(void)
1881 IActiveScriptParse
*parser
;
1882 IActiveScript
*engine
;
1886 strict_dispid_check
= FALSE
;
1888 engine
= create_script();
1892 hres
= IActiveScript_QueryInterface(engine
, &IID_IActiveScriptParse
, (void**)&parser
);
1893 ok(hres
== S_OK
, "Could not get IActiveScriptParse: %08x\n", hres
);
1895 hres
= IActiveScriptParse_InitNew(parser
);
1896 ok(hres
== S_OK
, "InitNew failed: %08x\n", hres
);
1898 hres
= IActiveScript_SetScriptSite(engine
, &ActiveScriptSite
);
1899 ok(hres
== S_OK
, "SetScriptSite failed: %08x\n", hres
);
1901 hres
= IActiveScript_AddNamedItem(engine
, testW
,
1902 SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|SCRIPTITEM_GLOBALMEMBERS
);
1903 ok(hres
== S_OK
, "AddNamedItem failed: %08x\n", hres
);
1905 hres
= IActiveScript_SetScriptState(engine
, SCRIPTSTATE_STARTED
);
1906 ok(hres
== S_OK
, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres
);
1911 " Public Sub Class_Terminate\n"
1912 " Call reportSuccess()\n"
1918 "set x = nothing\n");
1920 hres
= IActiveScriptParse_ParseScriptText(parser
, src
, NULL
, NULL
, NULL
, 0, 0, 0, NULL
, NULL
);
1921 ok(hres
== S_OK
, "ParseScriptText failed: %08x\n", hres
);
1924 SET_EXPECT(global_success_d
);
1925 SET_EXPECT(global_success_i
);
1926 IActiveScript_Close(engine
);
1927 CHECK_CALLED(global_success_d
);
1928 CHECK_CALLED(global_success_i
);
1930 IActiveScript_Release(engine
);
1931 IActiveScriptParse_Release(parser
);
1934 static void test_msgbox(void)
1938 uic_handling
= SCRIPTUICHANDLING_NOUIDEFAULT
;
1940 SET_EXPECT(GetUIBehavior
);
1941 SET_EXPECT(GetWindow
);
1942 SET_EXPECT(EnableModeless
);
1943 hres
= parse_script_ar("MsgBox \"testing...\"");
1944 CLEAR_CALLED(GetUIBehavior
);
1945 CLEAR_CALLED(GetWindow
);
1946 CLEAR_CALLED(EnableModeless
);
1948 win_skip("Skipping MsgBox tests, broken (probably too old) vbscript\n");
1952 SET_EXPECT(GetUIBehavior
);
1953 parse_script_a("dim r\n r=MsgBox(\"testing...\")\n Call ok(r=0, \"r=\"&r)");
1954 CHECK_CALLED(GetUIBehavior
);
1956 SET_EXPECT(GetUIBehavior
);
1957 parse_script_a("MsgBox 10");
1958 CHECK_CALLED(GetUIBehavior
);
1960 uic_handling
= SCRIPTUICHANDLING_ALLOW
;
1962 SET_EXPECT(GetUIBehavior
);
1963 SET_EXPECT(GetWindow
);
1964 SET_EXPECT(EnableModeless
);
1965 SET_EXPECT(OnScriptError
);
1966 hres
= parse_script_ar("MsgBox \"testing...\"");
1967 ok(FAILED(hres
), "script not failed\n");
1968 CHECK_CALLED(GetUIBehavior
);
1969 CHECK_CALLED(GetWindow
);
1970 CHECK_CALLED(EnableModeless
);
1971 todo_wine
CHECK_CALLED(OnScriptError
);
1973 uic_handling
= SCRIPTUICHANDLING_NOUIERROR
;
1975 SET_EXPECT(GetUIBehavior
);
1976 SET_EXPECT(OnScriptError
);
1977 hres
= parse_script_ar("MsgBox \"testing...\"");
1978 ok(FAILED(hres
), "script not failed\n");
1979 CHECK_CALLED(GetUIBehavior
);
1980 todo_wine
CHECK_CALLED(OnScriptError
);
1983 static HRESULT
test_global_vars_ref(BOOL use_close
)
1985 IActiveScriptParse
*parser
;
1986 IActiveScript
*engine
;
1991 engine
= create_script();
1995 hres
= IActiveScript_QueryInterface(engine
, &IID_IActiveScriptParse
, (void**)&parser
);
1996 ok(hres
== S_OK
, "Could not get IActiveScriptParse: %08x\n", hres
);
1999 IActiveScript_Release(engine
);
2003 hres
= IActiveScriptParse_InitNew(parser
);
2004 ok(hres
== S_OK
, "InitNew failed: %08x\n", hres
);
2006 hres
= IActiveScript_SetScriptSite(engine
, &ActiveScriptSite
);
2007 ok(hres
== S_OK
, "SetScriptSite failed: %08x\n", hres
);
2009 hres
= IActiveScript_AddNamedItem(engine
, testW
, SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|SCRIPTITEM_GLOBALMEMBERS
);
2010 ok(hres
== S_OK
, "AddNamedItem failed: %08x\n", hres
);
2012 hres
= IActiveScript_SetScriptState(engine
, SCRIPTSTATE_STARTED
);
2013 ok(hres
== S_OK
, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres
);
2017 script_str
= a2bstr("Dim x\nset x = RefObj\n");
2018 hres
= IActiveScriptParse_ParseScriptText(parser
, script_str
, NULL
, NULL
, NULL
, 0, 0, 0, NULL
, NULL
);
2019 SysFreeString(script_str
);
2021 ok(refobj_ref
, "refobj_ref = 0\n");
2024 hres
= IActiveScript_Close(engine
);
2025 ok(hres
== S_OK
, "Close failed: %08x\n", hres
);
2027 hres
= IActiveScript_SetScriptState(engine
, SCRIPTSTATE_UNINITIALIZED
);
2028 ok(hres
== S_OK
, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres
);
2031 ok(!refobj_ref
, "refobj_ref = %d\n", refobj_ref
);
2033 IActiveScript_Release(engine
);
2035 ref
= IActiveScriptParse_Release(parser
);
2036 ok(!ref
, "ref=%d\n", ref
);
2040 static BSTR
get_script_from_file(const char *filename
)
2044 const char *file_map
;
2047 file
= CreateFileA(filename
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_READONLY
, NULL
);
2048 if(file
== INVALID_HANDLE_VALUE
) {
2049 trace("Could not open file: %u\n", GetLastError());
2053 size
= GetFileSize(file
, NULL
);
2055 map
= CreateFileMappingW(file
, NULL
, PAGE_READONLY
, 0, 0, NULL
);
2057 if(map
== INVALID_HANDLE_VALUE
) {
2058 trace("Could not create file mapping: %u\n", GetLastError());
2062 file_map
= MapViewOfFile(map
, FILE_MAP_READ
, 0, 0, 0);
2065 trace("MapViewOfFile failed: %u\n", GetLastError());
2069 len
= MultiByteToWideChar(CP_ACP
, 0, file_map
, size
, NULL
, 0);
2070 ret
= SysAllocStringLen(NULL
, len
);
2071 MultiByteToWideChar(CP_ACP
, 0, file_map
, size
, ret
, len
);
2073 UnmapViewOfFile(file_map
);
2078 static void run_from_file(const char *filename
)
2083 script_str
= get_script_from_file(filename
);
2087 strict_dispid_check
= FALSE
;
2088 hres
= parse_script(SCRIPTITEM_GLOBALMEMBERS
, script_str
, NULL
);
2089 SysFreeString(script_str
);
2090 ok(hres
== S_OK
, "parse_script failed: %08x\n", hres
);
2093 static void run_from_res(const char *name
)
2101 strict_dispid_check
= FALSE
;
2104 src
= FindResourceA(NULL
, name
, (LPCSTR
)40);
2105 ok(src
!= NULL
, "Could not find resource %s\n", name
);
2107 size
= SizeofResource(NULL
, src
);
2108 data
= LoadResource(NULL
, src
);
2110 len
= MultiByteToWideChar(CP_ACP
, 0, data
, size
, NULL
, 0);
2111 str
= SysAllocStringLen(NULL
, len
);
2112 MultiByteToWideChar(CP_ACP
, 0, data
, size
, str
, len
);
2114 SET_EXPECT(global_success_d
);
2115 SET_EXPECT(global_success_i
);
2116 hres
= parse_script(SCRIPTITEM_GLOBALMEMBERS
, str
, NULL
);
2117 CHECK_CALLED(global_success_d
);
2118 CHECK_CALLED(global_success_i
);
2120 ok(hres
== S_OK
, "parse_script failed: %08x\n", hres
);
2124 static void run_tests(void)
2128 strict_dispid_check
= TRUE
;
2131 parse_script_a("' empty ;");
2133 SET_EXPECT(global_success_d
);
2134 SET_EXPECT(global_success_i
);
2135 parse_script_a("reportSuccess");
2136 CHECK_CALLED(global_success_d
);
2137 CHECK_CALLED(global_success_i
);
2139 SET_EXPECT(global_success_d
);
2140 SET_EXPECT(global_success_i
);
2141 parse_script_a("reportSuccess()");
2142 CHECK_CALLED(global_success_d
);
2143 CHECK_CALLED(global_success_i
);
2145 SET_EXPECT(global_success_d
);
2146 SET_EXPECT(global_success_i
);
2147 parse_script_a("Call reportSuccess");
2148 CHECK_CALLED(global_success_d
);
2149 CHECK_CALLED(global_success_i
);
2151 SET_EXPECT(global_success_d
);
2152 SET_EXPECT(global_success_i
);
2153 parse_script_a("test.reportSuccess()");
2154 CHECK_CALLED(global_success_d
);
2155 CHECK_CALLED(global_success_i
);
2157 SET_EXPECT(global_success_d
);
2158 SET_EXPECT(global_success_i
);
2159 parse_script_af(0, "TEST.reportSuccess()");
2160 CHECK_CALLED(global_success_d
);
2161 CHECK_CALLED(global_success_i
);
2163 SET_EXPECT(global_vbvar_d
);
2164 SET_EXPECT(global_vbvar_i
);
2165 parse_script_a("Option Explicit\nvbvar = 3");
2166 CHECK_CALLED(global_vbvar_d
);
2167 CHECK_CALLED(global_vbvar_i
);
2169 SET_EXPECT(global_vbvar_d
);
2170 SET_EXPECT(global_vbvar_i
);
2171 parse_script_a("Option Explicit\nvbvar() = 3");
2172 CHECK_CALLED(global_vbvar_d
);
2173 CHECK_CALLED(global_vbvar_i
);
2175 SET_EXPECT(global_letobj_i
);
2176 parse_script_a("Option Explicit\nletobj = testObj");
2177 CHECK_CALLED(global_letobj_i
);
2179 SET_EXPECT(global_letobj_i
);
2180 parse_script_a("Option Explicit\ntest.letobj = testObj");
2181 CHECK_CALLED(global_letobj_i
);
2183 SET_EXPECT(global_setobj_i
);
2184 parse_script_a("Option Explicit\nset setobj = testObj");
2185 CHECK_CALLED(global_setobj_i
);
2187 SET_EXPECT(global_setobj_i
);
2188 parse_script_a("Option Explicit\nset test.setobj = testObj");
2189 CHECK_CALLED(global_setobj_i
);
2191 SET_EXPECT(testobj_propget_d
);
2192 SET_EXPECT(testobj_propget_i
);
2193 parse_script_a("dim x\nx = testObj.propget");
2194 CHECK_CALLED(testobj_propget_d
);
2195 CHECK_CALLED(testobj_propget_i
);
2197 SET_EXPECT(testobj_propput_d
);
2198 SET_EXPECT(testobj_propput_i
);
2199 parse_script_a("testObj.propput = 1");
2200 CHECK_CALLED(testobj_propput_d
);
2201 CHECK_CALLED(testobj_propput_i
);
2203 SET_EXPECT(global_propargput_d
);
2204 SET_EXPECT(global_propargput_i
);
2205 parse_script_a("propargput(counter(), counter()) = counter()");
2206 CHECK_CALLED(global_propargput_d
);
2207 CHECK_CALLED(global_propargput_i
);
2209 SET_EXPECT(global_propargput_d
);
2210 SET_EXPECT(global_propargput_i
);
2211 parse_script_a("test.propargput(counter(), counter()) = counter()");
2212 CHECK_CALLED(global_propargput_d
);
2213 CHECK_CALLED(global_propargput_i
);
2215 SET_EXPECT(global_propargput1_d
);
2216 SET_EXPECT(global_propargput1_i
);
2217 parse_script_a("propargput1 (counter()) = counter()");
2218 CHECK_CALLED(global_propargput1_d
);
2219 CHECK_CALLED(global_propargput1_i
);
2221 SET_EXPECT(global_propargput1_d
);
2222 SET_EXPECT(global_propargput1_i
);
2223 parse_script_a("test.propargput1(counter()) = counter()");
2224 CHECK_CALLED(global_propargput1_d
);
2225 CHECK_CALLED(global_propargput1_i
);
2227 parse_htmlscript_a("<!--");
2228 parse_htmlscript_a(" -->");
2229 parse_htmlscript_a("<!--\ndim x\nx=1\n-->\n");
2230 parse_htmlscript_a("<!--\ndim x\n-->\n<!--\nx=1\n-->\n");
2232 SET_EXPECT(OnScriptError
);
2233 hres
= parse_script_ar("<!--");
2234 ok(FAILED(hres
), "script didn't fail\n");
2235 todo_wine
CHECK_CALLED(OnScriptError
);
2237 SET_EXPECT(global_success_d
);
2238 SET_EXPECT(global_success_i
);
2239 parse_htmlscript_a("<!--\n<!-- ignore this <> <>\n--> <>\nCall reportSuccess()\n-->\n");
2240 CHECK_CALLED(global_success_d
);
2241 CHECK_CALLED(global_success_i
);
2244 SET_EXPECT(collectionobj_newenum_i
);
2246 parse_script_a("for each x in collectionObj\nnext");
2247 CHECK_CALLED(collectionobj_newenum_i
);
2249 ok(next_cnt
== 4, "next_cnt = %d\n", next_cnt
);
2251 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
2253 parse_script_a("x = _ \n3");
2255 test_global_vars_ref(TRUE
);
2256 test_global_vars_ref(FALSE
);
2258 SET_EXPECT(OnScriptError
);
2259 hres
= parse_script_ar("throwInt(&h80080008&)");
2260 ok(hres
== 0x80080008, "hres = %08x\n", hres
);
2261 todo_wine
CHECK_CALLED(OnScriptError
);
2263 /* DISP_E_BADINDEX */
2264 SET_EXPECT(OnScriptError
);
2265 hres
= parse_script_ar("throwInt(&h8002000b&)");
2266 ok(hres
== MAKE_VBSERROR(9), "hres = %08x\n", hres
);
2267 todo_wine
CHECK_CALLED(OnScriptError
);
2269 SET_EXPECT(OnScriptError
);
2270 hres
= parse_script_ar("throwInt(&h800a0009&)");
2271 ok(hres
== MAKE_VBSERROR(9), "hres = %08x\n", hres
);
2272 todo_wine
CHECK_CALLED(OnScriptError
);
2274 onerror_hres
= S_OK
;
2275 SET_EXPECT(OnScriptError
);
2276 hres
= parse_script_ar("throwInt(&h800a0009&)");
2277 todo_wine
ok(hres
== SCRIPT_E_REPORTED
, "hres = %08x\n", hres
);
2278 todo_wine
CHECK_CALLED(OnScriptError
);
2281 SET_EXPECT(OnScriptError
);
2282 hres
= parse_script_ar("throwInt(&h80004001&)");
2283 ok(hres
== MAKE_VBSERROR(445), "hres = %08x\n", hres
);
2284 todo_wine
CHECK_CALLED(OnScriptError
);
2286 onerror_hres
= S_OK
;
2287 SET_EXPECT(OnScriptError
);
2288 hres
= parse_script_ar("throwInt(&h80004001&)");
2289 todo_wine
ok(hres
== SCRIPT_E_REPORTED
, "hres = %08x\n", hres
);
2290 todo_wine
CHECK_CALLED(OnScriptError
);
2292 SET_EXPECT(global_testoptionalarg_i
);
2293 parse_script_a("call testOptionalArg(1,,2)");
2294 CHECK_CALLED(global_testoptionalarg_i
);
2296 SET_EXPECT(global_testoptionalarg_i
);
2297 parse_script_a("call testOptionalArg(,1,1)");
2298 CHECK_CALLED(global_testoptionalarg_i
);
2300 SET_EXPECT(global_testoptionalarg_i
);
2301 parse_script_a("testOptionalArg 1,,2");
2302 CHECK_CALLED(global_testoptionalarg_i
);
2304 strict_dispid_check
= FALSE
;
2306 SET_EXPECT(testobj_value_i
);
2307 parse_script_a("dim n,o\n set o = testObj\n n = o(1,2)\n call ok(n=2, \"n = \" & n)\n");
2308 CHECK_CALLED(testobj_value_i
);
2310 SET_EXPECT(testobj_value_i
);
2311 parse_script_a("dim n,o\n set o = testObj\n n = o\n call ok(n=0, \"n = \" & n)\n");
2312 CHECK_CALLED(testobj_value_i
);
2314 parse_script_a("Sub testsub\n"
2316 "Call ok(x = 1, \"x = \" & x)\n"
2320 parse_script_a("Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n");
2321 parse_script_a("Call ok(x = \"\", \"x = \" & x)\n");
2322 parse_script_a("x = y\n"
2323 "Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n"
2324 "Call ok(getVT(y) = \"VT_EMPTY*\", \"getVT(y) = \" & getVT(y))");
2325 SET_EXPECT(OnScriptError
);
2326 hres
= parse_script_ar("x = y(\"a\")");
2327 ok(FAILED(hres
), "script didn't fail\n");
2328 todo_wine
CHECK_CALLED(OnScriptError
);
2330 run_from_res("lang.vbs");
2331 run_from_res("api.vbs");
2332 run_from_res("regexp.vbs");
2333 run_from_res("error.vbs");
2340 static BOOL
check_vbscript(void)
2346 hres
= CoCreateInstance(&CLSID_VBScriptRegExp
, NULL
,
2347 CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
2348 &IID_IUnknown
, (void**)&unk
);
2349 if(hres
== REGDB_E_CLASSNOTREG
)
2351 ok(hres
== S_OK
, "CoCreateInstance(CLSID_VBScriptRegExp) failed: %x\n", hres
);
2353 hres
= IUnknown_QueryInterface(unk
, &IID_IRegExp2
, (void**)®exp
);
2355 IRegExp2_Release(regexp
);
2356 IUnknown_Release(unk
);
2358 return hres
== S_OK
;
2368 skip("Skipping some tests in non-English locale\n");
2370 argc
= winetest_get_mainargs(&argv
);
2374 if(!check_vbscript()) {
2375 win_skip("Broken engine, probably too old\n");
2376 }else if(argc
> 2) {
2378 uic_handling
= SCRIPTUICHANDLING_ALLOW
;
2379 run_from_file(argv
[2]);