ReactOS 0.4.17-dev-357-ga8f14ff
run.c
Go to the documentation of this file.
1/*
2 * Copyright 2011 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 "vbsregexp55.h"
29
30#include "wine/test.h"
31
32#ifdef _WIN64
33
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
40
41#else
42
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
49
50#endif
51
52extern const CLSID CLSID_VBScript;
53extern const CLSID CLSID_VBScriptRegExp;
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 REF_EXPECT(func) \
62 (&expect_ ## func), (&called_ ## func)
63
64#define CHECK_EXPECT2(func) \
65 do { \
66 ok(expect_ ##func, "unexpected call " #func "\n"); \
67 called_ ## func = TRUE; \
68 }while(0)
69
70#define CHECK_EXPECT(func) \
71 do { \
72 CHECK_EXPECT2(func); \
73 expect_ ## func = FALSE; \
74 }while(0)
75
76#define CHECK_CALLED(func) \
77 do { \
78 ok(called_ ## func, "expected " #func "\n"); \
79 expect_ ## func = called_ ## func = FALSE; \
80 }while(0)
81
82#define CHECK_NOT_CALLED(func) \
83 do { \
84 ok(!called_ ## func, "unexpected " #func "\n"); \
85 expect_ ## func = called_ ## func = FALSE; \
86 }while(0)
87
88#define CLEAR_CALLED(func) \
89 expect_ ## func = called_ ## func = FALSE
90
91DEFINE_EXPECT(global_success_d);
92DEFINE_EXPECT(global_success_i);
93DEFINE_EXPECT(global_vbvar_d);
94DEFINE_EXPECT(global_vbvar_i);
95DEFINE_EXPECT(global_letobj_i);
96DEFINE_EXPECT(global_setobj_i);
97DEFINE_EXPECT(global_globalcallback_i);
98DEFINE_EXPECT(testobj_propget_d);
99DEFINE_EXPECT(testobj_propget_i);
100DEFINE_EXPECT(testobj_propput_d);
101DEFINE_EXPECT(testobj_propput_i);
102DEFINE_EXPECT(testobj_value_i);
103DEFINE_EXPECT(testobj_valueput_i);
104DEFINE_EXPECT(global_propargput_d);
105DEFINE_EXPECT(global_propargput_i);
106DEFINE_EXPECT(global_propargput1_d);
107DEFINE_EXPECT(global_propargput1_i);
108DEFINE_EXPECT(global_propargset_d);
109DEFINE_EXPECT(global_propargset_i);
110DEFINE_EXPECT(global_testoptionalarg_i);
111DEFINE_EXPECT(global_testerrorobject_i);
112DEFINE_EXPECT(collectionobj_newenum_i);
115DEFINE_EXPECT(GetUIBehavior);
117DEFINE_EXPECT(OnScriptError);
118DEFINE_EXPECT(OnEnterScript);
119DEFINE_EXPECT(OnLeaveScript);
120
121#define DISPID_GLOBAL_REPORTSUCCESS 1000
122#define DISPID_GLOBAL_TRACE 1001
123#define DISPID_GLOBAL_OK 1002
124#define DISPID_GLOBAL_GETVT 1003
125#define DISPID_GLOBAL_ISENGLANG 1004
126#define DISPID_GLOBAL_VBVAR 1005
127#define DISPID_GLOBAL_TESTOBJ 1006
128#define DISPID_GLOBAL_ISNULLDISP 1007
129#define DISPID_GLOBAL_TESTDISP 1008
130#define DISPID_GLOBAL_REFOBJ 1009
131#define DISPID_GLOBAL_COUNTER 1010
132#define DISPID_GLOBAL_PROPARGPUT 1011
133#define DISPID_GLOBAL_PROPARGPUT1 1012
134#define DISPID_GLOBAL_COLLOBJ 1013
135#define DISPID_GLOBAL_DOUBLEASSTRING 1014
136#define DISPID_GLOBAL_TESTARRAY 1015
137#define DISPID_GLOBAL_THROWINT 1016
138#define DISPID_GLOBAL_TESTOPTIONALARG 1017
139#define DISPID_GLOBAL_LETOBJ 1018
140#define DISPID_GLOBAL_SETOBJ 1019
141#define DISPID_GLOBAL_TODO_WINE_OK 1020
142#define DISPID_GLOBAL_WEEKSTARTDAY 1021
143#define DISPID_GLOBAL_GLOBALCALLBACK 1022
144#define DISPID_GLOBAL_TESTERROROBJECT 1023
145#define DISPID_GLOBAL_THROWWITHDESC 1024
146#define DISPID_GLOBAL_PROPARGSET 1025
147#define DISPID_GLOBAL_UNKOBJ 1026
148#define DISPID_GLOBAL_THROWEXCEPTION 1027
149#define DISPID_GLOBAL_ISARRAYFIXED 1028
150#define DISPID_GLOBAL_MAXCHARSIZE 1029
151
152#define DISPID_TESTOBJ_PROPGET 2000
153#define DISPID_TESTOBJ_PROPPUT 2001
154#define DISPID_TESTOBJ_KEYWORD 2002
155
156#define DISPID_COLLOBJ_RESET 3000
157
158#define FACILITY_VBS 0xa
159#define MAKE_VBSERROR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_VBS, code)
160
164static const char *test_name = "(null)";
165static int test_counter;
170
171static BSTR a2bstr(const char *str)
172{
173 BSTR ret;
174 int len;
175
176 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
179
180 return ret;
181}
182
183static const char *vt2a(VARIANT *v)
184{
185 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
186 static char buf[64];
187 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
188 return buf;
189 }
190
191 switch(V_VT(v)) {
192 case VT_EMPTY:
193 return "VT_EMPTY";
194 case VT_NULL:
195 return "VT_NULL";
196 case VT_I2:
197 return "VT_I2";
198 case VT_I4:
199 return "VT_I4";
200 case VT_R4:
201 return "VT_R4";
202 case VT_R8:
203 return "VT_R8";
204 case VT_CY:
205 return "VT_CY";
206 case VT_DATE:
207 return "VT_DATE";
208 case VT_BSTR:
209 return "VT_BSTR";
210 case VT_DISPATCH:
211 return "VT_DISPATCH";
212 case VT_UNKNOWN:
213 return "VT_UNKNOWN";
214 case VT_BOOL:
215 return "VT_BOOL";
216 case VT_ARRAY|VT_VARIANT:
217 return "VT_ARRAY|VT_VARIANT";
219 return "VT_ARRAY|VT_BYREF|VT_VARIANT";
220 case VT_UI1:
221 return "VT_UI1";
222 default:
223 ok(0, "unknown vt %d\n", V_VT(v));
224 return NULL;
225 }
226}
227
228/* Sets is_english to true if the user interface is in English. Note that this
229 * does not presume the formatting of dates, numbers, etc.
230 * Sets first_day_of_week to 1 if Sunday, 2 if Monday, and so on.
231 */
232static void detect_locale(void)
233{
234 UINT cp;
235 CPINFOEXA cpinfo;
236 HMODULE kernel32 = GetModuleHandleA("kernel32.dll");
237 LANGID (WINAPI *pGetThreadUILanguage)(void) = (void*)GetProcAddress(kernel32, "GetThreadUILanguage");
238
239 is_english = ((!pGetThreadUILanguage || PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH) &&
242
243 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, (WCHAR*)&cp, sizeof(cp));
244 if (cp)
245 {
246 GetCPInfoExA( cp, 0, &cpinfo );
247 MaxCharSize = cpinfo.MaxCharSize;
248 }
249 else
250 {
251 /* No ANSI code page for that locale -> the fallback is UTF-8 */
252 MaxCharSize = 4;
253 }
254
256 (void*)&first_day_of_week, sizeof(first_day_of_week));
257 first_day_of_week = 1 + (first_day_of_week + 1) % 7;
258}
259
261{
262 ok(0, "unexpected call\n");
263 return E_NOINTERFACE;
264}
265
267{
268 return 2;
269}
270
272{
273 return 1;
274}
275
277 REFIID riid, void **ppv)
278{
279 ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService));
280 return E_NOINTERFACE;
281}
282
283static const IServiceProviderVtbl ServiceProviderVtbl = {
288};
289
291
292static void test_disp(IDispatch *disp)
293{
294 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id, gs_getter_id;
295 DISPID named_args[5] = {DISPID_PROPERTYPUT};
296 VARIANT v, args[5];
297 DISPPARAMS dp = {args, named_args};
298 IDispatchEx *dispex;
299 EXCEPINFO ei = {0};
300 BSTR str;
302
303 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
304 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
305
306 str = SysAllocString(L"publicProp");
307 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
309 ok(hres == S_OK, "GetDispID(publicProp) failed: %08lx\n", hres);
310
311 str = SysAllocString(L"PUBLICPROP");
312 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
314 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08lx\n", hres);
315 ok(public_prop_id == id, "id = %ld\n", public_prop_id);
316
317 str = SysAllocString(L"publicPROP2");
318 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
320 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08lx\n", hres);
321
322 str = SysAllocString(L"defValGet");
323 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
325 ok(hres == S_OK, "GetDispID(defValGet) failed: %08lx\n", hres);
326 ok(defvalget_id == DISPID_VALUE, "id = %ld\n", defvalget_id);
327
328 str = SysAllocString(L"privateProp");
329 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
331 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08lx, expected DISP_E_UNKNOWNNAME\n", hres);
332 ok(id == -1, "id = %ld\n", id);
333
334 str = SysAllocString(L"class_initialize");
335 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
337 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08lx\n", hres);
338
339 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
340 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
341 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
342
343 V_VT(args) = VT_BOOL;
344 V_BOOL(args) = VARIANT_TRUE;
345 dp.cArgs = dp.cNamedArgs = 1;
346 V_VT(&v) = VT_BOOL;
347 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
348 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
349 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
350
351 dp.cArgs = dp.cNamedArgs = 0;
352 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
353 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
354 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
355 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
356
357 dp.cArgs = dp.cNamedArgs = 0;
358 hres = IDispatchEx_Invoke(dispex, public_prop_id, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
359 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
360 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
361 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
362
363 dp.cArgs = dp.cNamedArgs = 0;
364 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
365 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
366 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
367 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
368
369 dp.cArgs = 1;
370 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
371 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08lx, expected DISP_E_MEMBERNOTFOUND\n", hres);
372 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
373
374 SET_EXPECT(testobj_value_i);
377 dp.cArgs = dp.cNamedArgs = 1;
378 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
379 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
380 CHECK_CALLED(testobj_value_i);
381
382 dp.cArgs = dp.cNamedArgs = 0;
383 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
384 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
385 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
386 ok(V_I2(&v) == 0, "V_I2(v) = %d\n", V_I2(&v));
387
390 dp.cArgs = dp.cNamedArgs = 1;
391 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF, &dp, NULL, &ei, NULL);
392 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
393
396 dp.cArgs = dp.cNamedArgs = 1;
397 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, &ei, NULL);
398 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
399
400 dp.cArgs = dp.cNamedArgs = 0;
401 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
402 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
403 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
404 ok(V_DISPATCH(&v) == (IDispatch*)&testObj, "V_DISPATCH(v) != testObj\n");
405
406 V_VT(args) = VT_BOOL;
407 V_BOOL(args) = VARIANT_TRUE;
408 dp.cArgs = dp.cNamedArgs = 1;
409 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF, &dp, NULL, &ei, NULL);
410 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
411
412 dp.cArgs = dp.cNamedArgs = 0;
413 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
414 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
415 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
416 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
417
418 V_VT(args) = VT_BOOL;
419 V_BOOL(args) = VARIANT_FALSE;
420 dp.cArgs = dp.cNamedArgs = 1;
421 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, &ei, NULL);
422 ok(hres == DISP_E_EXCEPTION, "InvokeEx failed: %08lx, expected DISP_E_EXCEPTION\n", hres);
423
424 V_VT(args) = VT_BOOL;
425 V_BOOL(args) = VARIANT_FALSE;
426 dp.cArgs = 1;
427 dp.cNamedArgs = 0;
428 V_VT(&v) = VT_BOOL;
429 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
430 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08lx, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
431
432 str = SysAllocString(L"publicFunction");
433 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
435 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08lx\n", hres);
436 ok(public_func_id != -1, "public_func_id = -1\n");
437
438 str = SysAllocString(L"publicSub");
439 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
441 ok(hres == S_OK, "GetDispID(publicSub) failed: %08lx\n", hres);
442 ok(public_sub_id != -1, "public_func_id = -1\n");
443
444 dp.cArgs = dp.cNamedArgs = 0;
445 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
446 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
447 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
448 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
449
450 dp.cArgs = dp.cNamedArgs = 0;
451 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
452 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08lx, expected DISP_E_MEMBERNOTFOUND\n", hres);
453 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
454
455 dp.cArgs = dp.cNamedArgs = 0;
456 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
457 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
458 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
459 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
460
461 dp.cArgs = dp.cNamedArgs = 0;
462 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
463 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
464 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
465
466 dp.cArgs = dp.cNamedArgs = 0;
467 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
468 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08lx, expected DISP_E_MEMBERNOTFOUND\n", hres);
469 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
470
471 dp.cArgs = dp.cNamedArgs = 0;
472 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
473 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
474 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
475
476 V_VT(args) = VT_BOOL;
477 V_BOOL(args) = VARIANT_TRUE;
478 dp.cArgs = dp.cNamedArgs = 1;
479 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
480 ok(FAILED(hres), "InvokeEx succeeded: %08lx\n", hres);
481
482 dp.cArgs = dp.cNamedArgs = 0;
483 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
484 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
485 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
486 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
487
488 dp.cArgs = dp.cNamedArgs = 0;
489 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
490 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
491 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
492 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
493
494 dp.cArgs = dp.cNamedArgs = 0;
495 hres = IDispatchEx_Invoke(dispex, public_func_id, &IID_NULL, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
496 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
497 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
498 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
499
500 dp.cArgs = dp.cNamedArgs = 0;
501 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
502 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
503 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
504
505 dp.cArgs = dp.cNamedArgs = 0;
506 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
507 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
508 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
509
510 str = SysAllocString(L"privateSub");
511 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
513 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08lx, expected DISP_E_UNKNOWNNAME\n", hres);
514 ok(id == -1, "id = %ld\n", id);
515
516 str = SysAllocString(L"dynprop");
517 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
518 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08lx, expected DISP_E_UNKNOWNNAME\n", hres);
519 ok(id == -1, "id = %ld\n", id);
520 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
521 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08lx, expected DISP_E_UNKNOWNNAME\n", hres);
522 ok(id == -1, "id = %ld\n", id);
524
525 str = SysAllocString(L"publicProp");
526 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
528 ok(hres == S_OK, "GetDispID(publicProp) failed: %08lx\n", hres);
529
530 id = 0xdeadbeef;
531 str = SysAllocString(L"publicProp");
532 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
534 ok(hres == S_OK, "GetDispID(publicProp) failed: %08lx\n", hres);
535 ok(id == public_prop_id, "id = %ld, expected %ld\n", id, public_prop_id);
536
537 id = 0xdeadbeef;
538 str = SysAllocString(L"publicprop");
539 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
541 ok(hres == S_OK, "GetDispID(publicProp) failed: %08lx\n", hres);
542 ok(id == public_prop_id, "id = %ld, expected %ld\n", id, public_prop_id);
543
544 str = SysAllocString(L"gsGetProp");
545 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &gs_getter_id);
547 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08lx\n", hres);
548 ok(gs_getter_id != -1, "gs_getter_id = -1\n");
549
550 V_VT(args) = VT_BOOL;
551 V_BOOL(args) = VARIANT_TRUE;
552 dp.cNamedArgs = 0;
553 dp.cArgs = 1;
554 V_VT(&v) = VT_I8;
555 hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
556 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
557 ok(V_VT(&v) == VT_BOOL && V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
558
559 hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET, &dp, NULL, &ei, NULL);
560 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
561
562 V_VT(args) = VT_BOOL;
563 V_BOOL(args) = VARIANT_FALSE;
564 dp.cArgs = 1;
565 V_VT(&v) = VT_I8;
566 hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
567 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
568 ok(V_VT(&v) == VT_BOOL && !V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
569
570 V_VT(args) = VT_BOOL;
571 V_BOOL(args) = VARIANT_TRUE;
572 V_VT(&v) = VT_I8;
573 dp.cArgs = 1;
574 hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
575 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
576 ok(V_VT(&v) == VT_BOOL && V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
577
578 IDispatchEx_Release(dispex);
579}
580
581static void test_safearray(SAFEARRAY *safearray, unsigned indims)
582{
583 int i, exdims = indims;
584
585 if(!exdims)
586 exdims = 1;
587 ok(safearray->cDims == exdims, "safearray->cDims = %d, expected %d\n", safearray->cDims, exdims);
588 ok(safearray->fFeatures == (FADF_VARIANT|FADF_HAVEVARTYPE|FADF_FIXEDSIZE|FADF_STATIC),
589 "safearray->fFeatures = %x\n", safearray->fFeatures);
590 ok(safearray->cbElements == sizeof(VARIANT), "safearray->cbElements = %lx\n", safearray->cbElements);
591 ok(!safearray->cLocks, "safearray->cLocks = %lx\n", safearray->cLocks);
592
593 for(i=0; i < safearray->cDims; i++) {
594 ok(safearray->rgsabound[i].cElements == (indims ? i+4 : 1), "safearray->rgsabound[%d].cElements = %ld\n", i,
595 safearray->rgsabound[i].cElements);
596 ok(!safearray->rgsabound[i].lLbound, "safearray->rgsabound[%d].lLbound = %ld\n", i, safearray->rgsabound[i].lLbound);
597 }
598}
599
600#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
601static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
602{
603 ok_(__FILE__,line)(grfdex == expect, "grfdex = %lx, expected %lx\n", grfdex, expect);
604}
605
607
609{
611 *ppv = iface;
612 return S_OK;
613 }
614
615 *ppv = NULL;
616 return E_NOINTERFACE;
617}
618
620{
621 return 2;
622}
623
625{
626 return 1;
627}
628
629static const IUnknownVtbl unkObjVtbl = {
633};
634
636
638{
639 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
640 *ppv = iface;
641 return S_OK;
642 }
643
645 *ppv = &enumDisp;
646 return S_OK;
647 }
648
649 ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid));
650 return E_NOINTERFACE;
651}
652
654{
655 return 2;
656}
657
659{
660 return 1;
661}
662
663static unsigned next_cnt;
664
665static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
666{
669
670 ok(celt == 1, "celt = %ld\n", celt);
671 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
672 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
673
674 if(next_cnt++ < 3) {
675 V_VT(rgVar) = VT_I2;
676 V_I2(rgVar) = next_cnt;
677 return S_OK;
678 }
679
680 return S_FALSE;
681}
682
684{
685 ok(0, "unexpected call\n");
686 return E_NOTIMPL;
687}
688
690{
691 ok(0, "unexpected call\n");
692 return E_NOTIMPL;
693}
694
696{
697 ok(0, "unexpected call\n");
698 return E_NOTIMPL;
699}
700
701static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
709};
710
712
713typedef struct {
714 const WCHAR *name;
718} dispid_t;
719
720static BOOL get_dispid(BSTR name, const dispid_t *dispids, SIZE_T dispids_cnt, DISPID *id)
721{
722 int i;
723
724 for(i = 0; i < dispids_cnt; i++) {
725#ifdef __REACTOS__
726 if(!_wcsicmp(name, dispids[i].name)) {
727#else
728 if(!wcsicmp(name, dispids[i].name)) {
729#endif
730 const dispid_t *d = &dispids[i];
731 if(d->expect) {
732 ok(*d->expect, "unexpected call %s\n", wine_dbgstr_w(d->name));
733 *d->called = TRUE;
734 *d->expect = FALSE;
735 }
736 *id = d->pid;
737 return TRUE;
738 }
739 }
740
741 return FALSE;
742}
743
745{
746 *ppv = NULL;
747
750 || IsEqualGUID(riid, &IID_IDispatchEx))
751 *ppv = iface;
752 else {
753 trace("QI %s\n", wine_dbgstr_guid(riid));
754 return E_NOINTERFACE;
755 }
756
757 IUnknown_AddRef((IUnknown*)*ppv);
758 return S_OK;
759}
760
762{
763 return 2;
764}
765
767{
768 return 1;
769}
770
772{
773 ok(0, "unexpected call\n");
774 return E_NOTIMPL;
775}
776
778 LCID lcid, ITypeInfo **ppTInfo)
779{
780 return E_NOTIMPL;
781}
782
784 LPOLESTR *rgszNames, UINT cNames,
785 LCID lcid, DISPID *rgDispId)
786{
787 ok(0, "unexpected call\n");
788 return E_NOTIMPL;
789}
790
792 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
793 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
794{
795 ok(0, "unexpected call\n");
796 return E_NOTIMPL;
797}
798
800{
801 ok(0, "unexpected call %s %lx\n", wine_dbgstr_w(bstrName), grfdex);
802 return E_NOTIMPL;
803}
804
806{
807 ok(0, "unexpected call\n");
808 return E_NOTIMPL;
809}
810
812{
813 ok(0, "unexpected call\n");
814 return E_NOTIMPL;
815}
816
818{
819 ok(0, "unexpected call\n");
820 return E_NOTIMPL;
821}
822
824{
825 ok(0, "unexpected call\n");
826 return E_NOTIMPL;
827}
828
830{
831 ok(0, "unexpected call\n");
832 return E_NOTIMPL;
833}
834
836{
837 ok(0, "unexpected call\n");
838 return E_NOTIMPL;
839}
840
842 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
843{
844 ok(0, "unexpected call %ld\n", id);
845 return E_NOTIMPL;
846}
847
848static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
849{
850 static const dispid_t dispids[] = {
851 { L"propget", DISPID_TESTOBJ_PROPGET, REF_EXPECT(testobj_propget_d) },
852 { L"propput", DISPID_TESTOBJ_PROPPUT, REF_EXPECT(testobj_propput_d) },
853 { L"rem", DISPID_TESTOBJ_KEYWORD },
854 { L"true", DISPID_TESTOBJ_KEYWORD },
855 { L"false", DISPID_TESTOBJ_KEYWORD },
856 { L"not", DISPID_TESTOBJ_KEYWORD },
857 { L"and", DISPID_TESTOBJ_KEYWORD },
858 { L"or", DISPID_TESTOBJ_KEYWORD },
859 { L"xor", DISPID_TESTOBJ_KEYWORD },
860 { L"eqv", DISPID_TESTOBJ_KEYWORD },
861 { L"imp", DISPID_TESTOBJ_KEYWORD },
862 { L"is", DISPID_TESTOBJ_KEYWORD },
863 { L"mod", DISPID_TESTOBJ_KEYWORD },
864 { L"call", DISPID_TESTOBJ_KEYWORD },
865 { L"dim", DISPID_TESTOBJ_KEYWORD },
866 { L"sub", DISPID_TESTOBJ_KEYWORD },
867 { L"function", DISPID_TESTOBJ_KEYWORD },
868 { L"get", DISPID_TESTOBJ_KEYWORD },
869 { L"let", DISPID_TESTOBJ_KEYWORD },
870 { L"const", DISPID_TESTOBJ_KEYWORD },
871 { L"if", DISPID_TESTOBJ_KEYWORD },
872 { L"else", DISPID_TESTOBJ_KEYWORD },
873 { L"elseif", DISPID_TESTOBJ_KEYWORD },
874 { L"end", DISPID_TESTOBJ_KEYWORD },
875 { L"then", DISPID_TESTOBJ_KEYWORD },
876 { L"exit", DISPID_TESTOBJ_KEYWORD },
877 { L"while", DISPID_TESTOBJ_KEYWORD },
878 { L"wend", DISPID_TESTOBJ_KEYWORD },
879 { L"do", DISPID_TESTOBJ_KEYWORD },
880 { L"loop", DISPID_TESTOBJ_KEYWORD },
881 { L"until", DISPID_TESTOBJ_KEYWORD },
882 { L"for", DISPID_TESTOBJ_KEYWORD },
883 { L"to", DISPID_TESTOBJ_KEYWORD },
884 { L"each", DISPID_TESTOBJ_KEYWORD },
885 { L"in", DISPID_TESTOBJ_KEYWORD },
886 { L"select", DISPID_TESTOBJ_KEYWORD },
887 { L"case", DISPID_TESTOBJ_KEYWORD },
888 { L"byref", DISPID_TESTOBJ_KEYWORD },
889 { L"byval", DISPID_TESTOBJ_KEYWORD },
890 { L"option", DISPID_TESTOBJ_KEYWORD },
891 { L"nothing", DISPID_TESTOBJ_KEYWORD },
892 { L"empty", DISPID_TESTOBJ_KEYWORD },
893 { L"null", DISPID_TESTOBJ_KEYWORD },
894 { L"class", DISPID_TESTOBJ_KEYWORD },
895 { L"set", DISPID_TESTOBJ_KEYWORD },
896 { L"new", DISPID_TESTOBJ_KEYWORD },
897 { L"public", DISPID_TESTOBJ_KEYWORD },
898 { L"private", DISPID_TESTOBJ_KEYWORD },
899 { L"next", DISPID_TESTOBJ_KEYWORD },
900 { L"on", DISPID_TESTOBJ_KEYWORD },
901 { L"resume", DISPID_TESTOBJ_KEYWORD },
902 { L"goto", DISPID_TESTOBJ_KEYWORD },
903 { L"redim", DISPID_TESTOBJ_KEYWORD },
904 { L"preserve", DISPID_TESTOBJ_KEYWORD },
905 { L"with", DISPID_TESTOBJ_KEYWORD },
906 { L"property", DISPID_TESTOBJ_KEYWORD },
907 { L"me", DISPID_TESTOBJ_KEYWORD },
908 { L"stop", DISPID_TESTOBJ_KEYWORD }
909 };
910
911 test_grfdex(grfdex, fdexNameCaseInsensitive);
912 if(get_dispid(bstrName, dispids, ARRAY_SIZE(dispids), pid))
913 return S_OK;
914 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
915 return DISP_E_UNKNOWNNAME;
916}
917
918static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
919 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
920{
921 switch(id) {
922 case DISPID_VALUE:
924 VARIANT *arg;
925 int i;
926
927 CHECK_EXPECT(testobj_value_i);
928
929 ok(pdp != NULL, "pdp == NULL\n");
930 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
931 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
932 ok(pvarRes != NULL, "pvarRes == NULL\n");
933 ok(pei != NULL, "pei == NULL\n");
934
935 for(i=0; i<pdp->cArgs; i++) {
936 arg = pdp->rgvarg+pdp->cArgs-i-1;
937 ok(V_VT(arg) == VT_I2, "V_VT(arg) = %d\n", V_VT(arg));
938 ok(V_I2(arg) == i+1, "V_I2(arg) = %d\n", V_I2(arg));
939 }
940
941 V_VT(pvarRes) = VT_I2;
942 V_I2(pvarRes) = pdp->cArgs;
943 return S_OK;
944 }
946 CHECK_EXPECT(testobj_valueput_i);
947
948 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
949 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
950 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
951 ok(!pvarRes, "pvarRes != NULL\n");
952 ok(pei != NULL, "pei == NULL\n");
953
954 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(args[0]) = %d\n", V_VT(pdp->rgvarg));
955 ok(V_I2(pdp->rgvarg) == 0, "V_I2(args[0]) = %d\n", V_I2(pdp->rgvarg));
956 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(args[1]) = %d\n", V_VT(pdp->rgvarg+1));
957 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(args[1]) = %d\n", V_I2(pdp->rgvarg+1));
958 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(args[2]) = %d\n", V_VT(pdp->rgvarg+2));
959 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(args[2]) = %d\n", V_I2(pdp->rgvarg+2));
960
961 return S_OK;
962 }
963 ok(0, "wFlags = %x\n", wFlags);
964 break;
966 CHECK_EXPECT(testobj_propget_i);
967
968 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
969 ok(pdp != NULL, "pdp == NULL\n");
970 ok(!pdp->rgvarg, "rgvarg == NULL\n");
971 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
972 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
973 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
974 ok(pvarRes != NULL, "pvarRes == NULL\n");
975 ok(pei != NULL, "pei == NULL\n");
976
977 V_VT(pvarRes) = VT_I2;
978 V_I2(pvarRes) = 10;
979 return S_OK;
981 CHECK_EXPECT(testobj_propput_i);
982
983 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
984 ok(pdp != NULL, "pdp == NULL\n");
985 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
986 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
987 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
988 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
989 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
990 ok(!pvarRes, "pvarRes != NULL\n");
991 ok(pei != NULL, "pei == NULL\n");
992
993 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
994 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
995 return S_OK;
996
998 V_VT(pvarRes) = VT_I2;
999 V_I2(pvarRes) = 10;
1000 return S_OK;
1001 }
1002
1003 ok(0, "unexpected call %ld\n", id);
1004 return E_FAIL;
1005}
1006
1007static IDispatchExVtbl testObjVtbl = {
1023};
1024
1025static IDispatchEx testObj = { &testObjVtbl };
1026
1028{
1029 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
1030}
1031
1032static IDispatchExVtbl enumDispVtbl = {
1048};
1049
1050static IDispatchEx enumDisp = { &enumDispVtbl };
1051
1053{
1054 if(!lstrcmpW(bstrName, L"reset")) {
1056 return S_OK;
1057 }
1058
1059 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
1060 return DISP_E_UNKNOWNNAME;
1061}
1062
1064 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1065{
1066 switch(id) {
1067 case DISPID_NEWENUM:
1069 CHECK_EXPECT(collectionobj_newenum_i);
1070
1071 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1072 ok(pdp != NULL, "pdp == NULL\n");
1073 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1074 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1075 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1076 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1077 ok(pvarRes != NULL, "pvarRes == NULL\n");
1078 ok(pei != NULL, "pei == NULL\n");
1079
1080 V_VT(pvarRes) = VT_UNKNOWN;
1081 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
1082 return S_OK;
1084 next_cnt = 0;
1085 return S_OK;
1086 }
1087
1088 ok(0, "unexpected call %ld\n", id);
1089 return E_NOTIMPL;
1090}
1091
1092static IDispatchExVtbl collectionObjVtbl = {
1108};
1109
1111
1113
1115{
1116 return ++refobj_ref;
1117}
1118
1120{
1121 return --refobj_ref;
1122}
1123
1124static IDispatchExVtbl RefObjVtbl = {
1140};
1141
1143
1145
1147{
1148 return ++global_ref;
1149}
1150
1152{
1153 return --global_ref;
1154}
1155
1156static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
1157{
1158 static const dispid_t dispids[] = {
1159 { L"ok", DISPID_GLOBAL_OK },
1160 { L"todo_wine_ok", DISPID_GLOBAL_TODO_WINE_OK },
1161 { L"trace", DISPID_GLOBAL_TRACE },
1162 { L"reportSuccess", DISPID_GLOBAL_REPORTSUCCESS, REF_EXPECT(global_success_d) },
1163 { L"getVT", DISPID_GLOBAL_GETVT },
1164 { L"isEnglishLang", DISPID_GLOBAL_ISENGLANG },
1165 { L"MaxCharSize", DISPID_GLOBAL_MAXCHARSIZE },
1166 { L"firstDayOfWeek", DISPID_GLOBAL_WEEKSTARTDAY },
1167 { L"globalCallback", DISPID_GLOBAL_GLOBALCALLBACK },
1168 { L"testObj", DISPID_GLOBAL_TESTOBJ },
1169 { L"collectionObj" , DISPID_GLOBAL_COLLOBJ },
1170 { L"vbvar", DISPID_GLOBAL_VBVAR, REF_EXPECT(global_vbvar_d) },
1171 { L"letobj", DISPID_GLOBAL_LETOBJ },
1172 { L"setobj", DISPID_GLOBAL_SETOBJ },
1173 { L"isNullDisp", DISPID_GLOBAL_ISNULLDISP },
1174 { L"testDisp", DISPID_GLOBAL_TESTDISP },
1175 { L"RefObj", DISPID_GLOBAL_REFOBJ },
1176 { L"propargput", DISPID_GLOBAL_PROPARGPUT, REF_EXPECT(global_propargput_d) },
1177 { L"propargput1", DISPID_GLOBAL_PROPARGPUT1, REF_EXPECT(global_propargput1_d) },
1178 { L"propargset", DISPID_GLOBAL_PROPARGSET, REF_EXPECT(global_propargset_d) },
1179 { L"counter", DISPID_GLOBAL_COUNTER },
1180 { L"doubleAsString", DISPID_GLOBAL_DOUBLEASSTRING },
1181 { L"testArray", DISPID_GLOBAL_TESTARRAY },
1182 { L"throwException", DISPID_GLOBAL_THROWEXCEPTION },
1183 { L"throwInt", DISPID_GLOBAL_THROWINT },
1184 { L"testOptionalArg", DISPID_GLOBAL_TESTOPTIONALARG },
1185 { L"testErrorObject", DISPID_GLOBAL_TESTERROROBJECT },
1186 { L"throwWithDesc", DISPID_GLOBAL_THROWWITHDESC },
1187 { L"unkObj", DISPID_GLOBAL_UNKOBJ },
1188 { L"isArrayFixed", DISPID_GLOBAL_ISARRAYFIXED },
1189 };
1190
1191 test_grfdex(grfdex, fdexNameCaseInsensitive);
1192 if(get_dispid(bstrName, dispids, ARRAY_SIZE(dispids), pid))
1193 return S_OK;
1194 if(strict_dispid_check && wcscmp(bstrName, L"x"))
1195 ok(0, "unexpected call %s %lx\n", wine_dbgstr_w(bstrName), grfdex);
1196 return DISP_E_UNKNOWNNAME;
1197}
1198
1199static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1200 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1201{
1202 switch(id) {
1204 case DISPID_GLOBAL_OK: {
1205 VARIANT *b;
1206
1207 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1208 ok(pdp != NULL, "pdp == NULL\n");
1209 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1210 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1211 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1212 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1213 if(wFlags & INVOKE_PROPERTYGET)
1214 ok(pvarRes != NULL, "pvarRes == NULL\n");
1215 else
1216 ok(!pvarRes, "pvarRes != NULL\n");
1217 ok(pei != NULL, "pei == NULL\n");
1218
1219 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1220
1221 b = pdp->rgvarg+1;
1222 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
1223 b = V_BYREF(b);
1224
1225 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
1226
1228 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1229 return S_OK;
1230 }
1231
1233 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1234 ok(pdp != NULL, "pdp == NULL\n");
1235 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1236 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1237 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1238 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1239 ok(!pvarRes, "pvarRes != NULL\n");
1240 ok(pei != NULL, "pei == NULL\n");
1241
1242 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1243 if(V_VT(pdp->rgvarg) == VT_BSTR)
1244 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1245
1246 return S_OK;
1247
1249 CHECK_EXPECT(global_success_i);
1250
1251 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1252 ok(pdp != NULL, "pdp == NULL\n");
1253 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1254 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
1255 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1256 ok(!pvarRes, "pvarRes != NULL\n");
1257 ok(pei != NULL, "pei == NULL\n");
1258
1259 return S_OK;
1260
1262 ok(pdp != NULL, "pdp == NULL\n");
1263 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1264 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1265 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1266 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1267 ok(pvarRes != NULL, "pvarRes == NULL\n");
1268 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1269 ok(pei != NULL, "pei == NULL\n");
1270
1271 V_VT(pvarRes) = VT_BSTR;
1272 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
1273 return S_OK;
1274
1276 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1277 ok(pdp != NULL, "pdp == NULL\n");
1278 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1279 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
1280 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1281 ok(pvarRes != NULL, "pvarRes == NULL\n");
1282 ok(pei != NULL, "pei == NULL\n");
1283
1284 V_VT(pvarRes) = VT_BOOL;
1285 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
1286 return S_OK;
1287
1289 V_VT(pvarRes) = VT_I4;
1290 V_I4(pvarRes) = MaxCharSize;
1291 return S_OK;
1292
1294 V_VT(pvarRes) = VT_I4;
1295 V_I4(pvarRes) = first_day_of_week;
1296 return S_OK;
1297
1299 CHECK_EXPECT(global_vbvar_i);
1300
1301 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1302 ok(pdp != NULL, "pdp == NULL\n");
1303 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1304 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1305 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1306 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1307 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1308 ok(!pvarRes, "pvarRes != NULL\n");
1309 ok(pei != NULL, "pei == NULL\n");
1310
1311 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1312 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1313 return S_OK;
1314
1316 CHECK_EXPECT(global_letobj_i);
1317
1318 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1319 ok(pdp != NULL, "pdp == NULL\n");
1320 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1321 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1322 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1323 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1324 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1325 ok(!pvarRes, "pvarRes != NULL\n");
1326 ok(pei != NULL, "pei == NULL\n");
1327
1328 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1329 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)&testObj, "V_DISPATCH(psp->rgvargs) != testObj\n");
1330 return S_OK;
1331
1333 CHECK_EXPECT(global_setobj_i);
1334
1335 ok(wFlags == DISPATCH_PROPERTYPUTREF, "wFlags = %x\n", wFlags);
1336 ok(pdp != NULL, "pdp == NULL\n");
1337 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1338 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1339 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1340 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1341 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1342 ok(!pvarRes, "pvarRes != NULL\n");
1343 ok(pei != NULL, "pei == NULL\n");
1344
1345 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1346 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)&testObj, "V_DISPATCH(psp->rgvargs) != testObj\n");
1347 return S_OK;
1348
1350 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1351
1352 ok(pdp != NULL, "pdp == NULL\n");
1353 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1354 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1355 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1356 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1357 ok(pvarRes != NULL, "pvarRes == NULL\n");
1358 ok(pei != NULL, "pei == NULL\n");
1359
1360 V_VT(pvarRes) = VT_DISPATCH;
1361 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1362 return S_OK;
1363
1365 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1366
1367 ok(pdp != NULL, "pdp == NULL\n");
1368 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1369 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1370 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1371 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1372 ok(pvarRes != NULL, "pvarRes == NULL\n");
1373 ok(pei != NULL, "pei == NULL\n");
1374
1375 V_VT(pvarRes) = VT_DISPATCH;
1376 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1377 return S_OK;
1378
1380 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1381
1382 ok(pdp != NULL, "pdp == NULL\n");
1383 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1384 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1385 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1386 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1387 ok(pvarRes != NULL, "pvarRes == NULL\n");
1388 ok(pei != NULL, "pei == NULL\n");
1389
1390 IDispatchEx_AddRef(&RefObj);
1391 V_VT(pvarRes) = VT_DISPATCH;
1392 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1393 return S_OK;
1394
1396 VARIANT *v;
1397
1398 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1399 ok(pdp != NULL, "pdp == NULL\n");
1400 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1401 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1402 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1403 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1404 ok(pvarRes != NULL, "pvarRes == NULL\n");
1405 ok(pei != NULL, "pei == NULL\n");
1406
1407 v = pdp->rgvarg;
1408 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1409 v = V_VARIANTREF(v);
1410
1411 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1412 V_VT(pvarRes) = VT_BOOL;
1413 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1414 return S_OK;
1415 }
1416
1418 ok(wFlags == 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(!pvarRes, "pvarRes != NULL\n");
1425 ok(pei != NULL, "pei == NULL\n");
1426
1427 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1428 test_disp(V_DISPATCH(pdp->rgvarg));
1429 return S_OK;
1430
1432 CHECK_EXPECT(global_propargput_i);
1433
1434 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1435 ok(pdp != NULL, "pdp == NULL\n");
1436 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1437 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1438 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1439 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1440 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1441 ok(!pvarRes, "pvarRes != NULL\n");
1442 ok(pei != NULL, "pei == NULL\n");
1443
1444 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1445 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1446
1447 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1448 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1449
1450 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1451 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1452 return S_OK;
1453
1455 CHECK_EXPECT(global_propargput1_i);
1456
1457 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1458 ok(pdp != NULL, "pdp == NULL\n");
1459 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1460 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1461 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1462 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1463 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1464 ok(!pvarRes, "pvarRes != NULL\n");
1465 ok(pei != NULL, "pei == NULL\n");
1466
1467 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1468 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1469
1470 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1471 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1472
1473 return S_OK;
1474
1476 CHECK_EXPECT(global_propargset_i);
1477
1478 ok(wFlags == DISPATCH_PROPERTYPUTREF, "wFlags = %x\n", wFlags);
1479 ok(pdp != NULL, "pdp == NULL\n");
1480 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1481 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1482 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1483 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1484 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1485 ok(!pvarRes, "pvarRes != NULL\n");
1486 ok(pei != NULL, "pei == NULL\n");
1487
1488 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1489 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)&testObj, "V_DISPATCH(psp->rgvargs) = %p\n", V_DISPATCH(pdp->rgvarg));
1490
1491 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1492 ok(V_I2(pdp->rgvarg+1) == 0, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1493
1494 return S_OK;
1495
1497 ok(pdp != NULL, "pdp == NULL\n");
1498 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1499 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1500 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1501 ok(pvarRes != NULL, "pvarRes == NULL\n");
1502 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1503 ok(pei != NULL, "pei == NULL\n");
1504
1505 V_VT(pvarRes) = VT_I2;
1506 V_I2(pvarRes) = test_counter++;
1507 return S_OK;
1508
1510 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1511 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1512 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1513 ok(pvarRes != NULL, "pvarRes == NULL\n");
1514
1515 V_VT(pvarRes) = VT_BSTR;
1516 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1517
1519 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1520 ok(pdp != NULL, "pdp == NULL\n");
1521 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1522 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1523 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1524 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1525 ok(!pvarRes, "pvarRes != NULL\n");
1526 ok(pei != NULL, "pei == NULL\n");
1527
1528 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1529 ok(V_VT(pdp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1530 ok(V_VT(V_VARIANTREF(pdp->rgvarg)) == (VT_ARRAY|VT_BYREF|VT_VARIANT),
1531 "V_VT(V_VARIANTREF(psp->rgvargs)) = %d\n", V_VT(V_VARIANTREF(pdp->rgvarg)));
1532 if(V_I2(pdp->rgvarg+1) == -1)
1533 ok(!*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)), "*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)) != NULL\n");
1534 else
1535 test_safearray(*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)), V_I2(pdp->rgvarg+1));
1536 return S_OK;
1537
1539 VARIANT *v = pdp->rgvarg;
1540 HRESULT hres;
1541
1542 ok((wFlags & ~INVOKE_PROPERTYGET) == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1543 ok(pdp != NULL, "pdp == NULL\n");
1544 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1545 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1546 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1547 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1548 ok(pei != NULL, "pei == NULL\n");
1549 if(pvarRes) {
1550 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1551 V_VT(pvarRes) = VT_BOOL;
1552 V_BOOL(pvarRes) = VARIANT_FALSE;
1553 }
1554
1555 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1556 v = V_VARIANTREF(v);
1557
1558 switch(V_VT(v)) {
1559 case VT_I2:
1560 hres = V_I2(v);
1561 break;
1562 case VT_I4:
1563 hres = V_I4(v);
1564 break;
1565 default:
1566 ok(0, "unexpected vt %d\n", V_VT(v));
1567 return E_INVALIDARG;
1568 }
1569
1570 return hres;
1571
1573 VARIANT *v = pdp->rgvarg + pdp->cArgs - 1;
1574
1575 ok((wFlags & ~INVOKE_PROPERTYGET) == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1576 ok(pdp != NULL, "pdp == NULL\n");
1577 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1578 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1579 ok(pdp->cArgs >= 1, "cArgs = %d\n", pdp->cArgs);
1580 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1581 ok(pei != NULL, "pei == NULL\n");
1582
1583 if(pvarRes) {
1584 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1585 V_VT(pvarRes) = VT_BOOL;
1586 V_BOOL(pvarRes) = VARIANT_FALSE;
1587 }
1588
1589 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1590 v = V_VARIANTREF(v);
1591
1592 memset(pei, 0, sizeof(*pei));
1593 switch(V_VT(v)) {
1594 case VT_I2:
1595 pei->scode = V_I2(v);
1596 break;
1597 case VT_I4:
1598 pei->scode = V_I4(v);
1599 break;
1600 default:
1601 ok(0, "unexpected vt %d\n", V_VT(v));
1602 return E_INVALIDARG;
1603 }
1604
1605 if(pdp->cArgs >= 2) {
1606 v = pdp->rgvarg + pdp->cArgs - 2;
1607 if(!(V_VT(v) == VT_ERROR && V_ERROR(v) == DISP_E_PARAMNOTFOUND)) /* != vtMissing */
1608 {
1609 ok(V_VT(v) == VT_BSTR, "v = %s\n", debugstr_variant(v));
1610 pei->bstrSource = SysAllocString(V_BSTR(v));
1611 }
1612 }
1613
1614 if(pdp->cArgs >= 3) {
1615 v = pdp->rgvarg + pdp->cArgs - 3;
1616 ok(V_VT(v) == VT_BSTR, "v = %s\n", debugstr_variant(v));
1617 pei->bstrDescription = SysAllocString(V_BSTR(v));
1618 }
1619
1620 return DISP_E_EXCEPTION;
1621 }
1622
1624 pei->scode = 0xdeadbeef;
1625 pei->bstrDescription = SysAllocString(L"test");
1626 pei->bstrHelpFile = SysAllocString(L"test.chm");
1627 pei->dwHelpContext = 10;
1628 return DISP_E_EXCEPTION;
1629 }
1630
1632 VARIANT *v;
1633 int opt;
1634
1635 CHECK_EXPECT(global_testoptionalarg_i);
1636
1637 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1638 ok(pdp != NULL, "pdp == NULL\n");
1639 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1640 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1641 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1642 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1643 ok(!pvarRes, "pvarRes != NULL\n");
1644 ok(pei != NULL, "pei == NULL\n");
1645
1646 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1647 opt = V_I2(pdp->rgvarg);
1648 ok(opt == 1 || opt == 2, "opt = %d\n", opt);
1649 v = pdp->rgvarg+pdp->cArgs-opt;
1650 ok(V_VT(v) == VT_ERROR, "V_VT(v) = %d\n", V_VT(v));
1651 ok(V_ERROR(v) == DISP_E_PARAMNOTFOUND, "V_ERROR(v) = %08lx\n", V_ERROR(v));
1652 return S_OK;
1653 }
1655 DISPPARAMS dp = {0};
1656 IDispatchEx *dispex;
1657 EXCEPINFO ei;
1658 VARIANT v;
1659 DISPID id;
1660 BSTR str;
1661 HRESULT hres;
1662
1663 CHECK_EXPECT(global_globalcallback_i);
1664 CHECK_CALLED(OnEnterScript);
1665
1666 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1667 ok(pdp != NULL, "pdp == NULL\n");
1668 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1669 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1670 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1671 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1672 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1673 ok(!pvarRes, "pvarRes != NULL\n");
1674 ok(pei != NULL, "pei == NULL\n");
1675
1676 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IDispatchEx, (void**)&dispex);
1677 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
1678
1679 str = SysAllocString(L"callback");
1680 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
1681 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
1683
1684 SET_EXPECT(OnEnterScript);
1685 SET_EXPECT(OnLeaveScript);
1686 memset(&ei, 0, sizeof(ei));
1687 hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_METHOD, &dp, &v, &ei, pspCaller);
1688 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
1689 CHECK_CALLED(OnEnterScript);
1690 CHECK_CALLED(OnLeaveScript);
1691 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
1692 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
1693
1694 IDispatchEx_Release(dispex);
1695
1696 SET_EXPECT(OnLeaveScript);
1697 return S_OK;
1698 }
1701 IDispatchEx *dispex;
1702 DISPPARAMS dp;
1703 VARIANT v, r;
1704 EXCEPINFO ei;
1705 IDispatch *disp;
1706 WCHAR *names[1];
1707 UINT count, i;
1708 DISPID id;
1709 HRESULT hres;
1710
1711 static WCHAR props[][32] = { L"clear", L"description", L"helpcontext", L"helpFILE", L"number", L"raise", L"source" };
1712
1713 CHECK_EXPECT(global_testerrorobject_i);
1714
1715 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1716 ok(pdp != NULL, "pdp == NULL\n");
1717 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1718 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1719 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1720 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1721 ok(!pvarRes, "pvarRes != NULL\n");
1722 ok(pei != NULL, "pei == NULL\n");
1723
1724 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1725 disp = V_DISPATCH(pdp->rgvarg);
1726 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1727 ok(hres == E_NOINTERFACE, "Could not get IDispatchEx iface: %08lx\n", hres);
1728
1729 hres = IDispatch_GetTypeInfoCount(disp, &count);
1730 ok(hres == S_OK, "GetTypeInfoCount returned: %08lx\n", hres);
1731 ok(count == 0, "count = %u\n", count);
1732
1733 hres = IDispatch_GetTypeInfo(disp, 0, 0, &typeinfo);
1734 ok(hres == DISP_E_BADINDEX, "GetTypeInfo returned: %08lx\n", hres);
1735
1736 for(i = 0; i < ARRAY_SIZE(props); i++) {
1737 names[0] = props[i];
1738 hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, names, 1, 0, &id);
1739 ok(hres == S_OK, "GetIDsOfNames failed: %08lx\n", hres);
1740 ok(id == i + 1, "%s id = %lu\n", wine_dbgstr_w(props[i]), id);
1741 }
1742
1743 memset(&dp, 0, sizeof(dp));
1744 memset(&ei, 0, sizeof(ei));
1745 V_VT(&v) = VT_ERROR;
1746 hres = IDispatch_Invoke(disp, 5, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
1747 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
1748 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
1749 ok(V_I4(&v) == 1, "V_I4(v) = %ld\n", V_I4(&v));
1750 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
1751 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
1752 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
1753 ok(V_I4(&v) == 1, "V_I4(v) = %ld\n", V_I4(&v));
1754
1755 dp.rgvarg = &v;
1756 V_VT(&v) = VT_I4;
1757 V_I4(&v) = 6;
1758 V_VT(&r) = VT_EMPTY;
1759 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 6, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dp, &r, &ei, NULL);
1760 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
1761 return S_OK;
1762 }
1764 V_VT(pvarRes) = VT_UNKNOWN;
1765 V_UNKNOWN(pvarRes) = &unkObj;
1766 return S_OK;
1767
1769 {
1771 VARIANT *v;
1772
1773 ok(pdp != NULL, "pdp == NULL\n");
1774 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1775 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1776 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1777 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1778 ok(pvarRes != NULL, "pvarRes == NULL\n");
1779 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1780 ok(pei != NULL, "pei == NULL\n");
1781
1782 ok(V_VT(pdp->rgvarg) == (VT_VARIANT|VT_BYREF), "Unexpected argument type %d.\n", V_VT(pdp->rgvarg));
1783 v = V_VARIANTREF(pdp->rgvarg);
1784 ok(V_VT(v) == (VT_VARIANT|VT_ARRAY|VT_BYREF), "Unexpected argument type %d.\n", V_VT(v));
1785 if (V_ISARRAY(v))
1786 {
1788 is_fixed = (sa->fFeatures & (FADF_FIXEDSIZE | FADF_STATIC)) == (FADF_FIXEDSIZE | FADF_STATIC);
1789 }
1790
1791 V_VT(pvarRes) = VT_BOOL;
1792 V_BOOL(pvarRes) = is_fixed ? VARIANT_TRUE : VARIANT_FALSE;
1793 return S_OK;
1794 }
1795 }
1796
1797 ok(0, "unexpected call %ld\n", id);
1798 return DISP_E_MEMBERNOTFOUND;
1799}
1800
1801static IDispatchExVtbl GlobalVtbl = {
1817};
1818
1820
1822{
1823 ok(0, "unexpected call\n");
1824 return E_NOINTERFACE;
1825}
1826
1828{
1829 return 2;
1830}
1831
1833{
1834 return 1;
1835}
1836
1838{
1839 if(!allow_ui)
1841 *phwnd = NULL;
1842 return S_OK;
1843}
1844
1846{
1847 if(allow_ui)
1848 return S_OK;
1849
1851 ok(!fEnable, "fEnable = %x\n", fEnable);
1852 return E_FAIL;
1853}
1854
1855static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
1861};
1862
1864
1866{
1867 ok(0, "unexpected call\n");
1868 return E_NOINTERFACE;
1869}
1870
1872{
1873 return 2;
1874}
1875
1877{
1878 return 1;
1879}
1880
1882 SCRIPTUICHANDLING *pUicHandling)
1883{
1884 if(!allow_ui) {
1885 CHECK_EXPECT(GetUIBehavior);
1886 ok(UicItem == SCRIPTUICITEM_MSGBOX, "UidItem = %d\n", UicItem);
1887 }
1888 *pUicHandling = uic_handling;
1889 return S_OK;
1890}
1891
1892static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl = {
1897};
1898
1900
1902{
1903 *ppv = NULL;
1904
1906 *ppv = iface;
1907 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1908 *ppv = iface;
1909 else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid))
1911 else if(IsEqualGUID(&IID_IActiveScriptSiteUIControl, riid))
1913 else
1914 return E_NOINTERFACE;
1915
1916 IUnknown_AddRef((IUnknown*)*ppv);
1917 return S_OK;
1918}
1919
1921{
1922 return 2;
1923}
1924
1926{
1927 return 1;
1928}
1929
1931{
1932 *plcid = GetUserDefaultLCID();
1933 return S_OK;
1934}
1935
1937 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1938{
1939 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %lx\n", dwReturnMask);
1940 ok(!ppti, "ppti != NULL\n");
1941
1942 if(lstrcmpW(pstrName, L"test"))
1943 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1944
1945 *ppiunkItem = (IUnknown*)&Global;
1946 IUnknown_AddRef(*ppiunkItem);
1947 return S_OK;
1948}
1949
1951{
1952 return E_NOTIMPL;
1953}
1954
1956 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1957{
1958 return E_NOTIMPL;
1959}
1960
1962{
1963 return E_NOTIMPL;
1964}
1965
1969
1971{
1973
1974 hres = IActiveScriptError_GetSourcePosition(pscripterror, NULL, &error_line, &error_char);
1975 ok(hres == S_OK, "GetSourcePosition failed: %08lx\n", hres);
1976
1977 if(!expect_OnScriptError) {
1978 EXCEPINFO info;
1979
1980 hres = IActiveScriptError_GetExceptionInfo(pscripterror, &info);
1981 if(SUCCEEDED(hres))
1982 trace("Error in line %lu: %x %s\n", error_line + 1, info.wCode, wine_dbgstr_w(info.bstrDescription));
1983 }else {
1984 IDispatchEx *dispex;
1985
1986 hres = IActiveScriptError_QueryInterface(pscripterror, &IID_IDispatchEx, (void**)&dispex);
1987 ok(hres == E_NOINTERFACE, "QI(IDispatchEx) returned: %08lx\n", hres);
1988 }
1989
1990 if(store_script_error) {
1991 IActiveScriptError_AddRef(pscripterror);
1992 *store_script_error = pscripterror;
1994 }
1995
1996 CHECK_EXPECT(OnScriptError);
1998
1999 return hr;
2000}
2001
2003{
2005 CHECK_EXPECT(OnEnterScript);
2006 return E_NOTIMPL;
2007}
2008
2010{
2012 CHECK_EXPECT(OnLeaveScript);
2013 return E_NOTIMPL;
2014}
2015
2016static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
2028};
2029
2031
2033{
2035 HRESULT hres;
2036
2037 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2038 &IID_IActiveScript, (void**)&script);
2039 ok(hres == S_OK, "CoCreateInstance failed: %08lx\n", hres);
2040
2041 return script;
2042}
2043
2045{
2046 IActiveScriptParse *parser;
2047 IActiveScript *engine;
2048 HRESULT hres;
2049
2050 engine = create_script();
2051 if(!engine)
2052 return NULL;
2053
2054 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2055 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2056
2058 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2059
2061
2062 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2063 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2064
2065 hres = IActiveScript_AddNamedItem(engine, L"test",
2066 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
2067 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2068
2069 if (start)
2070 {
2071 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2072 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2073 }
2074
2075 return engine;
2076}
2077
2079{
2080 ULONG ref;
2081 HRESULT hres;
2082
2083 hres = IActiveScript_Close(script);
2084 ok(hres == S_OK, "Close failed: %08lx\n", hres);
2085
2086 ref = IActiveScript_Release(script);
2087 ok(!ref, "ref=%lu\n", ref);
2088}
2089
2090static HRESULT parse_script(DWORD flags, BSTR script_str, const WCHAR *delim)
2091{
2092 IActiveScriptParse *parser;
2093 IActiveScript *engine;
2095 HRESULT hres;
2096
2098 if(!engine)
2099 return S_OK;
2100
2101 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2102 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2103 if (FAILED(hres))
2104 {
2105 IActiveScript_Release(engine);
2106 return hres;
2107 }
2108
2109 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
2110 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
2111 ok(script_disp != NULL, "script_disp == NULL\n");
2112 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
2113
2114 test_counter = 0;
2115
2116 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, delim, 0, 0, 0, NULL, NULL);
2117
2118 IDispatch_Release(script_disp);
2120 close_script(engine);
2121
2122 return hres;
2123}
2124
2126{
2127 BSTR tmp;
2128 HRESULT hres;
2129
2130 tmp = SysAllocString(src);
2131 hres = parse_script(flags, tmp, NULL);
2132 SysFreeString(tmp);
2133 ok(hres == S_OK, "parse_script failed: %08lx\n", hres);
2134}
2135
2137{
2138 BSTR tmp;
2139 HRESULT hres;
2140
2141 tmp = SysAllocString(src);
2142 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, NULL);
2143 SysFreeString(tmp);
2144 return hres;
2145}
2146
2147static void test_parse_context(void)
2148{
2149 IActiveScriptParse *parser;
2150 IActiveScript *engine;
2151 BSTR str;
2152 HRESULT hres;
2153
2154 global_ref = 1;
2155 engine = create_and_init_script(0, TRUE);
2156 if(!engine)
2157 return;
2158
2159 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2160 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2161
2162 /* NULL code text succeeds but does nothing */
2164 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2165
2166 /* unknown identifier context is not a valid argument */
2167 str = SysAllocString(L"Call reportSuccess()\n");
2169 ok(hres == E_INVALIDARG, "ParseScriptText failed: %08lx\n", hres);
2171
2172 str = SysAllocString(L"class Cl\n"
2173 " Public Sub ClMethod\n"
2174 " Call reportSuccess()\n"
2175 " End Sub\n"
2176 "End Class\n"
2177 "Dim x\n"
2178 "set x = new Cl\n");
2180 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2182
2183 /* known global variable is not a valid context */
2184 str = SysAllocString(L"Call reportSuccess()\n");
2186 ok(hres == E_INVALIDARG, "ParseScriptText failed: %08lx\n", hres);
2188
2189 SET_EXPECT(global_success_d);
2190 SET_EXPECT(global_success_i);
2191 str = SysAllocString(L"Call reportSuccess()\n");
2193 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2195 CHECK_CALLED(global_success_d);
2196 CHECK_CALLED(global_success_i);
2197
2199 close_script(engine);
2200 ok(global_ref == 1, "global_ref = %lu\n", global_ref);
2201}
2202
2203static void parse_script_w(const WCHAR *src)
2204{
2205 parse_script_wf(SCRIPTITEM_GLOBALMEMBERS, src);
2206}
2207
2208#define parse_htmlscript(a) _parse_htmlscript(__LINE__,a)
2209static void _parse_htmlscript(unsigned line, const WCHAR *src)
2210{
2211 BSTR tmp;
2212 HRESULT hres;
2213
2214 tmp = SysAllocString(src);
2215 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp, L"</SCRIPT>");
2216 SysFreeString(tmp);
2217 ok_(__FILE__,line)(hres == S_OK, "parse_script failed: %08lx\n", hres);
2218}
2219
2220static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const WCHAR *src, DWORD flags)
2221{
2222 IDispatchEx *dispex;
2223 IDispatch *disp;
2224 BSTR str;
2225 HRESULT hres;
2226
2229 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS|flags, &disp);
2231 ok(hres == S_OK, "ParseProcedureText failed: %08lx\n", hres);
2232 ok(disp != NULL, "disp = NULL\n");
2233
2234 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
2235 IDispatch_Release(disp);
2236 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
2237
2238 return dispex;
2239}
2240
2241
2242static void test_procedures(void)
2243{
2244 IActiveScriptParseProcedure2 *parse_proc;
2245 DISPPARAMS dp = {NULL};
2248 IDispatch *disp;
2249 EXCEPINFO ei = {0};
2250 VARIANT v;
2251 HRESULT hres;
2252
2255
2256 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
2257 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08lx\n", hres);
2258
2259 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, NULL, NULL, L"", NULL, NULL, NULL, 0, 0, 0, &disp);
2260 ok(hres == S_OK, "ParseProcedureText failed: %08lx\n", hres);
2261 IDispatch_Release(disp);
2262
2263 proc = parse_procedure(parse_proc, L"dim x\nif true then x=false", 0);
2264
2265 SET_EXPECT(OnEnterScript);
2266 SET_EXPECT(OnLeaveScript);
2267 V_VT(&v) = VT_EMPTY;
2268 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
2269 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
2270 CHECK_CALLED(OnEnterScript);
2271 CHECK_CALLED(OnLeaveScript);
2272 VariantClear(&v);
2273 IDispatchEx_Release(proc);
2274
2275 proc = parse_procedure(parse_proc, L"\"foobar\"", SCRIPTPROC_ISEXPRESSION);
2276
2277 SET_EXPECT(OnEnterScript);
2278 SET_EXPECT(OnLeaveScript);
2279 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
2280 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
2281 CHECK_CALLED(OnEnterScript);
2282 CHECK_CALLED(OnLeaveScript);
2283 ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR, got %s\n", vt2a(&v));
2284 ok(!lstrcmpW(V_BSTR(&v), L"foobar"), "Wrong string, got %s\n", wine_dbgstr_w(V_BSTR(&v)));
2285 VariantClear(&v);
2286 IDispatchEx_Release(proc);
2287
2289
2292}
2293
2294static void free_ei(EXCEPINFO *ei)
2295{
2296 SysFreeString(ei->bstrSource);
2297 SysFreeString(ei->bstrDescription);
2298 SysFreeString(ei->bstrHelpFile);
2299}
2300
2301static void test_callbacks(void)
2302{
2304 IActiveScriptParse *parser;
2305 DISPPARAMS dp = {NULL};
2307 IDispatchEx *dispex;
2308 IDispatch *disp;
2309 DISPID id;
2310 EXCEPINFO ei = {0};
2311 BSTR str;
2312 VARIANT v;
2313 HRESULT hres;
2314
2316 script = create_and_init_script(SCRIPTITEM_GLOBALMEMBERS, TRUE);
2317
2318 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
2319 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08lx\n", hres);
2320
2321 SET_EXPECT(OnEnterScript);
2322 SET_EXPECT(OnLeaveScript);
2324 L"class CallbackClass\n"
2325 L" public function callback()\n"
2326 L" call ok(err.number = 2, \"err.number = \" & err.number)\n"
2327 L" callback = true\n"
2328 L" end function\n"
2329 L"end class\n"
2330 L"function callGlobalCallback()\n"
2331 L" on error resume next\n"
2332 L" err.raise 2\n"
2333 L" call test.globalCallback(new CallbackClass)\n"
2334 L" call ok(err.number = 2, \"err.number = \" & err.number)\n"
2335 L"end function\n",
2336 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2337 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2338 CHECK_CALLED(OnEnterScript);
2339 CHECK_CALLED(OnLeaveScript);
2340
2341 hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
2342 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
2343
2344 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
2345 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
2346 IDispatch_Release(disp);
2347
2348 str = SysAllocString(L"callGlobalCallback");
2349 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
2350 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
2352
2353 SET_EXPECT(OnEnterScript);
2354 /* OnLeaveScript will be set in global callback */
2355 SET_EXPECT(global_globalcallback_i);
2356 hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
2357 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
2358 /* OnEnterScript was checked in global callback */
2359 CHECK_CALLED(OnLeaveScript);
2360 CHECK_CALLED(global_globalcallback_i);
2361
2363
2364 SET_EXPECT(OnEnterScript);
2365 SET_EXPECT(OnLeaveScript);
2366 SET_EXPECT(OnScriptError);
2368 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2369 ok(hres == MAKE_VBSERROR(2), "ParseScriptText failed: %08lx\n", hres);
2370 CHECK_CALLED(OnEnterScript);
2371 CHECK_CALLED(OnLeaveScript);
2372 CHECK_CALLED(OnScriptError);
2373
2375
2376 SET_EXPECT(OnEnterScript);
2377 SET_EXPECT(OnLeaveScript);
2378 SET_EXPECT(OnScriptError);
2380 L"call ok(err.number = 0, \"err.number = \" & err.number)\n"
2381 L"err.raise &h86664004&, \"src\", \"desc\", \"help\", 1\n",
2382 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2383 ok(hres == SCRIPT_E_RECORDED, "ParseScriptText failed: %08lx\n", hres);
2384 CHECK_CALLED(OnEnterScript);
2385 CHECK_CALLED(OnLeaveScript);
2386 CHECK_CALLED(OnScriptError);
2387
2388 memset(&ei, 0xcc, sizeof(ei));
2389 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2390 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2391 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2392 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2393 if(is_english) {
2394 ok(!wcscmp(ei.bstrSource, L"Microsoft VBScript runtime error"),
2395 "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2396 ok(!wcscmp(ei.bstrDescription, L"Unknown runtime error"),
2397 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2398 }
2399 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2400 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2401 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2402 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2403 ok(ei.scode == MAKE_VBSERROR(2), "scode = %lx\n", ei.scode);
2404 free_ei(&ei);
2405
2406 IActiveScriptError_Release(error1);
2407
2408 memset(&ei, 0xcc, sizeof(ei));
2409 hres = IActiveScriptError_GetExceptionInfo(error2, &ei);
2410 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2411 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2412 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2413 ok(!wcscmp(ei.bstrSource, L"src"), "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2414 ok(!wcscmp(ei.bstrDescription, L"desc"), "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2415 ok(!wcscmp(ei.bstrHelpFile, L"help"), "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2416 ok(ei.dwHelpContext == 1, "dwHelpContext = %lx\n", ei.dwHelpContext);
2417 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2418 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2419 ok(ei.scode == SCRIPT_E_RECORDED, "scode = %lx\n", ei.scode);
2420 free_ei(&ei);
2421
2422 IActiveScriptError_Release(error2);
2423
2424 SET_EXPECT(OnEnterScript);
2425 SET_EXPECT(OnLeaveScript);
2426 SET_EXPECT(OnScriptError);
2427 hres = IActiveScriptParse_ParseScriptText(parser, L"err.raise &hffff&\n",
2428 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2429 ok(hres == MAKE_VBSERROR(0xffff), "ParseScriptText failed: %08lx\n", hres);
2430 CHECK_CALLED(OnEnterScript);
2431 CHECK_CALLED(OnLeaveScript);
2432 CHECK_CALLED(OnScriptError);
2433
2434 SET_EXPECT(OnEnterScript);
2435 SET_EXPECT(OnLeaveScript);
2436 SET_EXPECT(OnScriptError);
2437 hres = IActiveScriptParse_ParseScriptText(parser, L"err.raise &h80102030&\n",
2438 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2439 ok(hres == 0x80102030, "ParseScriptText failed: %08lx\n", hres);
2440 CHECK_CALLED(OnEnterScript);
2441 CHECK_CALLED(OnLeaveScript);
2442 CHECK_CALLED(OnScriptError);
2443
2444 SET_EXPECT(OnEnterScript);
2445 SET_EXPECT(global_testerrorobject_i);
2446 SET_EXPECT(OnLeaveScript);
2448 L"on error resume next\n"
2449 L"err.raise 1\n"
2450 L"testErrorObject err\n",
2451 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2452 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2453 CHECK_CALLED(OnEnterScript);
2454 CHECK_CALLED(global_testerrorobject_i);
2455 CHECK_CALLED(OnLeaveScript);
2456
2457 IDispatchEx_Release(dispex);
2458
2462
2464 SET_EXPECT(OnScriptError);
2465 hres = parse_script_wr(L"throwException &h80004002&");
2466 ok(hres == MAKE_VBSERROR(430), "got error: %08lx\n", hres);
2467 CHECK_CALLED(OnScriptError);
2468
2469 memset(&ei, 0xcc, sizeof(ei));
2470 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2471 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2472 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2473 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2474 if(is_english) {
2475 ok(!wcscmp(ei.bstrSource, L"Microsoft VBScript runtime error"),
2476 "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2477 ok(!wcscmp(ei.bstrDescription, L"Class doesn't support Automation"),
2478 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2479 }
2480 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2481 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2482 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2483 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2484 ok(ei.scode == MAKE_VBSERROR(430), "scode = %lx\n", ei.scode);
2485 free_ei(&ei);
2486
2487 IActiveScriptError_Release(error1);
2488
2490 SET_EXPECT(OnScriptError);
2491 hres = parse_script_wr(L"throwException &h80004002&, \"test src\"");
2492 ok(hres == MAKE_VBSERROR(430), "got error: %08lx\n", hres);
2493 CHECK_CALLED(OnScriptError);
2494
2495 memset(&ei, 0xcc, sizeof(ei));
2496 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2497 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2498 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2499 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2500 if(is_english) {
2501 ok(!wcscmp(ei.bstrSource, L"test src"), "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2502 ok(!wcscmp(ei.bstrDescription, L"Class doesn't support Automation"),
2503 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2504 }
2505 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2506 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2507 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2508 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2509 ok(ei.scode == MAKE_VBSERROR(430), "scode = %lx\n", ei.scode);
2510 free_ei(&ei);
2511
2512 IActiveScriptError_Release(error1);
2513
2515 SET_EXPECT(OnScriptError);
2516 hres = parse_script_wr(L"throwException &h80004002&, , \"test desc\"");
2517 ok(hres == E_NOINTERFACE, "got error: %08lx\n", hres);
2518 CHECK_CALLED(OnScriptError);
2519
2520 memset(&ei, 0xcc, sizeof(ei));
2521 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2522 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2523 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2524 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2525 if(is_english) {
2526 ok(!ei.bstrSource, "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2527 ok(!wcscmp(ei.bstrDescription, L"test desc"),
2528 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2529 }
2530 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2531 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2532 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2533 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2534 ok(ei.scode == E_NOINTERFACE, "scode = %lx\n", ei.scode);
2535 free_ei(&ei);
2536
2537 IActiveScriptError_Release(error1);
2538
2540 SET_EXPECT(OnScriptError);
2541 hres = parse_script_wr(L"throwException &h80004002&, \"test src\", \"test desc\"");
2542 ok(hres == E_NOINTERFACE, "got error: %08lx\n", hres);
2543 CHECK_CALLED(OnScriptError);
2544
2545 memset(&ei, 0xcc, sizeof(ei));
2546 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2547 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2548 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2549 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2550 if(is_english) {
2551 ok(!wcscmp(ei.bstrSource, L"test src"), "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2552 ok(!wcscmp(ei.bstrDescription, L"test desc"),
2553 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2554 }
2555 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2556 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2557 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2558 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2559 ok(ei.scode == E_NOINTERFACE, "scode = %lx\n", ei.scode);
2560 free_ei(&ei);
2561
2562 IActiveScriptError_Release(error1);
2563
2565 SET_EXPECT(OnScriptError);
2566 hres = parse_script_wr(L"throwException &h8000FFFF&");
2567 ok(hres == E_UNEXPECTED, "got error: %08lx\n", hres);
2568 CHECK_CALLED(OnScriptError);
2569
2570 memset(&ei, 0xcc, sizeof(ei));
2571 hres = IActiveScriptError_GetExceptionInfo(error1, &ei);
2572 ok(hres == S_OK, "GetExceptionInfo returned %08lx\n", hres);
2573 ok(!ei.wCode, "wCode = %x\n", ei.wCode);
2574 ok(!ei.wReserved, "wReserved = %x\n", ei.wReserved);
2575 if(is_english) {
2576 ok(!ei.bstrSource,
2577 "bstrSource = %s\n", wine_dbgstr_w(ei.bstrSource));
2578 ok(!ei.bstrDescription,
2579 "bstrDescription = %s\n", wine_dbgstr_w(ei.bstrDescription));
2580 }
2581 ok(!ei.bstrHelpFile, "bstrHelpFile = %s\n", wine_dbgstr_w(ei.bstrHelpFile));
2582 ok(!ei.dwHelpContext, "dwHelpContext = %lx\n", ei.dwHelpContext);
2583 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2584 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2585 ok(ei.scode == E_UNEXPECTED, "scode = %lx\n", ei.scode);
2586 free_ei(&ei);
2587
2588 IActiveScriptError_Release(error1);
2589}
2590
2591static void test_gc(void)
2592{
2593 IActiveScriptParse *parser;
2594 IActiveScript *engine;
2595 BSTR src;
2596 HRESULT hres;
2597
2599
2600 engine = create_script();
2601 if(!engine)
2602 return;
2603
2604 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2605 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2606
2608 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2609
2610 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2611 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2612
2613 hres = IActiveScript_AddNamedItem(engine, L"test",
2614 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2615 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2616
2617 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2618 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2619
2621 L"class C\n"
2622 " Public ref\n"
2623 " Public Sub Class_Terminate\n"
2624 " Call reportSuccess()\n"
2625 " End Sub\n"
2626 "End Class\n"
2627 "Dim x\n"
2628 "set x = new C\n"
2629 "set x.ref = x\n"
2630 "set x = nothing\n");
2631
2633 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2635
2636 SET_EXPECT(global_success_d);
2637 SET_EXPECT(global_success_i);
2638 hres = IActiveScript_Close(engine);
2639 ok(hres == S_OK, "Close failed: %08lx\n", hres);
2640 CHECK_CALLED(global_success_d);
2641 CHECK_CALLED(global_success_i);
2642
2643 IActiveScript_Release(engine);
2645}
2646
2647static void test_parse_errors(void)
2648{
2649 static const struct
2650 {
2651 const WCHAR *src;
2652 unsigned error_line;
2653 int error_char;
2654 }
2655 invalid_scripts[] =
2656 {
2657 {
2658 /* If...End If */
2659 L"If 0 > 1 Then\n"
2660 " x = 0 End If\n",
2661 1, 10
2662 },
2663 {
2664 /* While...End While */
2665 L"While False\n"
2666 " x = 0 End While\n",
2667 1, 10
2668 },
2669 {
2670 /* While...Wend */
2671 L"While False\n"
2672 " x = 0 Wend\n",
2673 1, 10
2674 },
2675 {
2676 /* Do While...Loop */
2677 L"Do While False\n"
2678 " x = 0 Loop\n",
2679 1, 10
2680 },
2681 {
2682 /* Do Until...Loop */
2683 L"Do Until True\n"
2684 " x = 0 Loop\n",
2685 1, 10
2686 },
2687 {
2688 /* Do...Loop While */
2689 L"Do\n"
2690 " x = 0 Loop While False\n",
2691 1, 10
2692 },
2693 {
2694 /* Do...Loop Until */
2695 L"Do\n"
2696 " x = 0 Loop Until True\n",
2697 1, 10
2698 },
2699 {
2700 /* Select...End Select */
2701 L"x = False\n"
2702 "Select Case 42\n"
2703 " Case 0\n"
2704 " Call ok(False, \"unexpected case\")\n"
2705 " Case 42\n"
2706 " x = True End Select\n"
2707 "Call ok(x, \"wrong case\")\n",
2708 5, 17
2709 },
2710 {
2711 /* Class...End Class (empty) */
2712 L"Class C End Class",
2713 0, 8
2714 },
2715 {
2716 /* Class...End Class (empty) */
2717 L"Class C _\nEnd Class",
2718 1, 0
2719 },
2720 {
2721 /* invalid use of parentheses for call statement */
2722 L"strcomp(\"x\", \"y\")",
2723 0, -17
2724 },
2725 {
2726 L"\n\n\n cint _\n throwInt(&h80001234&)",
2727 3, 2
2728 },
2729 {
2730 L"dim x\n"
2731 "if true then throwInt(&h80001234&)",
2732 1, 13
2733 },
2734 {
2735 L"dim x\n"
2736 "if x = throwInt(&h80001234&) then x = 1",
2737 1, 0
2738 },
2739 {
2740 L"sub test\n"
2741 " dim x\n"
2742 " if x = throwInt(&h80001234&) then x = 1\n"
2743 "end sub\n"
2744 "test\n",
2745 2, 4
2746 },
2747 {
2748 L"dim x\n"
2749 "do\n"
2750 " x = 1\n"
2751 "loop until throwInt(&h80001234&)\n",
2752 3, 0
2753 },
2754 {
2755 L"\n select case 3\n"
2756 " case 2\n"
2757 " ok false, \"unexpected case\"\n"
2758 " case throwInt(&h80001234&)\n"
2759 " throwInt &h87001234&\n"
2760 "end select\n",
2761 1, 2
2762 },
2763 {
2764 L"if false then\n"
2765 " ok false, \"unexpected case\"\n"
2766 " elseif throwInt(&h80001234&) then\n"
2767 " throwInt &h87001234&\n"
2768 "else\n"
2769 " throwInt &h87001234&\n"
2770 "end if\n",
2771 2, 1
2772 }
2773 };
2774 HRESULT hres;
2775 UINT i;
2776
2777 for (i = 0; i < ARRAY_SIZE(invalid_scripts); i++)
2778 {
2779 error_line = ~0;
2780 error_char = -1;
2782
2783 SET_EXPECT(OnScriptError);
2784 hres = parse_script_wr(invalid_scripts[i].src);
2785 ok(hres == SCRIPT_E_REPORTED, "[%u] script returned: %08lx\n", i, hres);
2786 CHECK_CALLED(OnScriptError);
2787
2788 ok(error_line == invalid_scripts[i].error_line, "[%u] error line %lu expected %u\n",
2789 i, error_line, invalid_scripts[i].error_line);
2790 todo_wine_if(invalid_scripts[i].error_char < 0)
2791 ok(error_char == abs(invalid_scripts[i].error_char), "[%u] error char %ld expected %d\n",
2792 i, error_char, invalid_scripts[i].error_char);
2793 }
2794}
2795
2796static void test_msgbox(void)
2797{
2798 HRESULT hres;
2799
2801
2802 SET_EXPECT(GetUIBehavior);
2805 hres = parse_script_wr(L"MsgBox \"testing...\"");
2806 CLEAR_CALLED(GetUIBehavior);
2809 if(FAILED(hres)) {
2810 win_skip("Skipping MsgBox tests, broken (probably too old) vbscript\n");
2811 return;
2812 }
2813
2814 SET_EXPECT(GetUIBehavior);
2815 parse_script_w(L"dim r\n r=MsgBox(\"testing...\")\n Call ok(r=0, \"r=\"&r)");
2816 CHECK_CALLED(GetUIBehavior);
2817
2818 SET_EXPECT(GetUIBehavior);
2819 parse_script_w(L"MsgBox 10");
2820 CHECK_CALLED(GetUIBehavior);
2821
2823
2824 SET_EXPECT(GetUIBehavior);
2827 SET_EXPECT(OnScriptError);
2828 hres = parse_script_wr(L"MsgBox \"testing...\"");
2829 ok(FAILED(hres), "script not failed\n");
2830 CHECK_CALLED(GetUIBehavior);
2833 CHECK_CALLED(OnScriptError);
2834
2836
2837 SET_EXPECT(GetUIBehavior);
2838 SET_EXPECT(OnScriptError);
2839 hres = parse_script_wr(L"MsgBox \"testing...\"");
2840 ok(FAILED(hres), "script not failed\n");
2841 CHECK_CALLED(GetUIBehavior);
2842 CHECK_CALLED(OnScriptError);
2843}
2844
2846{
2847 IActiveScriptParse *parser;
2848 IActiveScript *engine;
2849 BSTR script_str;
2850 LONG ref;
2851 HRESULT hres;
2852
2853 engine = create_script();
2854 if(!engine)
2855 return S_OK;
2856
2857 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2858 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2859 if (FAILED(hres))
2860 {
2861 IActiveScript_Release(engine);
2862 return hres;
2863 }
2864
2866 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2867
2868 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2869 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2870
2871 hres = IActiveScript_AddNamedItem(engine, L"test", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2872 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2873
2874 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2875 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2876
2877 refobj_ref = 0;
2878
2879 script_str = SysAllocString(L"Dim x\nset x = RefObj\n");
2880 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2881 SysFreeString(script_str);
2882
2883 ok(refobj_ref, "refobj_ref = 0\n");
2884
2885 if(use_close) {
2886 hres = IActiveScript_Close(engine);
2887 ok(hres == S_OK, "Close failed: %08lx\n", hres);
2888 }else {
2889 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
2890 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2891 }
2892
2893 ok(!refobj_ref, "refobj_ref = %ld\n", refobj_ref);
2894
2895 IActiveScript_Release(engine);
2896
2898 ok(!ref, "ref=%ld\n", ref);
2899 return hres;
2900}
2901
2902static void test_isexpression(void)
2903{
2904 IActiveScriptParse *parser;
2905 IActiveScript *engine;
2906 IDispatch *disp;
2908 HRESULT hres;
2909 VARIANT var;
2910 BSTR str;
2911
2912 if (!(engine = create_and_init_script(0, FALSE)))
2913 return;
2914
2915 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2916 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2917 if (FAILED(hres))
2918 {
2919 close_script(engine);
2920 return;
2921 }
2922
2923 /* Expression when script is not started is still executed */
2924 hres = IActiveScript_GetScriptState(engine, &ss);
2925 ok(hres == S_OK, "GetScriptState failed: %08lx\n", hres);
2926 ok(ss == SCRIPTSTATE_INITIALIZED, "Wrong script state %u\n", ss);
2927
2928 str = SysAllocString(L"13");
2929 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2930 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2931 ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var));
2932 ok(V_I2(&var) == 13, "Expected 13, got %d\n", V_I2(&var));
2933 VariantClear(&var);
2935
2936 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2937 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2938
2939 /* Empty expressions */
2940 V_VT(&var) = VT_I2;
2941 str = SysAllocString(L"");
2942 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2943 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2944 ok(V_VT(&var) == VT_EMPTY, "Expected VT_EMPTY, got %s\n", vt2a(&var));
2945 VariantClear(&var);
2947
2948 /* Two expressions fail */
2949 str = SysAllocString(L"1\n3");
2950 SET_EXPECT(OnScriptError);
2951 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2952 ok(FAILED(hres), "ParseScriptText did not fail: %08lx\n", hres);
2953 CHECK_CALLED(OnScriptError);
2954 VariantClear(&var);
2956
2957 /* Simple numerical expression */
2958 str = SysAllocString(L"(1 + 7) * 2 - 3");
2959 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, NULL, NULL);
2960 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2961
2962 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2963 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2964 ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var));
2965 ok(V_I2(&var) == 13, "Expected 13, got %d\n", V_I2(&var));
2966 VariantClear(&var);
2968
2969 /* Without a global host or named item context, "me" returns the script dispatch */
2970 hres = IActiveScript_GetScriptDispatch(engine, NULL, &disp);
2971 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
2972 str = SysAllocString(L"me");
2973 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2974 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2975 ok(V_VT(&var) == VT_DISPATCH, "Expected VT_DISPATCH, got %s\n", vt2a(&var));
2976 ok(V_DISPATCH(&var) == disp, "Wrong dispatch returned for 'me'\n");
2977 IDispatch_Release(disp);
2978 VariantClear(&var);
2980
2981 /* An expression can also refer to a variable, function, class, etc previously set */
2982 V_VT(&var) = VT_I2;
2983 str = SysAllocString(L"If True Then foo = 42 Else foo = 0\n");
2985 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2986 ok(V_VT(&var) == VT_EMPTY, "Expected VT_EMPTY, got %s\n", vt2a(&var));
2987 VariantClear(&var);
2989
2990 str = SysAllocString(L"foo\n\n");
2991 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
2992 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2993 ok(V_VT(&var) == VT_I2, "Expected VT_I2, got %s\n", vt2a(&var));
2994 ok(V_I2(&var) == 42, "Expected 42, got %d\n", V_I2(&var));
2995 VariantClear(&var);
2997
2998 str = SysAllocString(L"foo : ");
2999 SET_EXPECT(OnScriptError);
3000 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
3001 ok(FAILED(hres), "ParseScriptText did not fail: %08lx\n", hres);
3002 CHECK_CALLED(OnScriptError);
3003 VariantClear(&var);
3005
3006 str = SysAllocString(L"\"foo is \" & CStr(foo) \n \n\n ");
3007 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
3008 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3009 ok(V_VT(&var) == VT_BSTR, "Expected VT_BSTR, got %s\n", vt2a(&var));
3010 ok(!lstrcmpW(V_BSTR(&var), L"foo is 42"), "Wrong string, got %s\n", wine_dbgstr_w(V_BSTR(&var)));
3011 VariantClear(&var);
3013
3014 str = SysAllocString(L"Function test(x)\n"
3015 " test = x + 0.5\n"
3016 "End Function\n");
3018 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3020
3021 str = SysAllocString(L"test(4) * 3\n");
3022 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
3023 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3024 ok(V_VT(&var) == VT_R8, "Expected VT_R8, got %s\n", vt2a(&var));
3025 ok(V_R8(&var) == 13.5, "Expected %lf, got %lf\n", 13.5, V_R8(&var));
3026 VariantClear(&var);
3028
3029 str = SysAllocString(L"Class C\n"
3030 " Public x\n"
3031 "End Class\n"
3032 "Set obj = New C\n"
3033 "obj.x = True\n");
3035 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3037
3038 str = SysAllocString(L"obj.x");
3039 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
3040 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3041 ok(V_VT(&var) == VT_BOOL, "Expected VT_BOOL, got %s\n", vt2a(&var));
3042 ok(V_BOOL(&var) == VARIANT_TRUE, "Expected %x, got %x\n", VARIANT_TRUE, V_BOOL(&var));
3043 VariantClear(&var);
3045
3047 close_script(engine);
3048}
3049
3050static void test_multiple_parse(void)
3051{
3052 IActiveScriptParse *parser;
3054 HRESULT hres;
3055
3056 script = create_and_init_script(SCRIPTITEM_GLOBALMEMBERS, TRUE);
3057
3058 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
3059 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08lx\n", hres);
3060
3062 L"function duplicatedfunc\n"
3063 L" ok false, \"duplicatedfunc called\"\n"
3064 L"end function\n",
3065 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
3066 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3067
3069 L"sub duplicatedfunc\n"
3070 L" ok false, \"duplicatedfunc called\"\n"
3071 L"end sub\n",
3072 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
3073 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3074
3076 L"function duplicatedfunc\n"
3077 L" duplicatedfunc = 2\n"
3078 L"end function\n",
3079 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
3080 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3081
3083 L"ok duplicatedfunc() = 2, \"duplicatedfunc = \" & duplicatedfunc()\n",
3084 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
3085 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3086
3089}
3090
3092{
3093 DWORD size, len;
3094 HANDLE file, map;
3095 const char *file_map;
3096 BSTR ret;
3097
3099 if(file == INVALID_HANDLE_VALUE) {
3100 trace("Could not open file: %lu\n", GetLastError());
3101 return NULL;
3102 }
3103
3105
3108 if(map == INVALID_HANDLE_VALUE) {
3109 trace("Could not create file mapping: %lu\n", GetLastError());
3110 return NULL;
3111 }
3112
3113 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
3115 if(!file_map) {
3116 trace("MapViewOfFile failed: %lu\n", GetLastError());
3117 return NULL;
3118 }
3119
3120 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
3122 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
3123
3124 UnmapViewOfFile(file_map);
3125
3126 return ret;
3127}
3128
3129static void run_from_file(const char *filename)
3130{
3131 BSTR script_str;
3132 HRESULT hres;
3133
3134 script_str = get_script_from_file(filename);
3135 if(!script_str)
3136 return;
3137
3139 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str, NULL);
3140 SysFreeString(script_str);
3141 ok(hres == S_OK, "parse_script failed: %08lx\n", hres);
3142}
3143
3144static void run_from_res(const char *name)
3145{
3146 const char *data;
3147 DWORD size, len;
3148 BSTR str;
3149 HRSRC src;
3150 HRESULT hres;
3151
3153 test_name = name;
3154
3155 src = FindResourceA(NULL, name, (LPCSTR)40);
3156 ok(src != NULL, "Could not find resource %s\n", name);
3157
3160
3164
3165 SET_EXPECT(global_success_d);
3166 SET_EXPECT(global_success_i);
3167 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str, NULL);
3168 CHECK_CALLED(global_success_d);
3169 CHECK_CALLED(global_success_i);
3170
3171 ok(hres == S_OK, "parse_script failed: %08lx\n", hres);
3173 test_name = "";
3174}
3175
3176static void run_tests(void)
3177{
3178 HRESULT hres;
3179
3181
3182 parse_script_w(L"");
3183 parse_script_w(L"' empty ;");
3184
3185 SET_EXPECT(global_success_d);
3186 SET_EXPECT(global_success_i);
3187 parse_script_w(L"reportSuccess");
3188 CHECK_CALLED(global_success_d);
3189 CHECK_CALLED(global_success_i);
3190
3191 SET_EXPECT(global_success_d);
3192 SET_EXPECT(global_success_i);
3193 parse_script_w(L"reportSuccess()");
3194 CHECK_CALLED(global_success_d);
3195 CHECK_CALLED(global_success_i);
3196
3197 SET_EXPECT(global_success_d);
3198 SET_EXPECT(global_success_i);
3199 parse_script_w(L"Call reportSuccess");
3200 CHECK_CALLED(global_success_d);
3201 CHECK_CALLED(global_success_i);
3202
3203 SET_EXPECT(global_success_d);
3204 SET_EXPECT(global_success_i);
3205 parse_script_w(L"test.reportSuccess()");
3206 CHECK_CALLED(global_success_d);
3207 CHECK_CALLED(global_success_i);
3208
3209 SET_EXPECT(global_success_d);
3210 SET_EXPECT(global_success_i);
3211 parse_script_wf(0, L"TEST.reportSuccess()");
3212 CHECK_CALLED(global_success_d);
3213 CHECK_CALLED(global_success_i);
3214
3215 SET_EXPECT(global_vbvar_d);
3216 SET_EXPECT(global_vbvar_i);
3217 parse_script_w(L"Option Explicit\nvbvar = 3");
3218 CHECK_CALLED(global_vbvar_d);
3219 CHECK_CALLED(global_vbvar_i);
3220
3221 SET_EXPECT(global_vbvar_d);
3222 SET_EXPECT(global_vbvar_i);
3223 parse_script_w(L"Option Explicit\nvbvar() = 3");
3224 CHECK_CALLED(global_vbvar_d);
3225 CHECK_CALLED(global_vbvar_i);
3226
3227 SET_EXPECT(global_letobj_i);
3228 parse_script_w(L"Option Explicit\nletobj = testObj");
3229 CHECK_CALLED(global_letobj_i);
3230
3231 SET_EXPECT(global_letobj_i);
3232 parse_script_w(L"Option Explicit\ntest.letobj = testObj");
3233 CHECK_CALLED(global_letobj_i);
3234
3235 SET_EXPECT(global_setobj_i);
3236 parse_script_w(L"Option Explicit\nset setobj = testObj");
3237 CHECK_CALLED(global_setobj_i);
3238
3239 SET_EXPECT(global_setobj_i);
3240 parse_script_w(L"Option Explicit\nset test.setobj = testObj");
3241 CHECK_CALLED(global_setobj_i);
3242
3243 hres = parse_script_wr(L"dim x\nx = testObj.rem");
3244 ok(hres == S_OK, "use of 'rem' as dot identifier failed: %lx08\n", hres);
3245
3246 SET_EXPECT(testobj_propget_d);
3247 SET_EXPECT(testobj_propget_i);
3248 parse_script_w(L"dim x\nx = testObj.propget");
3249 CHECK_CALLED(testobj_propget_d);
3250 CHECK_CALLED(testobj_propget_i);
3251
3252 SET_EXPECT(testobj_propput_d);
3253 SET_EXPECT(testobj_propput_i);
3254 parse_script_w(L"testObj.propput = 1");
3255 CHECK_CALLED(testobj_propput_d);
3256 CHECK_CALLED(testobj_propput_i);
3257
3258 SET_EXPECT(global_propargput_d);
3259 SET_EXPECT(global_propargput_i);
3260 parse_script_w(L"propargput(counter(), counter()) = counter()");
3261 CHECK_CALLED(global_propargput_d);
3262 CHECK_CALLED(global_propargput_i);
3263
3264 SET_EXPECT(global_propargput_d);
3265 SET_EXPECT(global_propargput_i);
3266 parse_script_w(L"test.propargput(counter(), counter()) = counter()");
3267 CHECK_CALLED(global_propargput_d);
3268 CHECK_CALLED(global_propargput_i);
3269
3270 SET_EXPECT(global_propargput1_d);
3271 SET_EXPECT(global_propargput1_i);
3272 parse_script_w(L"propargput1 (counter()) = counter()");
3273 CHECK_CALLED(global_propargput1_d);
3274 CHECK_CALLED(global_propargput1_i);
3275
3276 SET_EXPECT(global_propargput1_d);
3277 SET_EXPECT(global_propargput1_i);
3278 parse_script_w(L"test.propargput1(counter()) = counter()");
3279 CHECK_CALLED(global_propargput1_d);
3280 CHECK_CALLED(global_propargput1_i);
3281
3282 SET_EXPECT(global_propargset_d);
3283 SET_EXPECT(global_propargset_i);
3284 parse_script_w(L"set propargset (counter()) = testObj");
3285 CHECK_CALLED(global_propargset_d);
3286 CHECK_CALLED(global_propargset_i);
3287
3288 SET_EXPECT(testobj_propget_d);
3289 SET_EXPECT(testobj_propget_i);
3290 parse_script_w(L"dim x\nwith testObj\nx=1+.propget\nend with");
3291 CHECK_CALLED(testobj_propget_d);
3292 CHECK_CALLED(testobj_propget_i);
3293
3294 SET_EXPECT(testobj_propput_d);
3295 SET_EXPECT(testobj_propput_i);
3296 parse_script_w(L"with testObj\n.propput = 1\nend with");
3297 CHECK_CALLED(testobj_propput_d);
3298 CHECK_CALLED(testobj_propput_i);
3299
3300 SET_EXPECT(testobj_valueput_i);
3301 parse_script_w(L"dim x\n"
3302 "set x = testObj\n"
3303 "x(counter(), counter()) = counter\n");
3304 CHECK_CALLED(testobj_valueput_i);
3305
3306 parse_script_w(L"dim x\nx = testObj.property(1)");
3307
3308 parse_htmlscript(L"<!--");
3309 parse_htmlscript(L" -->");
3310 parse_htmlscript(L"<!--\ndim x\nx=1\n-->\n");
3311 parse_htmlscript(L"<!--\ndim x\n-->\n<!--\nx=1\n-->\n");
3312
3313 SET_EXPECT(OnScriptError);
3314 hres = parse_script_wr(L"<!--");
3315 ok(FAILED(hres), "script didn't fail\n");
3316 CHECK_CALLED(OnScriptError);
3317
3318 SET_EXPECT(global_success_d);
3319 SET_EXPECT(global_success_i);
3320 parse_htmlscript(L"<!--\n<!-- ignore this <> <>\n--> <>\nCall reportSuccess()\n-->\n");
3321 CHECK_CALLED(global_success_d);
3322 CHECK_CALLED(global_success_i);
3323
3324 next_cnt = 0;
3325 SET_EXPECT(collectionobj_newenum_i);
3327 parse_script_w(L"for each x in collectionObj\nnext");
3328 CHECK_CALLED(collectionobj_newenum_i);
3330 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
3331
3332 parse_script_w(L"x = 1\n Call ok(x = 1, \"x = \" & x)");
3333
3334 parse_script_w(L"x = _ \n3");
3335
3338
3339 SET_EXPECT(OnScriptError);
3340 hres = parse_script_wr(L"throwInt(&h80080008&)");
3341 ok(hres == 0x80080008, "hres = %08lx\n", hres);
3342 CHECK_CALLED(OnScriptError);
3343
3344 /* DISP_E_BADINDEX */
3345 SET_EXPECT(OnScriptError);
3346 hres = parse_script_wr(L"throwInt(&h8002000b&)");
3347 ok(hres == MAKE_VBSERROR(9), "hres = %08lx\n", hres);
3348 CHECK_CALLED(OnScriptError);
3349
3350 SET_EXPECT(OnScriptError);
3351 hres = parse_script_wr(L"throwInt(&h800a0009&)");
3352 ok(hres == MAKE_VBSERROR(9), "hres = %08lx\n", hres);
3353 CHECK_CALLED(OnScriptError);
3354
3356 SET_EXPECT(OnScriptError);
3357 hres = parse_script_wr(L"throwInt(&h800a0009&)");
3358 ok(hres == SCRIPT_E_REPORTED, "hres = %08lx\n", hres);
3359 CHECK_CALLED(OnScriptError);
3360
3361 /* E_NOTIMPL */
3362 SET_EXPECT(OnScriptError);
3363 hres = parse_script_wr(L"throwInt(&h80004001&)");
3364 ok(hres == MAKE_VBSERROR(445), "hres = %08lx\n", hres);
3365 CHECK_CALLED(OnScriptError);
3366
3368 SET_EXPECT(OnScriptError);
3369 hres = parse_script_wr(L"throwInt(&h80004001&)");
3370 ok(hres == SCRIPT_E_REPORTED, "hres = %08lx\n", hres);
3371 CHECK_CALLED(OnScriptError);
3372
3373 SET_EXPECT(global_testoptionalarg_i);
3374 parse_script_w(L"call testOptionalArg(1,,2)");
3375 CHECK_CALLED(global_testoptionalarg_i);
3376
3377 SET_EXPECT(global_testoptionalarg_i);
3378 parse_script_w(L"call testOptionalArg(,1,1)");
3379 CHECK_CALLED(global_testoptionalarg_i);
3380
3381 SET_EXPECT(global_testoptionalarg_i);
3382 parse_script_w(L"testOptionalArg 1,,2");
3383 CHECK_CALLED(global_testoptionalarg_i);
3384
3385 parse_script_w(L"sub x()\n"
3386 " dim y\n"
3387 " y = cint(3)\n"
3388 "end sub\n"
3389 "x\n");
3390
3392
3393 SET_EXPECT(testobj_value_i);
3394 parse_script_w(L"dim n,o\n set o = testObj\n n = o(1,2)\n call ok(n=2, \"n = \" & n)\n");
3395 CHECK_CALLED(testobj_value_i);
3396
3397 SET_EXPECT(testobj_value_i);
3398 parse_script_w(L"dim n,o\n set o = testObj\n n = o\n call ok(n=0, \"n = \" & n)\n");
3399 CHECK_CALLED(testobj_value_i);
3400
3401 parse_script_w(L"Sub testsub\n"
3402 "x = 1\n"
3403 "Call ok(x = 1, \"x = \" & x)\n"
3404 "End Sub\n"
3405 "Call testsub()");
3406
3407 parse_script_w(L"Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n");
3408 parse_script_w(L"Call ok(x = \"\", \"x = \" & x)\n");
3409 parse_script_w(L"x = y\n"
3410 "Call ok(getVT(x) = \"VT_EMPTY*\", \"getVT(x) = \" & getVT(x))\n"
3411 "Call ok(getVT(y) = \"VT_EMPTY*\", \"getVT(y) = \" & getVT(y))");
3412 SET_EXPECT(OnScriptError);
3413 hres = parse_script_wr(L"x = y(\"a\")");
3414 ok(FAILED(hres), "script didn't fail\n");
3415 CHECK_CALLED(OnScriptError);
3416
3417 SET_EXPECT(global_success_d);
3418 SET_EXPECT(global_success_i);
3419 parse_script_w(L"' comment\r"
3420 "x = _\r3\r"
3421 "x = _\n3\r"
3422 "x = _\r\n3\r"
3423 "Sub testsub(arg)\r"
3424 "If arg = 1 Then\r\r"
3425 "Call reportSuccess()\n\n"
3426 "End If\r\n"
3427 "End Sub\n\r"
3428 "Call testsub(1)");
3429 CHECK_CALLED(global_success_d);
3430 CHECK_CALLED(global_success_i);
3431
3432 run_from_res("lang.vbs");
3433 run_from_res("api.vbs");
3434 run_from_res("regexp.vbs");
3435 run_from_res("error.vbs");
3436
3438 test_gc();
3439 test_msgbox();
3445}
3446
3448{
3449 IRegExp2 *regexp;
3450 IUnknown *unk;
3451 HRESULT hres;
3452
3454 CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
3455 &IID_IUnknown, (void**)&unk);
3457 return FALSE;
3458 ok(hres == S_OK, "CoCreateInstance(CLSID_VBScriptRegExp) failed: %lx\n", hres);
3459
3460 hres = IUnknown_QueryInterface(unk, &IID_IRegExp2, (void**)&regexp);
3461 if(SUCCEEDED(hres))
3462 IRegExp2_Release(regexp);
3463 IUnknown_Release(unk);
3464
3465 return hres == S_OK;
3466}
3467
3469{
3470 int argc;
3471 char **argv;
3472
3473 detect_locale();
3474 if(!is_english)
3475 skip("Skipping some tests in non-English locale\n");
3476
3478
3480
3481 if(!check_vbscript()) {
3482 win_skip("Broken engine, probably too old\n");
3483 }else if(argc > 2) {
3484 allow_ui = TRUE;
3486 run_from_file(argv[2]);
3487 }else {
3488 run_tests();
3489 }
3490
3492}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
enum tagSCRIPTUICHANDLING SCRIPTUICHANDLING
@ SCRIPTUICITEM_MSGBOX
Definition: activscp.idl:72
@ SCRIPTUICHANDLING_NOUIERROR
Definition: activscp.idl:77
@ SCRIPTUICHANDLING_ALLOW
Definition: activscp.idl:76
@ SCRIPTUICHANDLING_NOUIDEFAULT
Definition: activscp.idl:78
enum tagSCRIPTUICITEM SCRIPTUICITEM
@ SCRIPTSTATE_INITIALIZED
Definition: activscp.idl:62
@ SCRIPTSTATE_STARTED
Definition: activscp.idl:58
@ SCRIPTSTATE_UNINITIALIZED
Definition: activscp.idl:57
enum tagSCRIPTSTATE SCRIPTSTATE
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(A)
Definition: main.h:20
const GUID IID_IUnknown
Definition: _map.h:48
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define CloseHandle
Definition: compat.h:739
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
OLECHAR * BSTR
Definition: compat.h:2293
#define GENERIC_READ
Definition: compat.h:135
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_BSTR
Definition: compat.h:2303
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_ERROR
Definition: compat.h:2305
@ VT_ARRAY
Definition: compat.h:2341
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I8
Definition: compat.h:2314
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
#define wcsicmp
Definition: compat.h:15
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
LANGID WINAPI GetUserDefaultUILanguage(void)
Definition: locale.c:1380
INT WINAPI GetLocaleInfoA(LCID lcid, LCTYPE lctype, LPSTR buffer, INT len)
Definition: locale.c:1609
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
LANGID WINAPI GetUserDefaultLangID(void)
Definition: locale.c:1182
BOOL WINAPI GetCPInfoExA(UINT codepage, DWORD dwFlags, LPCPINFOEXA cpinfo)
Definition: locale.c:2204
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
LCID lcid
Definition: locale.c:5660
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI VarBstrFromR8(double dblIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
Definition: vartype.c:6587
#define EnableModeless(type)
Definition: ordinal.c:3084
#define test_disp(u, id, v)
Definition: dom.c:662
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define abs(i)
Definition: fconv.c:206
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum src
Definition: glext.h:6340
GLuint GLuint * names
Definition: glext.h:11545
GLsizeiptr size
Definition: glext.h:5919
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ss
Definition: i386-dis.c:441
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
#define d
Definition: ke_i.h:81
#define b
Definition: ke_i.h:79
#define wine_dbgstr_w
Definition: kernel32.h:34
USHORT LANGID
Definition: mui.h:9
POINT cp
Definition: magnifier.c:59
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
#define sprintf
Definition: sprintf.c:45
const char * var
Definition: shader.c:5666
HRESULT hres
Definition: protocol.c:465
#define parse_script(p, s)
Definition: activex.c:681
#define SET_EXPECT(func)
Definition: run.c:58
static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
Definition: run.c:2039
#define test_grfdex(a, b)
Definition: run.c:225
static BOOL run_tests(void)
Definition: run.c:4005
static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
Definition: run.c:2091
static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:548
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:436
static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
Definition: run.c:2076
static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *This, ULONG celt)
Definition: run.c:304
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
Definition: run.c:455
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
Definition: run.c:397
static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: run.c:414
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
Definition: run.c:449
static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
Definition: run.c:261
static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
Definition: run.c:473
static IDispatchExVtbl GlobalVtbl
Definition: run.c:1999
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:430
static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: run.c:422
#define IActiveScriptParseProcedure2_ParseProcedureText
Definition: run.c:46
#define CHECK_EXPECT(func)
Definition: run.c:67
static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
Definition: run.c:2065
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
Definition: run.c:2050
static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *This, IEnumVARIANT **ppEnum)
Definition: run.c:319
#define DEFINE_EXPECT(func)
Definition: run.c:55
static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
Definition: run.c:461
#define IActiveScriptParse_InitNew
Definition: run.c:43
#define DISPID_GLOBAL_REPORTSUCCESS
Definition: run.c:143
static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
Definition: run.c:244
#define DISPID_GLOBAL_THROWINT
Definition: run.c:174
#define IActiveScriptParse_ParseScriptText
Definition: run.c:44
#define DISPID_GLOBAL_TESTOBJ
Definition: run.c:147
#define IActiveScriptParseProcedure2_Release
Definition: run.c:45
#define IActiveScriptParse_Release
Definition: run.c:42
static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *This)
Definition: run.c:311
#define DISPID_GLOBAL_TRACE
Definition: run.c:144
#define DISPID_GLOBAL_OK
Definition: run.c:145
static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
Definition: run.c:467
static IDispatch * script_disp
Definition: run.c:195
static void close_script(IActiveScript *script)
Definition: run.c:232
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: run.c:377
static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
Definition: run.c:2019
static void run_from_res(const char *name)
Definition: run.c:2784
static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
Definition: run.c:226
static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
Definition: run.c:2086
static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *This, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
Definition: run.c:268
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
Definition: run.c:392
#define DISPID_GLOBAL_GETVT
Definition: run.c:146
#define CHECK_CALLED(func)
Definition: run.c:73
static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
Definition: run.c:2034
static const char * test_name
Definition: run.c:194
static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:502
static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
Definition: run.c:2070
#define DISPID_GLOBAL_PROPARGPUT
Definition: run.c:159
static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
Definition: run.c:256
static void run_from_file(const char *filename)
Definition: run.c:2746
static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: run.c:408
static IDispatchEx testObj
Definition: run.c:672
static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
Definition: run.c:2096
static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:1232
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
Definition: run.c:443
static BSTR get_script_from_file(const char *filename)
Definition: run.c:2708
static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
Definition: run.c:2044
static IActiveScript * create_script(void)
Definition: run.c:2155
static IDispatchEx Global
Definition: run.c:2017
static IActiveScriptSite ActiveScriptSite
Definition: run.c:2110
static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
Definition: run.c:2081
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
Definition: run.c:402
static IDispatchExVtbl testObjVtbl
Definition: run.c:654
static BOOL strict_dispid_check
Definition: run.c:193
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:987
static void test_safearray(void)
Definition: safearray.c:378
static VARIANTARG static DISPID
Definition: ordinal.c:49
static BOOL is_fixed(HANDLE handle)
Definition: clipboard.c:1443
static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:1052
static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: run.c:276
static ULONG WINAPI ActiveScriptSiteUIControl_Release(IActiveScriptSiteUIControl *iface)
Definition: run.c:1876
static void test_parse_errors(void)
Definition: run.c:2647
static void parse_script_wf(DWORD flags, const WCHAR *src)
Definition: run.c:2125
static HRESULT test_global_vars_ref(BOOL use_close)
Definition: run.c:2845
static BOOL is_english
Definition: run.c:161
#define CLEAR_CALLED(func)
Definition: run.c:88
static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
Definition: run.c:1832
static IServiceProvider caller_sp
Definition: run.c:290
static BOOL strict_enter_script
Definition: run.c:169
#define DISPID_GLOBAL_ISNULLDISP
Definition: run.c:128
static IEnumVARIANT enumObj
Definition: run.c:711
#define DISPID_GLOBAL_ISENGLANG
Definition: run.c:125
#define DISPID_GLOBAL_THROWEXCEPTION
Definition: run.c:148
#define DISPID_GLOBAL_LETOBJ
Definition: run.c:139
static HRESULT WINAPI unkObj_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: run.c:608
static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:1063
static IDispatchEx * parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const WCHAR *src, DWORD flags)
Definition: run.c:2220
static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
Definition: run.c:271
static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
Definition: run.c:1119
#define DISPID_TESTOBJ_PROPPUT
Definition: run.c:153
static void free_ei(EXCEPINFO *ei)
Definition: run.c:2294
#define DISPID_GLOBAL_DOUBLEASSTRING
Definition: run.c:135
#define DISPID_GLOBAL_WEEKSTARTDAY
Definition: run.c:142
static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
Definition: run.c:1855
#define DISPID_GLOBAL_GLOBALCALLBACK
Definition: run.c:143
static void parse_script_w(const WCHAR *src)
Definition: run.c:2203
static IActiveScriptError ** store_script_error
Definition: run.c:1966
static BOOL check_vbscript(void)
Definition: run.c:3447
static HRESULT parse_script_wr(const WCHAR *src)
Definition: run.c:2136
static void test_multiple_parse(void)
Definition: run.c:3050
static int test_counter
Definition: run.c:165
#define DISPID_GLOBAL_TESTOPTIONALARG
Definition: run.c:138
static void test_procedures(void)
Definition: run.c:2242
static void _parse_htmlscript(unsigned line, const WCHAR *src)
Definition: run.c:2209
static int first_day_of_week
Definition: run.c:163
static BOOL allow_ui
Definition: run.c:161
#define DISPID_GLOBAL_TODO_WINE_OK
Definition: run.c:141
static HRESULT onerror_hres
Definition: run.c:168
static void test_gc(void)
Definition: run.c:2591
static void detect_locale(void)
Definition: run.c:232
#define DISPID_GLOBAL_VBVAR
Definition: run.c:126
static ULONG global_ref
Definition: run.c:1144
static BSTR a2bstr(const char *str)
Definition: run.c:171
static SCRIPTUICHANDLING uic_handling
Definition: run.c:166
static LONG error_char
Definition: run.c:1968
#define DISPID_GLOBAL_PROPARGSET
Definition: run.c:146
#define DISPID_GLOBAL_THROWWITHDESC
Definition: run.c:145
#define DISPID_GLOBAL_ISARRAYFIXED
Definition: run.c:149
#define DISPID_GLOBAL_COLLOBJ
Definition: run.c:134
static void test_isexpression(void)
Definition: run.c:2902
#define DISPID_GLOBAL_TESTERROROBJECT
Definition: run.c:144
static IUnknown unkObj
Definition: run.c:635
#define DISPID_GLOBAL_TESTDISP
Definition: run.c:129
static IDispatchExVtbl enumDispVtbl
Definition: run.c:1032
static const IActiveScriptSiteUIControlVtbl ActiveScriptSiteUIControlVtbl
Definition: run.c:1892
static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
Definition: run.c:1114
#define DISPID_GLOBAL_MAXCHARSIZE
Definition: run.c:150
#define CHECK_EXPECT2(func)
Definition: run.c:64
#define DISPID_GLOBAL_COUNTER
Definition: run.c:131
static ULONG WINAPI Global_Release(IDispatchEx *iface)
Definition: run.c:1151
static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
Definition: run.c:1837
static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: run.c:1027
#define REF_EXPECT(func)
Definition: run.c:61
static IActiveScriptSiteWindow ActiveScriptSiteWindow
Definition: run.c:1863
static UINT MaxCharSize
Definition: run.c:162
static void test_callbacks(void)
Definition: run.c:2301
#define DISPID_GLOBAL_TESTARRAY
Definition: run.c:136
static IDispatchExVtbl collectionObjVtbl
Definition: run.c:1092
static ULONG WINAPI unkObj_Release(IUnknown *iface)
Definition: run.c:624
static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
Definition: run.c:1845
static ULONG WINAPI Global_AddRef(IDispatchEx *iface)
Definition: run.c:1146
static ULONG WINAPI ActiveScriptSiteUIControl_AddRef(IActiveScriptSiteUIControl *iface)
Definition: run.c:1871
#define DISPID_GLOBAL_SETOBJ
Definition: run.c:140
static IDispatchEx RefObj
Definition: run.c:1142
static const IEnumVARIANTVtbl EnumVARIANTVtbl
Definition: run.c:701
#define DISPID_GLOBAL_UNKOBJ
Definition: run.c:147
static unsigned next_cnt
Definition: run.c:663
#define DISPID_COLLOBJ_RESET
Definition: run.c:156
static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
Definition: run.c:1821
static ULONG refobj_ref
Definition: run.c:1112
static HRESULT WINAPI ActiveScriptSiteUIControl_GetUIBehavior(IActiveScriptSiteUIControl *iface, SCRIPTUICITEM UicItem, SCRIPTUICHANDLING *pUicHandling)
Definition: run.c:1881
static HRESULT WINAPI ActiveScriptSiteUIControl_QueryInterface(IActiveScriptSiteUIControl *iface, REFIID riid, void **ppv)
Definition: run.c:1865
static const char * vt2a(VARIANT *v)
Definition: run.c:183
const CLSID CLSID_VBScriptRegExp
static IDispatchEx collectionObj
Definition: run.c:1110
static IDispatchEx enumDisp
Definition: run.c:606
static const IUnknownVtbl unkObjVtbl
Definition: run.c:629
#define MAKE_VBSERROR(code)
Definition: run.c:159
static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: run.c:260
#define DISPID_GLOBAL_PROPARGPUT1
Definition: run.c:133
#define DISPID_TESTOBJ_KEYWORD
Definition: run.c:154
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
Definition: run.c:266
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: run.c:283
static ULONG WINAPI unkObj_AddRef(IUnknown *iface)
Definition: run.c:619
static BOOL get_dispid(BSTR name, const dispid_t *dispids, SIZE_T dispids_cnt, DISPID *id)
Definition: run.c:720
static IDispatchExVtbl RefObjVtbl
Definition: run.c:1124
#define parse_htmlscript(a)
Definition: run.c:2208
#define DISPID_TESTOBJ_PROPGET
Definition: run.c:152
const CLSID CLSID_VBScript
#define DISPID_GLOBAL_REFOBJ
Definition: run.c:130
static IActiveScript * create_and_init_script(DWORD flags, BOOL start)
Definition: run.c:2044
static IActiveScriptSiteUIControl ActiveScriptSiteUIControl
Definition: run.c:1899
static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
Definition: run.c:1827
static void test_parse_context(void)
Definition: run.c:2147
static ULONG error_line
Definition: run.c:1967
static void test_msgbox(void)
Definition: run.c:2796
#define argv
Definition: mplay32.c:18
script
Definition: msipriv.h:383
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define LOCALE_USER_DEFAULT
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_ERROR(A)
Definition: oleauto.h:241
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_ARRAYREF(A)
Definition: oleauto.h:223
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_ISBYREF(A)
Definition: oleauto.h:217
#define DISPATCH_PROPERTYPUT
Definition: oleauto.h:1008
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_BYREF(A)
Definition: oleauto.h:228
#define V_I4(A)
Definition: oleauto.h:247
#define V_ISARRAY(A)
Definition: oleauto.h:218
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_R8(A)
Definition: oleauto.h:262
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define DISPATCH_PROPERTYPUTREF
Definition: oleauto.h:1009
#define V_I2(A)
Definition: oleauto.h:245
const GUID IID_IDispatch
static HANDLE proc()
Definition: pdb.c:32
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
const WCHAR * str
#define LANG_ENGLISH
Definition: nls.h:52
DWORD LCID
Definition: nls.h:13
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define error2(s, a, b)
Definition: debug.h:126
#define error1(s, a)
Definition: debug.h:125
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
int winetest_get_mainargs(char ***pargv)
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
Definition: scsiwmi.h:51
UINT MaxCharSize
Definition: winnls.h:667
Definition: match.c:390
char * name
Definition: compiler.c:66
Definition: run.c:713
const WCHAR * name
Definition: run.c:714
DISPID pid
Definition: run.c:715
BOOL * expect
Definition: run.c:716
BOOL * called
Definition: run.c:717
Definition: fci.c:127
Definition: parser.c:49
Definition: name.c:39
Definition: import.c:81
Definition: send.c:48
USHORT fFeatures
Definition: compat.h:2356
SAFEARRAYBOUND rgsabound[1]
Definition: compat.h:2360
ULONG cLocks
Definition: compat.h:2358
USHORT cDims
Definition: compat.h:2355
ULONG cbElements
Definition: compat.h:2357
const char * LPCSTR
Definition: typedefs.h:52
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
static const WCHAR props[]
Definition: wbemdisp.c:288
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801
#define S_FALSE
Definition: winerror.h:3451
#define DISP_E_PARAMNOTFOUND
Definition: winerror.h:3616
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:3615
#define E_UNEXPECTED
Definition: winerror.h:3528
#define DISP_E_EXCEPTION
Definition: winerror.h:3621
#define DISP_E_BADINDEX
Definition: winerror.h:3623
#define DISP_E_PARAMNOTOPTIONAL
Definition: winerror.h:3627
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618
#define LOCALE_IDEFAULTANSICODEPAGE
Definition: winnls.h:48
#define LOCALE_IFIRSTDAYOFWEEK
Definition: winnls.h:85
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)