comctl32: We can now store binary files in the repository.
[wine] / dlls / oleaut32 / tests / vartest.c
1 /*
2  * VARIANT test program
3  *
4  * Copyright 1998 Jean-Claude Cote
5  * Copyright 2006 Google (Benjamin Arai)
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <math.h>
25 #include <float.h>
26 #include <time.h>
27
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winsock.h"
31 #include "wine/test.h"
32 #include "winuser.h"
33 #include "wingdi.h"
34 #include "winnls.h"
35 #include "winerror.h"
36 #include "winnt.h"
37
38 #include "wtypes.h"
39 #include "oleauto.h"
40
41 static HMODULE hOleaut32;
42
43 static HRESULT (WINAPI *pVarUdateFromDate)(DATE,ULONG,UDATE*);
44 static HRESULT (WINAPI *pVarDateFromUdate)(UDATE*,ULONG,DATE*);
45 static INT (WINAPI *pSystemTimeToVariantTime)(LPSYSTEMTIME,double*);
46 static INT (WINAPI *pVariantTimeToSystemTime)(double,LPSYSTEMTIME);
47 static INT (WINAPI *pDosDateTimeToVariantTime)(USHORT,USHORT,double*);
48 static INT (WINAPI *pVariantTimeToDosDateTime)(double,USHORT*,USHORT *);
49
50 /* Get a conversion function ptr, return if function not available */
51 #define CHECKPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func); \
52   if (!p##func) { trace("function " # func " not available, not testing it\n"); return; }
53
54 /* Have IRecordInfo data type? */
55 static int HAVE_OLEAUT32_RECORD = 0;
56 /* Have I8/UI8 data type? */
57 static int HAVE_OLEAUT32_I8 = 0;
58 /* Is this an ancient version with support for only I2/I4/R4/R8/DATE? */
59 static int IS_ANCIENT = 0;
60
61 /* When comparing floating point values we cannot expect an exact match
62  * because the rounding errors depend on the exact algorithm.
63  */
64 #define EQ_DOUBLE(a,b)     (fabs((a)-(b)) / (1.0+fabs(a)+fabs(b)) < 1e-14)
65 #define EQ_FLOAT(a,b)      (fabs((a)-(b)) / (1.0+fabs(a)+fabs(b)) < 1e-7)
66
67 #define SKIPTESTS(a)  if((a > VT_CLSID+10) && (a < VT_BSTR_BLOB-10)) continue
68
69 /* Allow our test macros to work for VT_NULL and VT_EMPTY too */
70 #define V_EMPTY(v) V_I4(v)
71 #define V_NULL(v) V_I4(v)
72
73 /* Size constraints for overflow tests */
74 #define I1_MAX   0x7f
75 #define I1_MIN   ((-I1_MAX)-1)
76 #define UI1_MAX  0xff
77 #define UI1_MIN  0
78 #define I2_MAX   0x7fff
79 #define I2_MIN   ((-I2_MAX)-1)
80 #define UI2_MAX  0xffff
81 #define UI2_MIN  0
82 #define I4_MAX   0x7fffffff
83 #define I4_MIN   ((-I4_MAX)-1)
84 #define UI4_MAX  0xffffffff
85 #define UI4_MIN  0
86 #define I8_MAX   (((LONGLONG)I4_MAX << 32) | UI4_MAX)
87 #define I8_MIN   ((-I8_MAX)-1)
88 #define UI8_MAX  (((ULONGLONG)UI4_MAX << 32) | UI4_MAX)
89 #define UI8_MIN  0
90 #define DATE_MAX 2958465
91 #define DATE_MIN -657434
92 #define R4_MAX FLT_MAX
93 #define R4_MIN FLT_MIN
94 #define R8_MAX DBL_MAX
95 #define R8_MIN DBL_MIN
96
97 static void init(void)
98 {
99   hOleaut32 = GetModuleHandle("oleaut32.dll");
100
101   /* Is a given function exported from oleaut32? */
102 #define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL)
103
104   HAVE_OLEAUT32_I8 = HAVE_FUNC(VarI8FromI1);
105   if (!HAVE_OLEAUT32_I8)
106       skip("No support for I8 and UI8 data types\n");
107
108   HAVE_OLEAUT32_RECORD = HAVE_FUNC(SafeArraySetRecordInfo);
109   IS_ANCIENT = (!HAVE_FUNC(VarI1FromI2));
110
111 #undef HAVE_FUNC
112 }
113
114 /* Functions to set a DECIMAL */
115 static void setdec(DECIMAL* dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG64 lo64)
116 {
117     S(U(*dec)).scale = scl;
118     S(U(*dec)).sign = sgn;
119     dec->Hi32 = hi32;
120     U1(*dec).Lo64 = lo64;
121 }
122
123 static void setdec64(DECIMAL* dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG mid32, ULONG lo32)
124 {
125     S(U(*dec)).scale = scl;
126     S(U(*dec)).sign = sgn;
127     dec->Hi32 = hi32;
128     S1(U1(*dec)).Mid32 = mid32;
129     S1(U1(*dec)).Lo32 = lo32;
130 }
131
132 static inline int strcmpW( const WCHAR *str1, const WCHAR *str2 )
133 {
134     while (*str1 && (*str1 == *str2)) { str1++; str2++; }
135     return *str1 - *str2;
136 }
137
138 /* return the string text of a given variant type */
139 static char vtstr_buffer[16][256];
140 static int vtstr_current=0;
141 static const char *vtstr(int x)
142 {
143     switch(x) {
144 #define CASE(vt) case VT_##vt: return #vt
145     CASE(EMPTY);
146     CASE(NULL);
147     CASE(I2);
148     CASE(I4);
149     CASE(R4);
150     CASE(R8);
151     CASE(CY);
152     CASE(DATE);
153     CASE(BSTR);
154     CASE(DISPATCH);
155     CASE(ERROR);
156     CASE(BOOL);
157     CASE(VARIANT);
158     CASE(UNKNOWN);
159     CASE(DECIMAL);
160     CASE(I1);
161     CASE(UI1);
162     CASE(UI2);
163     CASE(UI4);
164     CASE(I8);
165     CASE(UI8);
166     CASE(INT);
167     CASE(UINT);
168     CASE(VOID);
169     CASE(HRESULT);
170     CASE(PTR);
171     CASE(SAFEARRAY);
172     CASE(CARRAY);
173     CASE(USERDEFINED);
174     CASE(LPSTR);
175     CASE(LPWSTR);
176     CASE(RECORD);
177     CASE(INT_PTR);
178     CASE(UINT_PTR);
179     CASE(FILETIME);
180     CASE(BLOB);
181     CASE(STREAM);
182     CASE(STORAGE);
183     CASE(STREAMED_OBJECT);
184     CASE(STORED_OBJECT);
185     CASE(BLOB_OBJECT);
186     CASE(CF);
187     CASE(CLSID);
188     CASE(VERSIONED_STREAM);
189     CASE(VECTOR);
190     CASE(ARRAY);
191     CASE(BYREF);
192     CASE(RESERVED);
193     CASE(ILLEGAL);
194 #undef CASE
195
196     case 0xfff:
197         return "VT_BSTR_BLOB/VT_ILLEGALMASKED/VT_TYPEMASK";
198
199     default:
200         vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
201         sprintf(vtstr_buffer[vtstr_current], "unknown variant type %d", x);
202         return vtstr_buffer[vtstr_current++];
203     }
204 }
205
206 static const char *variantstr( const VARIANT *var )
207 {
208     vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
209     switch(V_VT(var))
210     {
211     case VT_I1:
212         sprintf( vtstr_buffer[vtstr_current], "VT_I1(%d)", V_I1(var) ); break;
213     case VT_I2:
214         sprintf( vtstr_buffer[vtstr_current], "VT_I2(%d)", V_I2(var) ); break;
215     case VT_I4:
216         sprintf( vtstr_buffer[vtstr_current], "VT_I4(%d)", V_I4(var) ); break;
217     case VT_INT:
218         sprintf( vtstr_buffer[vtstr_current], "VT_INT(%d)", V_INT(var) ); break;
219     case VT_I8:
220         sprintf( vtstr_buffer[vtstr_current], "VT_I8(%x%08x)", (UINT)(V_I8(var) >> 32), (UINT)V_I8(var) ); break;
221     case VT_UI8:
222         sprintf( vtstr_buffer[vtstr_current], "VT_UI8(%x%08x)", (UINT)(V_UI8(var) >> 32), (UINT)V_UI8(var) ); break;
223     case VT_R4:
224         sprintf( vtstr_buffer[vtstr_current], "VT_R4(%g)", V_R4(var) ); break;
225     case VT_R8:
226         sprintf( vtstr_buffer[vtstr_current], "VT_R8(%g)", V_R8(var) ); break;
227     case VT_UI1:
228         sprintf( vtstr_buffer[vtstr_current], "VT_UI1(%u)", V_UI1(var) ); break;
229     case VT_UI2:
230         sprintf( vtstr_buffer[vtstr_current], "VT_UI2(%u)", V_UI2(var) ); break;
231     case VT_UI4:
232         sprintf( vtstr_buffer[vtstr_current], "VT_UI4(%u)", V_UI4(var) ); break;
233     case VT_UINT:
234         sprintf( vtstr_buffer[vtstr_current], "VT_UINT(%d)", V_UINT(var) ); break;
235     case VT_CY:
236         sprintf( vtstr_buffer[vtstr_current], "VT_CY(%x%08x)", S(V_CY(var)).Hi, S(V_CY(var)).Lo ); break;
237     case VT_DATE:
238         sprintf( vtstr_buffer[vtstr_current], "VT_DATE(%g)", V_DATE(var) ); break;
239     default:
240         return vtstr(V_VT(var));
241     }
242     return vtstr_buffer[vtstr_current++];
243 }
244
245 static BOOL is_expected_variant( const VARIANT *result, const VARIANT *expected )
246 {
247     if (V_VT(result) != V_VT(expected)) return FALSE;
248     switch(V_VT(expected))
249     {
250     case VT_EMPTY:
251     case VT_NULL:
252         return TRUE;
253
254 #define CASE(vt) case VT_##vt: return (V_##vt(result) == V_##vt(expected))
255     CASE(BOOL);
256     CASE(I1);
257     CASE(UI1);
258     CASE(I2);
259     CASE(UI2);
260     CASE(I4);
261     CASE(UI4);
262     CASE(I8);
263     CASE(UI8);
264     CASE(INT);
265     CASE(UINT);
266 #undef CASE
267
268     case VT_DATE:
269         return EQ_FLOAT(V_DATE(result), V_DATE(expected));
270     case VT_R4:
271         return EQ_FLOAT(V_R4(result), V_R4(expected));
272     case VT_R8:
273         return EQ_FLOAT(V_R8(result), V_R8(expected));
274     case VT_CY:
275         return (V_CY(result).int64 == V_CY(expected).int64);
276     case VT_BSTR:
277         return !lstrcmpW( V_BSTR(result), V_BSTR(expected) );
278     case VT_DECIMAL:
279         return !memcmp( &V_DECIMAL(result), &V_DECIMAL(expected), sizeof(DECIMAL) );
280     default:
281         ok(0, "unhandled variant type %s\n",vtstr(V_VT(expected)));
282         return 0;
283     }
284 }
285
286 static void test_var_call1( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT),
287                            VARIANT *arg, VARIANT *expected )
288 {
289     VARIANT old_arg = *arg;
290     VARIANT result;
291     HRESULT hres;
292
293     memset( &result, 0, sizeof(result) );
294     hres = func( arg, &result );
295     ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
296     if (hres == S_OK)
297         ok_(__FILE__,line)( is_expected_variant( &result, expected ),
298                             "got %s expected %s\n", variantstr(&result), variantstr(expected) );
299     ok_(__FILE__,line)( is_expected_variant( arg, &old_arg ), "Modified argument %s / %s\n",
300                         variantstr(&old_arg), variantstr(arg));
301 }
302
303 static void test_var_call2( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT,LPVARIANT),
304                             VARIANT *left, VARIANT *right, VARIANT *expected )
305 {
306     VARIANT old_left = *left, old_right = *right;
307     VARIANT result;
308     HRESULT hres;
309
310     memset( &result, 0, sizeof(result) );
311     hres = func( left, right, &result );
312     ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
313     if (hres == S_OK)
314         ok_(__FILE__,line)( is_expected_variant( &result, expected ),
315                             "got %s expected %s\n", variantstr(&result), variantstr(expected) );
316     ok_(__FILE__,line)( is_expected_variant( left, &old_left ), "Modified left argument %s / %s\n",
317                         variantstr(&old_left), variantstr(left));
318     ok_(__FILE__,line)( is_expected_variant( right, &old_right ), "Modified right argument %s / %s\n",
319                         variantstr(&old_right), variantstr(right));
320 }
321
322
323 static void test_VariantInit(void)
324 {
325   VARIANTARG v1, v2;
326
327   /* Test that VariantInit() only sets the type */
328   memset(&v1, -1, sizeof(v1));
329   v2 = v1;
330   V_VT(&v2) = VT_EMPTY;
331   VariantInit(&v1);
332   ok(!memcmp(&v1, &v2, sizeof(v1)), "VariantInit() set extra fields\n");
333 }
334
335 /* All possible combinations of extra V_VT() flags */
336 static const VARTYPE ExtraFlags[16] =
337 {
338   0,
339   VT_VECTOR,
340   VT_ARRAY,
341   VT_BYREF,
342   VT_RESERVED,
343   VT_VECTOR|VT_ARRAY,
344   VT_VECTOR|VT_BYREF,
345   VT_VECTOR|VT_RESERVED,
346   VT_VECTOR|VT_ARRAY|VT_BYREF,
347   VT_VECTOR|VT_ARRAY|VT_RESERVED,
348   VT_VECTOR|VT_BYREF|VT_RESERVED,
349   VT_VECTOR|VT_ARRAY|VT_BYREF|VT_RESERVED,
350   VT_ARRAY|VT_BYREF,
351   VT_ARRAY|VT_RESERVED,
352   VT_ARRAY|VT_BYREF|VT_RESERVED,
353   VT_BYREF|VT_RESERVED,
354 };
355
356 /* Determine if a vt is valid for VariantClear() */
357 static int IsValidVariantClearVT(VARTYPE vt, VARTYPE extraFlags)
358 {
359   int ret = 0;
360
361   /* Only the following flags/types are valid */
362   if ((vt <= VT_LPWSTR || vt == VT_RECORD || vt == VT_CLSID) &&
363       vt != (VARTYPE)15 &&
364       (vt < (VARTYPE)24 || vt > (VARTYPE)31) &&
365       (!(extraFlags & (VT_BYREF|VT_ARRAY)) || vt > VT_NULL) &&
366       (extraFlags == 0 || extraFlags == VT_BYREF || extraFlags == VT_ARRAY ||
367        extraFlags == (VT_ARRAY|VT_BYREF)))
368     ret = 1; /* ok */
369
370   if ((vt == VT_RECORD && !HAVE_OLEAUT32_RECORD) ||
371       ((vt == VT_I8 || vt == VT_UI8) && !HAVE_OLEAUT32_I8))
372     ret = 0; /* Old versions of oleaut32 */
373   return ret;
374 }
375
376 typedef struct
377 {
378     const IUnknownVtbl *lpVtbl;
379     LONG               ref;
380     LONG               events;
381 } test_VariantClearImpl;
382
383 static HRESULT WINAPI VC_QueryInterface(LPUNKNOWN iface,REFIID riid,LPVOID *ppobj)
384 {
385     test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
386     This->events |= 0x1;
387     return E_NOINTERFACE;
388 }
389
390 static ULONG WINAPI VC_AddRef(LPUNKNOWN iface) {
391     test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
392     This->events |= 0x2;
393     return InterlockedIncrement(&This->ref);
394 }
395
396 static ULONG WINAPI VC_Release(LPUNKNOWN iface) {
397     test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
398     /* static class, won't be  freed */
399     This->events |= 0x4;
400     return InterlockedDecrement(&This->ref);
401 }
402
403 static const IUnknownVtbl test_VariantClear_vtbl = {
404     VC_QueryInterface,
405     VC_AddRef,
406     VC_Release,
407 };
408
409 static test_VariantClearImpl test_myVariantClearImpl = {&test_VariantClear_vtbl, 1, 0};
410
411 static void test_VariantClear(void)
412 {
413   HRESULT hres;
414   VARIANTARG v;
415   VARIANT v2;
416   size_t i;
417   LONG i4;
418   IUnknown *punk;
419
420   /* Crashes: Native does not test input for NULL, so neither does Wine */
421   if (0) hres = VariantClear(NULL);
422
423   /* Only the type field is set, to VT_EMPTY */
424   V_VT(&v) = VT_UI4;
425   V_UI4(&v) = ~0u;
426   hres = VariantClear(&v);
427   ok((hres == S_OK && V_VT(&v) == VT_EMPTY) ||
428      (IS_ANCIENT && hres == DISP_E_BADVARTYPE && V_VT(&v) == VT_UI4),
429      "VariantClear: Type set to %d, res %08x\n", V_VT(&v), hres);
430   ok(V_UI4(&v) == ~0u, "VariantClear: Overwrote value\n");
431
432   /* Test all possible V_VT values.
433    * Also demonstrates that null pointers in 'v' are not dereferenced.
434    * Individual variant tests should test VariantClear() with non-NULL values.
435    */
436   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
437   {
438     VARTYPE vt;
439
440     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
441     {
442       HRESULT hExpected = DISP_E_BADVARTYPE;
443
444       SKIPTESTS(vt);
445
446       memset(&v, 0, sizeof(v));
447       V_VT(&v) = vt | ExtraFlags[i];
448
449       hres = VariantClear(&v);
450
451       if (IsValidVariantClearVT(vt, ExtraFlags[i]))
452         hExpected = S_OK;
453
454       ok(hres == hExpected, "VariantClear: expected 0x%X, got 0x%X for vt %d | 0x%X\n",
455          hExpected, hres, vt, ExtraFlags[i]);
456     }
457   }
458
459   /* Some BYREF tests with non-NULL ptrs */
460
461   /* VARIANT BYREF */
462   V_VT(&v2) = VT_I4;
463   V_I4(&v2) = 0x1234;
464   V_VT(&v) = VT_VARIANT | VT_BYREF;
465   V_VARIANTREF(&v) = &v2;
466
467   hres = VariantClear(&v);
468   ok(hres == S_OK, "ret %08x\n", hres);
469   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
470   ok(V_VARIANTREF(&v) == &v2, "variant ref %p\n", V_VARIANTREF(&v2));
471   ok(V_VT(&v2) == VT_I4, "vt %04x\n", V_VT(&v2));
472   ok(V_I4(&v2) == 0x1234, "i4 %04x\n", V_I4(&v2));
473
474   /* I4 BYREF */
475   i4 = 0x4321;
476   V_VT(&v) = VT_I4 | VT_BYREF;
477   V_I4REF(&v) = &i4;
478
479   hres = VariantClear(&v);
480   ok(hres == S_OK, "ret %08x\n", hres);
481   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
482   ok(V_I4REF(&v) == &i4, "i4 ref %p\n", V_I4REF(&v2));
483   ok(i4 == 0x4321, "i4 changed %08x\n", i4);
484
485
486   /* UNKNOWN */
487   V_VT(&v) = VT_UNKNOWN;
488   V_UNKNOWN(&v) = (IUnknown*)&test_myVariantClearImpl;
489   test_myVariantClearImpl.events = 0;
490   hres = VariantClear(&v);
491   ok(hres == S_OK, "ret %08x\n", hres);
492   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
493   ok(V_UNKNOWN(&v) == (IUnknown*)&test_myVariantClearImpl, "unknown %p\n", V_UNKNOWN(&v));
494   /* Check that Release got called, but nothing else */
495   ok(test_myVariantClearImpl.events ==  0x4, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
496
497   /* UNKNOWN BYREF */
498   punk = (IUnknown*)&test_myVariantClearImpl;
499   V_VT(&v) = VT_UNKNOWN | VT_BYREF;
500   V_UNKNOWNREF(&v) = &punk;
501   test_myVariantClearImpl.events = 0;
502   hres = VariantClear(&v);
503   ok(hres == S_OK, "ret %08x\n", hres);
504   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
505   ok(V_UNKNOWNREF(&v) == &punk, "unknown ref %p\n", V_UNKNOWNREF(&v));
506   /* Check that nothing got called */
507   ok(test_myVariantClearImpl.events ==  0, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
508
509   /* DISPATCH */
510   V_VT(&v) = VT_DISPATCH;
511   V_DISPATCH(&v) = (IDispatch*)&test_myVariantClearImpl;
512   test_myVariantClearImpl.events = 0;
513   hres = VariantClear(&v);
514   ok(hres == S_OK, "ret %08x\n", hres);
515   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
516   ok(V_DISPATCH(&v) == (IDispatch*)&test_myVariantClearImpl, "dispatch %p\n", V_DISPATCH(&v));
517   /* Check that Release got called, but nothing else */
518   ok(test_myVariantClearImpl.events ==  0x4, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
519
520   /* DISPATCH BYREF */
521   punk = (IUnknown*)&test_myVariantClearImpl;
522   V_VT(&v) = VT_DISPATCH | VT_BYREF;
523   V_DISPATCHREF(&v) = (IDispatch**)&punk;
524   test_myVariantClearImpl.events = 0;
525   hres = VariantClear(&v);
526   ok(hres == S_OK, "ret %08x\n", hres);
527   ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
528   ok(V_DISPATCHREF(&v) == (IDispatch**)&punk, "dispatch ref %p\n", V_DISPATCHREF(&v));
529   /* Check that nothing got called */
530   ok(test_myVariantClearImpl.events ==  0, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
531 }
532
533 static void test_VariantCopy(void)
534 {
535   VARIANTARG vSrc, vDst;
536   VARTYPE vt;
537   size_t i;
538   HRESULT hres, hExpected;
539
540   /* Establish that the failure/other cases are dealt with. Individual tests
541    * for each type should verify that data is copied correctly, references
542    * are updated, etc.
543    */
544
545   /* vSrc == vDst */
546   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
547   {
548     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
549     {
550       SKIPTESTS(vt);
551
552       memset(&vSrc, 0, sizeof(vSrc));
553       V_VT(&vSrc) = vt | ExtraFlags[i];
554
555       hExpected = DISP_E_BADVARTYPE;
556       /* src is allowed to be a VT_CLSID */
557       if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
558         hExpected = S_OK;
559
560       hres = VariantCopy(&vSrc, &vSrc);
561
562       ok(hres == hExpected,
563          "Copy(src==dst): expected 0x%X, got 0x%X for src==dest vt %d|0x%X\n",
564          hExpected, hres, vt, ExtraFlags[i]);
565     }
566   }
567
568   /* Test that if VariantClear() fails on dest, the function fails. This also
569    * shows that dest is in fact cleared and not just overwritten
570    */
571   memset(&vSrc, 0, sizeof(vSrc));
572   V_VT(&vSrc) = VT_UI1;
573
574   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
575   {
576     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
577     {
578       SKIPTESTS(vt);
579
580       hExpected = DISP_E_BADVARTYPE;
581
582       memset(&vDst, 0, sizeof(vDst));
583       V_VT(&vDst) = vt | ExtraFlags[i];
584
585       if (IsValidVariantClearVT(vt, ExtraFlags[i]))
586         hExpected = S_OK;
587
588       hres = VariantCopy(&vDst, &vSrc);
589
590       ok(hres == hExpected,
591          "Copy(bad dst): expected 0x%X, got 0x%X for dest vt %d|0x%X\n",
592          hExpected, hres, vt, ExtraFlags[i]);
593       if (hres == S_OK)
594         ok(V_VT(&vDst) == VT_UI1,
595            "Copy(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
596     }
597   }
598
599   /* Test that VariantClear() checks vSrc for validity before copying */
600   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
601   {
602     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
603     {
604       SKIPTESTS(vt);
605
606       hExpected = DISP_E_BADVARTYPE;
607
608       memset(&vDst, 0, sizeof(vDst));
609       V_VT(&vDst) = VT_EMPTY;
610
611       memset(&vSrc, 0, sizeof(vSrc));
612       V_VT(&vSrc) = vt | ExtraFlags[i];
613
614       /* src is allowed to be a VT_CLSID */
615       if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
616         hExpected = S_OK;
617
618       hres = VariantCopy(&vDst, &vSrc);
619
620       ok(hres == hExpected,
621          "Copy(bad src): expected 0x%X, got 0x%X for src vt %d|0x%X\n",
622          hExpected, hres, vt, ExtraFlags[i]);
623       if (hres == S_OK)
624         ok(V_VT(&vDst) == (vt|ExtraFlags[i]),
625            "Copy(bad src): expected vt = %d, got %d\n",
626            vt | ExtraFlags[i], V_VT(&vDst));
627     }
628   }
629   
630   /* Test that copying a NULL BSTR results in an empty BSTR */
631   memset(&vDst, 0, sizeof(vDst));
632   V_VT(&vDst) = VT_EMPTY;
633   memset(&vSrc, 0, sizeof(vSrc));
634   V_VT(&vSrc) = VT_BSTR;
635   hres = VariantCopy(&vDst, &vSrc);
636   ok(hres == S_OK, "Copy(NULL BSTR): Failed to copy a NULL BSTR\n");
637   if (hres == S_OK)
638   {
639     ok((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst),
640        "Copy(NULL BSTR): should have non-NULL result\n");
641     if ((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst))
642     {
643       ok(*V_BSTR(&vDst) == 0, "Copy(NULL BSTR): result not empty\n");
644     }
645   }
646 }
647
648 /* Determine if a vt is valid for VariantCopyInd() */
649 static int IsValidVariantCopyIndVT(VARTYPE vt, VARTYPE extraFlags)
650 {
651   int ret = 0;
652
653   if ((extraFlags & VT_ARRAY) ||
654      (vt > VT_NULL && vt != (VARTYPE)15 && vt < VT_VOID &&
655      !(extraFlags & (VT_VECTOR|VT_RESERVED))))
656   {
657     ret = 1; /* ok */
658   }
659   return ret;
660 }
661
662 static void test_VariantCopyInd(void)
663 {
664   VARIANTARG vSrc, vDst, vRef, vRef2;
665   VARTYPE vt;
666   size_t i;
667   BYTE buffer[64];
668   HRESULT hres, hExpected;
669
670   memset(buffer, 0, sizeof(buffer));
671
672   /* vSrc == vDst */
673   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
674   {
675     if (ExtraFlags[i] & VT_ARRAY)
676       continue; /* Native crashes on NULL safearray */
677
678     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
679     {
680       SKIPTESTS(vt);
681
682       memset(&vSrc, 0, sizeof(vSrc));
683       V_VT(&vSrc) = vt | ExtraFlags[i];
684
685       hExpected = DISP_E_BADVARTYPE;
686       if (!(ExtraFlags[i] & VT_BYREF))
687       {
688         /* if src is not by-reference, acts as VariantCopy() */
689         if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
690           hExpected = S_OK;
691       }
692       else
693       {
694         if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
695             vt == VT_DISPATCH || vt == VT_RECORD)
696           continue; /* Need valid ptrs for deep copies */
697
698         V_BYREF(&vSrc) = &buffer;
699         hExpected = E_INVALIDARG;
700
701         if ((vt == VT_I8 || vt == VT_UI8) &&
702             ExtraFlags[i] == VT_BYREF)
703         {
704           if (HAVE_OLEAUT32_I8)
705             hExpected = S_OK; /* Only valid if I8 is a known type */
706         }
707         else if (IsValidVariantCopyIndVT(vt, ExtraFlags[i]))
708           hExpected = S_OK;
709       }
710
711       hres = VariantCopyInd(&vSrc, &vSrc);
712
713       ok(hres == hExpected,
714          "CopyInd(src==dst): expected 0x%X, got 0x%X for src==dst vt %d|0x%X\n",
715          hExpected, hres, vt, ExtraFlags[i]);
716     }
717   }
718
719   /* Bad dest */
720   memset(&vSrc, 0, sizeof(vSrc));
721   V_VT(&vSrc) = VT_UI1|VT_BYREF;
722   V_BYREF(&vSrc) = &buffer;
723
724   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
725   {
726     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
727     {
728       SKIPTESTS(vt);
729
730       memset(&vDst, 0, sizeof(vDst));
731       V_VT(&vDst) = vt | ExtraFlags[i];
732
733       hExpected = DISP_E_BADVARTYPE;
734
735       if (IsValidVariantClearVT(vt, ExtraFlags[i]))
736         hExpected = S_OK;
737
738       hres = VariantCopyInd(&vDst, &vSrc);
739
740       ok(hres == hExpected,
741          "CopyInd(bad dst): expected 0x%X, got 0x%X for dst vt %d|0x%X\n",
742          hExpected, hres, vt, ExtraFlags[i]);
743       if (hres == S_OK)
744         ok(V_VT(&vDst) == VT_UI1,
745            "CopyInd(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
746     }
747   }
748
749   /* bad src */
750   for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
751   {
752     if (ExtraFlags[i] & VT_ARRAY)
753       continue; /* Native crashes on NULL safearray */
754
755     for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
756     {
757       SKIPTESTS(vt);
758
759       memset(&vDst, 0, sizeof(vDst));
760       V_VT(&vDst) = VT_EMPTY;
761
762       memset(&vSrc, 0, sizeof(vSrc));
763       V_VT(&vSrc) = vt | ExtraFlags[i];
764
765       hExpected = DISP_E_BADVARTYPE;
766       if (!(ExtraFlags[i] & VT_BYREF))
767       {
768         /* if src is not by-reference, acts as VariantCopy() */
769         if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
770           hExpected = S_OK;
771       }
772       else
773       {
774         if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
775             vt == VT_DISPATCH || vt == VT_RECORD)
776           continue; /* Need valid ptrs for deep copies, see vartype.c */
777
778         V_BYREF(&vSrc) = &buffer;
779
780         hExpected = E_INVALIDARG;
781
782         if ((vt == VT_I8 || vt == VT_UI8) &&
783             ExtraFlags[i] == VT_BYREF)
784         {
785           if (HAVE_OLEAUT32_I8)
786             hExpected = S_OK; /* Only valid if I8 is a known type */
787         }
788         else if (IsValidVariantCopyIndVT(vt, ExtraFlags[i]))
789           hExpected = S_OK;
790       }
791
792       hres = VariantCopyInd(&vDst, &vSrc);
793
794       ok(hres == hExpected,
795          "CopyInd(bad src): expected 0x%X, got 0x%X for src vt %d|0x%X\n",
796          hExpected, hres, vt, ExtraFlags[i]);
797       if (hres == S_OK)
798       {
799         if (vt == VT_VARIANT && ExtraFlags[i] == VT_BYREF)
800         {
801           /* Type of vDst should be the type of the referenced variant.
802            * Since we set the buffer to all zeros, its type should be
803            * VT_EMPTY.
804            */
805           ok(V_VT(&vDst) == VT_EMPTY,
806              "CopyInd(bad src): expected dst vt = VT_EMPTY, got %d|0x%X\n",
807              V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
808         }
809         else
810         {
811           ok(V_VT(&vDst) == (vt|(ExtraFlags[i] & ~VT_BYREF)),
812              "CopyInd(bad src): expected dst vt = %d|0x%X, got %d|0x%X\n",
813              vt, ExtraFlags[i] & ~VT_BYREF,
814              V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
815         }
816       }
817     }
818   }
819
820   /* By-reference variants are dereferenced */
821   V_VT(&vRef) = VT_UI1;
822   V_UI1(&vRef) = 0x77;
823   V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
824   V_VARIANTREF(&vSrc) = &vRef;
825   VariantInit(&vDst);
826
827   hres = VariantCopyInd(&vDst, &vSrc);
828   ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x77,
829      "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
830       V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
831
832   /* By-reference variant to a by-reference type succeeds */
833   V_VT(&vRef) = VT_UI1|VT_BYREF;
834   V_UI1REF(&vRef) = buffer; buffer[0] = 0x88;
835   V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
836   V_VARIANTREF(&vSrc) = &vRef;
837   VariantInit(&vDst);
838
839   hres = VariantCopyInd(&vDst, &vSrc);
840   ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x88,
841      "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
842       V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
843
844   /* But a by-reference variant to a by-reference variant fails */
845   V_VT(&vRef2) = VT_UI1;
846   V_UI1(&vRef2) = 0x77;
847   V_VT(&vRef) = VT_VARIANT|VT_BYREF;
848   V_VARIANTREF(&vRef) = &vRef2;
849   V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
850   V_VARIANTREF(&vSrc) = &vRef;
851   VariantInit(&vDst);
852
853   hres = VariantCopyInd(&vDst, &vSrc);
854   ok(hres == E_INVALIDARG,
855      "CopyInd(ref->ref): expected E_INVALIDARG, got 0x%08x\n", hres);
856 }
857
858 static HRESULT (WINAPI *pVarParseNumFromStr)(OLECHAR*,LCID,ULONG,NUMPARSE*,BYTE*);
859
860 /* Macros for converting and testing the result of VarParseNumFromStr */
861 #define FAILDIG 255
862
863 static HRESULT convert_str( const char *str, INT dig, ULONG flags,
864                             NUMPARSE *np, BYTE rgb[128], LCID lcid )
865 {
866     OLECHAR buff[128];
867     MultiByteToWideChar( CP_ACP,0, str, -1, buff, sizeof(buff)/sizeof(WCHAR) );
868     memset( rgb, FAILDIG, 128 );
869     memset( np, 255, sizeof(*np) );
870     np->cDig = dig;
871     np->dwInFlags = flags;
872     return pVarParseNumFromStr( buff, lcid, LOCALE_NOUSEROVERRIDE, np, rgb);
873 }
874
875 static void expect_NumFromStr( int line, HRESULT hres, NUMPARSE *np, INT a, ULONG b, ULONG c,
876                                INT d, INT e, INT f )
877 {
878     if (hres == (HRESULT)S_OK)
879     {
880         ok_(__FILE__,line)(np->cDig == a, "Expected cDig = %d, got %d\n", a, np->cDig);
881         ok_(__FILE__,line)(np->dwInFlags == b, "Expected dwInFlags = 0x%x, got 0x%x\n", b, np->dwInFlags);
882         ok_(__FILE__,line)(np->dwOutFlags == c, "Expected dwOutFlags = 0x%x, got 0x%x\n", c, np->dwOutFlags);
883         ok_(__FILE__,line)(np->cchUsed == d, "Expected cchUsed = %d, got %d\n", d, np->cchUsed);
884         ok_(__FILE__,line)(np->nBaseShift == e, "Expected nBaseShift = %d, got %d\n", e, np->nBaseShift);
885         ok_(__FILE__,line)(np->nPwr10 == f, "Expected nPwr10 = %d, got %d\n", f, np->nPwr10);
886     }
887 }
888
889 #define CONVERTN(str,dig,flags) hres = convert_str( str, dig, flags, &np, rgb, lcid )
890 #define CONVERT(str,flags) CONVERTN(str,sizeof(rgb),flags)
891 #define EXPECT(a,b,c,d,e,f) expect_NumFromStr( __LINE__, hres, &np, a, b, c, d, e, f )
892 #define EXPECTRGB(a,b) ok(rgb[a] == b, "Digit[%d], expected %d, got %d\n", a, b, rgb[a])
893 #define EXPECTFAIL ok(hres == (HRESULT)DISP_E_TYPEMISMATCH, "Call succeeded, hres = %08x\n", hres)
894 #define EXPECT2(a,b) EXPECTRGB(0,a); EXPECTRGB(1,b)
895
896 static void test_VarParseNumFromStr(void)
897 {
898   HRESULT hres;
899   /* Ensure all tests are using the same locale characters for '$', ',' etc */
900   LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
901   NUMPARSE np;
902   BYTE rgb[128];
903
904   /** No flags **/
905
906   CHECKPTR(VarParseNumFromStr);
907
908   /* Consume a single digit */
909   CONVERT("7", 0);
910   EXPECT(1,0,0,1,0,0);
911   EXPECT2(7,FAILDIG);
912
913   /* cDig is not literal digits - zeros are suppressed and nPwr10 is increased */
914   CONVERT("10", 0);
915   EXPECT(1,0,0,2,0,1);
916   /* Note: Win32 writes the trailing zeros if they are within cDig's limits,
917    * but then excludes them from the returned cDig count.
918    * In our implementation we don't bother writing them at all.
919    */
920   EXPECTRGB(0, 1);
921
922   /* if cDig is too small and numbers follow, sets INEXACT */
923   CONVERTN("11",1, 0);
924   EXPECT(1,0,NUMPRS_INEXACT,2,0,1);
925   EXPECT2(1,FAILDIG);
926
927   /* Strips leading zeros */
928   CONVERT("01", 0);
929   EXPECT(1,0,0,2,0,0);
930   EXPECT2(1,FAILDIG);
931
932   /* Strips leading zeros */
933   CONVERTN("01",1, 0);
934   EXPECT(1,0,0,2,0,0);
935   EXPECT2(1,FAILDIG);
936
937
938   /* Fails on non digits */
939   CONVERT("a", 0);
940   EXPECTFAIL;
941   EXPECTRGB(0,FAILDIG);
942
943   /** NUMPRS_LEADING_WHITE/NUMPRS_TRAILING_WHITE **/
944
945   /* Without flag, fails on whitespace */
946   CONVERT(" 0", 0);
947   EXPECTFAIL;
948   EXPECTRGB(0,FAILDIG);
949
950
951   /* With flag, consumes whitespace */
952   CONVERT(" 0", NUMPRS_LEADING_WHITE);
953   EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
954   EXPECT2(0,FAILDIG);
955
956   /* Test TAB once, then assume it acts as space for all cases */
957   CONVERT("\t0", NUMPRS_LEADING_WHITE);
958   EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
959   EXPECT2(0,FAILDIG);
960
961
962   /* Doesn't pick up trailing whitespace without flag */
963   CONVERT("0 ", 0);
964   EXPECT(1,0,0,1,0,0);
965   EXPECT2(0,FAILDIG);
966
967   /* With flag, consumes trailing whitespace */
968   CONVERT("0 ", NUMPRS_TRAILING_WHITE);
969   EXPECT(1,NUMPRS_TRAILING_WHITE,NUMPRS_TRAILING_WHITE,2,0,0);
970   EXPECT2(0,FAILDIG);
971
972   /* Leading flag only consumes leading */
973   CONVERT(" 0 ", NUMPRS_LEADING_WHITE);
974   EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
975   EXPECT2(0,FAILDIG);
976
977   /* Both flags consumes both */
978   CONVERT(" 0 ", NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE);
979   EXPECT(1,NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE,NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE,3,0,0);
980   EXPECT2(0,FAILDIG);
981
982   /** NUMPRS_LEADING_PLUS/NUMPRS_TRAILING_PLUS **/
983
984   /* Without flag, fails on + */
985   CONVERT("+0", 0);
986   EXPECTFAIL;
987   EXPECTRGB(0,FAILDIG);
988
989   /* With flag, consumes + */
990   CONVERT("+0", NUMPRS_LEADING_PLUS);
991   EXPECT(1,NUMPRS_LEADING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
992   EXPECT2(0,FAILDIG);
993
994   /* Without flag, doesn't consume trailing + */
995   CONVERT("0+", 0);
996   EXPECT(1,0,0,1,0,0);
997   EXPECT2(0,FAILDIG);
998
999   /* With flag, consumes trailing + */
1000   CONVERT("0+", NUMPRS_TRAILING_PLUS);
1001   EXPECT(1,NUMPRS_TRAILING_PLUS,NUMPRS_TRAILING_PLUS,2,0,0);
1002   EXPECT2(0,FAILDIG);
1003
1004   /* With leading flag, doesn't consume trailing + */
1005   CONVERT("+0+", NUMPRS_LEADING_PLUS);
1006   EXPECT(1,NUMPRS_LEADING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
1007   EXPECT2(0,FAILDIG);
1008
1009   /* Trailing + doesn't get consumed if we specify both (unlike whitespace) */
1010   CONVERT("+0+", NUMPRS_LEADING_PLUS|NUMPRS_TRAILING_PLUS);
1011   EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_TRAILING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
1012   EXPECT2(0,FAILDIG);
1013
1014   /** NUMPRS_LEADING_MINUS/NUMPRS_TRAILING_MINUS **/
1015
1016   /* Without flag, fails on - */
1017   CONVERT("-0", 0);
1018   EXPECTFAIL;
1019   EXPECTRGB(0,FAILDIG);
1020
1021   /* With flag, consumes - */
1022   CONVERT("-0", NUMPRS_LEADING_MINUS);
1023   EXPECT(1,NUMPRS_LEADING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1024   EXPECT2(0,FAILDIG);
1025
1026   /* Without flag, doesn't consume trailing - */
1027   CONVERT("0-", 0);
1028   EXPECT(1,0,0,1,0,0);
1029   EXPECT2(0,FAILDIG);
1030
1031   /* With flag, consumes trailing - */
1032   CONVERT("0-", NUMPRS_TRAILING_MINUS);
1033   EXPECT(1,NUMPRS_TRAILING_MINUS,NUMPRS_NEG|NUMPRS_TRAILING_MINUS,2,0,0);
1034   EXPECT2(0,FAILDIG);
1035
1036   /* With leading flag, doesn't consume trailing - */
1037   CONVERT("-0-", NUMPRS_LEADING_MINUS);
1038   EXPECT(1,NUMPRS_LEADING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1039   EXPECT2(0,FAILDIG);
1040
1041   /* Trailing - doesn't get consumed if we specify both (unlike whitespace) */
1042   CONVERT("-0-", NUMPRS_LEADING_MINUS|NUMPRS_TRAILING_MINUS);
1043   EXPECT(1,NUMPRS_LEADING_MINUS|NUMPRS_TRAILING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1044   EXPECT2(0,FAILDIG);
1045
1046   /** NUMPRS_HEX_OCT **/
1047
1048   /* Could be hex, octal or decimal - With flag reads as decimal */
1049   CONVERT("0", NUMPRS_HEX_OCT);
1050   EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1051   EXPECT2(0,FAILDIG);
1052
1053   /* Doesn't recognise hex in .asm sytax */
1054   CONVERT("0h", NUMPRS_HEX_OCT);
1055   EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1056   EXPECT2(0,FAILDIG);
1057
1058   /* Doesn't fail with valid leading string but no digits */
1059   CONVERT("0x", NUMPRS_HEX_OCT);
1060   EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1061   EXPECT2(0,FAILDIG);
1062
1063   /* Doesn't recognise hex format humbers at all! */
1064   CONVERT("0x0", NUMPRS_HEX_OCT);
1065   EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1066   EXPECT2(0,FAILDIG);
1067
1068   /* Doesn't recognise plain hex digits either */
1069   CONVERT("FE", NUMPRS_HEX_OCT);
1070   EXPECTFAIL;
1071   EXPECTRGB(0,FAILDIG);
1072
1073   /* Octal */
1074   CONVERT("0100", NUMPRS_HEX_OCT);
1075   EXPECT(1,NUMPRS_HEX_OCT,0,4,0,2);
1076   EXPECTRGB(0,1);
1077   EXPECTRGB(1,0);
1078   EXPECTRGB(2,0);
1079   EXPECTRGB(3,FAILDIG);
1080
1081   /* VB hex */
1082   CONVERT("&HF800", NUMPRS_HEX_OCT);
1083   EXPECT(4,NUMPRS_HEX_OCT,0x40,6,4,0);
1084   EXPECTRGB(0,15);
1085   EXPECTRGB(1,8);
1086   EXPECTRGB(2,0);
1087   EXPECTRGB(3,0);
1088   EXPECTRGB(4,FAILDIG);
1089
1090   /* VB hex lower case and leading zero */
1091   CONVERT("&h0abcdef", NUMPRS_HEX_OCT);
1092   EXPECT(6,NUMPRS_HEX_OCT,0x40,9,4,0);
1093   EXPECTRGB(0,10);
1094   EXPECTRGB(1,11);
1095   EXPECTRGB(2,12);
1096   EXPECTRGB(3,13);
1097   EXPECTRGB(4,14);
1098   EXPECTRGB(5,15);
1099   EXPECTRGB(6,FAILDIG);
1100
1101   /* VB oct */
1102   CONVERT("&O300", NUMPRS_HEX_OCT);
1103   EXPECT(3,NUMPRS_HEX_OCT,0x40,5,3,0);
1104   EXPECTRGB(0,3);
1105   EXPECTRGB(1,0);
1106   EXPECTRGB(2,0);
1107   EXPECTRGB(3,FAILDIG);
1108
1109   /* VB oct lower case and leading zero */
1110   CONVERT("&o0777", NUMPRS_HEX_OCT);
1111   EXPECT(3,NUMPRS_HEX_OCT,0x40,6,3,0);
1112   EXPECTRGB(0,7);
1113   EXPECTRGB(1,7);
1114   EXPECTRGB(2,7);
1115   EXPECTRGB(3,FAILDIG);
1116
1117   /* VB oct char bigger than 7 */
1118   CONVERT("&o128", NUMPRS_HEX_OCT);
1119 /*
1120   Native versions 2.x of oleaut32 allow this to succeed: later versions and Wine don't
1121   EXPECTFAIL;
1122   EXPECTRGB(0,FAILDIG);
1123 */
1124   /** NUMPRS_PARENS **/
1125
1126   /* Empty parens = error */
1127   CONVERT("()", NUMPRS_PARENS);
1128   EXPECTFAIL;
1129   EXPECTRGB(0,FAILDIG);
1130
1131   /* With flag, trailing parens not consumed */
1132   CONVERT("0()", NUMPRS_PARENS);
1133   EXPECT(1,NUMPRS_PARENS,0,1,0,0);
1134   EXPECT2(0,FAILDIG);
1135
1136   /* With flag, Number in parens made negative and parens consumed */
1137   CONVERT("(0)", NUMPRS_PARENS);
1138   EXPECT(1,NUMPRS_PARENS,NUMPRS_NEG|NUMPRS_PARENS,3,0,0);
1139   EXPECT2(0,FAILDIG);
1140
1141   /** NUMPRS_THOUSANDS **/
1142
1143   /* With flag, thousands sep. not needed */
1144   CONVERT("0", NUMPRS_THOUSANDS);
1145   EXPECT(1,NUMPRS_THOUSANDS,0,1,0,0);
1146   EXPECT2(0,FAILDIG);
1147
1148   /* With flag, thousands sep. and following digits consumed */
1149   CONVERT("1,000", NUMPRS_THOUSANDS);
1150   EXPECT(1,NUMPRS_THOUSANDS,NUMPRS_THOUSANDS,5,0,3);
1151   EXPECTRGB(0,1);
1152
1153   /* With flag and decimal point, thousands sep. but not decimals consumed */
1154   CONVERT("1,000.0", NUMPRS_THOUSANDS);
1155   EXPECT(1,NUMPRS_THOUSANDS,NUMPRS_THOUSANDS,5,0,3);
1156   EXPECTRGB(0,1);
1157
1158   /** NUMPRS_CURRENCY **/
1159
1160   /* Without flag, chokes on currency sign */
1161   CONVERT("$11", 0);
1162   EXPECTFAIL;
1163   EXPECTRGB(0,FAILDIG);
1164
1165   /* With flag, consumes currency sign */
1166   CONVERT("$11", NUMPRS_CURRENCY);
1167   EXPECT(2,NUMPRS_CURRENCY,NUMPRS_CURRENCY,3,0,0);
1168   EXPECT2(1,1);
1169   EXPECTRGB(2,FAILDIG);
1170
1171   /* With flag only, doesn't consume decimal point */
1172   CONVERT("$11.1", NUMPRS_CURRENCY);
1173   EXPECT(2,NUMPRS_CURRENCY,NUMPRS_CURRENCY,3,0,0);
1174   EXPECT2(1,1);
1175   EXPECTRGB(2,FAILDIG);
1176
1177   /* With flag and decimal flag, consumes decimal point and following digits */
1178   CONVERT("$11.1", NUMPRS_CURRENCY|NUMPRS_DECIMAL);
1179   EXPECT(3,NUMPRS_CURRENCY|NUMPRS_DECIMAL,NUMPRS_CURRENCY|NUMPRS_DECIMAL,5,0,-1);
1180   EXPECT2(1,1);
1181   EXPECTRGB(2,1);
1182   EXPECTRGB(3,FAILDIG);
1183
1184   /* Thousands flag can only be used with currency */
1185   CONVERT("$1,234", NUMPRS_CURRENCY|NUMPRS_THOUSANDS);
1186   EXPECT(4,NUMPRS_CURRENCY|NUMPRS_THOUSANDS,NUMPRS_CURRENCY|NUMPRS_THOUSANDS,6,0,0);
1187   EXPECT2(1,2);
1188   EXPECTRGB(2,3);
1189   EXPECTRGB(3,4);
1190   EXPECTRGB(4,FAILDIG);
1191
1192   /** NUMPRS_DECIMAL **/
1193
1194   /* With flag, consumes decimal point */
1195   CONVERT("1.1", NUMPRS_DECIMAL);
1196   EXPECT(2,NUMPRS_DECIMAL,NUMPRS_DECIMAL,3,0,-1);
1197   EXPECT2(1,1);
1198   EXPECTRGB(2,FAILDIG);
1199
1200   /* With flag, consumes decimal point. Skipping the decimal part is not an error */
1201   CONVERT("1.", NUMPRS_DECIMAL);
1202   EXPECT(1,NUMPRS_DECIMAL,NUMPRS_DECIMAL,2,0,0);
1203   EXPECT2(1,FAILDIG);
1204
1205   /* Consumes only one decimal point */
1206   CONVERT("1.1.", NUMPRS_DECIMAL);
1207   EXPECT(2,NUMPRS_DECIMAL,NUMPRS_DECIMAL,3,0,-1);
1208   EXPECT2(1,1);
1209   EXPECTRGB(2,FAILDIG);
1210
1211   /** NUMPRS_EXPONENT **/
1212
1213   /* Without flag, doesn't consume exponent */
1214   CONVERT("1e1", 0);
1215   EXPECT(1,0,0,1,0,0);
1216   EXPECT2(1,FAILDIG);
1217
1218   /* With flag, consumes exponent */
1219   CONVERT("1e1", NUMPRS_EXPONENT);
1220   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,1);
1221   EXPECT2(1,FAILDIG);
1222
1223   /* Negative exponents are accepted without flags */
1224   CONVERT("1e-1", NUMPRS_EXPONENT);
1225   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,-1);
1226   EXPECT2(1,FAILDIG);
1227
1228   /* As are positive exponents and leading exponent 0s */
1229   CONVERT("1e+01", NUMPRS_EXPONENT);
1230   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,5,0,1);
1231   EXPECT2(1,FAILDIG);
1232
1233   /* The same for zero exponents */
1234   CONVERT("1e0", NUMPRS_EXPONENT);
1235   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,0);
1236   EXPECT2(1,FAILDIG);
1237
1238   /* Sign on a zero exponent doesn't matter */
1239   CONVERT("1e+0", NUMPRS_EXPONENT);
1240   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,0);
1241   EXPECT2(1,FAILDIG);
1242
1243   CONVERT("1e-0", NUMPRS_EXPONENT);
1244   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,0);
1245   EXPECT2(1,FAILDIG);
1246
1247   /* Doesn't consume a real number exponent */
1248   CONVERT("1e1.", NUMPRS_EXPONENT);
1249   EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,1);
1250   EXPECT2(1,FAILDIG);
1251
1252   /* Powers of 10 are calculated from the position of any decimal point */
1253   CONVERT("1.5e20", NUMPRS_EXPONENT|NUMPRS_DECIMAL);
1254   EXPECT(2,NUMPRS_EXPONENT|NUMPRS_DECIMAL,NUMPRS_EXPONENT|NUMPRS_DECIMAL,6,0,19);
1255   EXPECT2(1,5);
1256
1257   CONVERT("1.5e-20", NUMPRS_EXPONENT|NUMPRS_DECIMAL);
1258   EXPECT(2,NUMPRS_EXPONENT|NUMPRS_DECIMAL,NUMPRS_EXPONENT|NUMPRS_DECIMAL,7,0,-21);
1259   EXPECT2(1,5);
1260
1261   /** NUMPRS_USE_ALL **/
1262
1263   /* Flag expects all digits */
1264   CONVERT("0", NUMPRS_USE_ALL);
1265   EXPECT(1,NUMPRS_USE_ALL,0,1,0,0);
1266   EXPECT2(0,FAILDIG);
1267
1268   /* Rejects anything trailing */
1269   CONVERT("0 ", NUMPRS_USE_ALL);
1270   EXPECTFAIL;
1271   EXPECT2(0,FAILDIG);
1272
1273   /* Unless consumed by trailing flag */
1274   CONVERT("0 ", NUMPRS_USE_ALL|NUMPRS_TRAILING_WHITE);
1275   EXPECT(1,NUMPRS_USE_ALL|NUMPRS_TRAILING_WHITE,NUMPRS_TRAILING_WHITE,2,0,0);
1276   EXPECT2(0,FAILDIG);
1277
1278   /** Combinations **/
1279
1280   /* Leading whitespace and plus, doesn't consume trailing whitespace */
1281   CONVERT("+ 0 ", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1282   EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,3,0,0);
1283   EXPECT2(0,FAILDIG);
1284
1285   /* Order of whitespace and plus is unimportant */
1286   CONVERT(" +0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1287   EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,3,0,0);
1288   EXPECT2(0,FAILDIG);
1289
1290   /* Leading whitespace can be repeated */
1291   CONVERT(" + 0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1292   EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,4,0,0);
1293   EXPECT2(0,FAILDIG);
1294
1295   /* But plus/minus etc. cannot */
1296   CONVERT("+ +0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1297   EXPECTFAIL;
1298   EXPECTRGB(0,FAILDIG);
1299
1300   /* Inexact is not set if trailing zeros are removed */
1301   CONVERTN("10", 1, 0);
1302   EXPECT(1,0,0,2,0,1);
1303   EXPECT2(1,FAILDIG);
1304
1305   /* Make sure a leading 0 is stripped but decimals after it get read */
1306   CONVERT("-0.51", NUMPRS_STD);
1307   EXPECT(2,NUMPRS_STD,NUMPRS_NEG|NUMPRS_DECIMAL|NUMPRS_LEADING_MINUS,5,0,-2);
1308   EXPECT2(5,1);
1309
1310   /* Keep trailing zeros on whole number part of a decimal */
1311   CONVERT("10.1", NUMPRS_STD);
1312   EXPECT(3,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
1313   EXPECT2(1,0);
1314   EXPECTRGB(2,1);
1315
1316   /* Zeros after decimal sign */
1317   CONVERT("0.01", NUMPRS_STD);
1318   EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-2);
1319   EXPECT2(1,FAILDIG);
1320
1321   /* Trailing zeros after decimal part */
1322   CONVERT("0.10", NUMPRS_STD);
1323   EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
1324   EXPECT2(1,0);
1325 }
1326
1327 static HRESULT (WINAPI *pVarNumFromParseNum)(NUMPARSE*,BYTE*,ULONG,VARIANT*);
1328
1329 /* Macros for converting and testing the result of VarNumFromParseNum */
1330 #define SETRGB(indx,val) if (!indx) memset(rgb, FAILDIG, sizeof(rgb)); rgb[indx] = val
1331 #undef CONVERT
1332 #define CONVERT(a,b,c,d,e,f,bits) \
1333     np.cDig = (a); np.dwInFlags = (b); np.dwOutFlags = (c); np.cchUsed = (d); \
1334     np.nBaseShift = (e); np.nPwr10 = (f); hres = pVarNumFromParseNum(&np, rgb, bits, &vOut)
1335 static const char *szFailOverflow = "Expected overflow, hres = %08x\n";
1336 #define EXPECT_OVERFLOW ok(hres == (HRESULT)DISP_E_OVERFLOW, szFailOverflow, hres)
1337 static const char *szFailOk = "Call failed, hres = %08x\n";
1338 #define EXPECT_OK ok(hres == (HRESULT)S_OK, szFailOk, hres); \
1339   if (hres == (HRESULT)S_OK)
1340 #define EXPECT_TYPE(typ) ok(V_VT(&vOut) == typ,"Expected Type = " #typ ", got %d\n", V_VT(&vOut))
1341 #define EXPECT_I1(val) EXPECT_OK { EXPECT_TYPE(VT_I1); \
1342   ok(V_I1(&vOut) == val, "Expected i1 = %d, got %d\n", (signed char)val, V_I1(&vOut)); }
1343 #define EXPECT_UI1(val) EXPECT_OK { EXPECT_TYPE(VT_UI1); \
1344   ok(V_UI1(&vOut) == val, "Expected ui1 = %d, got %d\n", (BYTE)val, V_UI1(&vOut)); }
1345 #define EXPECT_I2(val) EXPECT_OK { EXPECT_TYPE(VT_I2); \
1346   ok(V_I2(&vOut) == val, "Expected i2 = %d, got %d\n", (SHORT)val, V_I2(&vOut)); }
1347 #define EXPECT_UI2(val) EXPECT_OK { EXPECT_TYPE(VT_UI2); \
1348   ok(V_UI2(&vOut) == val, "Expected ui2 = %d, got %d\n", (USHORT)val, V_UI2(&vOut)); }
1349 #define EXPECT_I4(val) EXPECT_OK { EXPECT_TYPE(VT_I4); \
1350   ok(V_I4(&vOut) == val, "Expected i4 = %d, got %d\n", (LONG)val, V_I4(&vOut)); }
1351 #define EXPECT_UI4(val) EXPECT_OK { EXPECT_TYPE(VT_UI4); \
1352   ok(V_UI4(&vOut) == val, "Expected ui4 = %d, got %d\n", (ULONG)val, V_UI4(&vOut)); }
1353 #define EXPECT_I8(high,low) EXPECT_OK { EXPECT_TYPE(VT_I8); \
1354   ok(V_I8(&vOut) == ((((LONG64)(high))<<32)|(low)), "Expected i8 = %x%08x, got %x%08x\n", \
1355      (LONG)(high), (LONG)(low), (LONG)(V_I8(&vOut)>>32), (LONG)V_I8(&vOut) ); }
1356 #define EXPECT_UI8(val) EXPECT_OK { EXPECT_TYPE(VT_UI8); \
1357   ok(V_UI8(&vOut) == val, "Expected ui8 = 0x%x%08x, got 0x%x%08x\n", \
1358       (DWORD)((ULONG64)val >> 32), (DWORD)(ULONG64)val, (DWORD)(V_UI8(&vOut) >> 32), (DWORD)V_UI8(&vOut)); }
1359 #define EXPECT_R4(val) EXPECT_OK { EXPECT_TYPE(VT_R4); \
1360   ok(V_R4(&vOut) == val, "Expected r4 = %f, got %f\n", val, V_R4(&vOut)); }
1361 #define EXPECT_R8(val) EXPECT_OK { EXPECT_TYPE(VT_R8); \
1362   ok(V_R8(&vOut) == val, "Expected r8 = %g, got %g\n", val, V_R8(&vOut)); }
1363 #define CY_MULTIPLIER 10000
1364 #define EXPECT_CY(val) EXPECT_OK { EXPECT_TYPE(VT_CY); \
1365   ok(V_CY(&vOut).int64 == (LONG64)(val * CY_MULTIPLIER), "Expected r8 = 0x%x%08x, got 0x%x%08x\n", \
1366       (DWORD)((LONG64)val >> 23), (DWORD)(LONG64)val, (DWORD)(V_CY(&vOut).int64 >>32), (DWORD)V_CY(&vOut).int64); }
1367 #define EXPECT_DECIMAL(valHi, valMid, valLo) EXPECT_OK { EXPECT_TYPE(VT_DECIMAL); \
1368       ok((V_DECIMAL(&vOut).Hi32 == valHi) && (S1(U1(V_DECIMAL(&vOut))).Mid32 == valMid) && \
1369       (S1(U1(V_DECIMAL(&vOut))).Lo32 == valLo),                      \
1370   "Expected decimal = %x/0x%x%08x, got %x/0x%x%08x\n", valHi, valMid, valLo, \
1371       V_DECIMAL(&vOut).Hi32, S1(U1(V_DECIMAL(&vOut))).Mid32, S1(U1(V_DECIMAL(&vOut))).Lo32); }
1372
1373 static void test_VarNumFromParseNum(void)
1374 {
1375   HRESULT hres;
1376   NUMPARSE np;
1377   BYTE rgb[128];
1378   VARIANT vOut;
1379
1380   CHECKPTR(VarNumFromParseNum);
1381     
1382   /* Convert the number 1 to different types */
1383   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1); EXPECT_I1(1);
1384   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_UI1); EXPECT_UI1(1);
1385   /* Prefers a signed type to unsigned of the same size */
1386   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1|VTBIT_UI1); EXPECT_I1(1);
1387   /* But takes the smaller size if possible */
1388   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I2|VTBIT_UI1); EXPECT_UI1(1);
1389
1390   /* Try different integer sizes */
1391 #define INTEGER_VTBITS (VTBIT_I1|VTBIT_UI1|VTBIT_I2|VTBIT_UI2|VTBIT_I4|VTBIT_UI4|VTBIT_I8|VTBIT_UI8)
1392
1393   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, INTEGER_VTBITS); EXPECT_I1(1);
1394   /* 127 */
1395   SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 7);
1396   CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I1(127);
1397   /* 128 */
1398   SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
1399   CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(128);
1400   /* 255 */
1401   SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 5);
1402   CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(255);
1403   /* 256 */
1404   SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 6);
1405   CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I2(256);
1406   /* 32767 */
1407   SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 7);
1408   CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_I2(32767);
1409   /* 32768 */
1410   SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
1411   CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_UI2(32768);
1412
1413   /* Assume the above pattern holds for remaining positive integers; test negative */
1414
1415   /* -128 */
1416   SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
1417   CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I1(-128);
1418   /* -129 */
1419   SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 9);
1420   CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I2(-129);
1421   /* -32768 */
1422   SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
1423   CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I2(-32768);
1424   /* -32768 */
1425   SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 9);
1426   CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I4(-32769);
1427
1428   /* Assume the above pattern holds for remaining negative integers */
1429
1430   /* Test hexadecimal conversions */
1431   SETRGB(0, 1); CONVERT(1,0,0,1,4,0, INTEGER_VTBITS); EXPECT_I1(0x01);
1432   /* 0x7f */
1433   SETRGB(0, 7); SETRGB(1, 0xf);
1434   CONVERT(2,0,0,2,4,0, INTEGER_VTBITS); EXPECT_I1(0x7f);
1435   SETRGB(0, 7); SETRGB(1, 0xf);
1436   CONVERT(2,0,0,2,4,0, VTBIT_DECIMAL); EXPECT_DECIMAL(0,0,0x7f);
1437   /* 0x7fff */
1438   SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1439   CONVERT(4,0,0,4,4,0, INTEGER_VTBITS); EXPECT_I2(0x7fff);
1440   /* 0x7fffffff */
1441   SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1442   SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
1443   CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x7fffffffL);
1444   /* 0x7fffffffffffffff (64 bits) */
1445   SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1446   SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
1447   SETRGB(8, 0xf); SETRGB(9, 0xf); SETRGB(10, 0xf); SETRGB(11, 0xf);
1448   SETRGB(12, 0xf); SETRGB(13, 0xf); SETRGB(14, 0xf); SETRGB(15, 0xf);
1449   if (HAVE_OLEAUT32_I8)
1450   {
1451     /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
1452        truncate the number to the smallest integer size requested:
1453        CONVERT(16,0,0,16,4,0, INTEGER_VTBITS); EXPECT_I1((signed char)0xff); */
1454     CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x7fffffff,0xffffffff);
1455   }
1456
1457   /* Assume the above pattern holds for numbers without hi-bit set, test (preservation of) hi-bit */
1458   /* 0x82 */
1459   SETRGB(0, 8); SETRGB(1, 2);
1460   CONVERT(2,0,0,2,4,0, INTEGER_VTBITS);
1461   EXPECT_I1((signed char)0x82);
1462   /* 0x8002 */
1463   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
1464   CONVERT(4,0,0,4,4,0, INTEGER_VTBITS);
1465   EXPECT_I2((signed short)0x8002);
1466   /* 0x80000002 */
1467   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1468   SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
1469   CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x80000002);
1470   /* 0x8000000000000002 (64 bits) */
1471   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1472   SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
1473   SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
1474   SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
1475   if (HAVE_OLEAUT32_I8)
1476   {
1477     /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
1478        truncate the number to the smallest integer size requested:
1479        CONVERT(16,0,0,16,4,0, INTEGER_VTBITS & ~VTBIT_I1);
1480        EXPECT_I2((signed short)0x0002); */
1481     CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x80000000,0x00000002);
1482   }
1483
1484   /* Test (preservation of) hi-bit with STRICT type requesting */
1485   /* 0x82 */
1486   SETRGB(0, 8); SETRGB(1, 2);
1487   CONVERT(2,0,0,2,4,0, VTBIT_I1);
1488   EXPECT_I1((signed char)0x82);
1489   /* 0x8002 */
1490   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
1491   CONVERT(4,0,0,4,4,0, VTBIT_I2);
1492   EXPECT_I2((signed short)0x8002);
1493   /* 0x80000002 */
1494   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1495   SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
1496   CONVERT(8,0,0,8,4,0, VTBIT_I4); EXPECT_I4(0x80000002);
1497   /* 0x8000000000000002 (64 bits) */
1498   SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1499   SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
1500   SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
1501   SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
1502   if (HAVE_OLEAUT32_I8)
1503   {
1504     CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x80000000,0x00000002);
1505   }
1506   /* Assume the above pattern holds for numbers with hi-bit set */
1507
1508   /* Negative numbers overflow if we have only unsigned outputs */
1509   /* -1 */
1510   SETRGB(0, 1); CONVERT(1,0,NUMPRS_NEG,1,0,0, VTBIT_UI1); EXPECT_OVERFLOW;
1511   /* -0.6 */
1512   SETRGB(0, 6); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_OVERFLOW;
1513
1514   /* Except that rounding is done first, so -0.5 to 0 are accepted as 0 */
1515   /* -0.5 */
1516   SETRGB(0, 5); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_UI1(0);
1517
1518   /* Floating point zero is OK */
1519   /* 0.00000000E0 */
1520   SETRGB(0, 0); CONVERT(1,0,NUMPRS_DECIMAL|NUMPRS_EXPONENT,12,0,-8, VTBIT_R8);
1521   EXPECT_R8(0.0);
1522
1523   /* Float is acceptable for an integer input value */
1524   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4); EXPECT_R4(1.0f);
1525   /* As is double */
1526   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8); EXPECT_R8(1.0);
1527   /* As is currency */
1528   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY); EXPECT_CY(1);
1529
1530   /* Float is preferred over double */
1531   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4|VTBIT_R8); EXPECT_R4(1.0f);
1532
1533   /* Double is preferred over currency */
1534   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8|VTBIT_CY); EXPECT_R8(1.0);
1535
1536   /* Currency is preferred over decimal */
1537   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY|VTBIT_DECIMAL); EXPECT_CY(1);
1538 }
1539
1540
1541 static void test_UdateFromDate( int line, DATE dt, ULONG flags, HRESULT r, WORD d, WORD m, WORD y,
1542                                 WORD h, WORD mn, WORD s, WORD ms, WORD dw, WORD dy)
1543 {
1544     UDATE ud;
1545     HRESULT res;
1546
1547     memset(&ud, 0, sizeof(ud));
1548     res = pVarUdateFromDate(dt, flags, &ud);
1549     ok_(__FILE__,line)(r == res, "Wrong result %x/%x\n", r, res);
1550     if (SUCCEEDED(res))
1551         ok_(__FILE__,line)(ud.st.wYear == y && ud.st.wMonth == m && ud.st.wDay == d &&
1552                            ud.st.wHour == h && ud.st.wMinute == mn && ud.st.wSecond == s &&
1553                            ud.st.wMilliseconds == ms && ud.st.wDayOfWeek == dw && ud.wDayOfYear == dy,
1554                            "%.16g expected %d,%d,%d,%d,%d,%d,%d  %d %d, got %d,%d,%d,%d,%d,%d,%d  %d %d\n",
1555                            dt, d, m, y, h, mn, s, ms, dw, dy,
1556                            ud.st.wDay, ud.st.wMonth, ud.st.wYear, ud.st.wHour, ud.st.wMinute,
1557                            ud.st.wSecond, ud.st.wMilliseconds, ud.st.wDayOfWeek, ud.wDayOfYear );
1558 }
1559 #define DT2UD(dt,flags,r,d,m,y,h,mn,s,ms,dw,dy) test_UdateFromDate(__LINE__,dt,flags,r,d,m,y,h,mn,s,ms,dw,dy)
1560
1561 static void test_VarUdateFromDate(void)
1562 {
1563   CHECKPTR(VarUdateFromDate);
1564   DT2UD(29221.0,0,S_OK,1,1,1980,0,0,0,0,2,1);        /* 1 Jan 1980 */
1565   DT2UD(29222.0,0,S_OK,2,1,1980,0,0,0,0,3,2);        /* 2 Jan 1980 */
1566   DT2UD(33238.0,0,S_OK,31,12,1990,0,0,0,0,1,365);    /* 31 Dec 1990 */
1567   DT2UD(0.0,0,S_OK,30,12,1899,0,0,0,0,6,364);        /* 30 Dec 1899 - VT_DATE 0.0 */
1568   DT2UD(-657434.0,0,S_OK,1,1,100,0,0,0,0,5,1);       /* 1 Jan 100 - Min */
1569   DT2UD(-657435.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* < 1 Jan 100 => err */
1570   DT2UD(2958465.0,0,S_OK,31,12,9999,0,0,0,0,5,365);  /* 31 Dec 9999 - Max */
1571   DT2UD(2958466.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* > 31 Dec 9999 => err  */
1572
1573   /* VAR_VALIDDATE doesn't prevent upper and lower bounds being checked */
1574   DT2UD(-657435.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
1575   DT2UD(2958466.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
1576
1577   /* Times */
1578   DT2UD(29221.25,0,S_OK,1,1,1980,6,0,0,0,2,1);           /* 6 AM */
1579   DT2UD(29221.33333333,0,S_OK,1,1,1980,8,0,0,0,2,1);     /* 8 AM */
1580   DT2UD(29221.5,0,S_OK,1,1,1980,12,0,0,0,2,1);           /* 12 AM */
1581   DT2UD(29221.9888884444,0,S_OK,1,1,1980,23,44,0,0,2,1); /* 11:44 PM */
1582   DT2UD(29221.7508765432,0,S_OK,1,1,1980,18,1,16,0,2,1); /* 6:18:02 PM */
1583 }
1584
1585
1586 static void test_DateFromUDate( int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms,
1587                                 WORD dw, WORD dy, ULONG flags, HRESULT r, DATE dt )
1588 {
1589     UDATE ud;
1590     double out;
1591     HRESULT res;
1592
1593     ud.st.wYear = y;
1594     ud.st.wMonth = m;
1595     ud.st.wDay = d;
1596     ud.st.wHour = h;
1597     ud.st.wMinute = mn;
1598     ud.st.wSecond = s;
1599     ud.st.wMilliseconds = ms;
1600     ud.st.wDayOfWeek = dw;
1601     ud.wDayOfYear = dy;
1602     res = pVarDateFromUdate(&ud, flags, &out);
1603     ok_(__FILE__,line)(r == res && (FAILED(r) || EQ_DOUBLE(out, dt)),
1604                        "expected %x, %.16g, got %x, %.16g\n", r, dt, res, out);
1605 }
1606 #define UD2T(d,m,y,h,mn,s,ms,dw,dy,flags,r,dt) test_DateFromUDate(__LINE__,d,m,y,h,mn,s,ms,dw,dy,flags,r,dt)
1607
1608 static void test_VarDateFromUdate(void)
1609 {
1610   CHECKPTR(VarDateFromUdate);
1611   UD2T(1,1,1980,0,0,0,0,2,1,0,S_OK,29221.0);      /* 1 Jan 1980 */
1612   UD2T(2,1,1980,0,0,0,0,3,2,0,S_OK,29222.0);      /* 2 Jan 1980 */
1613   UD2T(31,12,1990,0,0,0,0,0,0,0,S_OK,33238.0);    /* 31 Dec 1990 */
1614   UD2T(31,12,90,0,0,0,0,0,0,0,S_OK,33238.0);      /* year < 100 is 1900+year! */
1615   UD2T(30,12,1899,0,0,0,0,6,364,0,S_OK,0.0);      /* 30 Dec 1899 - VT_DATE 0.0 */
1616   UD2T(1,1,100,0,0,0,0,0,0,0,S_OK,-657434.0);     /* 1 Jan 100 - Min */
1617   UD2T(31,12,9999,0,0,0,0,0,0,0,S_OK,2958465.0);  /* 31 Dec 9999 - Max */
1618   UD2T(1,1,10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0); /* > 31 Dec 9999 => err  */
1619
1620   UD2T(1,1,1980,18,1,16,0,2,1,0,S_OK,29221.75087962963); /* 6:18:02 PM */
1621
1622   UD2T(0,1,1980,0,0,0,0,2,1,0,S_OK,29220.0);      /* Rolls back to 31 Dec 1899 */
1623   UD2T(1,13,1980,0,0,0,0,2,1,0,S_OK,29587.0);     /* Rolls fwd to 1/1/1981 */
1624 }
1625
1626 static void test_st2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn,
1627                        WORD s, WORD ms, INT r, double dt)
1628 {
1629     SYSTEMTIME st;
1630     double out;
1631     INT res;
1632
1633     st.wYear = y;
1634     st.wMonth = m;
1635     st.wDay = d;
1636     st.wHour = h;
1637     st.wMinute = mn;
1638     st.wSecond = s;
1639     st.wMilliseconds = ms;
1640     st.wDayOfWeek = 0;
1641     res = pSystemTimeToVariantTime(&st, &out);
1642     ok_(__FILE__,line)(r == res && (!r || EQ_DOUBLE(out, dt)),
1643                        "expected %d, %.16g, got %d, %.16g\n", r, dt, res, out);
1644 }
1645 #define ST2DT(d,m,y,h,mn,s,ms,r,dt) test_st2dt(__LINE__,d,m,y,h,mn,s,ms,r,dt)
1646
1647 static void test_SystemTimeToVariantTime(void)
1648 {
1649   CHECKPTR(SystemTimeToVariantTime);
1650   ST2DT(1,1,1980,0,0,0,0,TRUE,29221.0);
1651   ST2DT(2,1,1980,0,0,0,0,TRUE,29222.0);
1652   ST2DT(0,1,1980,0,0,0,0,TRUE,29220.0);   /* Rolls back to 31 Dec 1899 */
1653   ST2DT(1,13,1980,0,0,0,0,FALSE,29587.0); /* Fails on invalid month */
1654   ST2DT(31,12,90,0,0,0,0,TRUE,33238.0);   /* year < 100 is 1900+year! */
1655 }
1656
1657 static void test_dt2st(int line, double dt, INT r, WORD d, WORD m, WORD y,
1658                        WORD h, WORD mn, WORD s, WORD ms)
1659 {
1660   SYSTEMTIME st;
1661   INT res;
1662
1663   memset(&st, 0, sizeof(st));
1664   res = pVariantTimeToSystemTime(dt, &st);
1665   ok_(__FILE__,line)(r == res &&
1666                      (!r || (st.wYear == y && st.wMonth == m && st.wDay == d &&
1667                              st.wHour == h && st.wMinute == mn &&
1668                              st.wSecond == s && st.wMilliseconds == ms)),
1669                      "%.16g expected %d, %d,%d,%d,%d,%d,%d,%d, got %d, %d,%d,%d,%d,%d,%d,%d\n",
1670                      dt, r, d, m, y, h, mn, s, ms, res, st.wDay, st.wMonth,
1671                      st.wYear, st.wHour, st.wMinute, st.wSecond,
1672                      st.wMilliseconds);
1673 }
1674 #define DT2ST(dt,r,d,m,y,h,mn,s,ms) test_dt2st(__LINE__,dt,r,d,m,y,h,mn,s,ms)
1675
1676 static void test_VariantTimeToSystemTime(void)
1677 {
1678   CHECKPTR(VariantTimeToSystemTime);
1679   DT2ST(29221.0,1,1,1,1980,0,0,0,0);
1680   DT2ST(29222.0,1,2,1,1980,0,0,0,0);
1681 }
1682
1683 #define MKDOSDATE(d,m,y) ((d & 0x1f) | ((m & 0xf) << 5) | (((y-1980) & 0x7f) << 9))
1684 #define MKDOSTIME(h,m,s) (((s>>1) & 0x1f) | ((m & 0x3f) << 5) | ((h & 0x1f) << 11))
1685
1686 static void test_dos2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn,
1687                         WORD s, INT r, double dt)
1688 {
1689     unsigned short dosDate, dosTime;
1690     double out;
1691     INT res;
1692
1693     out = 0.0;
1694     dosDate = MKDOSDATE(d, m, y);
1695     dosTime = MKDOSTIME(h, mn, s);
1696     res = pDosDateTimeToVariantTime(dosDate, dosTime, &out);
1697     ok_(__FILE__,line)(r == res && (!r || EQ_DOUBLE(out, dt)),
1698                        "expected %d, %.16g, got %d, %.16g\n", r, dt, res, out);
1699 }
1700 #define DOS2DT(d,m,y,h,mn,s,r,dt) test_dos2dt(__LINE__,d,m,y,h,mn,s,r,dt)
1701
1702 static void test_DosDateTimeToVariantTime(void)
1703 {
1704   CHECKPTR(DosDateTimeToVariantTime);
1705
1706   /* Date */
1707   DOS2DT(1,1,1980,0,0,0,1,29221.0); /* 1/1/1980 */
1708   DOS2DT(31,12,2099,0,0,0,1,73050.0); /* 31/12/2099 */
1709   /* Dates are limited to the dos date max of 31/12/2099 */
1710   DOS2DT(31,12,2100,0,0,0,0,0.0); /* 31/12/2100 */
1711   /* Days and months of 0 cause date to roll back 1 day or month */
1712   DOS2DT(0,1,1980,0,0,0,1,29220.0); /* 0 Day => 31/12/1979 */
1713   DOS2DT(1,0,1980,0,0,0,1,29190.0); /* 0 Mth =>  1/12/1979 */
1714   DOS2DT(0,0,1980,0,0,0,1,29189.0); /* 0 D/M => 30/11/1979 */
1715   /* Days > days in the month cause date to roll forward 1 month */
1716   DOS2DT(29,2,1981,0,0,0,1,29646.0); /* 29/2/1981 -> 3/1/1980 */
1717   DOS2DT(30,2,1981,0,0,0,1,29647.0); /* 30/2/1981 -> 4/1/1980 */
1718   /* Takes leap years into account when rolling forward */
1719   DOS2DT(29,2,1980,0,0,0,1,29280.0); /* 2/29/1980 */
1720   /* Months > 12 cause an error */
1721   DOS2DT(2,13,1980,0,0,0,0,0.0);
1722
1723   /* Time */
1724   DOS2DT(1,1,1980,0,0,29,1,29221.00032407407); /* 1/1/1980 12:00:28 AM */
1725   DOS2DT(1,1,1980,0,0,31,1,29221.00034722222); /* 1/1/1980 12:00:30 AM */
1726   DOS2DT(1,1,1980,0,59,0,1,29221.04097222222); /* 1/1/1980 12:59:00 AM */
1727   DOS2DT(1,1,1980,0,60,0,0,0.0);               /* Invalid seconds */
1728   DOS2DT(1,1,1980,23,0,0,1,29221.95833333333); /* 1/1/1980 11:00:00 PM */
1729   DOS2DT(1,1,1980,24,0,0,0,0.0);               /* Invalid hours */
1730 }
1731
1732 static void test_dt2dos(int line, double dt, INT r, WORD d, WORD m, WORD y,
1733                         WORD h, WORD mn, WORD s)
1734 {
1735     unsigned short dosDate, dosTime, expDosDate, expDosTime;
1736     INT res;
1737
1738     dosTime = dosDate = 0;
1739     expDosDate = MKDOSDATE(d,m,y);
1740     expDosTime = MKDOSTIME(h,mn,s);
1741     res = pVariantTimeToDosDateTime(dt, &dosDate, &dosTime);
1742     ok_(__FILE__,line)(r == res && (!r || (dosTime == expDosTime && dosDate == expDosDate)),
1743                        "%g: expected %d,%d(%d/%d/%d),%d(%d:%d:%d) got %d,%d(%d/%d/%d),%d(%d:%d:%d)\n",
1744                        dt, r, expDosDate, expDosDate & 0x1f,
1745                        (expDosDate >> 5) & 0xf, 1980 + (expDosDate >> 9),
1746                        expDosTime, expDosTime >> 11, (expDosTime >> 5) & 0x3f,
1747                        (expDosTime & 0x1f),
1748                        res, dosDate, dosDate & 0x1f, (dosDate >> 5) & 0xf,
1749                        1980 + (dosDate >> 9), dosTime, dosTime >> 11,
1750                        (dosTime >> 5) & 0x3f, (dosTime & 0x1f));
1751 }
1752 #define DT2DOS(dt,r,d,m,y,h,mn,s) test_dt2dos(__LINE__,dt,r,d,m,y,h,mn,s)
1753
1754 static void test_VariantTimeToDosDateTime(void)
1755 {
1756   CHECKPTR(VariantTimeToDosDateTime);
1757
1758   /* Date */
1759   DT2DOS(29221.0,1,1,1,1980,0,0,0);   /* 1/1/1980 */
1760   DT2DOS(73050.0,1,31,12,2099,0,0,0); /* 31/12/2099 */
1761   DT2DOS(29220.0,0,0,0,0,0,0,0);      /* 31/12/1979 - out of range */
1762   DT2DOS(73415.0,0,0,0,0,0,0,0);      /* 31/12/2100 - out of range */
1763
1764   /* Time */
1765   DT2DOS(29221.00032407407,1,1,1,1980,0,0,29); /* 1/1/1980 12:00:28 AM */
1766   DT2DOS(29221.00034722222,1,1,1,1980,0,0,31); /* 1/1/1980 12:00:30 AM */
1767   DT2DOS(29221.04097222222,1,1,1,1980,0,59,0); /* 1/1/1980 12:59:00 AM */
1768   DT2DOS(29221.95833333333,1,1,1,1980,23,0,0); /* 1/1/1980 11:00:00 PM */
1769 }
1770
1771 static HRESULT (WINAPI *pVarAbs)(LPVARIANT,LPVARIANT);
1772
1773 #define VARABS(vt,val,rvt,rval)                  \
1774     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
1775     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
1776     test_var_call1( __LINE__, pVarAbs, &v, &exp )
1777
1778 static void test_VarAbs(void)
1779 {
1780     static const WCHAR szNum[] = {'-','1','.','1','\0' };
1781     char buff[8];
1782     HRESULT hres;
1783     VARIANT v, vDst, exp;
1784     size_t i;
1785
1786     CHECKPTR(VarAbs);
1787
1788     /* Test all possible V_VT values.
1789      */
1790     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
1791     {
1792         VARTYPE vt;
1793
1794         for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1795         {
1796             HRESULT hExpected = DISP_E_BADVARTYPE;
1797
1798             SKIPTESTS(vt);
1799
1800             memset(&v, 0, sizeof(v));
1801             V_VT(&v) = vt | ExtraFlags[i];
1802             V_VT(&vDst) = VT_EMPTY;
1803
1804             hres = pVarAbs(&v,&vDst);
1805             if (ExtraFlags[i] & (VT_ARRAY|VT_ARRAY) ||
1806                 (!ExtraFlags[i] && (vt == VT_UNKNOWN || vt == VT_BSTR ||
1807                  vt == VT_DISPATCH || vt == VT_ERROR || vt == VT_RECORD)))
1808             {
1809                 hExpected = DISP_E_TYPEMISMATCH;
1810             }
1811             else if (ExtraFlags[i] || vt >= VT_CLSID || vt == VT_VARIANT)
1812             {
1813                 hExpected = DISP_E_BADVARTYPE;
1814             }
1815             else if (IsValidVariantClearVT(vt, ExtraFlags[i]))
1816                 hExpected = S_OK;
1817
1818             /* Native always fails on some vartypes that should be valid. don't
1819              * check that Wine does the same; these are bugs in native.
1820              */
1821             if (vt == VT_I8 || vt == VT_UI8 || vt == VT_INT || vt == VT_UINT ||
1822                 vt == VT_I1 || vt == VT_UI2 || vt == VT_UI4)
1823                 continue;
1824             ok(hres == hExpected, "VarAbs: expected 0x%X, got 0x%X for vt %d | 0x%X\n",
1825                hExpected, hres, vt, ExtraFlags[i]);
1826         }
1827     }
1828
1829     /* BOOL->I2, BSTR->R8, all others remain the same */
1830     VARABS(BOOL,VARIANT_TRUE,I2,-VARIANT_TRUE);
1831     VARABS(BOOL,VARIANT_FALSE,I2,VARIANT_FALSE);
1832     VARABS(EMPTY,0,I2,0);
1833     VARABS(EMPTY,1,I2,0);
1834     VARABS(NULL,0,NULL,0);
1835     VARABS(NULL,1,NULL,0);
1836     VARABS(I2,1,I2,1);
1837     VARABS(I2,-1,I2,1);
1838     VARABS(I4,1,I4,1);
1839     VARABS(I4,-1,I4,1);
1840     VARABS(UI1,1,UI1,1);
1841     VARABS(R4,1,R4,1);
1842     VARABS(R4,-1,R4,1);
1843     VARABS(R8,1,R8,1);
1844     VARABS(R8,-1,R8,1);
1845     VARABS(DATE,1,DATE,1);
1846     VARABS(DATE,-1,DATE,1);
1847     V_VT(&v) = VT_CY;
1848     V_CY(&v).int64 = -10000;
1849     memset(&vDst,0,sizeof(vDst));
1850     hres = pVarAbs(&v,&vDst);
1851     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
1852        "VarAbs(CY): expected 0x0 got 0x%X\n", hres);
1853     GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
1854     if (buff[0] != '.' || buff[1])
1855     {
1856         trace("Skipping VarAbs(BSTR) as decimal separator is '%s'\n", buff);
1857         return;
1858     }
1859     V_VT(&v) = VT_BSTR;
1860     V_BSTR(&v) = (BSTR)szNum;
1861     memset(&vDst,0,sizeof(vDst));
1862     hres = pVarAbs(&v,&vDst);
1863     ok(hres == S_OK && V_VT(&vDst) == VT_R8 && V_R8(&vDst) == 1.1,
1864        "VarAbs: expected 0x0,%d,%g, got 0x%X,%d,%g\n", VT_R8, 1.1, hres, V_VT(&vDst), V_R8(&vDst));
1865 }
1866
1867 static HRESULT (WINAPI *pVarNot)(LPVARIANT,LPVARIANT);
1868
1869 #define VARNOT(vt,val,rvt,rval)                  \
1870     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
1871     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
1872     test_var_call1( __LINE__, pVarNot, &v, &exp )
1873
1874 static void test_VarNot(void)
1875 {
1876     static const WCHAR szNum0[] = {'0','\0' };
1877     static const WCHAR szNum1[] = {'1','\0' };
1878     HRESULT hres;
1879     VARIANT v, exp, vDst;
1880     DECIMAL *pdec = &V_DECIMAL(&v);
1881     CY *pcy = &V_CY(&v);
1882     size_t i;
1883
1884     CHECKPTR(VarNot);
1885
1886     /* Test all possible V_VT values */
1887     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
1888     {
1889         VARTYPE vt;
1890
1891         for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1892         {
1893             HRESULT hExpected = DISP_E_BADVARTYPE;
1894
1895             SKIPTESTS(vt);
1896
1897             memset(&v, 0, sizeof(v));
1898             V_VT(&v) = vt | ExtraFlags[i];
1899             V_VT(&vDst) = VT_EMPTY;
1900
1901             switch (V_VT(&v))
1902             {
1903             case VT_I1:  case VT_UI1: case VT_I2:  case VT_UI2:
1904             case VT_INT: case VT_UINT: case VT_I4:  case VT_UI4:
1905             case VT_R4:  case VT_R8:
1906             case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
1907             case VT_DATE: case VT_CY:
1908                 hExpected = S_OK;
1909                 break;
1910             case VT_I8: case VT_UI8:
1911                 if (HAVE_OLEAUT32_I8)
1912                     hExpected = S_OK;
1913                 break;
1914             case VT_RECORD:
1915                 if (HAVE_OLEAUT32_RECORD)
1916                     hExpected = DISP_E_TYPEMISMATCH;
1917                 break;
1918             case VT_UNKNOWN: case VT_BSTR: case VT_DISPATCH: case VT_ERROR:
1919                 hExpected = DISP_E_TYPEMISMATCH;
1920                 break;
1921             default:
1922                 if (IsValidVariantClearVT(vt, ExtraFlags[i]) && vt != VT_CLSID)
1923                    hExpected = DISP_E_TYPEMISMATCH;
1924                 break;
1925             }
1926
1927             hres = pVarNot(&v,&vDst);
1928             ok(hres == hExpected, "VarNot: expected 0x%X, got 0x%X vt %d|0x%X\n",
1929                hExpected, hres, vt, ExtraFlags[i]);
1930         }
1931     }
1932     /* Test the values returned by all cases that can succeed */
1933     VARNOT(EMPTY,0,I2,-1);
1934     VARNOT(EMPTY,1,I2,-1);
1935     VARNOT(NULL,0,NULL,0);
1936     VARNOT(NULL,1,NULL,0);
1937     VARNOT(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
1938     VARNOT(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
1939     VARNOT(I1,-1,I4,0);
1940     VARNOT(I1,0,I4,-1);
1941     VARNOT(I2,-1,I2,0);
1942     VARNOT(I2,0,I2,-1);
1943     VARNOT(I2,1,I2,-2);
1944     VARNOT(I4,1,I4,-2);
1945     VARNOT(I4,0,I4,-1);
1946     VARNOT(UI1,1,UI1,254);
1947     VARNOT(UI1,0,UI1,255);
1948     VARNOT(UI2,0,I4,-1);
1949     VARNOT(UI2,1,I4,-2);
1950     VARNOT(UI4,0,I4,-1);
1951     VARNOT(UI4,1,I4,-2);
1952     VARNOT(INT,0,I4,-1);
1953     VARNOT(INT,1,I4,-2);
1954     VARNOT(UINT,0,I4,-1);
1955     VARNOT(UINT,1,I4,-2);
1956     if (HAVE_OLEAUT32_I8)
1957     {
1958         VARNOT(I8,1,I8,-2);
1959         VARNOT(I8,0,I8,-1);
1960         VARNOT(UI8,0,I4,-1);
1961         VARNOT(UI8,1,I4,-2);
1962     }
1963     VARNOT(R4,1,I4,-2);
1964     VARNOT(R4,0,I4,-1);
1965     VARNOT(R8,1,I4,-2);
1966     VARNOT(R8,0,I4,-1);
1967     VARNOT(DATE,1,I4,-2);
1968     VARNOT(DATE,0,I4,-1);
1969     VARNOT(BSTR,(BSTR)szNum0,I4,-1);
1970     ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum0, "VarNot(0): changed input\n");
1971     VARNOT(BSTR,(BSTR)szNum1,I4,-2);
1972     ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum1, "VarNot(1): changed input\n");
1973
1974     V_VT(&v) = VT_DECIMAL;
1975     S(U(*pdec)).sign = DECIMAL_NEG;
1976     S(U(*pdec)).scale = 0;
1977     pdec->Hi32 = 0;
1978     S1(U1(*pdec)).Mid32 = 0;
1979     S1(U1(*pdec)).Lo32 = 1;
1980     VARNOT(DECIMAL,*pdec,I4,0);
1981
1982     pcy->int64 = 10000;
1983     VARNOT(CY,*pcy,I4,-2);
1984
1985     pcy->int64 = 0;
1986     VARNOT(CY,*pcy,I4,-1);
1987
1988     pcy->int64 = -1;
1989     VARNOT(CY,*pcy,I4,-1);
1990 }
1991
1992 static HRESULT (WINAPI *pVarSub)(LPVARIANT,LPVARIANT,LPVARIANT);
1993
1994 #define VARSUB(vt1,val1,vt2,val2,rvt,rval)               \
1995         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
1996         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
1997         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
1998         test_var_call2( __LINE__, pVarSub, &left, &right, &exp )
1999
2000 static void test_VarSub(void)
2001 {
2002     static const WCHAR sz12[] = {'1','2','\0'};
2003     VARIANT left, right, exp, result, cy, dec;
2004     VARTYPE i;
2005     BSTR lbstr, rbstr;
2006     HRESULT hres, expectedhres;
2007     double r;
2008
2009     CHECKPTR(VarSub);
2010
2011     lbstr = SysAllocString(sz12);
2012     rbstr = SysAllocString(sz12);
2013
2014     VariantInit(&left);
2015     VariantInit(&right);
2016     VariantInit(&result);
2017
2018     /* Test all possible flag/vt combinations & the resulting vt type */
2019     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2020     {
2021
2022         VARTYPE leftvt, rightvt, resvt;
2023
2024         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
2025         {
2026
2027             SKIPTESTS(leftvt);
2028
2029             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
2030             {
2031
2032                 SKIPTESTS(rightvt);
2033                 expectedhres = S_OK;
2034
2035                 memset(&left, 0, sizeof(left));
2036                 memset(&right, 0, sizeof(right));
2037                 V_VT(&left) = leftvt | ExtraFlags[i];
2038                 if (leftvt == VT_BSTR)
2039                     V_BSTR(&left) = lbstr;
2040                 V_VT(&right) = rightvt | ExtraFlags[i];
2041                 if (rightvt == VT_BSTR)
2042                     V_BSTR(&right) = rbstr;
2043                 V_VT(&result) = VT_EMPTY;
2044                 resvt = VT_ERROR;
2045
2046                 /* All extra flags produce errors */
2047                 if (ExtraFlags[i] == (VT_VECTOR|VT_BYREF|VT_RESERVED) ||
2048                     ExtraFlags[i] == (VT_VECTOR|VT_RESERVED) ||
2049                     ExtraFlags[i] == (VT_VECTOR|VT_BYREF) ||
2050                     ExtraFlags[i] == (VT_BYREF|VT_RESERVED) ||
2051                     ExtraFlags[i] == VT_VECTOR ||
2052                     ExtraFlags[i] == VT_BYREF ||
2053                     ExtraFlags[i] == VT_RESERVED)
2054                 {
2055                     expectedhres = DISP_E_BADVARTYPE;
2056                     resvt = VT_EMPTY;
2057                 }
2058                 else if (ExtraFlags[i] >= VT_ARRAY)
2059                 {
2060                     expectedhres = DISP_E_TYPEMISMATCH;
2061                     resvt = VT_EMPTY;
2062                 }
2063                 /* Native VarSub cannot handle: VT_I1, VT_UI2, VT_UI4,
2064                    VT_INT, VT_UINT and VT_UI8. Tested with WinXP */
2065                 else if (!IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
2066                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
2067                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
2068                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
2069                     leftvt == VT_I1 || rightvt == VT_I1 ||
2070                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
2071                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
2072                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
2073                     leftvt == VT_INT || rightvt == VT_INT ||
2074                     leftvt == VT_UINT || rightvt == VT_UINT ||
2075                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
2076                     leftvt == VT_RECORD || rightvt == VT_RECORD)
2077                 {
2078                     if (leftvt == VT_RECORD && rightvt == VT_I8)
2079                         expectedhres = DISP_E_TYPEMISMATCH;
2080                     else if (leftvt < VT_UI1 && rightvt == VT_RECORD)
2081                         expectedhres = DISP_E_TYPEMISMATCH;
2082                     else if (leftvt >= VT_UI1 && rightvt == VT_RECORD)
2083                         expectedhres = DISP_E_TYPEMISMATCH;
2084                     else if (leftvt == VT_RECORD && rightvt <= VT_UI1)
2085                         expectedhres = DISP_E_TYPEMISMATCH;
2086                     else if (leftvt == VT_RECORD && rightvt > VT_UI1)
2087                         expectedhres = DISP_E_BADVARTYPE;
2088                     else
2089                         expectedhres = DISP_E_BADVARTYPE;
2090                     resvt = VT_EMPTY;
2091                 }
2092                 else if ((leftvt == VT_NULL && rightvt == VT_DISPATCH) ||
2093                     (leftvt == VT_DISPATCH && rightvt == VT_NULL))
2094                     resvt = VT_NULL;
2095                 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
2096                     leftvt == VT_ERROR || rightvt == VT_ERROR)
2097                 {
2098                     resvt = VT_EMPTY;
2099                     expectedhres = DISP_E_TYPEMISMATCH;
2100                 }
2101                 else if (leftvt == VT_NULL || rightvt == VT_NULL)
2102                     resvt = VT_NULL;
2103                 else if ((leftvt == VT_EMPTY && rightvt == VT_BSTR) ||
2104                     (leftvt == VT_DATE && rightvt == VT_DATE) ||
2105                     (leftvt == VT_BSTR && rightvt == VT_EMPTY) ||
2106                     (leftvt == VT_BSTR && rightvt == VT_BSTR))
2107                     resvt = VT_R8;
2108                 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
2109                     resvt = VT_DECIMAL;
2110                 else if (leftvt == VT_DATE || rightvt == VT_DATE)
2111                     resvt = VT_DATE;
2112                 else if (leftvt == VT_CY || rightvt == VT_CY)
2113                     resvt = VT_CY;
2114                 else if (leftvt == VT_R8 || rightvt == VT_R8)
2115                     resvt = VT_R8;
2116                 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
2117                     resvt = VT_R8;
2118                 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
2119                     if (leftvt == VT_I4 || rightvt == VT_I4 ||
2120                         leftvt == VT_I8 || rightvt == VT_I8)
2121                         resvt = VT_R8;
2122                     else
2123                         resvt = VT_R4;
2124                 }
2125                 else if (leftvt == VT_I8 || rightvt == VT_I8)
2126                     resvt = VT_I8;
2127                 else if (leftvt == VT_I4 || rightvt == VT_I4)
2128                     resvt = VT_I4;
2129                 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
2130                     leftvt == VT_BOOL || rightvt == VT_BOOL ||
2131                     (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
2132                     resvt = VT_I2;
2133                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
2134                     resvt = VT_UI1;
2135                 else
2136                 {
2137                     resvt = VT_EMPTY;
2138                     expectedhres = DISP_E_TYPEMISMATCH;
2139                 }
2140
2141                 hres = pVarSub(&left, &right, &result);
2142
2143                 ok(hres == expectedhres && V_VT(&result) == resvt,
2144                     "VarSub: %d|0x%X, %d|0x%X: Expected failure 0x%X, "
2145                     "got 0x%X, expected vt %d got vt %d\n",
2146                     leftvt, ExtraFlags[i], rightvt, ExtraFlags[i],
2147                     expectedhres, hres, resvt, V_VT(&result));
2148             }
2149         }
2150     }
2151
2152     /* Test returned values */
2153     VARSUB(I4,4,I4,2,I4,2);
2154     VARSUB(I2,4,I2,2,I2,2);
2155     VARSUB(I2,-13,I4,5,I4,-18);
2156     VARSUB(I4,-13,I4,5,I4,-18);
2157     VARSUB(I2,7,R4,0.5f,R4,6.5f);
2158     VARSUB(R4,0.5f,I4,5,R8,-4.5);
2159     VARSUB(R8,7.1,BOOL,0,R8,7.1);
2160     VARSUB(BSTR,lbstr,I2,4,R8,8);
2161     VARSUB(BSTR,lbstr,BOOL,1,R8,11);
2162     VARSUB(BSTR,lbstr,R4,0.1f,R8,11.9);
2163     VARSUB(R4,0.2f,BSTR,rbstr,R8,-11.8);
2164     VARSUB(DATE,2.25,I4,7,DATE,-4.75);
2165     VARSUB(DATE,1.25,R4,-1.7f,DATE,2.95);
2166
2167     VARSUB(UI1, UI1_MAX, UI1, UI1_MAX, UI1, 0);
2168     VARSUB(I2, I2_MAX, I2, I2_MAX, I2, 0);
2169     VARSUB(I2, I2_MIN, I2, I2_MIN, I2, 0);
2170     VARSUB(I4, I4_MAX, I4, I4_MAX, I4, 0);
2171     VARSUB(I4, I4_MIN, I4, I4_MIN, I4, 0);
2172     VARSUB(R4, R4_MAX, R4, R4_MAX, R4, 0.0f);
2173     VARSUB(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX - R4_MIN);
2174     VARSUB(R4, R4_MIN, R4, R4_MIN, R4, 0.0f);
2175     VARSUB(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX - R8_MIN);
2176     VARSUB(R8, R8_MIN, R8, R8_MIN, R8, 0.0);
2177
2178     /* Manually test BSTR + BSTR */
2179     V_VT(&left) = VT_BSTR;
2180     V_BSTR(&left) = lbstr;
2181     V_VT(&right) = VT_BSTR;
2182     V_BSTR(&right) = rbstr;
2183     hres = VarSub(&left, &right, &result);
2184     ok(hres == S_OK && V_VT(&result) == VT_R8,
2185         "VarSub: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
2186     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0),
2187         "VarSub: BSTR + BSTR, expected %f got %f\n", 0.0, V_R8(&result));
2188
2189     /* Manually test some VT_CY and VT_DECIMAL variants */
2190     V_VT(&cy) = VT_CY;
2191     hres = VarCyFromI4(4711, &V_CY(&cy));
2192     ok(hres == S_OK, "VarCyFromI4 failed!\n");
2193     V_VT(&dec) = VT_DECIMAL;
2194     hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
2195     ok(hres == S_OK, "VarDecFromR4 failed!\n");
2196     memset(&left, 0, sizeof(left));
2197     memset(&right, 0, sizeof(right));
2198     V_VT(&left) = VT_I4;
2199     V_I4(&left) = -11;
2200     V_VT(&right) = VT_UI1;
2201     V_UI1(&right) = 9;
2202
2203     hres = VarSub(&cy, &right, &result);
2204     ok(hres == S_OK && V_VT(&result) == VT_CY,
2205         "VarSub: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
2206     hres = VarR8FromCy(V_CY(&result), &r);
2207     ok(hres == S_OK && EQ_DOUBLE(r, 4702),
2208         "VarSub: CY value %f, expected %f\n", r, (double)4720);
2209
2210     hres = VarSub(&left, &dec, &result);
2211     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
2212         "VarSub: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
2213     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
2214     ok(hres == S_OK && EQ_DOUBLE(r, -6.8),
2215         "VarSub: DECIMAL value %f, expected %f\n", r, (double)-15.2);
2216
2217     SysFreeString(lbstr);
2218     SysFreeString(rbstr);
2219 }
2220
2221 static HRESULT (WINAPI *pVarMod)(LPVARIANT,LPVARIANT,LPVARIANT);
2222
2223 static void test_Mod( int line, VARIANT *left, VARIANT *right, VARIANT *expected, HRESULT expres )
2224 {
2225     VARIANT result;
2226     HRESULT hres;
2227
2228     memset( &result, 0, sizeof(result) );
2229     hres = pVarMod( left, right, &result );
2230     ok_(__FILE__,line)( hres == expres, "wrong result %x/%x\n", hres, expres );
2231     if (hres == S_OK)
2232         ok_(__FILE__,line)( is_expected_variant( &result, expected ),
2233                             "got %s expected %s\n", variantstr(&result), variantstr(expected) );
2234 }
2235
2236 #define VARMOD(vt1,vt2,val1,val2,rvt,rval)               \
2237         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
2238         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
2239         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
2240         test_var_call2( __LINE__, pVarMod, &left, &right, &exp )
2241
2242 #define VARMOD2(vt1,vt2,val1,val2,rvt,rval,hexpected)         \
2243         V_VT(&left) = VT_##vt1; V_I4(&left) = val1;           \
2244         V_VT(&right) = VT_##vt2; V_I4(&right) = val2;         \
2245         V_VT(&exp) = VT_##rvt; V_I4(&exp) = rval;             \
2246         test_Mod( __LINE__, &left, &right, &exp, hexpected )
2247
2248 static void test_VarMod(void)
2249 {
2250   VARIANT v1, v2, vDst, left, right, exp;
2251   HRESULT hres;
2252   HRESULT hexpected = 0;
2253   static const WCHAR szNum0[] = {'1','2','5','\0'};
2254   static const WCHAR szNum1[] = {'1','0','\0'};
2255   int l, r;
2256   BOOL lFound, rFound;
2257   BOOL lValid, rValid;
2258   BSTR strNum0, strNum1;
2259
2260   CHECKPTR(VarMod);
2261
2262   VARMOD(I1,BOOL,100,10,I4,0);
2263   VARMOD(I1,I1,100,10,I4,0);
2264   VARMOD(I1,UI1,100,10,I4,0);
2265   VARMOD(I1,I2,100,10,I4,0);
2266   VARMOD(I1,UI2,100,10,I4,0);
2267   VARMOD(I1,I4,100,10,I4,0);
2268   VARMOD(I1,UI4,100,10,I4,0);
2269   VARMOD(I1,R4,100,10,I4,0);
2270   VARMOD(I1,R8,100,10,I4,0);
2271
2272   VARMOD(UI1,BOOL,100,10,I2,0);
2273   VARMOD(UI1,I1,100,10,I4,0);
2274   VARMOD(UI1,UI1,100,10,UI1,0);
2275   VARMOD(UI1,I2,100,10,I2,0);
2276   VARMOD(UI1,UI2,100,10,I4,0);
2277   VARMOD(UI1,I4,100,10,I4,0);
2278   VARMOD(UI1,UI4,100,10,I4,0);
2279   VARMOD(UI1,R4,100,10,I4,0);
2280   VARMOD(UI1,R8,100,10,I4,0);
2281
2282   VARMOD(I2,BOOL,100,10,I2,0);
2283   VARMOD(I2,I1,100,10,I4,0);
2284   VARMOD(I2,UI1,100,10,I2,0);
2285   VARMOD(I2,I2,100,10,I2,0);
2286   VARMOD(I2,UI2,100,10,I4,0);
2287   VARMOD(I2,I4,100,10,I4,0);
2288   VARMOD(I2,UI4,100,10,I4,0);
2289   VARMOD(I2,R4,100,10,I4,0);
2290   VARMOD(I2,R8,100,10,I4,0);
2291
2292   VARMOD(I4,BOOL,100,10,I4,0);
2293   VARMOD(I4,I1,100,10,I4,0);
2294   VARMOD(I4,UI1,100,10,I4,0);
2295   VARMOD(I4,I2,100,10,I4,0);
2296   VARMOD(I4,UI2,100,10,I4,0);
2297   VARMOD(I4,I4,100,10,I4,0);
2298   VARMOD(I4,UI4,100,10,I4,0);
2299   VARMOD(I4,R4,100,10,I4,0);
2300   VARMOD(I4,R8,100,10,I4,0);
2301   VARMOD(UI4,BOOL,100,10,I4,0);
2302   VARMOD(UI4,I1,100,10,I4,0);
2303   VARMOD(UI4,UI1,100,10,I4,0);
2304   VARMOD(UI4,I2,100,10,I4,0);
2305   VARMOD(UI4,UI2,100,10,I4,0);
2306   VARMOD(UI4,I4,100,10,I4,0);
2307   VARMOD(UI4,UI4,100,10,I4,0);
2308   VARMOD(UI4,R4,100,10,I4,0);
2309   VARMOD(UI4,R8,100,10,I4,0);
2310   VARMOD(R4,BOOL,100,10,I4,0);
2311   VARMOD(R4,I1,100,10,I4,0);
2312   VARMOD(R4,UI1,100,10,I4,0);
2313   VARMOD(R4,I2,100,10,I4,0);
2314   VARMOD(R4,UI2,100,10,I4,0);
2315   VARMOD(R4,I4,100,10,I4,0);
2316   VARMOD(R4,UI4,100,10,I4,0);
2317   VARMOD(R4,R4,100,10,I4,0);
2318   VARMOD(R4,R8,100,10,I4,0);
2319   VARMOD(R8,BOOL,100,10,I4,0);
2320   VARMOD(R8,I1,100,10,I4,0);
2321   VARMOD(R8,UI1,100,10,I4,0);
2322   VARMOD(R8,I2,100,10,I4,0);
2323   VARMOD(R8,UI2,100,10,I4,0);
2324   VARMOD(R8,I4,100,10,I4,0);
2325   VARMOD(R8,UI4,100,10,I4,0);
2326   VARMOD(R8,R4,100,10,I4,0);
2327   VARMOD(R8,R8,100,10,I4,0);
2328
2329   VARMOD(INT,INT,100,10,I4,0);
2330   VARMOD(INT,UINT,100,10,I4,0);
2331
2332   VARMOD(BOOL,BOOL,100,10,I2,0);
2333   VARMOD(BOOL,I1,100,10,I4,0);
2334   VARMOD(BOOL,UI1,100,10,I2,0);
2335   VARMOD(BOOL,I2,100,10,I2,0);
2336   VARMOD(BOOL,UI2,100,10,I4,0);
2337   VARMOD(BOOL,I4,100,10,I4,0);
2338   VARMOD(BOOL,UI4,100,10,I4,0);
2339   VARMOD(BOOL,R4,100,10,I4,0);
2340   VARMOD(BOOL,R8,100,10,I4,0);
2341   VARMOD(BOOL,DATE,100,10,I4,0);
2342
2343   VARMOD(DATE,BOOL,100,10,I4,0);
2344   VARMOD(DATE,I1,100,10,I4,0);
2345   VARMOD(DATE,UI1,100,10,I4,0);
2346   VARMOD(DATE,I2,100,10,I4,0);
2347   VARMOD(DATE,UI2,100,10,I4,0);
2348   VARMOD(DATE,I4,100,10,I4,0);
2349   VARMOD(DATE,UI4,100,10,I4,0);
2350   VARMOD(DATE,R4,100,10,I4,0);
2351   VARMOD(DATE,R8,100,10,I4,0);
2352   VARMOD(DATE,DATE,100,10,I4,0);
2353
2354   strNum0 = SysAllocString(szNum0);
2355   strNum1 = SysAllocString(szNum1);
2356   VARMOD(BSTR,BSTR,strNum0,strNum1,I4,5);
2357   VARMOD(BSTR,I1,strNum0,10,I4,5);
2358   VARMOD(BSTR,I2,strNum0,10,I4,5);
2359   VARMOD(BSTR,I4,strNum0,10,I4,5);
2360   VARMOD(BSTR,R4,strNum0,10,I4,5);
2361   VARMOD(BSTR,R8,strNum0,10,I4,5);
2362   VARMOD(I4,BSTR,125,strNum1,I4,5);
2363
2364   if (HAVE_OLEAUT32_I8)
2365   {
2366     VARMOD(BOOL,I8,100,10,I8,0);
2367     VARMOD(I1,I8,100,10,I8,0);
2368     VARMOD(UI1,I8,100,10,I8,0);
2369     VARMOD(I2,I8,100,10,I8,0);
2370     VARMOD(I4,I8,100,10,I8,0);
2371     VARMOD(UI4,I8,100,10,I8,0);
2372     VARMOD(R4,I8,100,10,I8,0);
2373     VARMOD(R8,I8,100,10,I8,0);
2374     VARMOD(DATE,I8,100,10,I8,0);
2375
2376     VARMOD(I8,BOOL,100,10,I8,0);
2377     VARMOD(I8,I1,100,10,I8,0);
2378     VARMOD(I8,UI1,100,10,I8,0);
2379     VARMOD(I8,I2,100,10,I8,0);
2380     VARMOD(I8,UI2,100,10,I8,0);
2381     VARMOD(I8,I4,100,10,I8,0);
2382     VARMOD(I8,UI4,100,10,I8,0);
2383     VARMOD(I8,R4,100,10,I8,0);
2384     VARMOD(I8,R8,100,10,I8,0);
2385     VARMOD(I8,I8,100,10,I8,0);
2386
2387     VARMOD(BSTR,I8,strNum0,10,I8,5);
2388   }
2389
2390   /* test all combinations of types */
2391   for(l = 0; l < VT_BSTR_BLOB; l++)
2392   {
2393     SKIPTESTS(l);
2394
2395     for(r = 0; r < VT_BSTR_BLOB; r++)
2396     {
2397       SKIPTESTS(r);
2398         
2399       if(l == VT_BSTR) continue;
2400       if(l == VT_DISPATCH) continue;
2401       if(r == VT_BSTR) continue;
2402       if(r == VT_DISPATCH) continue;
2403
2404       lFound = TRUE;
2405       lValid = TRUE;
2406       switch(l)
2407         {
2408         case VT_EMPTY:
2409         case VT_NULL:
2410         case VT_I1:
2411         case VT_UI1:
2412         case VT_I2:
2413         case VT_UI2:
2414         case VT_I4:
2415         case VT_I8:
2416         case VT_UI4:
2417         case VT_UI8:
2418         case VT_INT:
2419         case VT_UINT:
2420         case VT_R4:
2421         case VT_R8:
2422         case VT_BOOL:
2423         case VT_DATE:
2424         case VT_CY:
2425         case VT_DECIMAL:
2426           hexpected = S_OK;
2427           break;
2428         case VT_ERROR:
2429         case VT_VARIANT:
2430         case VT_UNKNOWN:
2431         case VT_RECORD:
2432           lValid = FALSE;
2433           break;
2434         default:
2435           lFound = FALSE;
2436           hexpected = DISP_E_BADVARTYPE;
2437           break;
2438         }
2439
2440       rFound = TRUE;
2441       rValid = TRUE;
2442       switch(r)
2443         {
2444         case VT_EMPTY:
2445         case VT_NULL:
2446         case VT_I1:
2447         case VT_UI1:
2448         case VT_I2:
2449         case VT_UI2:
2450         case VT_I4:
2451         case VT_I8:
2452         case VT_UI4:
2453         case VT_UI8:
2454         case VT_INT:
2455         case VT_UINT:
2456         case VT_R4:
2457         case VT_R8:
2458         case VT_BOOL:
2459         case VT_DATE:
2460         case VT_DECIMAL:
2461         case VT_CY:
2462           hexpected = S_OK;
2463           break;
2464         case VT_ERROR:
2465         case VT_VARIANT:
2466         case VT_UNKNOWN:
2467         case VT_RECORD:
2468           rValid = FALSE;
2469           break;
2470         default:
2471           rFound = FALSE;
2472           break;
2473         }
2474
2475       if(((l == VT_I8) && (r == VT_INT)) || ((l == VT_INT) && (r == VT_I8)))
2476       {
2477         hexpected = DISP_E_TYPEMISMATCH;
2478       } else if((l == VT_EMPTY) && (r == VT_NULL))
2479       {
2480         hexpected = S_OK;
2481       } else if((l == VT_NULL) && (r == VT_EMPTY))
2482       {
2483         hexpected = S_OK;
2484       } else if((l == VT_EMPTY) && (r == VT_CY))
2485       {
2486         hexpected = S_OK;
2487       } else if((l == VT_EMPTY) && (r == VT_RECORD))
2488       {
2489         hexpected = DISP_E_TYPEMISMATCH;
2490       } else if((r == VT_EMPTY) && lFound && lValid)
2491       {
2492         hexpected = DISP_E_DIVBYZERO;
2493       } else if((l == VT_ERROR) || ((r == VT_ERROR) && lFound && lValid))
2494       {
2495         hexpected = DISP_E_TYPEMISMATCH;
2496       } else if((l == VT_NULL) && (r == VT_NULL))
2497       {
2498         hexpected = S_OK;
2499       } else if((l == VT_VARIANT) || ((r == VT_VARIANT) && lFound && lValid))
2500       {
2501         hexpected = DISP_E_TYPEMISMATCH;
2502       } else if((l == VT_NULL) && (r == VT_RECORD))
2503       {
2504         hexpected = DISP_E_TYPEMISMATCH;
2505       } else if((l == VT_I8) && (r == VT_DECIMAL))
2506       {
2507         hexpected = S_OK;
2508       } else if((l == VT_DECIMAL) && (r == VT_I8))
2509       {
2510         hexpected = S_OK;
2511       } else if((l == VT_UNKNOWN) || ((r == VT_UNKNOWN) && lFound && lValid))
2512       {
2513         hexpected = DISP_E_TYPEMISMATCH;
2514       } else if((l == VT_NULL) && rFound)
2515       {
2516         hexpected = S_OK;
2517       } else if(l == VT_RECORD)
2518       {
2519         hexpected = DISP_E_TYPEMISMATCH;
2520       } else if((r == VT_RECORD) && lValid && lFound)
2521       {
2522         hexpected = DISP_E_TYPEMISMATCH;
2523       } else if((l == VT_EMPTY) && (r == VT_EMPTY))
2524       {
2525         hexpected = DISP_E_DIVBYZERO;
2526       } else if((l == VT_CY) && !rFound)
2527       {
2528         hexpected = DISP_E_BADVARTYPE;
2529       } else if(lFound && !rFound)
2530       {
2531         hexpected = DISP_E_BADVARTYPE;
2532       } else if(!lFound && rFound)
2533       {
2534         hexpected = DISP_E_BADVARTYPE;
2535       } else if((r == VT_NULL) && lFound && lValid)
2536       {
2537         hexpected = S_OK;
2538       } else if((l == VT_NULL) || (r == VT_NULL))
2539       {
2540         hexpected = DISP_E_BADVARTYPE;
2541       } else if((l == VT_VARIANT) || (r == VT_VARIANT))
2542       {
2543         hexpected = DISP_E_BADVARTYPE;
2544       } else if(lFound && !rFound)
2545       {
2546         hexpected = DISP_E_BADVARTYPE;
2547       } else if(!lFound && !rFound)
2548       {
2549         hexpected = DISP_E_BADVARTYPE;
2550       }
2551
2552       V_VT(&v1) = l;
2553       V_VT(&v2) = r;
2554
2555       if(l == VT_CY)
2556         V_CY(&v1).int64 = 1000000;
2557       else if(l == VT_R4)
2558         V_R4(&v1) = 100;
2559       else if(l == VT_R8)
2560         V_R8(&v1) = 100;
2561       else if(l == VT_UI8)
2562         V_UI8(&v1) = 100;
2563       else if(l == VT_I8)
2564         V_I8(&v1) = 100;
2565       else if(l == VT_DATE)
2566         V_DATE(&v1) = 1000;
2567       else if (l == VT_DECIMAL)
2568       {
2569         V_DECIMAL(&v1).Hi32 = 0;
2570         U1(V_DECIMAL(&v1)).Lo64 = 100;
2571         U(V_DECIMAL(&v1)).signscale = 0;
2572       }
2573       else
2574         V_I4(&v1) = 10000;
2575
2576       if(r == VT_CY)
2577         V_CY(&v2).int64 = 10000;
2578       else if(r == VT_R4)
2579         V_R4(&v2) = 100;
2580       else if(r == VT_R8)
2581         V_R8(&v2) = 100;
2582       else if(r == VT_UI8)
2583         V_UI8(&v2) = 100;
2584       else if(r == VT_I8)
2585         V_I8(&v2) = 100;
2586       else if(r == VT_DATE)
2587         V_DATE(&v2) = 1000;
2588       else if (r == VT_DECIMAL)
2589       {
2590         V_DECIMAL(&v2).Hi32 = 0;
2591         U1(V_DECIMAL(&v2)).Lo64 = 100;
2592         U(V_DECIMAL(&v2)).signscale = 0;
2593       }
2594       else
2595         V_I4(&v2) = 10000;
2596
2597       if ((l != VT_I8 && l != VT_UI8 && r != VT_I8 && r != VT_UI8) || HAVE_OLEAUT32_I8)
2598       {
2599         hres = pVarMod(&v1,&v2,&vDst);
2600         ok(hres == hexpected,
2601            "VarMod: expected 0x%x, got 0x%X for l type of %d, r type of %d,\n", hexpected, hres, l, r);
2602       }
2603     }
2604   }
2605
2606
2607   /****************************/
2608   /* test some bad parameters */
2609   VARMOD(I4,I4,-1,-1,I4,0);
2610
2611   /* test modulus with zero */
2612   VARMOD2(I4,I4,100,0,EMPTY,0,DISP_E_DIVBYZERO);
2613
2614   VARMOD(I4,I4,0,10,I4,0); /* test 0 mod 10 */
2615
2616   /* right parameter is type empty */
2617   VARMOD2(I4,EMPTY,100,10,EMPTY,0,DISP_E_DIVBYZERO);
2618
2619   /* left parameter is type empty */
2620   VARMOD2(EMPTY,I4,100,10,I4,0,S_OK);
2621
2622   /* mod with a null left value */
2623   VARMOD2(NULL,I4,125,10,NULL,0,S_OK);
2624
2625   /* mod with a null right value */
2626   VARMOD2(I4,NULL,100,10,NULL,0,S_OK);
2627
2628   /* void left value */
2629   VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2630
2631   /* void right value */
2632   VARMOD2(I4,VOID,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2633
2634   /* null left value, void right value */
2635   VARMOD2(NULL,VOID,100,10,EMPTY, 0, DISP_E_BADVARTYPE);
2636
2637   /* void left value, null right value */
2638   VARMOD2(VOID,NULL,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2639
2640   /* some currencies */
2641   V_VT(&v1) = VT_CY;
2642   V_VT(&v2) = VT_CY;
2643   V_CY(&v1).int64 = 100000;
2644   V_CY(&v2).int64 = 100000;
2645   hres = pVarMod(&v1,&v2,&vDst);
2646   ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2647      "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
2648
2649   V_VT(&v1) = VT_I4;
2650   V_VT(&v2) = VT_CY;
2651   V_I4(&v1) = 100;
2652   V_CY(&v2).int64 = 100000;
2653   hres = pVarMod(&v1,&v2,&vDst);
2654   ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2655      "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
2656
2657   /* some decimals */
2658   V_VT(&v1) = VT_DECIMAL;
2659   V_VT(&v2) = VT_DECIMAL;
2660   VarDecFromI4(100, &V_DECIMAL(&v1));
2661   VarDecFromI4(10, &V_DECIMAL(&v2));
2662   hres = pVarMod(&v1,&v2,&vDst);
2663   ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2664      "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
2665
2666   V_VT(&v1) = VT_I4;
2667   V_VT(&v2) = VT_DECIMAL;
2668   V_I4(&v1) = 100;
2669   VarDecFromI4(10, &V_DECIMAL(&v2));
2670   hres = pVarMod(&v1,&v2,&vDst);
2671   ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2672      "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
2673
2674   VARMOD2(UINT,I4,100,10,I4,0,S_OK);
2675
2676   /* test that an error results in the type of the result changing but not its value */
2677   V_VT(&v1) = VT_UNKNOWN;
2678   V_VT(&v2) = VT_EMPTY;
2679   V_I4(&v1) = 100;
2680   V_CY(&v2).int64 = 100000;
2681   V_VT(&vDst) = VT_I4;
2682   V_I4(&vDst) = 1231;
2683   hres = pVarMod(&v1,&v2,&vDst);
2684   ok(hres == DISP_E_TYPEMISMATCH && V_VT(&vDst) == VT_EMPTY && V_I4(&vDst) == 1231,
2685      "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", DISP_E_TYPEMISMATCH, VT_EMPTY, 1231, hres, V_VT(&vDst), V_I4(&vDst));
2686
2687
2688   /* test some invalid types */
2689   /*TODO: not testing VT_DISPATCH */
2690   if (HAVE_OLEAUT32_I8)
2691   {
2692     VARMOD2(I8,INT,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2693   }
2694   VARMOD2(ERROR,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2695   VARMOD2(VARIANT,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2696   VARMOD2(UNKNOWN,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2697   VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2698   VARMOD2(HRESULT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2699   VARMOD2(PTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2700   VARMOD2(SAFEARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2701   VARMOD2(CARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2702   VARMOD2(USERDEFINED,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2703   VARMOD2(LPSTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2704   VARMOD2(LPWSTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2705   VARMOD2(RECORD,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2706   VARMOD2(FILETIME,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2707   VARMOD2(BLOB,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2708   VARMOD2(STREAM,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2709   VARMOD2(STORAGE,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2710   VARMOD2(STREAMED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2711   VARMOD2(STORED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2712   VARMOD2(BLOB_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2713   VARMOD2(CF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2714   VARMOD2(CLSID,CLSID,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2715   VARMOD2(VECTOR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2716   VARMOD2(ARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2717   VARMOD2(BYREF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2718
2719   /* test some more invalid types */
2720   V_VT(&v1) = 456;
2721   V_VT(&v2) = 234;
2722   V_I4(&v1) = 100;
2723   V_I4(&v2)=  10;
2724   hres = pVarMod(&v1,&v2,&vDst);
2725   ok(hres == DISP_E_BADVARTYPE && V_VT(&vDst) == VT_EMPTY,
2726      "VarMod: expected 0x%x,%d, got 0x%X,%d\n", DISP_E_BADVARTYPE, VT_EMPTY, hres, V_VT(&vDst));
2727 }
2728
2729 static HRESULT (WINAPI *pVarFix)(LPVARIANT,LPVARIANT);
2730
2731 #define VARFIX(vt,val,rvt,rval)                  \
2732     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
2733     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2734     test_var_call1( __LINE__, pVarFix, &v, &exp )
2735
2736 static void test_VarFix(void)
2737 {
2738     static const WCHAR szNumMinus1[] = {'-','1','\0' };
2739     HRESULT hres;
2740     VARIANT v, exp, vDst;
2741     DECIMAL *pdec = &V_DECIMAL(&v);
2742     CY *pcy = &V_CY(&v);
2743     size_t i;
2744
2745     CHECKPTR(VarFix);
2746
2747     /* Test all possible V_VT values */
2748     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2749     {
2750         VARTYPE vt;
2751
2752         for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2753         {
2754             HRESULT bFail = TRUE;
2755
2756             SKIPTESTS(vt);
2757
2758             memset(&v, 0, sizeof(v));
2759             V_VT(&v) = vt | ExtraFlags[i];
2760             V_VT(&vDst) = VT_EMPTY;
2761
2762             switch (V_VT(&v))
2763             {
2764               case VT_UI1: case VT_I2: case VT_I4: case VT_R4:  case VT_R8:
2765               case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
2766               case VT_DATE: case VT_CY:
2767                 bFail = FALSE;
2768                 break;
2769               case VT_I8:
2770                 if (HAVE_OLEAUT32_I8)
2771                   bFail = FALSE;
2772                 break;
2773             }
2774
2775             hres = pVarFix(&v,&vDst);
2776             if (bFail)
2777               ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
2778                  "VarFix: expected failure, got 0x%X vt %d|0x%X\n",
2779                  hres, vt, ExtraFlags[i]);
2780             else
2781                  ok(hres == S_OK, "VarFix: expected S_OK, got 0x%X vt %d|0x%X\n",
2782                     hres, vt, ExtraFlags[i]);
2783         }
2784     }
2785
2786     VARFIX(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
2787     VARFIX(BOOL,VARIANT_FALSE,I2,0);
2788     VARFIX(BOOL,1,I2,1);
2789     VARFIX(UI1,1,UI1,1);
2790     VARFIX(I2,-1,I2,-1);
2791     VARFIX(I4,-1,I4,-1);
2792     if (HAVE_OLEAUT32_I8)
2793     {
2794         VARFIX(I8,-1,I8,-1);
2795     }
2796     VARFIX(R4,1.4f,R4,1);
2797     VARFIX(R4,1.5f,R4,1);
2798     VARFIX(R4,1.6f,R4,1);
2799     VARFIX(R4,-1.4f,R4,-1);
2800     VARFIX(R4,-1.5f,R4,-1);
2801     VARFIX(R4,-1.6f,R4,-1);
2802     /* DATE & R8 round as for R4 */
2803     VARFIX(DATE,-1,DATE,-1);
2804     VARFIX(R8,-1,R8,-1);
2805     VARFIX(BSTR,(BSTR)szNumMinus1,R8,-1);
2806
2807     V_VT(&v) = VT_EMPTY;
2808     hres = pVarFix(&v,&vDst);
2809     ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
2810        "VarFix: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
2811        hres, V_VT(&vDst), V_I2(&vDst));
2812
2813     V_VT(&v) = VT_NULL;
2814     hres = pVarFix(&v,&vDst);
2815     ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
2816        "VarFix: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
2817
2818     V_VT(&v) = VT_DECIMAL;
2819     S(U(*pdec)).sign = DECIMAL_NEG;
2820     S(U(*pdec)).scale = 0;
2821     pdec->Hi32 = 0;
2822     S1(U1(*pdec)).Mid32 = 0;
2823     S1(U1(*pdec)).Lo32 = 1;
2824     hres = pVarFix(&v,&vDst);
2825     ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&v, &vDst, sizeof(v)),
2826        "VarFix: expected 0x0,%d,identical, got 0x%X,%d\n", VT_DECIMAL,
2827        hres, V_VT(&vDst));
2828
2829     /* FIXME: Test some fractional decimals when VarDecFix is implemented */
2830
2831     V_VT(&v) = VT_CY;
2832     pcy->int64 = -10000;
2833     hres = pVarFix(&v,&vDst);
2834     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2835        "VarFix: VT_CY wrong, hres=0x%X\n", hres);
2836
2837     V_VT(&v) = VT_CY;
2838     pcy->int64 = -16000;
2839     hres = pVarFix(&v,&vDst);
2840     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2841        "VarFix: VT_CY wrong, hres=0x%X\n", hres);
2842 }
2843
2844 static HRESULT (WINAPI *pVarInt)(LPVARIANT,LPVARIANT);
2845
2846 #define VARINT(vt,val,rvt,rval)                  \
2847     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
2848     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2849     test_var_call1( __LINE__, pVarInt, &v, &exp )
2850
2851 static void test_VarInt(void)
2852 {
2853     static const WCHAR szNumMinus1[] = {'-','1','\0' };
2854     HRESULT hres;
2855     VARIANT v, exp, vDst;
2856     DECIMAL *pdec = &V_DECIMAL(&v);
2857     CY *pcy = &V_CY(&v);
2858     size_t i;
2859
2860     CHECKPTR(VarInt);
2861
2862     /* Test all possible V_VT values */
2863     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2864     {
2865         VARTYPE vt;
2866
2867         for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2868         {
2869             HRESULT bFail = TRUE;
2870
2871             SKIPTESTS(vt);
2872
2873             memset(&v, 0, sizeof(v));
2874             V_VT(&v) = vt | ExtraFlags[i];
2875             V_VT(&vDst) = VT_EMPTY;
2876
2877             switch (V_VT(&v))
2878             {
2879               case VT_UI1: case VT_I2: case VT_I4: case VT_R4:  case VT_R8:
2880               case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
2881               case VT_DATE: case VT_CY:
2882                 bFail = FALSE;
2883                 break;
2884               case VT_I8:
2885                 if (HAVE_OLEAUT32_I8)
2886                   bFail = FALSE;
2887                 break;
2888             }
2889
2890             hres = pVarInt(&v,&vDst);
2891             if (bFail)
2892               ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
2893                  "VarInt: expected failure, got 0x%X vt %d|0x%X\n",
2894                  hres, vt, ExtraFlags[i]);
2895             else
2896                  ok(hres == S_OK, "VarInt: expected S_OK, got 0x%X vt %d|0x%X\n",
2897                     hres, vt, ExtraFlags[i]);
2898         }
2899     }
2900
2901     VARINT(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
2902     VARINT(BOOL,VARIANT_FALSE,I2,0);
2903     VARINT(BOOL,1,I2,1);
2904     VARINT(UI1,1,UI1,1);
2905     VARINT(I2,-1,I2,-1);
2906     VARINT(I4,-1,I4,-1);
2907     if (HAVE_OLEAUT32_I8)
2908     {
2909         VARINT(I8,-1,I8,-1);
2910     }
2911     VARINT(R4,1.4f,R4,1);
2912     VARINT(R4,1.5f,R4,1);
2913     VARINT(R4,1.6f,R4,1);
2914     VARINT(R4,-1.4f,R4,-2); /* Note these 3 are different from VarFix */
2915     VARINT(R4,-1.5f,R4,-2);
2916     VARINT(R4,-1.6f,R4,-2);
2917     /* DATE & R8 round as for R4 */
2918     VARINT(DATE,-1,DATE,-1);
2919     VARINT(R8,-1,R8,-1);
2920     VARINT(BSTR,(BSTR)szNumMinus1,R8,-1);
2921
2922     V_VT(&v) = VT_EMPTY;
2923     hres = pVarInt(&v,&vDst);
2924     ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
2925        "VarInt: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
2926        hres, V_VT(&vDst), V_I2(&vDst));
2927
2928     V_VT(&v) = VT_NULL;
2929     hres = pVarInt(&v,&vDst);
2930     ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
2931        "VarInt: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
2932
2933     V_VT(&v) = VT_DECIMAL;
2934     S(U(*pdec)).sign = DECIMAL_NEG;
2935     S(U(*pdec)).scale = 0;
2936     pdec->Hi32 = 0;
2937     S1(U1(*pdec)).Mid32 = 0;
2938     S1(U1(*pdec)).Lo32 = 1;
2939     hres = pVarInt(&v,&vDst);
2940     ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&v, &vDst, sizeof(v)),
2941        "VarInt: expected 0x0,%d,identical, got 0x%X,%d\n", VT_DECIMAL,
2942        hres, V_VT(&vDst));
2943
2944     /* FIXME: Test some fractional decimals when VarDecInt is implemented */
2945
2946     V_VT(&v) = VT_CY;
2947     pcy->int64 = -10000;
2948     hres = pVarInt(&v,&vDst);
2949     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2950        "VarInt: VT_CY wrong, hres=0x%X\n", hres);
2951
2952     V_VT(&v) = VT_CY;
2953     pcy->int64 = -11000;
2954     hres = pVarInt(&v,&vDst);
2955     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -20000,
2956        "VarInt: VT_CY wrong, hres=0x%X 0x%x%08x\n",
2957        hres, (DWORD)(V_CY(&vDst).int64 >> 32), (DWORD)V_CY(&vDst).int64);
2958 }
2959
2960 static HRESULT (WINAPI *pVarNeg)(LPVARIANT,LPVARIANT);
2961
2962 #define VARNEG(vt,val,rvt,rval)                  \
2963     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
2964     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2965     test_var_call1( __LINE__, pVarNeg, &v, &exp )
2966
2967 static void test_VarNeg(void)
2968 {
2969     static const WCHAR szNumMinus1[] = {'-','1','\0' };
2970     static const WCHAR szNum1[] = {'1','\0' };
2971     HRESULT hres;
2972     VARIANT v, exp, vDst;
2973     DECIMAL *pdec = &V_DECIMAL(&v);
2974     CY *pcy = &V_CY(&v);
2975     size_t i;
2976
2977     CHECKPTR(VarNeg);
2978
2979     /* Test all possible V_VT values. But don't test the exact return values
2980      * except for success/failure, since M$ made a hash of them in the
2981      * native version. This at least ensures (as with all tests here) that
2982      * we will notice if/when new vtypes/flags are added in native.
2983      */
2984     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2985     {
2986         VARTYPE vt;
2987
2988         for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2989         {
2990             HRESULT bFail = TRUE;
2991
2992             SKIPTESTS(vt);
2993
2994             memset(&v, 0, sizeof(v));
2995             V_VT(&v) = vt | ExtraFlags[i];
2996             V_VT(&vDst) = VT_EMPTY;
2997
2998             switch (V_VT(&v))
2999             {
3000             case VT_UI1: case VT_I2: case VT_I4:
3001             case VT_R4:  case VT_R8:
3002             case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
3003             case VT_DATE: case VT_CY:
3004                 bFail = FALSE;
3005                 break;
3006             case VT_I8:
3007                 if (HAVE_OLEAUT32_I8)
3008                     bFail = FALSE;
3009             }
3010
3011             hres = pVarNeg(&v,&vDst);
3012             if (bFail)
3013                 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
3014                    "VarNeg: expected failure, got 0x%X vt %d|0x%X\n",
3015                    hres, vt, ExtraFlags[i]);
3016             else
3017                 ok(hres == S_OK, "VarNeg: expected S_OK, got 0x%X vt %d|0x%X\n",
3018                     hres, vt, ExtraFlags[i]);
3019         }
3020     }
3021
3022     VARNEG(BOOL,VARIANT_TRUE,I2,1);
3023     VARNEG(BOOL,VARIANT_FALSE,I2,0);
3024     VARNEG(BOOL,1,I2,-1);
3025     VARNEG(UI1,1,I2,-1);
3026     VARNEG(UI1,254,I2,-254);
3027     VARNEG(I2,-32768,I4,32768);
3028     VARNEG(I2,-1,I2,1);
3029     VARNEG(I2,1,I2,-1);
3030     VARNEG(I4,-((int)(~0u >> 1)) - 1,R8,-2147483648u);
3031     VARNEG(I4,-1,I4,1);
3032     VARNEG(I4,1,I4,-1);
3033     if (HAVE_OLEAUT32_I8)
3034     {
3035         VARNEG(I8,1,I8,-1);
3036         VARNEG(I8,-1,I8,1);
3037     }
3038     VARNEG(R4,1,R4,-1);
3039     VARNEG(R4,-1,R4,1);
3040     VARNEG(DATE,1,DATE,-1);
3041     VARNEG(DATE,-1,DATE,1);
3042     VARNEG(R8,1,R8,-1);
3043     VARNEG(R8,-1,R8,1);
3044     VARNEG(BSTR,(BSTR)szNumMinus1,R8,1);
3045     VARNEG(BSTR,(BSTR)szNum1,R8,-1);
3046
3047     V_VT(&v) = VT_EMPTY;
3048     hres = pVarNeg(&v,&vDst);
3049     ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
3050        "VarNeg: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
3051        hres, V_VT(&vDst), V_I2(&vDst));
3052
3053     V_VT(&v) = VT_NULL;
3054     hres = pVarNeg(&v,&vDst);
3055     ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
3056        "VarNeg: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
3057
3058     V_VT(&v) = VT_DECIMAL;
3059     S(U(*pdec)).sign = DECIMAL_NEG;
3060     S(U(*pdec)).scale = 0;
3061     pdec->Hi32 = 0;
3062     S1(U1(*pdec)).Mid32 = 0;
3063     S1(U1(*pdec)).Lo32 = 1;
3064     hres = pVarNeg(&v,&vDst);
3065     ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3066        S(U(V_DECIMAL(&vDst))).sign == 0,
3067        "VarNeg: expected 0x0,%d,0x00, got 0x%X,%d,%02x\n", VT_DECIMAL,
3068        hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3069
3070     S(U(*pdec)).sign = 0;
3071     hres = pVarNeg(&v,&vDst);
3072     ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3073        S(U(V_DECIMAL(&vDst))).sign == DECIMAL_NEG,
3074        "VarNeg: expected 0x0,%d,0x7f, got 0x%X,%d,%02x\n", VT_DECIMAL,
3075        hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3076
3077     V_VT(&v) = VT_CY;
3078     pcy->int64 = -10000;
3079     hres = pVarNeg(&v,&vDst);
3080     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
3081        "VarNeg: VT_CY wrong, hres=0x%X\n", hres);
3082 }
3083
3084 static HRESULT (WINAPI *pVarRound)(LPVARIANT,int,LPVARIANT);
3085
3086 static void test_Round( int line, VARIANT *arg, int deci, VARIANT *expected )
3087 {
3088     VARIANT result;
3089     HRESULT hres;
3090
3091     memset( &result, 0, sizeof(result) );
3092     hres = pVarRound( arg, deci, &result );
3093     ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
3094     if (hres == S_OK)
3095         ok_(__FILE__,line)( is_expected_variant( &result, expected ),
3096                             "got %s expected %s\n", variantstr(&result), variantstr(expected) );
3097 }
3098 #define VARROUND(vt,val,deci,rvt,rval)           \
3099     V_VT(&v) = VT_##vt; V_##vt(&v) = val;        \
3100     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3101     test_Round( __LINE__, &v, deci, &exp )
3102
3103 static void test_VarRound(void)
3104 {
3105     static const WCHAR szNumMin[] = {'-','1','.','4','5','\0' };
3106     static const WCHAR szNum[] = {'1','.','4','5','\0' };
3107     HRESULT hres;
3108     VARIANT v, exp, vDst;
3109     CY *pcy = &V_CY(&v);
3110
3111     CHECKPTR(VarRound);
3112
3113     /* first check valid integer types */
3114     VARROUND(BOOL,VARIANT_TRUE,0,I2,-1);
3115     VARROUND(BOOL,VARIANT_FALSE,0,I2,0);
3116     VARROUND(BOOL,1,0,I2,1);
3117     VARROUND(UI1,1,0,UI1,1);
3118     VARROUND(UI1,254,0,UI1,254);
3119     VARROUND(I2,-32768,0,I2,-32768);
3120     VARROUND(I2,-1,0,I2,-1);
3121     VARROUND(I2,1,0,I2,1);
3122     VARROUND(I4,-((int)(~0u >> 1)) - 1,0,I4,-((int)(~0u >> 1)) - 1);
3123     VARROUND(I4,-1,0,I4,-1);
3124     VARROUND(I4,1,0,I4,1);
3125
3126
3127     /* MSDN states that rounding of R4/R8 is dependent on the underlying
3128      * bit pattern of the number and so is architecture dependent. In this
3129      * case Wine returns .2 (which is more correct) and Native returns .3
3130      */
3131
3132     VARROUND(R4,1.0f,0,R4,1.0f);
3133     VARROUND(R4,-1.0f,0,R4,-1.0f);
3134     VARROUND(R8,1.0,0,R8,1.0);
3135     VARROUND(R8,-1.0,0,R8,-1.0);
3136
3137     /* floating point numbers aren't exactly equal and we can't just
3138      * compare the first few digits. */
3139     VARROUND(DATE,1.451,1,DATE,1.5);
3140     VARROUND(DATE,-1.45,1,DATE,-1.4);
3141     VARROUND(BSTR,(BSTR)szNumMin,1,R8,-1.40);
3142     if (0) { VARROUND(BSTR,(BSTR)szNum,1,R8,1.50); }
3143
3144     VARROUND(R4,1.23456f,0,R4,1.0f);
3145     VARROUND(R4,1.23456f,1,R4,1.2f);
3146     VARROUND(R4,1.23456f,2,R4,1.23f);
3147     VARROUND(R4,1.23456f,3,R4,1.235f);
3148     VARROUND(R4,1.23456f,4,R4,1.2346f);
3149     VARROUND(R4,-1.23456f,0,R4,-1.0f);
3150     VARROUND(R4,-1.23456f,1,R4,-1.2f);
3151     VARROUND(R4,-1.23456f,2,R4,-1.23f);
3152     VARROUND(R4,-1.23456f,3,R4,-1.235f);
3153     VARROUND(R4,-1.23456f,4,R4,-1.2346f);
3154
3155     VARROUND(R8,1.23456,0,R8,1.0);
3156     VARROUND(R8,1.23456,1,R8,1.2);
3157     VARROUND(R8,1.23456,2,R8,1.23);
3158     VARROUND(R8,1.23456,3,R8,1.235);
3159     VARROUND(R8,1.23456,4,R8,1.2346);
3160     VARROUND(R8,-1.23456,0,R8,-1.0);
3161     VARROUND(R8,-1.23456,1,R8,-1.2);
3162     VARROUND(R8,-1.23456,2,R8,-1.23);
3163     VARROUND(R8,-1.23456,3,R8,-1.235);
3164     VARROUND(R8,-1.23456,4,R8,-1.2346);
3165
3166     V_VT(&v) = VT_EMPTY;
3167     hres = pVarRound(&v,0,&vDst);
3168     ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
3169         "VarRound: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
3170         hres, V_VT(&vDst), V_I2(&vDst));
3171
3172     V_VT(&v) = VT_NULL;
3173     hres = pVarRound(&v,0,&vDst);
3174     ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
3175         "VarRound: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
3176
3177     /* not yet implemented so no use testing yet
3178     todo_wine {
3179         DECIMAL *pdec = &V_DECIMAL(&v);
3180         V_VT(&v) = VT_DECIMAL;
3181         S(U(*pdec)).sign = DECIMAL_NEG;
3182         S(U(*pdec)).scale = 0;
3183         pdec->Hi32 = 0;
3184         S1(U1(*pdec)).Mid32 = 0;
3185         S1(U1(*pdec)).Lo32 = 1;
3186         hres = pVarRound(&v,0,&vDst);
3187         ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3188             S(U(V_DECIMAL(&vDst))).sign == 0,
3189             "VarRound: expected 0x0,%d,0x00, got 0x%X,%d,%02x\n", VT_DECIMAL,
3190             hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3191
3192         S(U(*pdec)).sign = 0;
3193         hres = pVarRound(&v,0,&vDst);
3194         ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3195             S(U(V_DECIMAL(&vDst))).sign == DECIMAL_NEG,
3196             "VarRound: expected 0x0,%d,0x7f, got 0x%X,%d,%02x\n", VT_DECIMAL,
3197             hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3198     }
3199     */
3200
3201     V_VT(&v) = VT_CY;
3202     pcy->int64 = 10000;
3203     hres = pVarRound(&v,0,&vDst);
3204     ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
3205         "VarRound: VT_CY wrong, hres=0x%X\n", hres);
3206
3207 }
3208
3209 static HRESULT (WINAPI *pVarXor)(LPVARIANT,LPVARIANT,LPVARIANT);
3210
3211 #define VARXOR(vt1,val1,vt2,val2,rvt,rval)               \
3212         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
3213         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3214         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
3215         test_var_call2( __LINE__, pVarXor, &left, &right, &exp )
3216
3217 #define VARXORCY(vt1,val1,val2,rvt,rval)                 \
3218         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
3219         V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
3220         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
3221         test_var_call2( __LINE__, pVarXor, &left, &right, &exp )
3222
3223 static void test_VarXor(void)
3224 {
3225     static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
3226     static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
3227     VARIANT left, right, exp, result;
3228     BSTR lbstr, rbstr;
3229     VARTYPE i;
3230     HRESULT hres;
3231
3232     CHECKPTR(VarXor);
3233
3234     /* Test all possible flag/vt combinations & the resulting vt type */
3235     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
3236     {
3237         VARTYPE leftvt, rightvt, resvt;
3238
3239         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
3240         {
3241
3242             SKIPTESTS(leftvt);
3243                     
3244             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
3245             {
3246                 BOOL bFail = FALSE;
3247
3248                 SKIPTESTS(rightvt);
3249                 
3250                 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
3251                     leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
3252                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
3253                     continue;
3254
3255                 memset(&left, 0, sizeof(left));
3256                 memset(&right, 0, sizeof(right));
3257                 V_VT(&left) = leftvt | ExtraFlags[i];
3258                 V_VT(&right) = rightvt | ExtraFlags[i];
3259                 V_VT(&result) = VT_EMPTY;
3260                 resvt = VT_I4;
3261
3262                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
3263                     !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
3264                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
3265                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
3266                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
3267                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
3268                     leftvt == VT_ERROR || rightvt == VT_ERROR)
3269                 {
3270                     bFail = TRUE;
3271                 }
3272                 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
3273                 {
3274                     if (leftvt == rightvt ||
3275                         leftvt == VT_I2 || rightvt == VT_I2 ||
3276                         leftvt == VT_UI1 || rightvt == VT_UI1 ||
3277                         leftvt == VT_BOOL || rightvt == VT_BOOL)
3278                         resvt = VT_I2;
3279                     else if (leftvt == VT_NULL || rightvt == VT_NULL)
3280                         resvt = VT_NULL;
3281                     else if (leftvt == VT_I8 || rightvt == VT_I8)
3282                         resvt = VT_I8;
3283                 }
3284                 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3285                 {
3286                     resvt = VT_NULL;
3287                 }
3288                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
3289                 {
3290                     if (leftvt == rightvt)
3291                         resvt = VT_UI1;
3292                     else if (leftvt == rightvt ||
3293                         leftvt == VT_I2 || rightvt == VT_I2 ||
3294                         leftvt == VT_BOOL || rightvt == VT_BOOL)
3295                     {
3296                         resvt = VT_I2;
3297                     }
3298                     else if (leftvt == VT_I8 || rightvt == VT_I8)
3299                         resvt = VT_I8;
3300                 }
3301                 else if (leftvt == VT_I2 || rightvt == VT_I2)
3302                 {
3303                     if (leftvt == rightvt ||
3304                         leftvt == VT_BOOL || rightvt == VT_BOOL)
3305                         resvt = VT_I2;
3306                     else if (leftvt == VT_I8 || rightvt == VT_I8)
3307                         resvt = VT_I8;
3308                 }
3309                 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
3310                 {
3311                     resvt = VT_BOOL;
3312                 }
3313                 else if (leftvt == VT_I8 || rightvt == VT_I8)
3314                 {
3315                     if (leftvt == VT_INT || rightvt == VT_INT)
3316                         bFail = TRUE;
3317                     else
3318                         resvt = VT_I8;
3319                 }
3320                 hres = pVarXor(&left, &right, &result);
3321                 if (bFail)
3322                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
3323                        "VarXor: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
3324                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
3325                        V_VT(&result));
3326                 else
3327                     ok(hres == S_OK && V_VT(&result) == resvt,
3328                        "VarXor: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
3329                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
3330                        V_VT(&result));
3331             }
3332         }
3333     }
3334
3335     /* Test returned values
3336      * FIXME: Test VT_DECIMAL/VT_DISPATCH
3337      */
3338     VARXOR(EMPTY,0,EMPTY,0,I2,0);
3339     VARXOR(EMPTY,1,EMPTY,0,I2,0);
3340     VARXOR(EMPTY,0,NULL,0,NULL,0);
3341     VARXOR(EMPTY,0,I1,0,I4,0);
3342     VARXOR(EMPTY,0,I1,1,I4,1);
3343     VARXOR(EMPTY,0,UI1,0,I2,0);
3344     VARXOR(EMPTY,0,UI1,1,I2,1);
3345     VARXOR(EMPTY,0,I2,0,I2,0);
3346     VARXOR(EMPTY,0,I2,1,I2,1);
3347     VARXOR(EMPTY,0,UI2,0,I4,0);
3348     VARXOR(EMPTY,0,UI2,1,I4,1);
3349     VARXOR(EMPTY,0,I4,0,I4,0);
3350     VARXOR(EMPTY,0,I4,1,I4,1);
3351     VARXOR(EMPTY,0,UI4,0,I4,0);
3352     VARXOR(EMPTY,0,UI4,1,I4,1);
3353     if (HAVE_OLEAUT32_I8)
3354     {
3355         VARXOR(EMPTY,0,I8,0,I8,0);
3356         VARXOR(EMPTY,0,I8,1,I8,1);
3357         VARXOR(EMPTY,0,UI8,0,I4,0);
3358         VARXOR(EMPTY,0,UI8,1,I4,1);
3359     }
3360     VARXOR(EMPTY,0,INT,0,I4,0);
3361     VARXOR(EMPTY,0,INT,1,I4,1);
3362     VARXOR(EMPTY,0,UINT,0,I4,0);
3363     VARXOR(EMPTY,0,UINT,1,I4,1);
3364     VARXOR(EMPTY,0,BOOL,0,I2,0);
3365     VARXOR(EMPTY,0,BOOL,1,I2,1);
3366     VARXOR(EMPTY,0,R4,0,I4,0);
3367     VARXOR(EMPTY,0,R4,1,I4,1);
3368     VARXOR(EMPTY,0,R8,0,I4,0);
3369     VARXOR(EMPTY,0,R8,1,I4,1);
3370     rbstr = SysAllocString(szFalse);
3371     VARXOR(EMPTY,0,BSTR,rbstr,I2,0);
3372     rbstr = SysAllocString(szTrue);
3373     VARXOR(EMPTY,0,BSTR,rbstr,I2,-1);
3374     VARXORCY(EMPTY,0,10000,I4,1);
3375
3376     /* NULL OR 0 = NULL. NULL OR n = n */
3377     VARXOR(NULL,0,NULL,0,NULL,0);
3378     VARXOR(NULL,1,NULL,0,NULL,0);
3379     VARXOR(NULL,0,I1,0,NULL,0);
3380     VARXOR(NULL,0,I1,1,NULL,0);
3381     VARXOR(NULL,0,UI1,0,NULL,0);
3382     VARXOR(NULL,0,UI1,1,NULL,0);
3383     VARXOR(NULL,0,I2,0,NULL,0);
3384     VARXOR(NULL,0,I2,1,NULL,0);
3385     VARXOR(NULL,0,UI2,0,NULL,0);
3386     VARXOR(NULL,0,UI2,1,NULL,0);
3387     VARXOR(NULL,0,I4,0,NULL,0);
3388     VARXOR(NULL,0,I4,1,NULL,0);
3389     VARXOR(NULL,0,UI4,0,NULL,0);
3390     VARXOR(NULL,0,UI4,1,NULL,0);
3391     if (HAVE_OLEAUT32_I8)
3392     {
3393         VARXOR(NULL,0,I8,0,NULL,0);
3394         VARXOR(NULL,0,I8,1,NULL,0);
3395         VARXOR(NULL,0,UI8,0,NULL,0);
3396         VARXOR(NULL,0,UI8,1,NULL,0);
3397     }
3398     VARXOR(NULL,0,INT,0,NULL,0);
3399     VARXOR(NULL,0,INT,1,NULL,0);
3400     VARXOR(NULL,0,UINT,0,NULL,0);
3401     VARXOR(NULL,0,UINT,1,NULL,0);
3402     VARXOR(NULL,0,BOOL,0,NULL,0);
3403     VARXOR(NULL,0,BOOL,1,NULL,0);
3404     VARXOR(NULL,0,R4,0,NULL,0);
3405     VARXOR(NULL,0,R4,1,NULL,0);
3406     VARXOR(NULL,0,R8,0,NULL,0);
3407     VARXOR(NULL,0,R8,1,NULL,0);
3408     rbstr = SysAllocString(szFalse);
3409     VARXOR(NULL,0,BSTR,rbstr,NULL,0);
3410     rbstr = SysAllocString(szTrue);
3411     VARXOR(NULL,0,BSTR,rbstr,NULL,0);
3412     VARXORCY(NULL,0,10000,NULL,0);
3413     VARXORCY(NULL,0,0,NULL,0);
3414
3415     VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
3416     VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
3417     VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
3418     VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
3419     /* Assume x,y & y,x are the same from now on to reduce the number of tests */
3420     VARXOR(BOOL,VARIANT_TRUE,I1,-1,I4,0);
3421     VARXOR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
3422     VARXOR(BOOL,VARIANT_FALSE,I1,0,I4,0);
3423     VARXOR(BOOL,VARIANT_TRUE,UI1,255,I2,-256);
3424     VARXOR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
3425     VARXOR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
3426     VARXOR(BOOL,VARIANT_TRUE,I2,-1,I2,0);
3427     VARXOR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
3428     VARXOR(BOOL,VARIANT_FALSE,I2,0,I2,0);
3429     VARXOR(BOOL,VARIANT_TRUE,UI2,65535,I4,-65536);
3430     VARXOR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
3431     VARXOR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
3432     VARXOR(BOOL,VARIANT_TRUE,I4,-1,I4,0);
3433     VARXOR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
3434     VARXOR(BOOL,VARIANT_FALSE,I4,0,I4,0);
3435     VARXOR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,0);
3436     VARXOR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
3437     VARXOR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
3438     VARXOR(BOOL,VARIANT_TRUE,R4,-1,I4,0);
3439     VARXOR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
3440     VARXOR(BOOL,VARIANT_FALSE,R4,0,I4,0);
3441     VARXOR(BOOL,VARIANT_TRUE,R8,-1,I4,0);
3442     VARXOR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
3443     VARXOR(BOOL,VARIANT_FALSE,R8,0,I4,0);
3444     VARXOR(BOOL,VARIANT_TRUE,DATE,-1,I4,0);
3445     VARXOR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
3446     VARXOR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
3447     if (HAVE_OLEAUT32_I8)
3448     {
3449         VARXOR(BOOL,VARIANT_TRUE,I8,-1,I8,0);
3450         VARXOR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
3451         VARXOR(BOOL,VARIANT_FALSE,I8,0,I8,0);
3452         /* This returns DISP_E_OVERFLOW which indicates that a conversion
3453          * to I4 is performed.
3454          */
3455         /* VARXOR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
3456         VARXOR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
3457         VARXOR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
3458     }
3459     VARXOR(BOOL,VARIANT_TRUE,INT,-1,I4,0);
3460     VARXOR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
3461     VARXOR(BOOL,VARIANT_FALSE,INT,0,I4,0);
3462     VARXOR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,0);
3463     VARXOR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
3464     VARXOR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
3465     rbstr = SysAllocString(szFalse);
3466     VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
3467     VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
3468     rbstr = SysAllocString(szTrue);
3469     VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
3470     VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_FALSE);
3471     VARXORCY(BOOL,VARIANT_TRUE,10000,I4,-2);
3472     VARXORCY(BOOL,VARIANT_TRUE,0,I4,-1);
3473     VARXORCY(BOOL,VARIANT_FALSE,0,I4,0);
3474
3475     VARXOR(I1,-1,I1,-1,I4,0);
3476     VARXOR(I1,-1,I1,0,I4,-1);
3477     VARXOR(I1,0,I1,0,I4,0);
3478     VARXOR(I1,-1,UI1,255,I4,-256);
3479     VARXOR(I1,-1,UI1,0,I4,-1);
3480     VARXOR(I1,0,UI1,0,I4,0);
3481     VARXOR(I1,-1,I2,-1,I4,0);
3482     VARXOR(I1,-1,I2,0,I4,-1);
3483     VARXOR(I1,0,I2,0,I4,0);
3484     VARXOR(I1,-1,UI2,65535,I4,-65536);
3485     VARXOR(I1,-1,UI2,0,I4,-1);
3486     VARXOR(I1,0,UI2,0,I4,0);
3487     VARXOR(I1,-1,I4,-1,I4,0);
3488     VARXOR(I1,-1,I4,0,I4,-1);
3489     VARXOR(I1,0,I4,0,I4,0);
3490     VARXOR(I1,-1,UI4,0xffffffff,I4,0);
3491     VARXOR(I1,-1,UI4,0,I4,-1);
3492     VARXOR(I1,0,UI4,0,I4,0);
3493     VARXOR(I1,-1,R4,-1,I4,0);
3494     VARXOR(I1,-1,R4,0,I4,-1);
3495     VARXOR(I1,0,R4,0,I4,0);
3496     VARXOR(I1,-1,R8,-1,I4,0);
3497     VARXOR(I1,-1,R8,0,I4,-1);
3498     VARXOR(I1,0,R8,0,I4,0);
3499     VARXOR(I1,-1,DATE,-1,I4,0);
3500     VARXOR(I1,-1,DATE,0,I4,-1);
3501     VARXOR(I1,0,DATE,0,I4,0);
3502     if (HAVE_OLEAUT32_I8)
3503     {
3504         VARXOR(I1,-1,I8,-1,I8,0);
3505         VARXOR(I1,-1,I8,0,I8,-1);
3506         VARXOR(I1,0,I8,0,I8,0);
3507         VARXOR(I1,-1,UI8,0,I4,-1);
3508         VARXOR(I1,0,UI8,0,I4,0);
3509     }
3510     VARXOR(I1,-1,INT,-1,I4,0);
3511     VARXOR(I1,-1,INT,0,I4,-1);
3512     VARXOR(I1,0,INT,0,I4,0);
3513     VARXOR(I1,-1,UINT,0xffffffff,I4,0);
3514     VARXOR(I1,-1,UINT,0,I4,-1);
3515     VARXOR(I1,0,UINT,0,I4,0);
3516     rbstr = SysAllocString(szFalse);
3517     VARXOR(I1,0,BSTR,rbstr,I4,0);
3518     VARXOR(I1,-1,BSTR,rbstr,I4,-1);
3519     rbstr = SysAllocString(szTrue);
3520     VARXOR(I1,0,BSTR,rbstr,I4,-1);
3521     VARXOR(I1,-1,BSTR,rbstr,I4,0);
3522     VARXORCY(I1,-1,10000,I4,-2);
3523     VARXORCY(I1,-1,0,I4,-1);
3524     VARXORCY(I1,0,0,I4,0);
3525
3526     VARXOR(UI1,255,UI1,255,UI1,0);
3527     VARXOR(UI1,255,UI1,0,UI1,255);
3528     VARXOR(UI1,0,UI1,0,UI1,0);
3529     VARXOR(UI1,255,I2,-1,I2,-256);
3530     VARXOR(UI1,255,I2,0,I2,255);
3531     VARXOR(UI1,0,I2,0,I2,0);
3532     VARXOR(UI1,255,UI2,65535,I4,65280);
3533     VARXOR(UI1,255,UI2,0,I4,255);
3534     VARXOR(UI1,0,UI2,0,I4,0);
3535     VARXOR(UI1,255,I4,-1,I4,-256);
3536     VARXOR(UI1,255,I4,0,I4,255);
3537     VARXOR(UI1,0,I4,0,I4,0);
3538     VARXOR(UI1,255,UI4,0xffffffff,I4,-256);
3539     VARXOR(UI1,255,UI4,0,I4,255);
3540     VARXOR(UI1,0,UI4,0,I4,0);
3541     VARXOR(UI1,255,R4,-1,I4,-256);
3542     VARXOR(UI1,255,R4,0,I4,255);
3543     VARXOR(UI1,0,R4,0,I4,0);
3544     VARXOR(UI1,255,R8,-1,I4,-256);
3545     VARXOR(UI1,255,R8,0,I4,255);
3546     VARXOR(UI1,0,R8,0,I4,0);
3547     VARXOR(UI1,255,DATE,-1,I4,-256);
3548     VARXOR(UI1,255,DATE,0,I4,255);
3549     VARXOR(UI1,0,DATE,0,I4,0);
3550     if (HAVE_OLEAUT32_I8)
3551     {
3552         VARXOR(UI1,255,I8,-1,I8,-256);
3553         VARXOR(UI1,255,I8,0,I8,255);
3554         VARXOR(UI1,0,I8,0,I8,0);
3555         VARXOR(UI1,255,UI8,0,I4,255);
3556         VARXOR(UI1,0,UI8,0,I4,0);
3557     }
3558     VARXOR(UI1,255,INT,-1,I4,-256);
3559     VARXOR(UI1,255,INT,0,I4,255);
3560     VARXOR(UI1,0,INT,0,I4,0);
3561     VARXOR(UI1,255,UINT,0xffffffff,I4,-256);
3562     VARXOR(UI1,255,UINT,0,I4,255);
3563     VARXOR(UI1,0,UINT,0,I4,0);
3564     rbstr = SysAllocString(szFalse);
3565     VARXOR(UI1,0,BSTR,rbstr,I2,0);
3566     VARXOR(UI1,255,BSTR,rbstr,I2,255);
3567     rbstr = SysAllocString(szTrue);
3568     VARXOR(UI1,0,BSTR,rbstr,I2,-1);
3569     VARXOR(UI1,255,BSTR,rbstr,I2,-256);
3570     VARXORCY(UI1,255,10000,I4,254);
3571     VARXORCY(UI1,255,0,I4,255);
3572     VARXORCY(UI1,0,0,I4,0);
3573
3574     VARXOR(I2,-1,I2,-1,I2,0);
3575     VARXOR(I2,-1,I2,0,I2,-1);
3576     VARXOR(I2,0,I2,0,I2,0);
3577     VARXOR(I2,-1,UI2,65535,I4,-65536);
3578     VARXOR(I2,-1,UI2,0,I4,-1);
3579     VARXOR(I2,0,UI2,0,I4,0);
3580     VARXOR(I2,-1,I4,-1,I4,0);
3581     VARXOR(I2,-1,I4,0,I4,-1);
3582     VARXOR(I2,0,I4,0,I4,0);
3583     VARXOR(I2,-1,UI4,0xffffffff,I4,0);
3584     VARXOR(I2,-1,UI4,0,I4,-1);
3585     VARXOR(I2,0,UI4,0,I4,0);
3586     VARXOR(I2,-1,R4,-1,I4,0);
3587     VARXOR(I2,-1,R4,0,I4,-1);
3588     VARXOR(I2,0,R4,0,I4,0);
3589     VARXOR(I2,-1,R8,-1,I4,0);
3590     VARXOR(I2,-1,R8,0,I4,-1);
3591     VARXOR(I2,0,R8,0,I4,0);
3592     VARXOR(I2,-1,DATE,-1,I4,0);
3593     VARXOR(I2,-1,DATE,0,I4,-1);
3594     VARXOR(I2,0,DATE,0,I4,0);
3595     if (HAVE_OLEAUT32_I8)
3596     {
3597         VARXOR(I2,-1,I8,-1,I8,0);
3598         VARXOR(I2,-1,I8,0,I8,-1);
3599         VARXOR(I2,0,I8,0,I8,0);
3600         VARXOR(I2,-1,UI8,0,I4,-1);
3601         VARXOR(I2,0,UI8,0,I4,0);
3602     }
3603     VARXOR(I2,-1,INT,-1,I4,0);
3604     VARXOR(I2,-1,INT,0,I4,-1);
3605     VARXOR(I2,0,INT,0,I4,0);
3606     VARXOR(I2,-1,UINT,0xffffffff,I4,0);
3607     VARXOR(I2,-1,UINT,0,I4,-1);
3608     VARXOR(I2,0,UINT,0,I4,0);
3609     rbstr = SysAllocString(szFalse);
3610     VARXOR(I2,0,BSTR,rbstr,I2,0);
3611     VARXOR(I2,-1,BSTR,rbstr,I2,-1);
3612     rbstr = SysAllocString(szTrue);
3613     VARXOR(I2,0,BSTR,rbstr,I2,-1);
3614     VARXOR(I2,-1,BSTR,rbstr,I2,0);
3615     VARXORCY(I2,-1,10000,I4,-2);
3616     VARXORCY(I2,-1,0,I4,-1);
3617     VARXORCY(I2,0,0,I4,0);
3618
3619     VARXOR(UI2,65535,UI2,65535,I4,0);
3620     VARXOR(UI2,65535,UI2,0,I4,65535);
3621     VARXOR(UI2,0,UI2,0,I4,0);
3622     VARXOR(UI2,65535,I4,-1,I4,-65536);
3623     VARXOR(UI2,65535,I4,0,I4,65535);
3624     VARXOR(UI2,0,I4,0,I4,0);
3625     VARXOR(UI2,65535,UI4,0xffffffff,I4,-65536);
3626     VARXOR(UI2,65535,UI4,0,I4,65535);
3627     VARXOR(UI2,0,UI4,0,I4,0);
3628     VARXOR(UI2,65535,R4,-1,I4,-65536);
3629     VARXOR(UI2,65535,R4,0,I4,65535);
3630     VARXOR(UI2,0,R4,0,I4,0);
3631     VARXOR(UI2,65535,R8,-1,I4,-65536);
3632     VARXOR(UI2,65535,R8,0,I4,65535);
3633     VARXOR(UI2,0,R8,0,I4,0);
3634     VARXOR(UI2,65535,DATE,-1,I4,-65536);
3635     VARXOR(UI2,65535,DATE,0,I4,65535);
3636     VARXOR(UI2,0,DATE,0,I4,0);
3637     if (HAVE_OLEAUT32_I8)
3638     {
3639         VARXOR(UI2,65535,I8,-1,I8,-65536);
3640         VARXOR(UI2,65535,I8,0,I8,65535);
3641         VARXOR(UI2,0,I8,0,I8,0);
3642         VARXOR(UI2,65535,UI8,0,I4,65535);
3643         VARXOR(UI2,0,UI8,0,I4,0);
3644     }
3645     VARXOR(UI2,65535,INT,-1,I4,-65536);
3646     VARXOR(UI2,65535,INT,0,I4,65535);
3647     VARXOR(UI2,0,INT,0,I4,0);
3648     VARXOR(UI2,65535,UINT,0xffffffff,I4,-65536);
3649     VARXOR(UI2,65535,UINT,0,I4,65535);
3650     VARXOR(UI2,0,UINT,0,I4,0);
3651     rbstr = SysAllocString(szFalse);
3652     VARXOR(UI2,0,BSTR,rbstr,I4,0);
3653     VARXOR(UI2,65535,BSTR,rbstr,I4,65535);
3654     rbstr = SysAllocString(szTrue);
3655     VARXOR(UI2,0,BSTR,rbstr,I4,-1);
3656     VARXOR(UI2,65535,BSTR,rbstr,I4,-65536);
3657     VARXORCY(UI2,65535,10000,I4,65534);
3658     VARXORCY(UI2,65535,0,I4,65535);
3659     VARXORCY(UI2,0,0,I4,0);
3660
3661     VARXOR(I4,-1,I4,-1,I4,0);
3662     VARXOR(I4,-1,I4,0,I4,-1);
3663     VARXOR(I4,0,I4,0,I4,0);
3664     VARXOR(I4,-1,UI4,0xffffffff,I4,0);
3665     VARXOR(I4,-1,UI4,0,I4,-1);
3666     VARXOR(I4,0,UI4,0,I4,0);
3667     VARXOR(I4,-1,R4,-1,I4,0);
3668     VARXOR(I4,-1,R4,0,I4,-1);
3669     VARXOR(I4,0,R4,0,I4,0);
3670     VARXOR(I4,-1,R8,-1,I4,0);
3671     VARXOR(I4,-1,R8,0,I4,-1);
3672     VARXOR(I4,0,R8,0,I4,0);
3673     VARXOR(I4,-1,DATE,-1,I4,0);
3674     VARXOR(I4,-1,DATE,0,I4,-1);
3675     VARXOR(I4,0,DATE,0,I4,0);
3676     if (HAVE_OLEAUT32_I8)
3677     {
3678         VARXOR(I4,-1,I8,-1,I8,0);
3679         VARXOR(I4,-1,I8,0,I8,-1);
3680         VARXOR(I4,0,I8,0,I8,0);
3681         VARXOR(I4,-1,UI8,0,I4,-1);
3682         VARXOR(I4,0,UI8,0,I4,0);
3683     }
3684     VARXOR(I4,-1,INT,-1,I4,0);
3685     VARXOR(I4,-1,INT,0,I4,-1);
3686     VARXOR(I4,0,INT,0,I4,0);
3687     VARXOR(I4,-1,UINT,0xffffffff,I4,0);
3688     VARXOR(I4,-1,UINT,0,I4,-1);
3689     VARXOR(I4,0,UINT,0,I4,0);
3690     rbstr = SysAllocString(szFalse);
3691     VARXOR(I4,0,BSTR,rbstr,I4,0);
3692     VARXOR(I4,-1,BSTR,rbstr,I4,-1);
3693     rbstr = SysAllocString(szTrue);
3694     VARXOR(I4,0,BSTR,rbstr,I4,-1);
3695     VARXOR(I4,-1,BSTR,rbstr,I4,0);
3696     VARXORCY(I4,-1,10000,I4,-2);
3697     VARXORCY(I4,-1,0,I4,-1);
3698     VARXORCY(I4,0,0,I4,0);
3699
3700     VARXOR(UI4,0xffffffff,UI4,0xffffffff,I4,0);
3701     VARXOR(UI4,0xffffffff,UI4,0,I4,-1);
3702     VARXOR(UI4,0,UI4,0,I4,0);
3703     VARXOR(UI4,0xffffffff,R4,-1,I4,0);
3704     VARXOR(UI4,0xffffffff,R4,0,I4,-1);
3705     VARXOR(UI4,0,R4,0,I4,0);
3706     VARXOR(UI4,0xffffffff,R8,-1,I4,0);
3707     VARXOR(UI4,0xffffffff,R8,0,I4,-1);
3708     VARXOR(UI4,0,R8,0,I4,0);
3709     VARXOR(UI4,0xffffffff,DATE,-1,I4,0);
3710     VARXOR(UI4,0xffffffff,DATE,0,I4,-1);
3711     VARXOR(UI4,0,DATE,0,I4,0);
3712     if (HAVE_OLEAUT32_I8)
3713     {
3714         VARXOR(UI4,0xffffffff,I8,0,I8,0xffffffff);
3715         VARXOR(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,0);
3716         VARXOR(UI4,0,I8,0,I8,0);
3717         VARXOR(UI4,0xffffffff,UI8,0,I4,-1);
3718         VARXOR(UI4,0,UI8,0,I4,0);
3719     }
3720     VARXOR(UI4,0xffffffff,INT,-1,I4,0);
3721     VARXOR(UI4,0xffffffff,INT,0,I4,-1);
3722     VARXOR(UI4,0,INT,0,I4,0);
3723     VARXOR(UI4,0xffffffff,UINT,0xffffffff,I4,0);
3724     VARXOR(UI4,0xffffffff,UINT,0,I4,-1);
3725     VARXOR(UI4,0,UINT,0,I4,0);
3726     rbstr = SysAllocString(szFalse);
3727     VARXOR(UI4,0,BSTR,rbstr,I4,0);
3728     VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
3729     rbstr = SysAllocString(szTrue);
3730     VARXOR(UI4,0,BSTR,rbstr,I4,-1);
3731     VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,0);
3732     VARXORCY(UI4,0xffffffff,10000,I4,-2);
3733     VARXORCY(UI4,0xffffffff,0,I4,-1);
3734     VARXORCY(UI4,0,0,I4,0);
3735
3736     VARXOR(R4,-1,R4,-1,I4,0);
3737     VARXOR(R4,-1,R4,0,I4,-1);
3738     VARXOR(R4,0,R4,0,I4,0);
3739     VARXOR(R4,-1,R8,-1,I4,0);
3740     VARXOR(R4,-1,R8,0,I4,-1);
3741     VARXOR(R4,0,R8,0,I4,0);
3742     VARXOR(R4,-1,DATE,-1,I4,0);
3743     VARXOR(R4,-1,DATE,0,I4,-1);
3744     VARXOR(R4,0,DATE,0,I4,0);
3745     if (HAVE_OLEAUT32_I8)
3746     {
3747         VARXOR(R4,-1,I8,-1,I8,0);
3748         VARXOR(R4,-1,I8,0,I8,-1);
3749         VARXOR(R4,0,I8,0,I8,0);
3750         VARXOR(R4,-1,UI8,0,I4,-1);
3751         VARXOR(R4,0,UI8,0,I4,0);
3752     }
3753     VARXOR(R4,-1,INT,-1,I4,0);
3754     VARXOR(R4,-1,INT,0,I4,-1);
3755     VARXOR(R4,0,INT,0,I4,0);
3756     VARXOR(R4,-1,UINT,0xffffffff,I4,0);
3757     VARXOR(R4,-1,UINT,0,I4,-1);
3758     VARXOR(R4,0,UINT,0,I4,0);
3759     rbstr = SysAllocString(szFalse);
3760     VARXOR(R4,0,BSTR,rbstr,I4,0);
3761     VARXOR(R4,-1,BSTR,rbstr,I4,-1);
3762     rbstr = SysAllocString(szTrue);
3763     VARXOR(R4,0,BSTR,rbstr,I4,-1);
3764     VARXOR(R4,-1,BSTR,rbstr,I4,0);
3765     VARXORCY(R4,-1,10000,I4,-2);
3766     VARXORCY(R4,-1,0,I4,-1);
3767     VARXORCY(R4,0,0,I4,0);
3768
3769     VARXOR(R8,-1,R8,-1,I4,0);
3770     VARXOR(R8,-1,R8,0,I4,-1);
3771     VARXOR(R8,0,R8,0,I4,0);
3772     VARXOR(R8,-1,DATE,-1,I4,0);
3773     VARXOR(R8,-1,DATE,0,I4,-1);
3774     VARXOR(R8,0,DATE,0,I4,0);
3775     if (HAVE_OLEAUT32_I8)
3776     {
3777         VARXOR(R8,-1,I8,-1,I8,0);
3778         VARXOR(R8,-1,I8,0,I8,-1);
3779         VARXOR(R8,0,I8,0,I8,0);
3780         VARXOR(R8,-1,UI8,0,I4,-1);
3781         VARXOR(R8,0,UI8,0,I4,0);
3782     }
3783     VARXOR(R8,-1,INT,-1,I4,0);
3784     VARXOR(R8,-1,INT,0,I4,-1);
3785     VARXOR(R8,0,INT,0,I4,0);
3786     VARXOR(R8,-1,UINT,0xffffffff,I4,0);
3787     VARXOR(R8,-1,UINT,0,I4,-1);
3788     VARXOR(R8,0,UINT,0,I4,0);
3789     rbstr = SysAllocString(szFalse);
3790     VARXOR(R8,0,BSTR,rbstr,I4,0);
3791     VARXOR(R8,-1,BSTR,rbstr,I4,-1);
3792     rbstr = SysAllocString(szTrue);
3793     VARXOR(R8,0,BSTR,rbstr,I4,-1);
3794     VARXOR(R8,-1,BSTR,rbstr,I4,0);
3795     VARXORCY(R8,-1,10000,I4,-2);
3796     VARXORCY(R8,-1,0,I4,-1);
3797     VARXORCY(R8,0,0,I4,0);
3798
3799     VARXOR(DATE,-1,DATE,-1,I4,0);
3800     VARXOR(DATE,-1,DATE,0,I4,-1);
3801     VARXOR(DATE,0,DATE,0,I4,0);
3802     if (HAVE_OLEAUT32_I8)
3803     {
3804         VARXOR(DATE,-1,I8,-1,I8,0);
3805         VARXOR(DATE,-1,I8,0,I8,-1);
3806         VARXOR(DATE,0,I8,0,I8,0);
3807         VARXOR(DATE,-1,UI8,0,I4,-1);
3808         VARXOR(DATE,0,UI8,0,I4,0);
3809     }
3810     VARXOR(DATE,-1,INT,-1,I4,0);
3811     VARXOR(DATE,-1,INT,0,I4,-1);
3812     VARXOR(DATE,0,INT,0,I4,0);
3813     VARXOR(DATE,-1,UINT,0xffffffff,I4,0);
3814     VARXOR(DATE,-1,UINT,0,I4,-1);
3815     VARXOR(DATE,0,UINT,0,I4,0);
3816     rbstr = SysAllocString(szFalse);
3817     VARXOR(DATE,0,BSTR,rbstr,I4,0);
3818     VARXOR(DATE,-1,BSTR,rbstr,I4,-1);
3819     rbstr = SysAllocString(szTrue);
3820     VARXOR(DATE,0,BSTR,rbstr,I4,-1);
3821     VARXOR(DATE,-1,BSTR,rbstr,I4,0);
3822     VARXORCY(DATE,-1,10000,I4,-2);
3823     VARXORCY(DATE,-1,0,I4,-1);
3824     VARXORCY(DATE,0,0,I4,0);
3825
3826     if (HAVE_OLEAUT32_I8)
3827     {
3828         VARXOR(I8,-1,I8,-1,I8,0);
3829         VARXOR(I8,-1,I8,0,I8,-1);
3830         VARXOR(I8,0,I8,0,I8,0);
3831         VARXOR(I8,-1,UI8,0,I8,-1);
3832         VARXOR(I8,0,UI8,0,I8,0);
3833         VARXOR(I8,-1,UINT,0,I8,-1);
3834         VARXOR(I8,0,UINT,0,I8,0);
3835         rbstr = SysAllocString(szFalse);
3836         VARXOR(I8,0,BSTR,rbstr,I8,0);
3837         VARXOR(I8,-1,BSTR,rbstr,I8,-1);
3838         rbstr = SysAllocString(szTrue);
3839         VARXOR(I8,0,BSTR,rbstr,I8,-1);
3840         VARXOR(I8,-1,BSTR,rbstr,I8,0);
3841         VARXORCY(I8,-1,10000,I8,-2);
3842         VARXORCY(I8,-1,0,I8,-1);
3843         VARXORCY(I8,0,0,I8,0);
3844
3845         VARXOR(UI8,0xffff,UI8,0xffff,I4,0);
3846         VARXOR(UI8,0xffff,UI8,0,I4,0xffff);
3847         VARXOR(UI8,0,UI8,0,I4,0);
3848         VARXOR(UI8,0xffff,INT,-1,I4,-65536);
3849         VARXOR(UI8,0xffff,INT,0,I4,0xffff);
3850         VARXOR(UI8,0,INT,0,I4,0);
3851         VARXOR(UI8,0xffff,UINT,0xffff,I4,0);
3852         VARXOR(UI8,0xffff,UINT,0,I4,0xffff);
3853         VARXOR(UI8,0,UINT,0,I4,0);
3854         rbstr = SysAllocString(szFalse);
3855         VARXOR(UI8,0,BSTR,rbstr,I4,0);
3856         VARXOR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
3857         rbstr = SysAllocString(szTrue);
3858         VARXOR(UI8,0,BSTR,rbstr,I4,-1);
3859         VARXOR(UI8,0xffff,BSTR,rbstr,I4,-65536);
3860         VARXORCY(UI8,0xffff,10000,I4,65534);
3861         VARXORCY(UI8,0xffff,0,I4,0xffff);
3862         VARXORCY(UI8,0,0,I4,0);
3863     }
3864
3865     VARXOR(INT,-1,INT,-1,I4,0);
3866     VARXOR(INT,-1,INT,0,I4,-1);
3867     VARXOR(INT,0,INT,0,I4,0);
3868     VARXOR(INT,-1,UINT,0xffff,I4,-65536);
3869     VARXOR(INT,-1,UINT,0,I4,-1);
3870     VARXOR(INT,0,UINT,0,I4,0);
3871     rbstr = SysAllocString(szFalse);
3872     VARXOR(INT,0,BSTR,rbstr,I4,0);
3873     VARXOR(INT,-1,BSTR,rbstr,I4,-1);
3874     rbstr = SysAllocString(szTrue);
3875     VARXOR(INT,0,BSTR,rbstr,I4,-1);
3876     VARXOR(INT,-1,BSTR,rbstr,I4,0);
3877     VARXORCY(INT,-1,10000,I4,-2);
3878     VARXORCY(INT,-1,0,I4,-1);
3879     VARXORCY(INT,0,0,I4,0);
3880
3881     VARXOR(UINT,0xffff,UINT,0xffff,I4,0);
3882     VARXOR(UINT,0xffff,UINT,0,I4,0xffff);
3883     VARXOR(UINT,0,UINT,0,I4,0);
3884     rbstr = SysAllocString(szFalse);
3885     VARXOR(UINT,0,BSTR,rbstr,I4,0);
3886     VARXOR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
3887     rbstr = SysAllocString(szTrue);
3888     VARXOR(UINT,0,BSTR,rbstr,I4,-1);
3889     VARXOR(UINT,0xffff,BSTR,rbstr,I4,-65536);
3890     VARXORCY(UINT,0xffff,10000,I4,65534);
3891     VARXORCY(UINT,0xffff,0,I4,0xffff);
3892     VARXORCY(UINT,0,0,I4,0);
3893
3894     lbstr = SysAllocString(szFalse);
3895     rbstr = SysAllocString(szFalse);
3896     VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
3897     rbstr = SysAllocString(szTrue);
3898     VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
3899     lbstr = SysAllocString(szTrue);
3900     VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_FALSE);
3901     VARXORCY(BSTR,lbstr,10000,I4,-2);
3902     lbstr = SysAllocString(szFalse);
3903     VARXORCY(BSTR,lbstr,10000,I4,1);
3904 }
3905
3906 static HRESULT (WINAPI *pVarOr)(LPVARIANT,LPVARIANT,LPVARIANT);
3907
3908 #define VAROR(vt1,val1,vt2,val2,rvt,rval)                \
3909         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
3910         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3911         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
3912         test_var_call2( __LINE__, pVarOr, &left, &right, &exp )
3913
3914 #define VARORCY(vt1,val1,val2,rvt,rval)                  \
3915         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
3916         V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
3917         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
3918         test_var_call2( __LINE__, pVarOr, &left, &right, &exp )
3919
3920 static void test_VarOr(void)
3921 {
3922     static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
3923     static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
3924     VARIANT left, right, exp, result;
3925     BSTR lbstr, rbstr;
3926     VARTYPE i;
3927     HRESULT hres;
3928
3929     CHECKPTR(VarOr);
3930
3931     /* Test all possible flag/vt combinations & the resulting vt type */
3932     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
3933     {
3934         VARTYPE leftvt, rightvt, resvt;
3935
3936         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
3937         {
3938         
3939             SKIPTESTS(leftvt);
3940         
3941             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
3942             {
3943                 BOOL bFail = FALSE;
3944
3945                 SKIPTESTS(rightvt);
3946                 
3947                 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
3948                     leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
3949                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
3950                     continue;
3951
3952                 memset(&left, 0, sizeof(left));
3953                 memset(&right, 0, sizeof(right));
3954                 V_VT(&left) = leftvt | ExtraFlags[i];
3955                 V_VT(&right) = rightvt | ExtraFlags[i];
3956                 V_VT(&result) = VT_EMPTY;
3957                 resvt = VT_I4;
3958
3959                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
3960                     !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
3961                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
3962                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
3963                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
3964                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
3965                     leftvt == VT_ERROR || rightvt == VT_ERROR)
3966                 {
3967                     bFail = TRUE;
3968                 }
3969                 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
3970                 {
3971                     if (leftvt == rightvt ||
3972                         leftvt == VT_I2 || rightvt == VT_I2 ||
3973                         leftvt == VT_UI1 || rightvt == VT_UI1 ||
3974                         leftvt == VT_BOOL || rightvt == VT_BOOL)
3975                         resvt = VT_I2;
3976                     else if (leftvt == VT_NULL || rightvt == VT_NULL)
3977                         resvt = VT_NULL;
3978                     else if (leftvt == VT_I8 || rightvt == VT_I8)
3979                         resvt = VT_I8;
3980                 }
3981                 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3982                 {
3983                     resvt = VT_NULL;
3984                 }
3985                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
3986                 {
3987                     if (leftvt == rightvt)
3988                         resvt = VT_UI1;
3989                     else if (leftvt == rightvt ||
3990                         leftvt == VT_I2 || rightvt == VT_I2 ||
3991                         leftvt == VT_BOOL || rightvt == VT_BOOL)
3992                     {
3993                         resvt = VT_I2;
3994                     }
3995                     else if (leftvt == VT_I8 || rightvt == VT_I8)
3996                         resvt = VT_I8;
3997                 }
3998                 else if (leftvt == VT_I2 || rightvt == VT_I2)
3999                 {
4000                     if (leftvt == rightvt ||
4001                         leftvt == VT_BOOL || rightvt == VT_BOOL)
4002                         resvt = VT_I2;
4003                     else if (leftvt == VT_I8 || rightvt == VT_I8)
4004                         resvt = VT_I8;
4005                 }
4006                 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
4007                 {
4008                     resvt = VT_BOOL;
4009                 }
4010                 else if (leftvt == VT_I8 || rightvt == VT_I8)
4011                 {
4012                     if (leftvt == VT_INT || rightvt == VT_INT)
4013                         bFail = TRUE;
4014                     else
4015                         resvt = VT_I8;
4016                 }
4017                 hres = pVarOr(&left, &right, &result);
4018                 if (bFail)
4019                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4020                        "VarOr: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4021                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4022                        V_VT(&result));
4023                 else
4024                     ok(hres == S_OK && V_VT(&result) == resvt,
4025                        "VarOr: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4026                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4027                        V_VT(&result));
4028             }
4029         }
4030     }
4031
4032     /* Test returned values. Since we know the returned type is correct
4033      * and that we handle all combinations of invalid types, just check
4034      * that good type combinations produce the desired value.
4035      * FIXME: Test VT_DECIMAL/VT_DISPATCH
4036      */
4037     VAROR(EMPTY,0,EMPTY,0,I2,0);
4038     VAROR(EMPTY,1,EMPTY,0,I2,0);
4039     VAROR(EMPTY,0,NULL,0,NULL,0);
4040     VAROR(EMPTY,0,I1,0,I4,0);
4041     VAROR(EMPTY,0,I1,1,I4,1);
4042     VAROR(EMPTY,0,UI1,0,I2,0);
4043     VAROR(EMPTY,0,UI1,1,I2,1);
4044     VAROR(EMPTY,0,I2,0,I2,0);
4045     VAROR(EMPTY,0,I2,1,I2,1);
4046     VAROR(EMPTY,0,UI2,0,I4,0);
4047     VAROR(EMPTY,0,UI2,1,I4,1);
4048     VAROR(EMPTY,0,I4,0,I4,0);
4049     VAROR(EMPTY,0,I4,1,I4,1);
4050     VAROR(EMPTY,0,UI4,0,I4,0);
4051     VAROR(EMPTY,0,UI4,1,I4,1);
4052     if (HAVE_OLEAUT32_I8)
4053     {
4054         VAROR(EMPTY,0,I8,0,I8,0);
4055         VAROR(EMPTY,0,I8,1,I8,1);
4056         VAROR(EMPTY,0,UI8,0,I4,0);
4057         VAROR(EMPTY,0,UI8,1,I4,1);
4058     }
4059     VAROR(EMPTY,0,INT,0,I4,0);
4060     VAROR(EMPTY,0,INT,1,I4,1);
4061     VAROR(EMPTY,0,UINT,0,I4,0);
4062     VAROR(EMPTY,0,UINT,1,I4,1);
4063     VAROR(EMPTY,0,BOOL,0,I2,0);
4064     VAROR(EMPTY,0,BOOL,1,I2,1);
4065     VAROR(EMPTY,0,R4,0,I4,0);
4066     VAROR(EMPTY,0,R4,1,I4,1);
4067     VAROR(EMPTY,0,R8,0,I4,0);
4068     VAROR(EMPTY,0,R8,1,I4,1);
4069     rbstr = SysAllocString(szFalse);
4070     VAROR(EMPTY,0,BSTR,rbstr,I2,0);
4071     rbstr = SysAllocString(szTrue);
4072     VAROR(EMPTY,0,BSTR,rbstr,I2,-1);
4073     VARORCY(EMPTY,0,10000,I4,1);
4074
4075     /* NULL OR 0 = NULL. NULL OR n = n */
4076     VAROR(NULL,0,NULL,0,NULL,0);
4077     VAROR(NULL,1,NULL,0,NULL,0);
4078     VAROR(NULL,0,I1,0,NULL,0);
4079     VAROR(NULL,0,I1,1,I4,1);
4080     VAROR(NULL,0,UI1,0,NULL,0);
4081     VAROR(NULL,0,UI1,1,UI1,1);
4082     VAROR(NULL,0,I2,0,NULL,0);
4083     VAROR(NULL,0,I2,1,I2,1);
4084     VAROR(NULL,0,UI2,0,NULL,0);
4085     VAROR(NULL,0,UI2,1,I4,1);
4086     VAROR(NULL,0,I4,0,NULL,0);
4087     VAROR(NULL,0,I4,1,I4,1);
4088     VAROR(NULL,0,UI4,0,NULL,0);
4089     VAROR(NULL,0,UI4,1,I4,1);
4090     if (HAVE_OLEAUT32_I8)
4091     {
4092         VAROR(NULL,0,I8,0,NULL,0);
4093         VAROR(NULL,0,I8,1,I8,1);
4094         VAROR(NULL,0,UI8,0,NULL,0);
4095         VAROR(NULL,0,UI8,1,I4,1);
4096     }
4097     VAROR(NULL,0,INT,0,NULL,0);
4098     VAROR(NULL,0,INT,1,I4,1);
4099     VAROR(NULL,0,UINT,0,NULL,0);
4100     VAROR(NULL,0,UINT,1,I4,1);
4101     VAROR(NULL,0,BOOL,0,NULL,0);
4102     VAROR(NULL,0,BOOL,1,BOOL,1);
4103     VAROR(NULL,0,R4,0,NULL,0);
4104     VAROR(NULL,0,R4,1,I4,1);
4105     VAROR(NULL,0,R8,0,NULL,0);
4106     VAROR(NULL,0,R8,1,I4,1);
4107     rbstr = SysAllocString(szFalse);
4108     VAROR(NULL,0,BSTR,rbstr,NULL,0);
4109     rbstr = SysAllocString(szTrue);
4110     VAROR(NULL,0,BSTR,rbstr,BOOL,VARIANT_TRUE);
4111     VARORCY(NULL,0,10000,I4,1);
4112     VARORCY(NULL,0,0,NULL,0);
4113
4114     VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4115     VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
4116     VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4117     VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
4118     /* Assume x,y & y,x are the same from now on to reduce the number of tests */
4119     VAROR(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
4120     VAROR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
4121     VAROR(BOOL,VARIANT_FALSE,I1,0,I4,0);
4122     VAROR(BOOL,VARIANT_TRUE,UI1,255,I2,-1);
4123     VAROR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
4124     VAROR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
4125     VAROR(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
4126     VAROR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
4127     VAROR(BOOL,VARIANT_FALSE,I2,0,I2,0);
4128     VAROR(BOOL,VARIANT_TRUE,UI2,65535,I4,-1);
4129     VAROR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
4130     VAROR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
4131     VAROR(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
4132     VAROR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
4133     VAROR(BOOL,VARIANT_FALSE,I4,0,I4,0);
4134     VAROR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
4135     VAROR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
4136     VAROR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
4137     VAROR(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
4138     VAROR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
4139     VAROR(BOOL,VARIANT_FALSE,R4,0,I4,0);
4140     VAROR(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
4141     VAROR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
4142     VAROR(BOOL,VARIANT_FALSE,R8,0,I4,0);
4143     VAROR(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
4144     VAROR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
4145     VAROR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
4146     if (HAVE_OLEAUT32_I8)
4147     {
4148         VAROR(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
4149         VAROR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
4150         VAROR(BOOL,VARIANT_FALSE,I8,0,I8,0);
4151         /* This returns DISP_E_OVERFLOW which indicates that a conversion
4152          * to I4 is performed.
4153          */
4154         /* VAROR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
4155         VAROR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
4156         VAROR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
4157     }
4158     VAROR(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
4159     VAROR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
4160     VAROR(BOOL,VARIANT_FALSE,INT,0,I4,0);
4161     VAROR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
4162     VAROR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
4163     VAROR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
4164     rbstr = SysAllocString(szFalse);
4165     VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
4166     VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4167     rbstr = SysAllocString(szTrue);
4168     VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4169     VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4170     VARORCY(BOOL,VARIANT_TRUE,10000,I4,-1);
4171     VARORCY(BOOL,VARIANT_TRUE,0,I4,-1);
4172     VARORCY(BOOL,VARIANT_FALSE,0,I4,0);
4173
4174     VAROR(I1,-1,I1,-1,I4,-1);
4175     VAROR(I1,-1,I1,0,I4,-1);
4176     VAROR(I1,0,I1,0,I4,0);
4177     VAROR(I1,-1,UI1,255,I4,-1);
4178     VAROR(I1,-1,UI1,0,I4,-1);
4179     VAROR(I1,0,UI1,0,I4,0);
4180     VAROR(I1,-1,I2,-1,I4,-1);
4181     VAROR(I1,-1,I2,0,I4,-1);
4182     VAROR(I1,0,I2,0,I4,0);
4183     VAROR(I1,-1,UI2,65535,I4,-1);
4184     VAROR(I1,-1,UI2,0,I4,-1);
4185     VAROR(I1,0,UI2,0,I4,0);
4186     VAROR(I1,-1,I4,-1,I4,-1);
4187     VAROR(I1,-1,I4,0,I4,-1);
4188     VAROR(I1,0,I4,0,I4,0);
4189     VAROR(I1,-1,UI4,0xffffffff,I4,-1);
4190     VAROR(I1,-1,UI4,0,I4,-1);
4191     VAROR(I1,0,UI4,0,I4,0);
4192     VAROR(I1,-1,R4,-1,I4,-1);
4193     VAROR(I1,-1,R4,0,I4,-1);
4194     VAROR(I1,0,R4,0,I4,0);
4195     VAROR(I1,-1,R8,-1,I4,-1);
4196     VAROR(I1,-1,R8,0,I4,-1);
4197     VAROR(I1,0,R8,0,I4,0);
4198     VAROR(I1,-1,DATE,-1,I4,-1);
4199     VAROR(I1,-1,DATE,0,I4,-1);
4200     VAROR(I1,0,DATE,0,I4,0);
4201     if (HAVE_OLEAUT32_I8)
4202     {
4203         VAROR(I1,-1,I8,-1,I8,-1);
4204         VAROR(I1,-1,I8,0,I8,-1);
4205         VAROR(I1,0,I8,0,I8,0);
4206         VAROR(I1,-1,UI8,0,I4,-1);
4207         VAROR(I1,0,UI8,0,I4,0);
4208     }
4209     VAROR(I1,-1,INT,-1,I4,-1);
4210     VAROR(I1,-1,INT,0,I4,-1);
4211     VAROR(I1,0,INT,0,I4,0);
4212     VAROR(I1,-1,UINT,0xffffffff,I4,-1);
4213     VAROR(I1,-1,UINT,0,I4,-1);
4214     VAROR(I1,0,UINT,0,I4,0);
4215     rbstr = SysAllocString(szFalse);
4216     VAROR(I1,0,BSTR,rbstr,I4,0);
4217     VAROR(I1,-1,BSTR,rbstr,I4,-1);
4218     rbstr = SysAllocString(szTrue);
4219     VAROR(I1,0,BSTR,rbstr,I4,-1);
4220     VAROR(I1,-1,BSTR,rbstr,I4,-1);
4221     VARORCY(I1,-1,10000,I4,-1);
4222     VARORCY(I1,-1,0,I4,-1);
4223     VARORCY(I1,0,0,I4,0);
4224
4225     VAROR(UI1,255,UI1,255,UI1,255);
4226     VAROR(UI1,255,UI1,0,UI1,255);
4227     VAROR(UI1,0,UI1,0,UI1,0);
4228     VAROR(UI1,255,I2,-1,I2,-1);
4229     VAROR(UI1,255,I2,0,I2,255);
4230     VAROR(UI1,0,I2,0,I2,0);
4231     VAROR(UI1,255,UI2,65535,I4,65535);
4232     VAROR(UI1,255,UI2,0,I4,255);
4233     VAROR(UI1,0,UI2,0,I4,0);
4234     VAROR(UI1,255,I4,-1,I4,-1);
4235     VAROR(UI1,255,I4,0,I4,255);
4236     VAROR(UI1,0,I4,0,I4,0);
4237     VAROR(UI1,255,UI4,0xffffffff,I4,-1);
4238     VAROR(UI1,255,UI4,0,I4,255);
4239     VAROR(UI1,0,UI4,0,I4,0);
4240     VAROR(UI1,255,R4,-1,I4,-1);
4241     VAROR(UI1,255,R4,0,I4,255);
4242     VAROR(UI1,0,R4,0,I4,0);
4243     VAROR(UI1,255,R8,-1,I4,-1);
4244     VAROR(UI1,255,R8,0,I4,255);
4245     VAROR(UI1,0,R8,0,I4,0);
4246     VAROR(UI1,255,DATE,-1,I4,-1);
4247     VAROR(UI1,255,DATE,0,I4,255);
4248     VAROR(UI1,0,DATE,0,I4,0);
4249     if (HAVE_OLEAUT32_I8)
4250     {
4251         VAROR(UI1,255,I8,-1,I8,-1);
4252         VAROR(UI1,255,I8,0,I8,255);
4253         VAROR(UI1,0,I8,0,I8,0);
4254         VAROR(UI1,255,UI8,0,I4,255);
4255         VAROR(UI1,0,UI8,0,I4,0);
4256     }
4257     VAROR(UI1,255,INT,-1,I4,-1);
4258     VAROR(UI1,255,INT,0,I4,255);
4259     VAROR(UI1,0,INT,0,I4,0);
4260     VAROR(UI1,255,UINT,0xffffffff,I4,-1);
4261     VAROR(UI1,255,UINT,0,I4,255);
4262     VAROR(UI1,0,UINT,0,I4,0);
4263     rbstr = SysAllocString(szFalse);
4264     VAROR(UI1,0,BSTR,rbstr,I2,0);
4265     VAROR(UI1,255,BSTR,rbstr,I2,255);
4266     rbstr = SysAllocString(szTrue);
4267     VAROR(UI1,0,BSTR,rbstr,I2,-1);
4268     VAROR(UI1,255,BSTR,rbstr,I2,-1);
4269     VARORCY(UI1,255,10000,I4,255);
4270     VARORCY(UI1,255,0,I4,255);
4271     VARORCY(UI1,0,0,I4,0);
4272
4273     VAROR(I2,-1,I2,-1,I2,-1);
4274     VAROR(I2,-1,I2,0,I2,-1);
4275     VAROR(I2,0,I2,0,I2,0);
4276     VAROR(I2,-1,UI2,65535,I4,-1);
4277     VAROR(I2,-1,UI2,0,I4,-1);
4278     VAROR(I2,0,UI2,0,I4,0);
4279     VAROR(I2,-1,I4,-1,I4,-1);
4280     VAROR(I2,-1,I4,0,I4,-1);
4281     VAROR(I2,0,I4,0,I4,0);
4282     VAROR(I2,-1,UI4,0xffffffff,I4,-1);
4283     VAROR(I2,-1,UI4,0,I4,-1);
4284     VAROR(I2,0,UI4,0,I4,0);
4285     VAROR(I2,-1,R4,-1,I4,-1);
4286     VAROR(I2,-1,R4,0,I4,-1);
4287     VAROR(I2,0,R4,0,I4,0);
4288     VAROR(I2,-1,R8,-1,I4,-1);
4289     VAROR(I2,-1,R8,0,I4,-1);
4290     VAROR(I2,0,R8,0,I4,0);
4291     VAROR(I2,-1,DATE,-1,I4,-1);
4292     VAROR(I2,-1,DATE,0,I4,-1);
4293     VAROR(I2,0,DATE,0,I4,0);
4294     if (HAVE_OLEAUT32_I8)
4295     {
4296         VAROR(I2,-1,I8,-1,I8,-1);
4297         VAROR(I2,-1,I8,0,I8,-1);
4298         VAROR(I2,0,I8,0,I8,0);
4299         VAROR(I2,-1,UI8,0,I4,-1);
4300         VAROR(I2,0,UI8,0,I4,0);
4301     }
4302     VAROR(I2,-1,INT,-1,I4,-1);
4303     VAROR(I2,-1,INT,0,I4,-1);
4304     VAROR(I2,0,INT,0,I4,0);
4305     VAROR(I2,-1,UINT,0xffffffff,I4,-1);
4306     VAROR(I2,-1,UINT,0,I4,-1);
4307     VAROR(I2,0,UINT,0,I4,0);
4308     rbstr = SysAllocString(szFalse);
4309     VAROR(I2,0,BSTR,rbstr,I2,0);
4310     VAROR(I2,-1,BSTR,rbstr,I2,-1);
4311     rbstr = SysAllocString(szTrue);
4312     VAROR(I2,0,BSTR,rbstr,I2,-1);
4313     VAROR(I2,-1,BSTR,rbstr,I2,-1);
4314     VARORCY(I2,-1,10000,I4,-1);
4315     VARORCY(I2,-1,0,I4,-1);
4316     VARORCY(I2,0,0,I4,0);
4317
4318     VAROR(UI2,65535,UI2,65535,I4,65535);
4319     VAROR(UI2,65535,UI2,0,I4,65535);
4320     VAROR(UI2,0,UI2,0,I4,0);
4321     VAROR(UI2,65535,I4,-1,I4,-1);
4322     VAROR(UI2,65535,I4,0,I4,65535);
4323     VAROR(UI2,0,I4,0,I4,0);
4324     VAROR(UI2,65535,UI4,0xffffffff,I4,-1);
4325     VAROR(UI2,65535,UI4,0,I4,65535);
4326     VAROR(UI2,0,UI4,0,I4,0);
4327     VAROR(UI2,65535,R4,-1,I4,-1);
4328     VAROR(UI2,65535,R4,0,I4,65535);
4329     VAROR(UI2,0,R4,0,I4,0);
4330     VAROR(UI2,65535,R8,-1,I4,-1);
4331     VAROR(UI2,65535,R8,0,I4,65535);
4332     VAROR(UI2,0,R8,0,I4,0);
4333     VAROR(UI2,65535,DATE,-1,I4,-1);
4334     VAROR(UI2,65535,DATE,0,I4,65535);
4335     VAROR(UI2,0,DATE,0,I4,0);
4336     if (HAVE_OLEAUT32_I8)
4337     {
4338         VAROR(UI2,65535,I8,-1,I8,-1);
4339         VAROR(UI2,65535,I8,0,I8,65535);
4340         VAROR(UI2,0,I8,0,I8,0);
4341         VAROR(UI2,65535,UI8,0,I4,65535);
4342         VAROR(UI2,0,UI8,0,I4,0);
4343     }
4344     VAROR(UI2,65535,INT,-1,I4,-1);
4345     VAROR(UI2,65535,INT,0,I4,65535);
4346     VAROR(UI2,0,INT,0,I4,0);
4347     VAROR(UI2,65535,UINT,0xffffffff,I4,-1);
4348     VAROR(UI2,65535,UINT,0,I4,65535);
4349     VAROR(UI2,0,UINT,0,I4,0);
4350     rbstr = SysAllocString(szFalse);
4351     VAROR(UI2,0,BSTR,rbstr,I4,0);
4352     VAROR(UI2,65535,BSTR,rbstr,I4,65535);
4353     rbstr = SysAllocString(szTrue);
4354     VAROR(UI2,0,BSTR,rbstr,I4,-1);
4355     VAROR(UI2,65535,BSTR,rbstr,I4,-1);
4356     VARORCY(UI2,65535,10000,I4,65535);
4357     VARORCY(UI2,65535,0,I4,65535);
4358     VARORCY(UI2,0,0,I4,0);
4359
4360     VAROR(I4,-1,I4,-1,I4,-1);
4361     VAROR(I4,-1,I4,0,I4,-1);
4362     VAROR(I4,0,I4,0,I4,0);
4363     VAROR(I4,-1,UI4,0xffffffff,I4,-1);
4364     VAROR(I4,-1,UI4,0,I4,-1);
4365     VAROR(I4,0,UI4,0,I4,0);
4366     VAROR(I4,-1,R4,-1,I4,-1);
4367     VAROR(I4,-1,R4,0,I4,-1);
4368     VAROR(I4,0,R4,0,I4,0);
4369     VAROR(I4,-1,R8,-1,I4,-1);
4370     VAROR(I4,-1,R8,0,I4,-1);
4371     VAROR(I4,0,R8,0,I4,0);
4372     VAROR(I4,-1,DATE,-1,I4,-1);
4373     VAROR(I4,-1,DATE,0,I4,-1);
4374     VAROR(I4,0,DATE,0,I4,0);
4375     if (HAVE_OLEAUT32_I8)
4376     {
4377         VAROR(I4,-1,I8,-1,I8,-1);
4378         VAROR(I4,-1,I8,0,I8,-1);
4379         VAROR(I4,0,I8,0,I8,0);
4380         VAROR(I4,-1,UI8,0,I4,-1);
4381         VAROR(I4,0,UI8,0,I4,0);
4382     }
4383     VAROR(I4,-1,INT,-1,I4,-1);
4384     VAROR(I4,-1,INT,0,I4,-1);
4385     VAROR(I4,0,INT,0,I4,0);
4386     VAROR(I4,-1,UINT,0xffffffff,I4,-1);
4387     VAROR(I4,-1,UINT,0,I4,-1);
4388     VAROR(I4,0,UINT,0,I4,0);
4389     rbstr = SysAllocString(szFalse);
4390     VAROR(I4,0,BSTR,rbstr,I4,0);
4391     VAROR(I4,-1,BSTR,rbstr,I4,-1);
4392     rbstr = SysAllocString(szTrue);
4393     VAROR(I4,0,BSTR,rbstr,I4,-1);
4394     VAROR(I4,-1,BSTR,rbstr,I4,-1);
4395     VARORCY(I4,-1,10000,I4,-1);
4396     VARORCY(I4,-1,0,I4,-1);
4397     VARORCY(I4,0,0,I4,0);
4398
4399     VAROR(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
4400     VAROR(UI4,0xffffffff,UI4,0,I4,-1);
4401     VAROR(UI4,0,UI4,0,I4,0);
4402     VAROR(UI4,0xffffffff,R4,-1,I4,-1);
4403     VAROR(UI4,0xffffffff,R4,0,I4,-1);
4404     VAROR(UI4,0,R4,0,I4,0);
4405     VAROR(UI4,0xffffffff,R8,-1,I4,-1);
4406     VAROR(UI4,0xffffffff,R8,0,I4,-1);
4407     VAROR(UI4,0,R8,0,I4,0);
4408     VAROR(UI4,0xffffffff,DATE,-1,I4,-1);
4409     VAROR(UI4,0xffffffff,DATE,0,I4,-1);
4410     VAROR(UI4,0,DATE,0,I4,0);
4411     if (HAVE_OLEAUT32_I8)
4412     {
4413         VAROR(UI4,0xffffffff,I8,-1,I8,-1);
4414         VAROR(UI4,0xffffffff,I8,0,I8,0xffffffff);
4415         VAROR(UI4,0,I8,0,I8,0);
4416         VAROR(UI4,0xffffffff,UI8,0,I4,-1);
4417         VAROR(UI4,0,UI8,0,I4,0);
4418     }
4419     VAROR(UI4,0xffffffff,INT,-1,I4,-1);
4420     VAROR(UI4,0xffffffff,INT,0,I4,-1);
4421     VAROR(UI4,0,INT,0,I4,0);
4422     VAROR(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
4423     VAROR(UI4,0xffffffff,UINT,0,I4,-1);
4424     VAROR(UI4,0,UINT,0,I4,0);
4425     rbstr = SysAllocString(szFalse);
4426     VAROR(UI4,0,BSTR,rbstr,I4,0);
4427     VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
4428     rbstr = SysAllocString(szTrue);
4429     VAROR(UI4,0,BSTR,rbstr,I4,-1);
4430     VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
4431     VARORCY(UI4,0xffffffff,10000,I4,-1);
4432     VARORCY(UI4,0xffffffff,0,I4,-1);
4433     VARORCY(UI4,0,0,I4,0);
4434
4435     VAROR(R4,-1,R4,-1,I4,-1);
4436     VAROR(R4,-1,R4,0,I4,-1);
4437     VAROR(R4,0,R4,0,I4,0);
4438     VAROR(R4,-1,R8,-1,I4,-1);
4439     VAROR(R4,-1,R8,0,I4,-1);
4440     VAROR(R4,0,R8,0,I4,0);
4441     VAROR(R4,-1,DATE,-1,I4,-1);
4442     VAROR(R4,-1,DATE,0,I4,-1);
4443     VAROR(R4,0,DATE,0,I4,0);
4444     if (HAVE_OLEAUT32_I8)
4445     {
4446         VAROR(R4,-1,I8,-1,I8,-1);
4447         VAROR(R4,-1,I8,0,I8,-1);
4448         VAROR(R4,0,I8,0,I8,0);
4449         VAROR(R4,-1,UI8,0,I4,-1);
4450         VAROR(R4,0,UI8,0,I4,0);
4451     }
4452     VAROR(R4,-1,INT,-1,I4,-1);
4453     VAROR(R4,-1,INT,0,I4,-1);
4454     VAROR(R4,0,INT,0,I4,0);
4455     VAROR(R4,-1,UINT,0xffffffff,I4,-1);
4456     VAROR(R4,-1,UINT,0,I4,-1);
4457     VAROR(R4,0,UINT,0,I4,0);
4458     rbstr = SysAllocString(szFalse);
4459     VAROR(R4,0,BSTR,rbstr,I4,0);
4460     VAROR(R4,-1,BSTR,rbstr,I4,-1);
4461     rbstr = SysAllocString(szTrue);
4462     VAROR(R4,0,BSTR,rbstr,I4,-1);
4463     VAROR(R4,-1,BSTR,rbstr,I4,-1);
4464     VARORCY(R4,-1,10000,I4,-1);
4465     VARORCY(R4,-1,0,I4,-1);
4466     VARORCY(R4,0,0,I4,0);
4467
4468     VAROR(R8,-1,R8,-1,I4,-1);
4469     VAROR(R8,-1,R8,0,I4,-1);
4470     VAROR(R8,0,R8,0,I4,0);
4471     VAROR(R8,-1,DATE,-1,I4,-1);
4472     VAROR(R8,-1,DATE,0,I4,-1);
4473     VAROR(R8,0,DATE,0,I4,0);
4474     if (HAVE_OLEAUT32_I8)
4475     {
4476         VAROR(R8,-1,I8,-1,I8,-1);
4477         VAROR(R8,-1,I8,0,I8,-1);
4478         VAROR(R8,0,I8,0,I8,0);
4479         VAROR(R8,-1,UI8,0,I4,-1);
4480         VAROR(R8,0,UI8,0,I4,0);
4481     }
4482     VAROR(R8,-1,INT,-1,I4,-1);
4483     VAROR(R8,-1,INT,0,I4,-1);
4484     VAROR(R8,0,INT,0,I4,0);
4485     VAROR(R8,-1,UINT,0xffffffff,I4,-1);
4486     VAROR(R8,-1,UINT,0,I4,-1);
4487     VAROR(R8,0,UINT,0,I4,0);
4488     rbstr = SysAllocString(szFalse);
4489     VAROR(R8,0,BSTR,rbstr,I4,0);
4490     VAROR(R8,-1,BSTR,rbstr,I4,-1);
4491     rbstr = SysAllocString(szTrue);
4492     VAROR(R8,0,BSTR,rbstr,I4,-1);
4493     VAROR(R8,-1,BSTR,rbstr,I4,-1);
4494     VARORCY(R8,-1,10000,I4,-1);
4495     VARORCY(R8,-1,0,I4,-1);
4496     VARORCY(R8,0,0,I4,0);
4497
4498     VAROR(DATE,-1,DATE,-1,I4,-1);
4499     VAROR(DATE,-1,DATE,0,I4,-1);
4500     VAROR(DATE,0,DATE,0,I4,0);
4501     if (HAVE_OLEAUT32_I8)
4502     {
4503         VAROR(DATE,-1,I8,-1,I8,-1);
4504         VAROR(DATE,-1,I8,0,I8,-1);
4505         VAROR(DATE,0,I8,0,I8,0);
4506         VAROR(DATE,-1,UI8,0,I4,-1);
4507         VAROR(DATE,0,UI8,0,I4,0);
4508     }
4509     VAROR(DATE,-1,INT,-1,I4,-1);
4510     VAROR(DATE,-1,INT,0,I4,-1);
4511     VAROR(DATE,0,INT,0,I4,0);
4512     VAROR(DATE,-1,UINT,0xffffffff,I4,-1);
4513     VAROR(DATE,-1,UINT,0,I4,-1);
4514     VAROR(DATE,0,UINT,0,I4,0);
4515     rbstr = SysAllocString(szFalse);
4516     VAROR(DATE,0,BSTR,rbstr,I4,0);
4517     VAROR(DATE,-1,BSTR,rbstr,I4,-1);
4518     rbstr = SysAllocString(szTrue);
4519     VAROR(DATE,0,BSTR,rbstr,I4,-1);
4520     VAROR(DATE,-1,BSTR,rbstr,I4,-1);
4521     VARORCY(DATE,-1,10000,I4,-1);
4522     VARORCY(DATE,-1,0,I4,-1);
4523     VARORCY(DATE,0,0,I4,0);
4524
4525     if (HAVE_OLEAUT32_I8)
4526     {
4527         VAROR(I8,-1,I8,-1,I8,-1);
4528         VAROR(I8,-1,I8,0,I8,-1);
4529         VAROR(I8,0,I8,0,I8,0);
4530         VAROR(I8,-1,UI8,0,I8,-1);
4531         VAROR(I8,0,UI8,0,I8,0);
4532         /* These overflow under native and Wine
4533         VAROR(I8,-1,INT,-1,I4,-1);
4534         VAROR(I8,-1,INT,0,I4,-1);
4535         VAROR(I8,0,INT,0,I4,0); */
4536         VAROR(I8,-1,UINT,0xffffffff,I8,-1);
4537         VAROR(I8,-1,UINT,0,I8,-1);
4538         VAROR(I8,0,UINT,0,I8,0);
4539         rbstr = SysAllocString(szFalse);
4540         VAROR(I8,0,BSTR,rbstr,I8,0);
4541         VAROR(I8,-1,BSTR,rbstr,I8,-1);
4542         rbstr = SysAllocString(szTrue);
4543         VAROR(I8,0,BSTR,rbstr,I8,-1);
4544         VAROR(I8,-1,BSTR,rbstr,I8,-1);
4545         VARORCY(I8,-1,10000,I8,-1);
4546         VARORCY(I8,-1,0,I8,-1);
4547         VARORCY(I8,0,0,I8,0);
4548
4549         VAROR(UI8,0xffff,UI8,0xffff,I4,0xffff);
4550         VAROR(UI8,0xffff,UI8,0,I4,0xffff);
4551         VAROR(UI8,0,UI8,0,I4,0);
4552         VAROR(UI8,0xffff,INT,-1,I4,-1);
4553         VAROR(UI8,0xffff,INT,0,I4,0xffff);
4554         VAROR(UI8,0,INT,0,I4,0);
4555         VAROR(UI8,0xffff,UINT,0xffff,I4,0xffff);
4556         VAROR(UI8,0xffff,UINT,0,I4,0xffff);
4557         VAROR(UI8,0,UINT,0,I4,0);
4558         rbstr = SysAllocString(szFalse);
4559         VAROR(UI8,0,BSTR,rbstr,I4,0);
4560         VAROR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
4561         rbstr = SysAllocString(szTrue);
4562         VAROR(UI8,0,BSTR,rbstr,I4,-1);
4563         VAROR(UI8,0xffff,BSTR,rbstr,I4,-1);
4564         VARORCY(UI8,0xffff,10000,I4,0xffff);
4565         VARORCY(UI8,0xffff,0,I4,0xffff);
4566         VARORCY(UI8,0,0,I4,0);
4567     }
4568
4569     VAROR(INT,-1,INT,-1,I4,-1);
4570     VAROR(INT,-1,INT,0,I4,-1);
4571     VAROR(INT,0,INT,0,I4,0);
4572     VAROR(INT,-1,UINT,0xffff,I4,-1);
4573     VAROR(INT,-1,UINT,0,I4,-1);
4574     VAROR(INT,0,UINT,0,I4,0);
4575     rbstr = SysAllocString(szFalse);
4576     VAROR(INT,0,BSTR,rbstr,I4,0);
4577     VAROR(INT,-1,BSTR,rbstr,I4,-1);
4578     rbstr = SysAllocString(szTrue);
4579     VAROR(INT,0,BSTR,rbstr,I4,-1);
4580     VAROR(INT,-1,BSTR,rbstr,I4,-1);
4581     VARORCY(INT,-1,10000,I4,-1);
4582     VARORCY(INT,-1,0,I4,-1);
4583     VARORCY(INT,0,0,I4,0);
4584
4585     VAROR(UINT,0xffff,UINT,0xffff,I4,0xffff);
4586     VAROR(UINT,0xffff,UINT,0,I4,0xffff);
4587     VAROR(UINT,0,UINT,0,I4,0);
4588     rbstr = SysAllocString(szFalse);
4589     VAROR(UINT,0,BSTR,rbstr,I4,0);
4590     VAROR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
4591     rbstr = SysAllocString(szTrue);
4592     VAROR(UINT,0,BSTR,rbstr,I4,-1);
4593     VAROR(UINT,0xffff,BSTR,rbstr,I4,-1);
4594     VARORCY(UINT,0xffff,10000,I4,0xffff);
4595     VARORCY(UINT,0xffff,0,I4,0xffff);
4596     VARORCY(UINT,0,0,I4,0);
4597
4598     lbstr = SysAllocString(szFalse);
4599     rbstr = SysAllocString(szFalse);
4600     VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
4601     rbstr = SysAllocString(szTrue);
4602     VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
4603     lbstr = SysAllocString(szTrue);
4604     VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
4605     VARORCY(BSTR,lbstr,10000,I4,-1);
4606     lbstr = SysAllocString(szFalse);
4607     VARORCY(BSTR,lbstr,10000,I4,1);
4608 }
4609
4610 static HRESULT (WINAPI *pVarEqv)(LPVARIANT,LPVARIANT,LPVARIANT);
4611
4612 #define VAREQV(vt1,val1,vt2,val2,rvt,rval)           \
4613     V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
4614     V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4615     V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
4616     test_var_call2( __LINE__, pVarEqv, &left, &right, &exp )
4617
4618 static void test_VarEqv(void)
4619 {
4620     VARIANT left, right, exp, result;
4621     VARTYPE i;
4622     HRESULT hres;
4623
4624     CHECKPTR(VarEqv);
4625
4626     /* Test all possible flag/vt combinations & the resulting vt type */
4627     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4628     {
4629         VARTYPE leftvt, rightvt, resvt;
4630
4631         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4632         {
4633             SKIPTESTS(leftvt);
4634
4635             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4636             {
4637                 BOOL bFail = FALSE;
4638
4639                 SKIPTESTS(rightvt);
4640
4641                 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
4642                     leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
4643                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4644                     continue;
4645
4646                 memset(&left, 0, sizeof(left));
4647                 memset(&right, 0, sizeof(right));
4648                 V_VT(&left) = leftvt | ExtraFlags[i];
4649                 V_VT(&right) = rightvt | ExtraFlags[i];
4650                 V_VT(&result) = VT_EMPTY;
4651                 resvt = VT_I4;
4652
4653                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4654                     !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4655                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4656                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
4657                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
4658                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4659                     leftvt == VT_ERROR || rightvt == VT_ERROR)
4660                 {
4661                     bFail = TRUE;
4662                 }
4663                 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
4664                 {
4665                     if (leftvt == rightvt ||
4666                         leftvt == VT_I2 || rightvt == VT_I2 ||
4667                         leftvt == VT_UI1 || rightvt == VT_UI1 ||
4668                         leftvt == VT_BOOL || rightvt == VT_BOOL)
4669                         resvt = VT_I2;
4670                     else if (leftvt == VT_NULL || rightvt == VT_NULL)
4671                         resvt = VT_NULL;
4672                     else if (leftvt == VT_I8 || rightvt == VT_I8)
4673                         resvt = VT_I8;
4674                 }
4675                 else if (leftvt == VT_NULL || rightvt == VT_NULL)
4676                 {
4677                     resvt = VT_NULL;
4678                 }
4679                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
4680                 {
4681                     if (leftvt == rightvt)
4682                         resvt = VT_UI1;
4683                     else if (leftvt == rightvt ||
4684                         leftvt == VT_I2 || rightvt == VT_I2 ||
4685                         leftvt == VT_BOOL || rightvt == VT_BOOL)
4686                     {
4687                         resvt = VT_I2;
4688                     }
4689                     else if (leftvt == VT_I8 || rightvt == VT_I8)
4690                         resvt = VT_I8;
4691                 }
4692                 else if (leftvt == VT_I2 || rightvt == VT_I2)
4693                 {
4694                     if (leftvt == rightvt ||
4695                         leftvt == VT_BOOL || rightvt == VT_BOOL)
4696                         resvt = VT_I2;
4697                     else if (leftvt == VT_I8 || rightvt == VT_I8)
4698                         resvt = VT_I8;
4699                 }
4700                 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
4701                 {
4702                     resvt = VT_BOOL;
4703                 }
4704                 else if (leftvt == VT_I8 || rightvt == VT_I8)
4705                 {
4706                     if (leftvt == VT_INT || rightvt == VT_INT)
4707                         bFail = TRUE;
4708                     else
4709                         resvt = VT_I8;
4710                 }
4711                 hres = pVarEqv(&left, &right, &result);
4712                 if (bFail)
4713                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4714                        "VarEqv: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4715                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4716                        V_VT(&result));
4717                 else
4718                     ok(hres == S_OK && V_VT(&result) == resvt,
4719                        "VarEqv: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4720                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4721                        V_VT(&result));
4722             }
4723         }
4724     }
4725
4726     /* Test returned values */
4727     VAREQV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4728     VAREQV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
4729     VAREQV(BOOL,TRUE,BOOL,TRUE,BOOL,VARIANT_TRUE);
4730     VAREQV(BOOL,FALSE,BOOL,FALSE,BOOL,VARIANT_TRUE);
4731     VAREQV(BOOL,TRUE,BOOL,FALSE,BOOL,-2);
4732     VAREQV(BOOL,FALSE,BOOL,TRUE,BOOL,-2);
4733     VAREQV(BOOL,6,BOOL,7,BOOL,-2);
4734     VAREQV(BOOL,6,BOOL,6,BOOL,VARIANT_TRUE);
4735     VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE,I2,VARIANT_TRUE);
4736     VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_FALSE,I2,VARIANT_FALSE);
4737     VAREQV(BOOL,6,I2,7,I2,-2);
4738     VAREQV(UI1,1,UI1,1,UI1,255);
4739     VAREQV(UI1,1,UI1,0,UI1,254);
4740     VAREQV(UI1,0,UI1,1,UI1,254);
4741     if (HAVE_OLEAUT32_I8)
4742     {
4743         VAREQV(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,-1);
4744         VAREQV(UI4,5,I8,19,I8,-23);
4745         VAREQV(UI4,VARIANT_FALSE,UI8,VARIANT_FALSE,I4,-1);
4746     }
4747 }
4748
4749 static HRESULT (WINAPI *pVarMul)(LPVARIANT,LPVARIANT,LPVARIANT);
4750
4751 #define VARMUL(vt1,val1,vt2,val2,rvt,rval)               \
4752         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
4753         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4754         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
4755         test_var_call2( __LINE__, pVarMul, &left, &right, &exp )
4756
4757 static void test_VarMul(void)
4758 {
4759     static const WCHAR sz12[] = {'1','2','\0'};
4760     VARIANT left, right, exp, result, cy, dec;
4761     VARTYPE i;
4762     BSTR lbstr, rbstr;
4763     HRESULT hres;
4764     double r;
4765
4766     CHECKPTR(VarMul);
4767
4768     lbstr = SysAllocString(sz12);
4769     rbstr = SysAllocString(sz12);
4770
4771     /* Test all possible flag/vt combinations & the resulting vt type */
4772     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4773     {
4774         VARTYPE leftvt, rightvt, resvt;
4775
4776         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4777         {
4778
4779             SKIPTESTS(leftvt);
4780
4781             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4782             {
4783                 BOOL bFail = FALSE;
4784
4785                 SKIPTESTS(rightvt);
4786
4787                 if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
4788                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4789                     continue;
4790
4791                 memset(&left, 0, sizeof(left));
4792                 memset(&right, 0, sizeof(right));
4793                 V_VT(&left) = leftvt | ExtraFlags[i];
4794                 if (leftvt == VT_BSTR)
4795                     V_BSTR(&left) = lbstr;
4796                 V_VT(&right) = rightvt | ExtraFlags[i];
4797                 if (rightvt == VT_BSTR)
4798                     V_BSTR(&right) = rbstr;
4799                 V_VT(&result) = VT_EMPTY;
4800                 resvt = VT_UNKNOWN;
4801
4802                 /* Don't ask me why but native VarMul cannot handle:
4803                    VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
4804                    Tested with DCOM98, Win2k, WinXP */
4805                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4806                     !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4807                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4808                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
4809                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
4810                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4811                     leftvt == VT_ERROR || rightvt == VT_ERROR ||
4812                     leftvt == VT_I1 || rightvt == VT_I1 ||
4813                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
4814                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
4815                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
4816                     leftvt == VT_INT || rightvt == VT_INT ||
4817                     leftvt == VT_UINT || rightvt == VT_UINT) {
4818                     bFail = TRUE;
4819                 }
4820
4821                 if (leftvt == VT_NULL || rightvt == VT_NULL)
4822                     resvt = VT_NULL;
4823                 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
4824                     resvt = VT_DECIMAL;
4825                 else if (leftvt == VT_R8 || rightvt == VT_R8 ||
4826                          leftvt == VT_BSTR || rightvt == VT_BSTR ||
4827                          leftvt == VT_DATE || rightvt == VT_DATE)
4828                     resvt = VT_R8;
4829                 else if (leftvt == VT_R4 || rightvt == VT_R4) {
4830                     if (leftvt == VT_I4 || rightvt == VT_I4 ||
4831                         leftvt == VT_I8 || rightvt == VT_I8 ||
4832                         leftvt == VT_CY || rightvt == VT_CY)
4833                         resvt = VT_R8;
4834                     else
4835                         resvt = VT_R4;
4836                 } else if (leftvt == VT_CY || rightvt == VT_CY)
4837                     resvt = VT_CY;
4838                 else if (leftvt == VT_I8 || rightvt == VT_I8)
4839                     resvt = VT_I8;
4840                 else if (leftvt == VT_I4 || rightvt == VT_I4)
4841                     resvt = VT_I4;
4842                 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
4843                          leftvt == VT_BOOL || rightvt == VT_BOOL ||
4844                          (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
4845                     resvt = VT_I2;
4846                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
4847                     resvt = VT_UI1;
4848
4849                 hres = pVarMul(&left, &right, &result);
4850                 if (bFail) {
4851                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4852                        "VarMul: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4853                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4854                        V_VT(&result));
4855                 } else {
4856                     ok(hres == S_OK && V_VT(&result) == resvt,
4857                        "VarMul: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4858                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4859                        V_VT(&result));
4860                 }
4861             }
4862         }
4863     }
4864
4865     /* Test returned values */
4866     VARMUL(I4,4,I4,2,I4,8);
4867     VARMUL(I2,4,I2,2,I2,8);
4868     VARMUL(I2,-13,I4,5,I4,-65);
4869     VARMUL(I4,-13,I4,5,I4,-65);
4870     VARMUL(I2,7,R4,0.5f,R4,3.5f);
4871     VARMUL(R4,0.5f,I4,5,R8,2.5);
4872     VARMUL(R8,7.1,BOOL,0,R8,0);
4873     VARMUL(BSTR,lbstr,I2,4,R8,48);
4874     VARMUL(BSTR,lbstr,BOOL,1,R8,12);
4875     VARMUL(BSTR,lbstr,R4,0.1f,R8,1.2);
4876     VARMUL(BSTR,lbstr,BSTR,rbstr,R8,144);
4877     VARMUL(R4,0.2f,BSTR,rbstr,R8,2.4);
4878     VARMUL(DATE,2.25,I4,7,R8,15.75);
4879
4880     VARMUL(UI1, UI1_MAX, UI1, UI1_MAX, I4, UI1_MAX * UI1_MAX);
4881     VARMUL(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX * I2_MAX);
4882     VARMUL(I2, I2_MAX, I2, I2_MIN, I4, I2_MAX * I2_MIN);
4883     VARMUL(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN * I2_MIN);
4884     VARMUL(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX * I4_MAX);
4885     VARMUL(I4, I4_MAX, I4, I4_MIN, R8, (double)I4_MAX * I4_MIN);
4886     VARMUL(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN * I4_MIN);
4887     VARMUL(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX * R4_MAX);
4888     VARMUL(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX * R4_MIN);
4889     VARMUL(R4, R4_MIN, R4, R4_MIN, R4, R4_MIN * R4_MIN);
4890     VARMUL(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX * R8_MIN);
4891     VARMUL(R8, R8_MIN, R8, R8_MIN, R8, R8_MIN * R8_MIN);
4892
4893     /* Manuly test some VT_CY and VT_DECIMAL variants */
4894     V_VT(&cy) = VT_CY;
4895     hres = VarCyFromI4(4711, &V_CY(&cy));
4896     ok(hres == S_OK, "VarCyFromI4 failed!\n");
4897     V_VT(&dec) = VT_DECIMAL;
4898     hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
4899     ok(hres == S_OK, "VarDecFromR4 failed!\n");
4900     memset(&left, 0, sizeof(left));
4901     memset(&right, 0, sizeof(right));
4902     V_VT(&left) = VT_I4;
4903     V_I4(&left) = -11;
4904     V_VT(&right) = VT_UI1;
4905     V_UI1(&right) = 9;
4906
4907     hres = VarMul(&cy, &right, &result);
4908     ok(hres == S_OK && V_VT(&result) == VT_CY, "VarMul: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
4909     hres = VarR8FromCy(V_CY(&result), &r);
4910     ok(hres == S_OK && EQ_DOUBLE(r, 42399), "VarMul: CY value %f, expected %f\n", r, (double)42399);
4911
4912     hres = VarMul(&left, &dec, &result);
4913     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarMul: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
4914     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
4915     ok(hres == S_OK && EQ_DOUBLE(r, 46.2), "VarMul: DECIMAL value %f, expected %f\n", r, (double)46.2);
4916
4917     SysFreeString(lbstr);
4918     SysFreeString(rbstr);
4919 }
4920
4921 static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT);
4922
4923 #define VARADD(vt1,val1,vt2,val2,rvt,rval)               \
4924         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
4925         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4926         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
4927         test_var_call2( __LINE__, pVarAdd, &left, &right, &exp )
4928
4929 static void test_VarAdd(void)
4930 {
4931     static const WCHAR sz12[] = {'1','2','\0'};
4932     VARIANT left, right, exp, result, cy, dec;
4933     VARTYPE i;
4934     BSTR lbstr, rbstr;
4935     HRESULT hres;
4936     double r;
4937
4938     CHECKPTR(VarAdd);
4939
4940     lbstr = SysAllocString(sz12);
4941     rbstr = SysAllocString(sz12);
4942
4943     /* Test all possible flag/vt combinations & the resulting vt type */
4944     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4945     {
4946         VARTYPE leftvt, rightvt, resvt;
4947
4948         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4949         {
4950
4951             SKIPTESTS(leftvt);
4952
4953             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4954             {
4955                 BOOL bFail = FALSE;
4956
4957                 SKIPTESTS(rightvt);
4958
4959                 if (leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4960                     continue;
4961
4962                 memset(&left, 0, sizeof(left));
4963                 memset(&right, 0, sizeof(right));
4964                 V_VT(&left) = leftvt | ExtraFlags[i];
4965                 if (leftvt == VT_BSTR)
4966                     V_BSTR(&left) = lbstr;
4967                 V_VT(&right) = rightvt | ExtraFlags[i];
4968                 if (rightvt == VT_BSTR)
4969                     V_BSTR(&right) = rbstr;
4970                 V_VT(&result) = VT_EMPTY;
4971                 resvt = VT_ERROR;
4972
4973                 /* Don't ask me why but native VarAdd cannot handle:
4974                    VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
4975                    Tested with DCOM98, Win2k, WinXP */
4976                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4977                     !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4978                     !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4979                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
4980                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
4981                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4982                     leftvt == VT_ERROR || rightvt == VT_ERROR ||
4983                     leftvt == VT_I1 || rightvt == VT_I1 ||
4984                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
4985                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
4986                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
4987                     leftvt == VT_INT || rightvt == VT_INT ||
4988                     leftvt == VT_UINT || rightvt == VT_UINT) {
4989                     bFail = TRUE;
4990                 }
4991
4992                 if (leftvt == VT_NULL || rightvt == VT_NULL)
4993                     resvt = VT_NULL;
4994                 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH)
4995                     bFail = TRUE;
4996                 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
4997                     resvt = VT_DECIMAL;
4998                 else if (leftvt == VT_DATE || rightvt == VT_DATE)
4999                     resvt = VT_DATE;
5000                 else if (leftvt == VT_CY || rightvt == VT_CY)
5001                     resvt = VT_CY;
5002                 else if (leftvt == VT_R8 || rightvt == VT_R8)
5003                     resvt = VT_R8;
5004                 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
5005                     if ((leftvt == VT_BSTR && rightvt == VT_BSTR) ||
5006                          leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5007                         resvt = VT_BSTR;
5008                     else
5009                         resvt = VT_R8;
5010                 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
5011                     if (leftvt == VT_I4 || rightvt == VT_I4 ||
5012                         leftvt == VT_I8 || rightvt == VT_I8)
5013                         resvt = VT_R8;
5014                     else
5015                         resvt = VT_R4;
5016                 }
5017                 else if (leftvt == VT_I8 || rightvt == VT_I8)
5018                     resvt = VT_I8;
5019                 else if (leftvt == VT_I4 || rightvt == VT_I4)
5020                     resvt = VT_I4;
5021                 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
5022                          leftvt == VT_BOOL || rightvt == VT_BOOL ||
5023                          (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
5024                     resvt = VT_I2;
5025                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
5026                     resvt = VT_UI1;
5027
5028                 hres = pVarAdd(&left, &right, &result);
5029                 if (bFail) {
5030                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
5031                        "VarAdd: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
5032                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
5033                        V_VT(&result));
5034                 } else {
5035                     ok(hres == S_OK && V_VT(&result) == resvt,
5036                        "VarAdd: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
5037                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
5038                        V_VT(&result));
5039                 }
5040             }
5041         }
5042     }
5043
5044     /* Test returned values */
5045     VARADD(I4,4,I4,2,I4,6);
5046     VARADD(I2,4,I2,2,I2,6);
5047     VARADD(I2,-13,I4,5,I4,-8);
5048     VARADD(I4,-13,I4,5,I4,-8);
5049     VARADD(I2,7,R4,0.5f,R4,7.5f);
5050     VARADD(R4,0.5f,I4,5,R8,5.5);
5051     VARADD(R8,7.1,BOOL,0,R8,7.1);
5052     VARADD(BSTR,lbstr,I2,4,R8,16);
5053     VARADD(BSTR,lbstr,BOOL,1,R8,13);
5054     VARADD(BSTR,lbstr,R4,0.1f,R8,12.1);
5055     VARADD(R4,0.2f,BSTR,rbstr,R8,12.2);
5056     VARADD(DATE,2.25,I4,7,DATE,9.25);
5057     VARADD(DATE,1.25,R4,-1.7f,DATE,-0.45);
5058
5059     VARADD(UI1, UI1_MAX, UI1, UI1_MAX, I2, UI1_MAX + UI1_MAX);
5060     VARADD(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX + I2_MAX);
5061     VARADD(I2, I2_MAX, I2, I2_MIN, I2, I2_MAX + I2_MIN);
5062     VARADD(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN + I2_MIN);
5063     VARADD(I4, I4_MAX, I4, I4_MIN, I4, I4_MAX + I4_MIN);
5064     VARADD(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX + I4_MAX);
5065     VARADD(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN + I4_MIN);
5066     VARADD(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX + R4_MAX);
5067     VARADD(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX + R4_MIN);
5068     VARADD(R4, R4_MIN, R4, R4_MIN, R4, R4_MIN + R4_MIN);
5069     VARADD(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX + R8_MIN);
5070     VARADD(R8, R8_MIN, R8, R8_MIN, R8, R8_MIN + R8_MIN);
5071
5072     /* Manually test BSTR + BSTR */
5073     V_VT(&left) = VT_BSTR;
5074     V_BSTR(&left) = lbstr;
5075     V_VT(&right) = VT_BSTR;
5076     V_BSTR(&right) = rbstr;
5077     hres = VarAdd(&left, &right, &result);
5078     ok(hres == S_OK && V_VT(&result) == VT_BSTR, "VarAdd: expected coerced type VT_BSTR, got %s!\n", vtstr(V_VT(&result)));
5079     hres = VarR8FromStr(V_BSTR(&result), 0, 0, &r);
5080     ok(hres == S_OK && EQ_DOUBLE(r, 1212), "VarAdd: BSTR value %f, expected %f\n", r, (double)1212);
5081
5082     /* Manuly test some VT_CY and VT_DECIMAL variants */
5083     V_VT(&cy) = VT_CY;
5084     hres = VarCyFromI4(4711, &V_CY(&cy));
5085     ok(hres == S_OK, "VarCyFromI4 failed!\n");
5086     V_VT(&dec) = VT_DECIMAL;
5087     hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
5088     ok(hres == S_OK, "VarDecFromR4 failed!\n");
5089     memset(&left, 0, sizeof(left));
5090     memset(&right, 0, sizeof(right));
5091     V_VT(&left) = VT_I4;
5092     V_I4(&left) = -11;
5093     V_VT(&right) = VT_UI1;
5094     V_UI1(&right) = 9;
5095
5096     hres = VarAdd(&cy, &right, &result);
5097     ok(hres == S_OK && V_VT(&result) == VT_CY, "VarAdd: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
5098     hres = VarR8FromCy(V_CY(&result), &r);
5099     ok(hres == S_OK && EQ_DOUBLE(r, 4720), "VarAdd: CY value %f, expected %f\n", r, (double)4720);
5100
5101     hres = VarAdd(&left, &dec, &result);
5102     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarAdd: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
5103     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
5104     ok(hres == S_OK && EQ_DOUBLE(r, -15.2), "VarAdd: DECIMAL value %f, expected %f\n", r, (double)-15.2);
5105
5106     SysFreeString(lbstr);
5107     SysFreeString(rbstr);
5108 }
5109
5110 static void test_VarCat(void)
5111 {
5112     LCID lcid;
5113     VARIANT left, right, result, expected;
5114     static const WCHAR sz12[] = {'1','2','\0'};
5115     static const WCHAR sz34[] = {'3','4','\0'};
5116     static const WCHAR sz1234[] = {'1','2','3','4','\0'};
5117     static const WCHAR date_sz12[] = {'9','/','3','0','/','1','9','8','0','1','2','\0'};
5118     static const WCHAR sz12_date[] = {'1','2','9','/','3','0','/','1','9','8','0','\0'};
5119     static const WCHAR sz_empty[] = {'\0'};
5120     static const WCHAR sz12_true[] = {'1','2','T','r','u','e','\0'};
5121     static const WCHAR sz12_false[] = {'1','2','F','a','l','s','e','\0'};
5122     TCHAR orig_date_format[128];
5123     VARTYPE leftvt, rightvt, resultvt;
5124     HRESULT hres;
5125     HRESULT expected_error_num;
5126
5127     /* Set date format for testing */
5128     lcid = LOCALE_USER_DEFAULT;
5129     GetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format,128);
5130     SetLocaleInfo(lcid,LOCALE_SSHORTDATE,"M/d/yyyy");
5131
5132     VariantInit(&left);
5133     VariantInit(&right);
5134     VariantInit(&result);
5135     VariantInit(&expected);
5136
5137     /* Check expected types for all combinations */
5138     for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5139     {
5140
5141         SKIPTESTS(leftvt);
5142
5143         /* Check if we need/have support for I8 and/or UI8 */
5144         if ((leftvt == VT_I8 || leftvt == VT_UI8) && !HAVE_OLEAUT32_I8)
5145             continue;
5146
5147         for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5148         {
5149
5150             SKIPTESTS(rightvt);
5151             expected_error_num = S_OK;
5152             resultvt = VT_EMPTY;
5153
5154             if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
5155                 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN  ||
5156                 leftvt == VT_RECORD || rightvt == VT_RECORD  ||
5157                 leftvt == 15 || rightvt == 15 /* Undefined type */)
5158                 continue;
5159
5160             /* Check if we need/have support for I8 and/or UI8 */
5161             if ((rightvt == VT_I8 || rightvt == VT_UI8) && !HAVE_OLEAUT32_I8)
5162                 continue;
5163
5164             if (leftvt == VT_NULL && rightvt == VT_NULL)
5165                 resultvt = VT_NULL;
5166             else if (leftvt == VT_VARIANT && (rightvt == VT_ERROR ||
5167                 rightvt == VT_DATE || rightvt == VT_DECIMAL))
5168                 expected_error_num = DISP_E_TYPEMISMATCH;
5169             else if ((leftvt == VT_I2 || leftvt == VT_I4 ||
5170                 leftvt == VT_R4 || leftvt == VT_R8 ||
5171                 leftvt == VT_CY || leftvt == VT_BOOL ||
5172                 leftvt == VT_BSTR || leftvt == VT_I1 ||
5173                 leftvt == VT_UI1 || leftvt == VT_UI2 ||
5174                 leftvt == VT_UI4 || leftvt == VT_I8 ||
5175                 leftvt == VT_UI8 || leftvt == VT_INT ||
5176                 leftvt == VT_UINT || leftvt == VT_EMPTY ||
5177                 leftvt == VT_NULL || leftvt == VT_DECIMAL ||
5178                 leftvt == VT_DATE)
5179                 &&
5180                 (rightvt == VT_I2 || rightvt == VT_I4 ||
5181                 rightvt == VT_R4 || rightvt == VT_R8 ||
5182                 rightvt == VT_CY || rightvt == VT_BOOL ||
5183                 rightvt == VT_BSTR || rightvt == VT_I1 ||
5184                 rightvt == VT_UI1 || rightvt == VT_UI2 ||
5185                 rightvt == VT_UI4 || rightvt == VT_I8 ||
5186                 rightvt == VT_UI8 || rightvt == VT_INT ||
5187                 rightvt == VT_UINT || rightvt == VT_EMPTY ||
5188                 rightvt == VT_NULL || rightvt == VT_DECIMAL ||
5189                 rightvt == VT_DATE))
5190                 resultvt = VT_BSTR;
5191             else if (rightvt == VT_ERROR && leftvt < VT_VOID)
5192                 expected_error_num = DISP_E_TYPEMISMATCH;
5193             else if (leftvt == VT_ERROR && (rightvt == VT_DATE ||
5194                 rightvt == VT_ERROR || rightvt == VT_DECIMAL))
5195                 expected_error_num = DISP_E_TYPEMISMATCH;
5196             else if (rightvt == VT_DATE || rightvt == VT_ERROR ||
5197                 rightvt == VT_DECIMAL)
5198                 expected_error_num = DISP_E_BADVARTYPE;
5199             else if (leftvt == VT_ERROR || rightvt == VT_ERROR)
5200                 expected_error_num = DISP_E_TYPEMISMATCH;
5201             else if (leftvt == VT_VARIANT)
5202                 expected_error_num = DISP_E_TYPEMISMATCH;
5203             else if (rightvt == VT_VARIANT && (leftvt == VT_EMPTY ||
5204                 leftvt == VT_NULL || leftvt ==  VT_I2 ||
5205                 leftvt == VT_I4 || leftvt == VT_R4 ||
5206                 leftvt == VT_R8 || leftvt == VT_CY ||
5207                 leftvt == VT_DATE || leftvt == VT_BSTR ||
5208                 leftvt == VT_BOOL ||  leftvt == VT_DECIMAL ||
5209                 leftvt == VT_I1 || leftvt == VT_UI1 ||
5210                 leftvt == VT_UI2 || leftvt == VT_UI4 ||
5211                 leftvt == VT_I8 || leftvt == VT_UI8 ||
5212                 leftvt == VT_INT || leftvt == VT_UINT
5213                 ))
5214                 expected_error_num = DISP_E_TYPEMISMATCH;
5215             else
5216                 expected_error_num = DISP_E_BADVARTYPE;
5217
5218             V_VT(&left) = leftvt;
5219             V_VT(&right) = rightvt;
5220
5221             if (leftvt == VT_BSTR)
5222                 V_BSTR(&left) = SysAllocString(sz_empty);
5223             if (rightvt == VT_BSTR)
5224                 V_BSTR(&right) = SysAllocString(sz_empty);
5225             if (leftvt == VT_DATE)
5226                 V_DATE(&left) = 0.0;
5227             if (rightvt == VT_DATE)
5228                 V_DATE(&right) = 0.0;
5229             if (leftvt == VT_DECIMAL)
5230                 VarDecFromR8(0.0, &V_DECIMAL(&left));
5231             if (rightvt == VT_DECIMAL)
5232                 VarDecFromR8(0.0, &V_DECIMAL(&right));
5233
5234             hres = VarCat(&left, &right, &result);
5235
5236             /* Determine the error code for the vt combination */
5237             ok(hres == expected_error_num,
5238                 "VarCat: %d, %d returned error, 0x%X expected 0x%X.\n",
5239                 leftvt, rightvt, expected_error_num, hres);
5240
5241             /* Check types are correct */
5242             ok(V_VT(&result) == resultvt,
5243                 "VarCat: %d, %d: expected vt %d, got vt %d\n",
5244                 leftvt, rightvt, resultvt, V_VT(&result));
5245
5246             VariantClear(&left);
5247             VariantClear(&right);
5248             VariantClear(&result);
5249         }
5250     }
5251
5252     /* Runnning single comparison tests to compare outputs */
5253
5254     /* Test concat strings */
5255     V_VT(&left) = VT_BSTR;
5256     V_VT(&right) = VT_BSTR;
5257     V_VT(&expected) = VT_BSTR;
5258     V_BSTR(&left) = SysAllocString(sz12);
5259     V_BSTR(&right) = SysAllocString(sz34);
5260     V_BSTR(&expected) = SysAllocString(sz1234);
5261     hres = VarCat(&left,&right,&result);
5262     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5263     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5264         "VarCat: VT_BSTR concat with VT_BSTR failed to return correct result\n");
5265
5266     VariantClear(&left);
5267     VariantClear(&right);
5268     VariantClear(&result);
5269
5270     /* Test if expression is VT_ERROR */
5271     V_VT(&left) = VT_ERROR;
5272     V_VT(&right) = VT_BSTR;
5273     V_BSTR(&right) = SysAllocString(sz1234);
5274     hres = VarCat(&left,&right,&result);
5275     ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08x\n", hres);
5276     ok(V_VT(&result) == VT_EMPTY,
5277         "VarCat: VT_ERROR concat with VT_BSTR should have returned VT_EMPTY\n");
5278
5279     VariantClear(&left);
5280     VariantClear(&right);
5281     VariantClear(&result);
5282
5283     V_VT(&left) = VT_BSTR;
5284     V_VT(&right) = VT_ERROR;
5285     V_BSTR(&left) = SysAllocString(sz1234);
5286     hres = VarCat(&left,&right,&result);
5287     ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08x\n", hres);
5288     ok(V_VT(&result) == VT_EMPTY,
5289         "VarCat: VT_BSTR concat with VT_ERROR should have returned VT_EMPTY\n");
5290
5291     VariantClear(&left);
5292     VariantClear(&right);
5293     VariantClear(&result);
5294     VariantClear(&expected);
5295
5296     /* Test combining boolean with number */
5297     V_VT(&left) = VT_INT;
5298     V_VT(&right) = VT_BOOL;
5299     V_VT(&expected) = VT_BSTR;
5300     V_INT(&left) = 12;
5301     V_BOOL(&right) = TRUE;
5302     V_BSTR(&expected) = SysAllocString(sz12_true);
5303     hres = VarCat(&left,&right,&result);
5304     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5305     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5306         "VarCat: VT_INT concat with VT_BOOL (TRUE) returned incorrect result\n");
5307
5308     VariantClear(&left);
5309     VariantClear(&right);
5310     VariantClear(&result);
5311     VariantClear(&expected);
5312
5313     V_VT(&left) = VT_INT;
5314     V_VT(&right) = VT_BOOL;
5315     V_VT(&expected) = VT_BSTR;
5316     V_INT(&left) = 12;
5317     V_BOOL(&right) = FALSE;
5318     V_BSTR(&expected) = SysAllocString(sz12_false);
5319     hres = VarCat(&left,&right,&result);
5320     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5321     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5322         "VarCat: VT_INT concat with VT_BOOL (FALSE) returned inncorrect result\n");
5323
5324     VariantClear(&left);
5325     VariantClear(&right);
5326     VariantClear(&result);
5327     VariantClear(&expected);
5328
5329     /* Test when both expressions are numeric */
5330     V_VT(&left) = VT_INT;
5331     V_VT(&right) = VT_INT;
5332     V_VT(&expected) = VT_BSTR;
5333     V_INT(&left)  = 12;
5334     V_INT(&right) = 34;
5335     V_BSTR(&expected) = SysAllocString(sz1234);
5336     hres = VarCat(&left,&right,&result);
5337     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5338     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5339         "VarCat: NUMBER concat with NUMBER returned inncorrect result\n");
5340
5341     VariantClear(&left);
5342     VariantClear(&right);
5343     VariantClear(&result);
5344
5345     /* Test if one expression is numeric and the other is a string */
5346     V_VT(&left) = VT_INT;
5347     V_VT(&right) = VT_BSTR;
5348     V_INT(&left) = 12;
5349     V_BSTR(&right) = SysAllocString(sz34);
5350     hres = VarCat(&left,&right,&result);
5351     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5352     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5353         "VarCat: NUMBER concat with VT_BSTR, inncorrect result\n");
5354
5355     VariantClear(&left);
5356     VariantClear(&right);
5357     VariantClear(&result);
5358
5359     V_VT(&left) = VT_BSTR;
5360     V_VT(&right) = VT_INT;
5361     V_BSTR(&left) = SysAllocString(sz12);
5362     V_INT(&right) = 34;
5363     hres = VarCat(&left,&right,&result);
5364     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5365     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5366         "VarCat: VT_BSTR concat with NUMBER, inncorrect result\n");
5367
5368     VariantClear(&left);
5369     VariantClear(&right);
5370     VariantClear(&result);
5371
5372     /* Test concat dates with strings */
5373     V_VT(&left) = VT_BSTR;
5374     V_VT(&right) = VT_DATE;
5375     V_VT(&expected) = VT_BSTR;
5376     V_BSTR(&left) = SysAllocString(sz12);
5377     V_DATE(&right) = 29494.0;
5378     V_BSTR(&expected)= SysAllocString(sz12_date);
5379     hres = VarCat(&left,&right,&result);
5380     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5381     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5382         "VarCat: VT_BSTR concat with VT_DATE returned inncorrect result\n");
5383
5384     VariantClear(&left);
5385     VariantClear(&right);
5386     VariantClear(&result);
5387     VariantClear(&expected);
5388
5389     V_VT(&left) = VT_DATE;
5390     V_VT(&right) = VT_BSTR;
5391     V_VT(&expected) = VT_BSTR;
5392     V_DATE(&left) = 29494.0;
5393     V_BSTR(&right) = SysAllocString(sz12);
5394     V_BSTR(&expected)= SysAllocString(date_sz12);
5395     hres = VarCat(&left,&right,&result);
5396     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5397     ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5398         "VarCat: VT_DATE concat with VT_BSTR returned inncorrect result\n");
5399
5400     VariantClear(&left);
5401     VariantClear(&right);
5402     VariantClear(&result);
5403     VariantClear(&expected);
5404
5405     /* Test of both expressions are empty */
5406     V_VT(&left) = VT_BSTR;
5407     V_VT(&right) = VT_BSTR;
5408     V_VT(&expected) = VT_BSTR;
5409     V_BSTR(&left) = SysAllocString(sz_empty);
5410     V_BSTR(&right) = SysAllocString(sz_empty);
5411     V_BSTR(&expected)= SysAllocString(sz_empty);
5412     hres = VarCat(&left,&right,&result);
5413     ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5414     ok(VarCmp(&result,&left,lcid,0) == VARCMP_EQ,
5415         "VarCat: EMPTY concat with EMPTY did not return empty VT_BSTR\n");
5416
5417     /* Restore original date format settings */
5418     SetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format);
5419
5420     VariantClear(&left);
5421     VariantClear(&right);
5422     VariantClear(&result);
5423     VariantClear(&expected);
5424 }
5425
5426 static HRESULT (WINAPI *pVarAnd)(LPVARIANT,LPVARIANT,LPVARIANT);
5427
5428 #define VARAND(vt1,val1,vt2,val2,rvt,rval)               \
5429         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
5430         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
5431         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
5432         test_var_call2( __LINE__, pVarAnd, &left, &right, &exp )
5433
5434 #define VARANDCY(vt1,val1,val2,rvt,rval)                 \
5435         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
5436         V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
5437         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
5438         test_var_call2( __LINE__, pVarAnd, &left, &right, &exp )
5439
5440 /* Skip any type that is not defined or produces an error for every case */
5441 #define SKIPTESTAND(a)                                \
5442         if (a == VT_ERROR || a == VT_VARIANT ||       \
5443             a == VT_DISPATCH || a == VT_UNKNOWN ||    \
5444             a > VT_UINT || a == 15 /*not defined*/)   \
5445             continue
5446
5447 static void test_VarAnd(void)
5448 {
5449     static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
5450     static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
5451     VARIANT left, right, exp, result;
5452     BSTR false_str, true_str;
5453     VARTYPE i;
5454     HRESULT hres;
5455
5456     true_str = SysAllocString(szTrue);
5457     false_str = SysAllocString(szFalse);
5458
5459     CHECKPTR(VarAnd);
5460
5461     /* Test all possible flag/vt combinations & the resulting vt type */
5462     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
5463     {
5464         VARTYPE leftvt, rightvt, resvt;
5465
5466         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5467         {
5468             SKIPTESTAND(leftvt);
5469
5470             /* Check if we need/have support for I8 and/or UI8 */
5471             if ((leftvt == VT_I8 || leftvt == VT_UI8) && !HAVE_OLEAUT32_I8)
5472                 continue;
5473
5474             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5475             {
5476                 BOOL bFail = FALSE;
5477                 SKIPTESTAND(rightvt);
5478
5479                 /* Check if we need/have support for I8 and/or UI8 */
5480                 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !HAVE_OLEAUT32_I8)
5481                     continue;
5482
5483                 memset(&left, 0, sizeof(left));
5484                 memset(&right, 0, sizeof(right));
5485                 V_VT(&left) = leftvt | ExtraFlags[i];
5486                 V_VT(&right) = rightvt | ExtraFlags[i];
5487                 V_VT(&result) = VT_EMPTY;
5488                 resvt = VT_EMPTY;
5489                 if ((leftvt | ExtraFlags[i]) == VT_BSTR)
5490                     V_BSTR(&left) = true_str;
5491                 if ((rightvt | ExtraFlags[i]) == VT_BSTR)
5492                     V_BSTR(&right) = true_str;
5493
5494                 /* Native VarAnd always returns an error when using extra
5495                  * flags or if the variant combination is I8 and INT.
5496                  */
5497                 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
5498                     (leftvt == VT_INT && rightvt == VT_I8) ||
5499                     ExtraFlags[i] != 0)
5500                     bFail = TRUE;
5501
5502                 /* Determine return type */
5503                 else if (leftvt == VT_I8 || rightvt == VT_I8)
5504                     resvt = VT_I8;
5505                 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
5506                     leftvt == VT_UINT || rightvt == VT_UINT ||
5507                     leftvt == VT_INT || rightvt == VT_INT ||
5508                     leftvt == VT_UINT || rightvt == VT_UINT ||
5509                     leftvt == VT_R4 || rightvt == VT_R4 ||
5510                     leftvt == VT_R8 || rightvt == VT_R8 ||
5511                     leftvt == VT_CY || rightvt == VT_CY ||
5512                     leftvt == VT_DATE || rightvt == VT_DATE ||
5513                     leftvt == VT_I1 || rightvt == VT_I1 ||
5514                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
5515                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
5516                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
5517                     leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
5518                     resvt = VT_I4;
5519                 else if (leftvt == VT_UI1 || rightvt == VT_UI1 ||
5520                     leftvt == VT_I2 || rightvt == VT_I2 ||
5521                     leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5522                     if ((leftvt == VT_NULL && rightvt == VT_UI1) ||
5523                         (leftvt == VT_UI1 && rightvt == VT_NULL) ||
5524                         (leftvt == VT_UI1 && rightvt == VT_UI1))
5525                         resvt = VT_UI1;
5526                     else
5527                         resvt = VT_I2;
5528                 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
5529                     (leftvt == VT_BSTR && rightvt == VT_BSTR))
5530                     resvt = VT_BOOL;
5531                 else if (leftvt == VT_NULL || rightvt == VT_NULL ||
5532                     leftvt == VT_BSTR || rightvt == VT_BSTR)
5533                     resvt = VT_NULL;
5534                 else
5535                     bFail = TRUE;
5536
5537                 hres = pVarAnd(&left, &right, &result);
5538
5539                 /* Check expected HRESULT and if result variant type is correct */
5540                 if (bFail)
5541                     ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
5542                         "VarAnd: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
5543                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
5544                         vtstr(V_VT(&result)), hres);
5545                 else
5546                     ok (hres == S_OK && resvt == V_VT(&result),
5547                         "VarAnd: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
5548                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
5549                         S_OK, vtstr(V_VT(&result)), hres);
5550             }
5551         }
5552     }
5553
5554     /*
5555      * Test returned values. Since we know the returned type is correct
5556      * and that we handle all combinations of invalid types, just check
5557      * that good type combinations produce the desired value.
5558      * FIXME: Test VT_DECIMAL
5559      */
5560     VARAND(EMPTY,0,EMPTY,0,I2,0);
5561     VARAND(EMPTY,1,EMPTY,0,I2,0);
5562     VARAND(EMPTY,1,EMPTY,1,I2,0);
5563     VARAND(EMPTY,0,NULL,0,I2,0);
5564     VARAND(EMPTY,1,NULL,0,I2,0);
5565     VARAND(EMPTY,1,NULL,1,I2,0);
5566     VARAND(EMPTY,0,I1,0,I4,0);
5567     VARAND(EMPTY,0,I1,1,I4,0);
5568     VARAND(EMPTY,1,I1,1,I4,0);
5569     VARAND(EMPTY,0,UI1,0,I2,0);
5570     VARAND(EMPTY,0,UI1,1,I2,0);
5571     VARAND(EMPTY,1,UI1,1,I2,0);
5572     VARAND(EMPTY,0,I2,0,I2,0);
5573     VARAND(EMPTY,0,I2,1,I2,0);
5574     VARAND(EMPTY,1,I2,1,I2,0);
5575     VARAND(EMPTY,0,UI2,0,I4,0);
5576     VARAND(EMPTY,0,UI2,1,I4,0);
5577     VARAND(EMPTY,1,UI2,1,I4,0);
5578     VARAND(EMPTY,0,I4,0,I4,0);
5579     VARAND(EMPTY,0,I4,1,I4,0);
5580     VARAND(EMPTY,1,I4,1,I4,0);
5581     VARAND(EMPTY,0,UI4,0,I4,0);
5582     VARAND(EMPTY,0,UI4,1,I4,0);
5583     VARAND(EMPTY,1,UI4,1,I4,0);
5584     if (HAVE_OLEAUT32_I8)
5585     {
5586         VARAND(EMPTY,0,I8,0,I8,0);
5587         VARAND(EMPTY,0,I8,1,I8,0);
5588         VARAND(EMPTY,1,I8,1,I8,0);
5589         VARAND(EMPTY,0,UI8,0,I4,0);
5590         VARAND(EMPTY,0,UI8,1,I4,0);
5591         VARAND(EMPTY,1,UI8,1,I4,0);
5592     }
5593     VARAND(EMPTY,0,INT,0,I4,0);
5594     VARAND(EMPTY,0,INT,1,I4,0);
5595     VARAND(EMPTY,1,INT,1,I4,0);
5596     VARAND(EMPTY,0,UINT,0,I4,0);
5597     VARAND(EMPTY,0,UINT,1,I4,0);
5598     VARAND(EMPTY,1,UINT,1,I4,0);
5599     VARAND(EMPTY,0,BOOL,0,I2,0);
5600     VARAND(EMPTY,0,BOOL,1,I2,0);
5601     VARAND(EMPTY,1,BOOL,1,I2,0);
5602     VARAND(EMPTY,0,R4,0,I4,0);
5603     VARAND(EMPTY,0,R4,1,I4,0);
5604     VARAND(EMPTY,1,R4,1,I4,0);
5605     VARAND(EMPTY,0,R8,0,I4,0);
5606     VARAND(EMPTY,0,R8,1,I4,0);
5607     VARAND(EMPTY,1,R8,1,I4,0);
5608     VARAND(EMPTY,0,BSTR,false_str,I2,0);
5609     VARAND(EMPTY,0,BSTR,true_str,I2,0);
5610     VARANDCY(EMPTY,0,10000,I4,0);
5611
5612     /* NULL OR 0 = NULL. NULL OR n = n */
5613     VARAND(NULL,0,NULL,0,NULL,0);
5614     VARAND(NULL,1,NULL,0,NULL,0);
5615     VARAND(NULL,0,I1,0,I4,0);
5616     VARAND(NULL,0,I1,1,NULL,0);
5617     VARAND(NULL,0,UI1,0,UI1,0);
5618     VARAND(NULL,0,UI1,1,NULL,0);
5619     VARAND(NULL,0,I2,0,I2,0);
5620     VARAND(NULL,0,I2,1,NULL,0);
5621     VARAND(NULL,0,UI2,0,I4,0);
5622     VARAND(NULL,0,UI2,1,NULL,0);
5623     VARAND(NULL,0,I4,0,I4,0);
5624     VARAND(NULL,0,I4,1,NULL,0);
5625     VARAND(NULL,0,UI4,0,I4,0);
5626     VARAND(NULL,0,UI4,1,NULL,0);
5627     if (HAVE_OLEAUT32_I8)
5628     {
5629         VARAND(NULL,0,I8,0,I8,0);
5630         VARAND(NULL,0,I8,1,NULL,0);
5631         VARAND(NULL,0,UI8,0,I4,0);
5632         VARAND(NULL,0,UI8,1,NULL,0);
5633     }
5634     VARAND(NULL,0,INT,0,I4,0);
5635     VARAND(NULL,0,INT,1,NULL,0);
5636     VARAND(NULL,0,UINT,0,I4,0);
5637     VARAND(NULL,0,UINT,1,NULL,0);
5638     VARAND(NULL,0,BOOL,0,BOOL,0);
5639     VARAND(NULL,0,BOOL,1,NULL,0);
5640     VARAND(NULL,0,R4,0,I4,0);
5641     VARAND(NULL,0,R4,1,NULL,0);
5642     VARAND(NULL,0,R8,0,I4,0);
5643     VARAND(NULL,0,R8,1,NULL,0);
5644     VARAND(NULL,0,BSTR,false_str,BOOL,0);
5645     VARAND(NULL,0,BSTR,true_str,NULL,VARIANT_FALSE);
5646     VARANDCY(NULL,0,10000,NULL,0);
5647     VARANDCY(NULL,0,0,I4,0);
5648     VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
5649     VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
5650     VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
5651     VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
5652
5653     /* Assume x,y & y,x are the same from now on to reduce the number of tests */
5654     VARAND(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
5655     VARAND(BOOL,VARIANT_TRUE,I1,0,I4,0);
5656     VARAND(BOOL,VARIANT_FALSE,I1,0,I4,0);
5657     VARAND(BOOL,VARIANT_TRUE,UI1,255,I2,255);
5658     VARAND(BOOL,VARIANT_TRUE,UI1,0,I2,0);
5659     VARAND(BOOL,VARIANT_FALSE,UI1,0,I2,0);
5660     VARAND(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
5661     VARAND(BOOL,VARIANT_TRUE,I2,0,I2,0);
5662     VARAND(BOOL,VARIANT_FALSE,I2,0,I2,0);
5663     VARAND(BOOL,VARIANT_TRUE,UI2,65535,I4,65535);
5664     VARAND(BOOL,VARIANT_TRUE,UI2,0,I4,0);
5665     VARAND(BOOL,VARIANT_FALSE,UI2,0,I4,0);
5666     VARAND(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
5667     VARAND(BOOL,VARIANT_TRUE,I4,0,I4,0);
5668     VARAND(BOOL,VARIANT_FALSE,I4,0,I4,0);
5669     VARAND(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
5670     VARAND(BOOL,VARIANT_TRUE,UI4,0,I4,0);
5671     VARAND(BOOL,VARIANT_FALSE,UI4,0,I4,0);
5672     VARAND(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
5673     VARAND(BOOL,VARIANT_TRUE,R4,0,I4,0);
5674     VARAND(BOOL,VARIANT_FALSE,R4,0,I4,0);
5675     VARAND(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
5676     VARAND(BOOL,VARIANT_TRUE,R8,0,I4,0);
5677     VARAND(BOOL,VARIANT_FALSE,R8,0,I4,0);
5678     VARAND(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
5679     VARAND(BOOL,VARIANT_TRUE,DATE,0,I4,0);
5680     VARAND(BOOL,VARIANT_FALSE,DATE,0,I4,0);
5681     if (HAVE_OLEAUT32_I8)
5682     {
5683         VARAND(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
5684         VARAND(BOOL,VARIANT_TRUE,I8,0,I8,0);
5685         VARAND(BOOL,VARIANT_FALSE,I8,0,I8,0);
5686         VARAND(BOOL,VARIANT_TRUE,UI8,0,I4,0);
5687         VARAND(BOOL,VARIANT_FALSE,UI8,0,I4,0);
5688     }
5689     VARAND(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
5690     VARAND(BOOL,VARIANT_TRUE,INT,0,I4,0);
5691     VARAND(BOOL,VARIANT_FALSE,INT,0,I4,0);
5692     VARAND(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
5693     VARAND(BOOL,VARIANT_TRUE,UINT,0,I4,0);
5694     VARAND(BOOL,VARIANT_FALSE,UINT,0,I4,0);
5695     VARAND(BOOL,VARIANT_FALSE,BSTR,false_str,BOOL,VARIANT_FALSE);
5696     VARAND(BOOL,VARIANT_TRUE,BSTR,false_str,BOOL,VARIANT_FALSE);
5697     VARAND(BOOL,VARIANT_FALSE,BSTR,true_str,BOOL,VARIANT_FALSE);
5698     VARAND(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,VARIANT_TRUE);
5699     VARANDCY(BOOL,VARIANT_TRUE,10000,I4,1);
5700     VARANDCY(BOOL,VARIANT_TRUE,0,I4,0);
5701     VARANDCY(BOOL,VARIANT_FALSE,0,I4,0);
5702     VARAND(I1,-1,I1,-1,I4,-1);
5703     VARAND(I1,-1,I1,0,I4,0);
5704     VARAND(I1,0,I1,0,I4,0);
5705     VARAND(I1,-1,UI1,255,I4,255);
5706     VARAND(I1,-1,UI1,0,I4,0);
5707     VARAND(I1,0,UI1,0,I4,0);
5708     VARAND(I1,-1,I2,-1,I4,-1);
5709     VARAND(I1,-1,I2,0,I4,0);
5710     VARAND(I1,0,I2,0,I4,0);
5711     VARAND(I1,-1,UI2,65535,I4,65535);
5712     VARAND(I1,-1,UI2,0,I4,0);
5713     VARAND(I1,0,UI2,0,I4,0);
5714     VARAND(I1,-1,I4,-1,I4,-1);
5715     VARAND(I1,-1,I4,0,I4,0);
5716     VARAND(I1,0,I4,0,I4,0);
5717     VARAND(I1,-1,UI4,0xffffffff,I4,-1);
5718     VARAND(I1,-1,UI4,0,I4,0);
5719     VARAND(I1,0,UI4,0,I4,0);
5720     VARAND(I1,-1,R4,-1,I4,-1);
5721     VARAND(I1,-1,R4,0,I4,0);
5722     VARAND(I1,0,R4,0,I4,0);
5723     VARAND(I1,-1,R8,-1,I4,-1);
5724     VARAND(I1,-1,R8,0,I4,0);
5725     VARAND(I1,0,R8,0,I4,0);
5726     VARAND(I1,-1,DATE,-1,I4,-1);
5727     VARAND(I1,-1,DATE,0,I4,0);
5728     VARAND(I1,0,DATE,0,I4,0);
5729     if (HAVE_OLEAUT32_I8)
5730     {
5731         VARAND(I1,-1,I8,-1,I8,-1);
5732         VARAND(I1,-1,I8,0,I8,0);
5733         VARAND(I1,0,I8,0,I8,0);
5734         VARAND(I1,-1,UI8,0,I4,0);
5735         VARAND(I1,0,UI8,0,I4,0);
5736     }
5737     VARAND(I1,-1,INT,-1,I4,-1);
5738     VARAND(I1,-1,INT,0,I4,0);
5739     VARAND(I1,0,INT,0,I4,0);
5740     VARAND(I1,-1,UINT,0xffffffff,I4,-1);
5741     VARAND(I1,-1,UINT,0,I4,0);
5742     VARAND(I1,0,UINT,0,I4,0);
5743     VARAND(I1,0,BSTR,false_str,I4,0);
5744     VARAND(I1,-1,BSTR,false_str,I4,0);
5745     VARAND(I1,0,BSTR,true_str,I4,0);
5746     VARAND(I1,-1,BSTR,true_str,I4,-1);
5747     VARANDCY(I1,-1,10000,I4,1);
5748     VARANDCY(I1,-1,0,I4,0);
5749     VARANDCY(I1,0,0,I4,0);
5750
5751     VARAND(UI1,255,UI1,255,UI1,255);
5752     VARAND(UI1,255,UI1,0,UI1,0);
5753     VARAND(UI1,0,UI1,0,UI1,0);
5754     VARAND(UI1,255,I2,-1,I2,255);
5755     VARAND(UI1,255,I2,0,I2,0);
5756     VARAND(UI1,0,I2,0,I2,0);
5757     VARAND(UI1,255,UI2,65535,I4,255);
5758     VARAND(UI1,255,UI2,0,I4,0);
5759     VARAND(UI1,0,UI2,0,I4,0);
5760     VARAND(UI1,255,I4,-1,I4,255);
5761     VARAND(UI1,255,I4,0,I4,0);
5762     VARAND(UI1,0,I4,0,I4,0);
5763     VARAND(UI1,255,UI4,0xffffffff,I4,255);
5764     VARAND(UI1,255,UI4,0,I4,0);
5765     VARAND(UI1,0,UI4,0,I4,0);
5766     VARAND(UI1,255,R4,-1,I4,255);
5767     VARAND(UI1,255,R4,0,I4,0);
5768     VARAND(UI1,0,R4,0,I4,0);
5769     VARAND(UI1,255,R8,-1,I4,255);
5770     VARAND(UI1,255,R8,0,I4,0);
5771     VARAND(UI1,0,R8,0,I4,0);
5772     VARAND(UI1,255,DATE,-1,I4,255);
5773     VARAND(UI1,255,DATE,0,I4,0);
5774     VARAND(UI1,0,DATE,0,I4,0);
5775     if (HAVE_OLEAUT32_I8)
5776     {
5777         VARAND(UI1,255,I8,-1,I8,255);
5778         VARAND(UI1,255,I8,0,I8,0);
5779         VARAND(UI1,0,I8,0,I8,0);
5780         VARAND(UI1,255,UI8,0,I4,0);
5781         VARAND(UI1,0,UI8,0,I4,0);
5782     }
5783     VARAND(UI1,255,INT,-1,I4,255);
5784     VARAND(UI1,255,INT,0,I4,0);
5785     VARAND(UI1,0,INT,0,I4,0);
5786     VARAND(UI1,255,UINT,0xffffffff,I4,255);
5787     VARAND(UI1,255,UINT,0,I4,0);
5788     VARAND(UI1,0,UINT,0,I4,0);
5789     VARAND(UI1,0,BSTR,false_str,I2,0);
5790     VARAND(UI1,255,BSTR,false_str,I2,0);
5791     VARAND(UI1,0,BSTR,true_str,I2,0);
5792     VARAND(UI1,255,BSTR,true_str,I2,255);
5793     VARANDCY(UI1,255,10000,I4,1);
5794     VARANDCY(UI1,255,0,I4,0);
5795     VARANDCY(UI1,0,0,I4,0);
5796
5797     VARAND(I2,-1,I2,-1,I2,-1);
5798     VARAND(I2,-1,I2,0,I2,0);
5799     VARAND(I2,0,I2,0,I2,0);
5800     VARAND(I2,-1,UI2,65535,I4,65535);
5801     VARAND(I2,-1,UI2,0,I4,0);
5802     VARAND(I2,0,UI2,0,I4,0);
5803     VARAND(I2,-1,I4,-1,I4,-1);
5804     VARAND(I2,-1,I4,0,I4,0);
5805     VARAND(I2,0,I4,0,I4,0);
5806     VARAND(I2,-1,UI4,0xffffffff,I4,-1);
5807     VARAND(I2,-1,UI4,0,I4,0);
5808     VARAND(I2,0,UI4,0,I4,0);
5809     VARAND(I2,-1,R4,-1,I4,-1);
5810     VARAND(I2,-1,R4,0,I4,0);
5811     VARAND(I2,0,R4,0,I4,0);
5812     VARAND(I2,-1,R8,-1,I4,-1);
5813     VARAND(I2,-1,R8,0,I4,0);
5814     VARAND(I2,0,R8,0,I4,0);
5815     VARAND(I2,-1,DATE,-1,I4,-1);
5816     VARAND(I2,-1,DATE,0,I4,0);
5817     VARAND(I2,0,DATE,0,I4,0);
5818     if (HAVE_OLEAUT32_I8)
5819     {
5820         VARAND(I2,-1,I8,-1,I8,-1);
5821         VARAND(I2,-1,I8,0,I8,0);
5822         VARAND(I2,0,I8,0,I8,0);
5823         VARAND(I2,-1,UI8,0,I4,0);
5824         VARAND(I2,0,UI8,0,I4,0);
5825     }
5826     VARAND(I2,-1,INT,-1,I4,-1);
5827     VARAND(I2,-1,INT,0,I4,0);
5828     VARAND(I2,0,INT,0,I4,0);
5829     VARAND(I2,-1,UINT,0xffffffff,I4,-1);
5830     VARAND(I2,-1,UINT,0,I4,0);
5831     VARAND(I2,0,UINT,0,I4,0);
5832     VARAND(I2,0,BSTR,false_str,I2,0);
5833     VARAND(I2,-1,BSTR,false_str,I2,0);
5834     VARAND(I2,0,BSTR,true_str,I2,0);
5835     VARAND(I2,-1,BSTR,true_str,I2,-1);
5836     VARANDCY(I2,-1,10000,I4,1);
5837     VARANDCY(I2,-1,0,I4,0);
5838     VARANDCY(I2,0,0,I4,0);
5839
5840     VARAND(UI2,65535,UI2,65535,I4,65535);
5841     VARAND(UI2,65535,UI2,0,I4,0);
5842     VARAND(UI2,0,UI2,0,I4,0);
5843     VARAND(UI2,65535,I4,-1,I4,65535);
5844     VARAND(UI2,65535,I4,0,I4,0);
5845     VARAND(UI2,0,I4,0,I4,0);
5846     VARAND(UI2,65535,UI4,0xffffffff,I4,65535);
5847     VARAND(UI2,65535,UI4,0,I4,0);
5848     VARAND(UI2,0,UI4,0,I4,0);
5849     VARAND(UI2,65535,R4,-1,I4,65535);
5850     VARAND(UI2,65535,R4,0,I4,0);
5851     VARAND(UI2,0,R4,0,I4,0);
5852     VARAND(UI2,65535,R8,-1,I4,65535);
5853     VARAND(UI2,65535,R8,0,I4,0);
5854     VARAND(UI2,0,R8,0,I4,0);
5855     VARAND(UI2,65535,DATE,-1,I4,65535);
5856     VARAND(UI2,65535,DATE,0,I4,0);
5857     VARAND(UI2,0,DATE,0,I4,0);
5858     if (HAVE_OLEAUT32_I8)
5859     {
5860         VARAND(UI2,65535,I8,-1,I8,65535);
5861         VARAND(UI2,65535,I8,0,I8,0);
5862         VARAND(UI2,0,I8,0,I8,0);
5863         VARAND(UI2,65535,UI8,0,I4,0);
5864         VARAND(UI2,0,UI8,0,I4,0);
5865     }
5866     VARAND(UI2,65535,INT,-1,I4,65535);
5867     VARAND(UI2,65535,INT,0,I4,0);
5868     VARAND(UI2,0,INT,0,I4,0);
5869     VARAND(UI2,65535,UINT,0xffffffff,I4,65535);
5870     VARAND(UI2,65535,UINT,0,I4,0);
5871     VARAND(UI2,0,UINT,0,I4,0);
5872     VARAND(UI2,0,BSTR,false_str,I4,0);
5873     VARAND(UI2,65535,BSTR,false_str,I4,0);
5874     VARAND(UI2,0,BSTR,true_str,I4,0);
5875     VARAND(UI2,65535,BSTR,true_str,I4,65535);
5876     VARANDCY(UI2,65535,10000,I4,1);
5877     VARANDCY(UI2,65535,0,I4,0);
5878     VARANDCY(UI2,0,0,I4,0);
5879
5880     VARAND(I4,-1,I4,-1,I4,-1);
5881     VARAND(I4,-1,I4,0,I4,0);
5882     VARAND(I4,0,I4,0,I4,0);
5883     VARAND(I4,-1,UI4,0xffffffff,I4,-1);
5884     VARAND(I4,-1,UI4,0,I4,0);
5885     VARAND(I4,0,UI4,0,I4,0);
5886     VARAND(I4,-1,R4,-1,I4,-1);
5887     VARAND(I4,-1,R4,0,I4,0);
5888     VARAND(I4,0,R4,0,I4,0);
5889     VARAND(I4,-1,R8,-1,I4,-1);
5890     VARAND(I4,-1,R8,0,I4,0);
5891     VARAND(I4,0,R8,0,I4,0);
5892     VARAND(I4,-1,DATE,-1,I4,-1);
5893     VARAND(I4,-1,DATE,0,I4,0);
5894     VARAND(I4,0,DATE,0,I4,0);
5895     if (HAVE_OLEAUT32_I8)
5896     {
5897         VARAND(I4,-1,I8,-1,I8,-1);
5898         VARAND(I4,-1,I8,0,I8,0);
5899         VARAND(I4,0,I8,0,I8,0);
5900         VARAND(I4,-1,UI8,0,I4,0);
5901         VARAND(I4,0,UI8,0,I4,0);
5902     }
5903     VARAND(I4,-1,INT,-1,I4,-1);
5904     VARAND(I4,-1,INT,0,I4,0);
5905     VARAND(I4,0,INT,0,I4,0);
5906     VARAND(I4,-1,UINT,0xffffffff,I4,-1);
5907     VARAND(I4,-1,UINT,0,I4,0);
5908     VARAND(I4,0,UINT,0,I4,0);
5909     VARAND(I4,0,BSTR,false_str,I4,0);
5910     VARAND(I4,-1,BSTR,false_str,I4,0);
5911     VARAND(I4,0,BSTR,true_str,I4,0);
5912     VARAND(I4,-1,BSTR,true_str,I4,-1);
5913     VARANDCY(I4,-1,10000,I4,1);
5914     VARANDCY(I4,-1,0,I4,0);
5915     VARANDCY(I4,0,0,I4,0);
5916
5917     VARAND(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
5918     VARAND(UI4,0xffffffff,UI4,0,I4,0);
5919     VARAND(UI4,0,UI4,0,I4,0);
5920     VARAND(UI4,0xffffffff,R4,-1,I4,-1);
5921     VARAND(UI4,0xffffffff,R4,0,I4,0);
5922     VARAND(UI4,0,R4,0,I4,0);
5923     VARAND(UI4,0xffffffff,R8,-1,I4,-1);
5924     VARAND(UI4,0xffffffff,R8,0,I4,0);
5925     VARAND(UI4,0,R8,0,I4,0);
5926     VARAND(UI4,0xffffffff,DATE,-1,I4,-1);
5927     VARAND(UI4,0xffffffff,DATE,0,I4,0);
5928     VARAND(UI4,0,DATE,0,I4,0);
5929     if (HAVE_OLEAUT32_I8)
5930     {
5931         VARAND(UI4,0xffffffff,I8,0,I8,0);
5932         VARAND(UI4,0,I8,0,I8,0);
5933         VARAND(UI4,0xffffffff,UI8,0,I4,0);
5934         VARAND(UI4,0,UI8,0,I4,0);
5935     }
5936     VARAND(UI4,0xffffffff,INT,-1,I4,-1);
5937     VARAND(UI4,0xffffffff,INT,0,I4,0);
5938     VARAND(UI4,0,INT,0,I4,0);
5939     VARAND(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
5940     VARAND(UI4,0xffffffff,UINT,0,I4,0);
5941     VARAND(UI4,0,UINT,0,I4,0);
5942     VARAND(UI4,0,BSTR,false_str,I4,0);
5943     VARAND(UI4,0xffffffff,BSTR,false_str,I4,0);
5944     VARAND(UI4,0,BSTR,true_str,I4,0);
5945     VARAND(UI4,0xffffffff,BSTR,true_str,I4,-1);
5946     VARANDCY(UI4,0xffffffff,10000,I4,1);
5947     VARANDCY(UI4,0xffffffff,0,I4,0);
5948     VARANDCY(UI4,0,0,I4,0);
5949
5950     VARAND(R4,-1,R4,-1,I4,-1);
5951     VARAND(R4,-1,R4,0,I4,0);
5952     VARAND(R4,0,R4,0,I4,0);
5953     VARAND(R4,-1,R8,-1,I4,-1);
5954     VARAND(R4,-1,R8,0,I4,0);
5955     VARAND(R4,0,R8,0,I4,0);
5956     VARAND(R4,-1,DATE,-1,I4,-1);
5957     VARAND(R4,-1,DATE,0,I4,0);
5958     VARAND(R4,0,DATE,0,I4,0);
5959     if (HAVE_OLEAUT32_I8)
5960     {
5961         VARAND(R4,-1,I8,-1,I8,-1);
5962         VARAND(R4,-1,I8,0,I8,0);
5963         VARAND(R4,0,I8,0,I8,0);
5964         VARAND(R4,-1,UI8,0,I4,0);
5965         VARAND(R4,0,UI8,0,I4,0);
5966     }
5967     VARAND(R4,-1,INT,-1,I4,-1);
5968     VARAND(R4,-1,INT,0,I4,0);
5969     VARAND(R4,0,INT,0,I4,0);
5970     VARAND(R4,-1,UINT,0xffffffff,I4,-1);
5971     VARAND(R4,-1,UINT,0,I4,0);
5972     VARAND(R4,0,UINT,0,I4,0);
5973     VARAND(R4,0,BSTR,false_str,I4,0);
5974     VARAND(R4,-1,BSTR,false_str,I4,0);
5975     VARAND(R4,0,BSTR,true_str,I4,0);
5976     VARAND(R4,-1,BSTR,true_str,I4,-1);
5977     VARANDCY(R4,-1,10000,I4,1);
5978     VARANDCY(R4,-1,0,I4,0);
5979     VARANDCY(R4,0,0,I4,0);
5980
5981     VARAND(R8,-1,R8,-1,I4,-1);
5982     VARAND(R8,-1,R8,0,I4,0);
5983     VARAND(R8,0,R8,0,I4,0);
5984     VARAND(R8,-1,DATE,-1,I4,-1);
5985     VARAND(R8,-1,DATE,0,I4,0);
5986     VARAND(R8,0,DATE,0,I4,0);
5987     if (HAVE_OLEAUT32_I8)
5988     {
5989         VARAND(R8,-1,I8,-1,I8,-1);
5990         VARAND(R8,-1,I8,0,I8,0);
5991         VARAND(R8,0,I8,0,I8,0);
5992         VARAND(R8,-1,UI8,0,I4,0);
5993         VARAND(R8,0,UI8,0,I4,0);
5994     }
5995     VARAND(R8,-1,INT,-1,I4,-1);
5996     VARAND(R8,-1,INT,0,I4,0);
5997     VARAND(R8,0,INT,0,I4,0);
5998     VARAND(R8,-1,UINT,0xffffffff,I4,-1);
5999     VARAND(R8,-1,UINT,0,I4,0);
6000     VARAND(R8,0,UINT,0,I4,0);
6001     VARAND(R8,0,BSTR,false_str,I4,0);
6002     VARAND(R8,-1,BSTR,false_str,I4,0);
6003     VARAND(R8,0,BSTR,true_str,I4,0);
6004     VARAND(R8,-1,BSTR,true_str,I4,-1);
6005     VARANDCY(R8,-1,10000,I4,1);
6006     VARANDCY(R8,-1,0,I4,0);
6007     VARANDCY(R8,0,0,I4,0);
6008
6009     VARAND(DATE,-1,DATE,-1,I4,-1);
6010     VARAND(DATE,-1,DATE,0,I4,0);
6011     VARAND(DATE,0,DATE,0,I4,0);
6012     if (HAVE_OLEAUT32_I8)
6013     {
6014         VARAND(DATE,-1,I8,-1,I8,-1);
6015         VARAND(DATE,-1,I8,0,I8,0);
6016         VARAND(DATE,0,I8,0,I8,0);
6017         VARAND(DATE,-1,UI8,0,I4,0);
6018         VARAND(DATE,0,UI8,0,I4,0);
6019     }
6020     VARAND(DATE,-1,INT,-1,I4,-1);
6021     VARAND(DATE,-1,INT,0,I4,0);
6022     VARAND(DATE,0,INT,0,I4,0);
6023     VARAND(DATE,-1,UINT,0xffffffff,I4,-1);
6024     VARAND(DATE,-1,UINT,0,I4,0);
6025     VARAND(DATE,0,UINT,0,I4,0);
6026     VARAND(DATE,0,BSTR,false_str,I4,0);
6027     VARAND(DATE,-1,BSTR,false_str,I4,0);
6028     VARAND(DATE,0,BSTR,true_str,I4,0);
6029     VARAND(DATE,-1,BSTR,true_str,I4,-1);
6030     VARANDCY(DATE,-1,10000,I4,1);
6031     VARANDCY(DATE,-1,0,I4,0);
6032     VARANDCY(DATE,0,0,I4,0);
6033
6034     if (HAVE_OLEAUT32_I8)
6035     {
6036         VARAND(I8,-1,I8,-1,I8,-1);
6037         VARAND(I8,-1,I8,0,I8,0);
6038         VARAND(I8,0,I8,0,I8,0);
6039         VARAND(I8,-1,UI8,0,I8,0);
6040         VARAND(I8,0,UI8,0,I8,0);
6041         VARAND(I8,-1,UINT,0,I8,0);
6042         VARAND(I8,0,UINT,0,I8,0);
6043         VARAND(I8,0,BSTR,false_str,I8,0);
6044         VARAND(I8,-1,BSTR,false_str,I8,0);
6045         VARAND(I8,0,BSTR,true_str,I8,0);
6046         VARAND(I8,-1,BSTR,true_str,I8,-1);
6047         VARANDCY(I8,-1,10000,I8,1);
6048         VARANDCY(I8,-1,0,I8,0);
6049         VARANDCY(I8,0,0,I8,0);
6050
6051         VARAND(UI8,0xffff,UI8,0xffff,I4,0xffff);
6052         VARAND(UI8,0xffff,UI8,0,I4,0);
6053         VARAND(UI8,0,UI8,0,I4,0);
6054         VARAND(UI8,0xffff,INT,-1,I4,65535);
6055         VARAND(UI8,0xffff,INT,0,I4,0);
6056         VARAND(UI8,0,INT,0,I4,0);
6057         VARAND(UI8,0xffff,UINT,0xffff,I4,0xffff);
6058         VARAND(UI8,0xffff,UINT,0,I4,0);
6059         VARAND(UI8,0,UINT,0,I4,0);
6060         VARAND(UI8,0,BSTR,false_str,I4,0);
6061         VARAND(UI8,0xffff,BSTR,false_str,I4,0);
6062         VARAND(UI8,0,BSTR,true_str,I4,0);
6063         VARAND(UI8,0xffff,BSTR,true_str,I4,65535);
6064         VARANDCY(UI8,0xffff,10000,I4,1);
6065         VARANDCY(UI8,0xffff,0,I4,0);
6066         VARANDCY(UI8,0,0,I4,0);
6067     }
6068
6069     VARAND(INT,-1,INT,-1,I4,-1);
6070     VARAND(INT,-1,INT,0,I4,0);
6071     VARAND(INT,0,INT,0,I4,0);
6072     VARAND(INT,-1,UINT,0xffff,I4,65535);
6073     VARAND(INT,-1,UINT,0,I4,0);
6074     VARAND(INT,0,UINT,0,I4,0);
6075     VARAND(INT,0,BSTR,false_str,I4,0);
6076     VARAND(INT,-1,BSTR,false_str,I4,0);
6077     VARAND(INT,0,BSTR,true_str,I4,0);
6078     VARAND(INT,-1,BSTR,true_str,I4,-1);
6079     VARANDCY(INT,-1,10000,I4,1);
6080     VARANDCY(INT,-1,0,I4,0);
6081     VARANDCY(INT,0,0,I4,0);
6082
6083     VARAND(UINT,0xffff,UINT,0xffff,I4,0xffff);
6084     VARAND(UINT,0xffff,UINT,0,I4,0);
6085     VARAND(UINT,0,UINT,0,I4,0);
6086     VARAND(UINT,0,BSTR,false_str,I4,0);
6087     VARAND(UINT,0xffff,BSTR, false_str,I4,0);
6088     VARAND(UINT,0,BSTR,true_str,I4,0);
6089     VARAND(UINT,0xffff,BSTR,true_str,I4,65535);
6090     VARANDCY(UINT,0xffff,10000,I4,1);
6091     VARANDCY(UINT,0xffff,0,I4,0);
6092     VARANDCY(UINT,0,0,I4,0);
6093
6094     VARAND(BSTR,false_str,BSTR,false_str,BOOL,0);
6095     VARAND(BSTR,true_str,BSTR,false_str,BOOL,VARIANT_FALSE);
6096     VARAND(BSTR,true_str,BSTR,true_str,BOOL,VARIANT_TRUE);
6097     VARANDCY(BSTR,true_str,10000,I4,1);
6098     VARANDCY(BSTR,false_str,10000,I4,0);
6099
6100     SysFreeString(true_str);
6101     SysFreeString(false_str);
6102 }
6103
6104 static HRESULT (WINAPI *pVarCmp)(LPVARIANT,LPVARIANT,LCID,ULONG);
6105
6106 static void test_cmp( int line, LCID lcid, UINT flags, VARIANT *left, VARIANT *right, HRESULT result )
6107 {
6108     HRESULT hres;
6109
6110     hres = pVarCmp(left,right,lcid,flags);
6111     ok_(__FILE__,line)(hres == result, "VarCmp(%s,%s): expected 0x%x, got hres=0x%x\n",
6112                        variantstr(left), variantstr(right), result, hres );
6113 }
6114 static void test_cmpex( int line, LCID lcid, VARIANT *left, VARIANT *right,
6115                         HRESULT res1, HRESULT res2, HRESULT res3, HRESULT res4 )
6116 {
6117     test_cmp( line, lcid, 0, left, right, res1 );
6118     V_VT(left) |= VT_RESERVED;
6119     test_cmp( line, lcid, 0, left, right, res2 );
6120     V_VT(left) &= ~VT_RESERVED;
6121     V_VT(right) |= VT_RESERVED;
6122     test_cmp( line, lcid, 0, left, right, res3 );
6123     V_VT(left) |= VT_RESERVED;
6124     test_cmp( line, lcid, 0, left, right, res4 );
6125     ok_(__FILE__,line)(V_VT(left) & V_VT(right) & VT_RESERVED, "VT_RESERVED filtered out\n");
6126 }
6127
6128 /* ERROR from wingdi.h is interfering here */
6129 #undef ERROR
6130 #define _VARCMP(vt1,val1,vtfl1,vt2,val2,vtfl2,lcid,flags,result) \
6131         V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1 | vtfl1; \
6132         V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2 | vtfl2; \
6133         test_cmp( __LINE__, lcid, flags, &left, &right, result )
6134 #define VARCMPEX(vt1,val1,vt2,val2,res1,res2,res3,res4) \
6135         V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1; \
6136         V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2; \
6137         test_cmpex( __LINE__, lcid, &left, &right, res1, res2, res3, res4 )
6138 #define VARCMP(vt1,val1,vt2,val2,result) \
6139         VARCMPEX(vt1,val1,vt2,val2,result,result,result,result)
6140 /* The above macros do not work for VT_NULL as NULL gets expanded first */
6141 #define V_NULL_  V_NULL
6142 #define VT_NULL_ VT_NULL
6143
6144 static void test_VarCmp(void)
6145 {
6146     VARIANT left, right;
6147     VARTYPE i;
6148     LCID lcid;
6149     HRESULT hres;
6150     DECIMAL dec;
6151     static const WCHAR szhuh[] = {'h','u','h','?','\0'};
6152     static const WCHAR sz2cents[] = {'2','c','e','n','t','s','\0'};
6153     static const WCHAR szempty[] = {'\0'};
6154     static const WCHAR sz0[] = {'0','\0'};
6155     static const WCHAR sz1[] = {'1','\0'};
6156     static const WCHAR sz7[] = {'7','\0'};
6157     static const WCHAR sz42[] = {'4','2','\0'};
6158     static const WCHAR sz1neg[] = {'-','1','\0'};
6159     static const WCHAR sz666neg[] = {'-','6','6','6','\0'};
6160     static const WCHAR sz1few[] = {'1','.','0','0','0','0','0','0','0','1','\0'};
6161     BSTR bstrhuh, bstrempty, bstr0, bstr1, bstr7, bstr42, bstr1neg, bstr666neg;
6162     BSTR bstr2cents, bstr1few;
6163
6164     CHECKPTR(VarCmp);
6165
6166     lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
6167     bstrempty = SysAllocString(szempty);
6168     bstrhuh = SysAllocString(szhuh);
6169     bstr2cents = SysAllocString(sz2cents);
6170     bstr0 = SysAllocString(sz0);
6171     bstr1 = SysAllocString(sz1);
6172     bstr7 = SysAllocString(sz7);
6173     bstr42 = SysAllocString(sz42);
6174     bstr1neg = SysAllocString(sz1neg);
6175     bstr666neg = SysAllocString(sz666neg);
6176     bstr1few = SysAllocString(sz1few);
6177
6178     /* Test all possible flag/vt combinations & the resulting vt type */
6179     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6180     {
6181         VARTYPE leftvt, rightvt;
6182
6183         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6184         {
6185
6186             SKIPTESTS(leftvt);
6187
6188             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6189             {
6190                 BOOL bFail = FALSE;
6191                 HRESULT expect = VARCMP_EQ;
6192
6193                 SKIPTESTS(rightvt);
6194
6195                 memset(&left, 0, sizeof(left));
6196                 memset(&right, 0, sizeof(right));
6197                 V_VT(&left) = leftvt | ExtraFlags[i];
6198                 if (leftvt == VT_BSTR) {
6199                     V_BSTR(&left) = bstr1neg;
6200                     if (ExtraFlags[i] & VT_RESERVED)
6201                         expect = VARCMP_LT;
6202                     else
6203                         expect = VARCMP_GT;
6204                 }
6205                 V_VT(&right) = rightvt | ExtraFlags[i];
6206                 if (rightvt == VT_BSTR) {
6207                     V_BSTR(&right) = bstr1neg;
6208                     if (ExtraFlags[i] & VT_RESERVED)
6209                         expect = VARCMP_GT;
6210                     else
6211                         expect = VARCMP_LT;
6212                 }
6213
6214                 /* Don't ask me why but native VarCmp cannot handle:
6215                    VT_I1, VT_UI2, VT_UI4, VT_UINT and VT_UI8.
6216                    VT_INT is only supported as left variant. Go figure.
6217                    Tested with DCOM98, Win2k, WinXP */
6218                 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
6219                     !IsValidVariantClearVT(leftvt, ExtraFlags[i] & ~VT_RESERVED) ||
6220                     !IsValidVariantClearVT(rightvt, ExtraFlags[i] & ~VT_RESERVED) ||
6221                     leftvt == VT_CLSID || rightvt == VT_CLSID ||
6222                     leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
6223                     leftvt == VT_ERROR || rightvt == VT_ERROR ||
6224                     leftvt == VT_RECORD || rightvt == VT_RECORD ||
6225                     leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
6226                     leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
6227                     leftvt == VT_I1 || rightvt == VT_I1 ||
6228                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
6229                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
6230                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
6231                     rightvt == VT_INT ||
6232                     leftvt == VT_UINT || rightvt == VT_UINT) {
6233                     bFail = TRUE;
6234                 }
6235
6236                 if (leftvt == VT_ERROR && rightvt == VT_ERROR &&
6237                     !(ExtraFlags[i] & ~VT_RESERVED)) {
6238                     expect = VARCMP_EQ;
6239                     bFail = FALSE;
6240                 } else if (leftvt == VT_NULL || rightvt == VT_NULL)
6241                     expect = VARCMP_NULL;
6242                 else if (leftvt == VT_BSTR && rightvt == VT_BSTR)
6243                     expect = VARCMP_EQ;
6244                 else if (leftvt == VT_BSTR && rightvt == VT_EMPTY)
6245                     expect = VARCMP_GT;
6246                 else if (leftvt == VT_EMPTY && rightvt == VT_BSTR)
6247                     expect = VARCMP_LT;
6248
6249                 hres = pVarCmp(&left, &right, LOCALE_USER_DEFAULT, 0);
6250                 if (bFail) {
6251                     ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
6252                        "VarCmp: %d|0x%X, %d|0x%X: Expected failure, got 0x%X\n",
6253                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres);
6254                 } else {
6255                     ok(hres == expect,
6256                        "VarCmp: %d|0x%X, %d|0x%X: Expected 0x%X, got 0x%X\n",
6257                        leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], expect,
6258                        hres);
6259                 }
6260             }
6261         }
6262     }
6263
6264     /* VARCMP{,EX} run each 4 tests with a permutation of all posible
6265        input variants with (1) and without (0) VT_RESERVED set. The order
6266        of the permutations is (0,0); (1,0); (0,1); (1,1) */
6267     VARCMP(INT,4711,I2,4711,VARCMP_EQ);
6268     VARCMP(INT,4711,I2,-4711,VARCMP_GT);
6269     VARCMP(ERROR,0,ERROR,0,VARCMP_EQ);
6270     VARCMP(ERROR,0,UI1,0,DISP_E_TYPEMISMATCH);
6271     VARCMP(EMPTY,0,EMPTY,0,VARCMP_EQ);
6272     VARCMP(I4,1,R8,1.0,VARCMP_EQ);
6273     VARCMP(EMPTY,19,I2,0,VARCMP_EQ);
6274     ok(V_EMPTY(&left) == 19, "VT_EMPTY modified!\n");
6275     VARCMP(I4,1,UI1,1,VARCMP_EQ);
6276     VARCMP(I2,2,I2,2,VARCMP_EQ);
6277     VARCMP(I2,1,I2,2,VARCMP_LT);
6278     VARCMP(I2,2,I2,1,VARCMP_GT);
6279     VARCMP(I2,2,EMPTY,1,VARCMP_GT);
6280     VARCMP(I2,2,NULL_,1,VARCMP_NULL);
6281
6282     /* BSTR handling, especially in conjunction with VT_RESERVED */
6283     VARCMP(BSTR,bstr0,NULL_,0,VARCMP_NULL);
6284     VARCMP(BSTR,bstr0,BSTR,bstr0,VARCMP_EQ);
6285     VARCMP(BSTR,bstrempty,BSTR,bstr0,VARCMP_LT);
6286     VARCMP(BSTR,bstr7,BSTR,bstr0,VARCMP_GT);
6287     VARCMP(BSTR,bstr7,BSTR,bstr1neg,VARCMP_GT);
6288     VARCMP(BSTR,bstr0,BSTR,NULL,VARCMP_GT);
6289     VARCMP(BSTR,NULL,BSTR,NULL,VARCMP_EQ);
6290     VARCMP(BSTR,bstrempty,BSTR,NULL,VARCMP_EQ);
6291     VARCMP(BSTR,NULL,EMPTY,0,VARCMP_EQ);
6292     VARCMP(EMPTY,0,BSTR,NULL,VARCMP_EQ);
6293     VARCMP(EMPTY,0,BSTR,bstrempty,VARCMP_EQ);
6294     VARCMP(EMPTY,1,BSTR,bstrempty,VARCMP_EQ);
6295     VARCMP(BSTR,bstr0,EMPTY,0,VARCMP_GT);
6296     VARCMP(BSTR,bstr42,EMPTY,0,VARCMP_GT);
6297     VARCMPEX(BSTR,bstrempty,UI1,0,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6298     VARCMPEX(BSTR,bstrempty,I2,-1,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6299     VARCMPEX(I4,0,BSTR,bstrempty,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6300     VARCMPEX(BSTR,NULL,UI1,0,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6301     VARCMPEX(I4,7,BSTR,NULL,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6302     _VARCMP(BSTR,(BSTR)100,0,I2,100,0,lcid,0,VARCMP_GT);
6303     VARCMPEX(BSTR,bstr0,UI1,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6304     VARCMPEX(I2,0,BSTR,bstr0,VARCMP_LT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6305     VARCMP(BSTR,bstrhuh,I4,I4_MAX,VARCMP_GT);
6306     VARCMP(BSTR,bstr2cents,I4,2,VARCMP_GT);
6307     VARCMPEX(BSTR,bstr2cents,I4,42,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6308     VARCMP(BSTR,bstr2cents,I4,-1,VARCMP_GT);
6309     VARCMPEX(BSTR,bstr2cents,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6310     VARCMPEX(BSTR,bstr0,I2,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6311     VARCMPEX(BSTR,bstr0,I4,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6312     VARCMPEX(BSTR,bstr0,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6313     VARCMP(BSTR,bstr1,I4,0,VARCMP_GT);
6314     VARCMPEX(BSTR,bstr1,I4,1,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6315     VARCMPEX(BSTR,bstr1,I4,I4_MAX,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_GT);
6316     VARCMPEX(BSTR,bstr1,I4,-1,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6317     VARCMP(BSTR,bstr7,I4,1,VARCMP_GT);
6318     VARCMPEX(BSTR,bstr7,I4,7,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6319     VARCMPEX(BSTR,bstr7,I4,42,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_GT);
6320     VARCMPEX(BSTR,bstr42,I4,7,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6321     VARCMPEX(BSTR,bstr42,I4,42,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6322     VARCMPEX(BSTR,bstr42,I4,I4_MAX,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_GT);
6323     VARCMPEX(BSTR,bstr1neg,I4,1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6324     VARCMPEX(BSTR,bstr1neg,I4,42,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_LT);
6325     VARCMPEX(BSTR,bstr1neg,I4,-1,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6326     VARCMPEX(BSTR,bstr1neg,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6327     VARCMPEX(BSTR,bstr666neg,I4,1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6328     VARCMPEX(BSTR,bstr666neg,I4,7,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_LT);
6329     VARCMPEX(BSTR,bstr666neg,I4,42,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6330     VARCMPEX(BSTR,bstr666neg,I4,I4_MAX,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6331     VARCMPEX(BSTR,bstr666neg,I4,-1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6332     VARCMPEX(BSTR,bstr666neg,I4,-666,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6333     VARCMPEX(BSTR,bstr7,R8,7.0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6334     VARCMPEX(R8,3.141592,BSTR,NULL,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6335     VARCMP(BSTR,bstr7,BSTR,bstr7,VARCMP_EQ);
6336     VARCMP(BSTR,bstr7,BSTR,bstr42,VARCMP_GT);
6337     VARCMP(BSTR,bstr42,BSTR,bstr7,VARCMP_LT);
6338
6339     /* DECIMAL handling */
6340     setdec(&dec,0,0,0,0);
6341     VARCMPEX(DECIMAL,dec,BSTR,bstr0,VARCMP_LT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6342     setdec64(&dec,0,0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF); /* max DECIMAL */
6343     VARCMP(DECIMAL,dec,R8,R8_MAX,VARCMP_LT);    /* R8 has bigger range */
6344     VARCMP(DECIMAL,dec,DATE,R8_MAX,VARCMP_LT);  /* DATE has bigger range */
6345     setdec64(&dec,0,0x80,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
6346     VARCMP(DECIMAL,dec,R8,-R8_MAX,VARCMP_GT);
6347     setdec64(&dec,20,0,0x5,0x6BC75E2D,0x63100001);    /* 1+1e-20 */
6348     VARCMP(DECIMAL,dec,R8,1,VARCMP_GT); /* DECIMAL has higher precision */
6349
6350     /* Show that DATE is handled just as a R8 */
6351     VARCMP(DATE,DATE_MAX,DATE,DATE_MAX+1,VARCMP_LT);
6352     VARCMP(DATE,DATE_MIN,DATE,DATE_MIN-1,VARCMP_GT);
6353     VARCMP(DATE,R8_MIN,R8,R8_MIN,VARCMP_EQ);
6354     VARCMP(DATE,1,DATE,1+1e-15,VARCMP_LT);      /* 1e-15 == 8.64e-11 seconds */
6355     VARCMP(DATE,25570.0,DATE,25570.0,VARCMP_EQ);
6356     VARCMP(DATE,25570.0,DATE,25571.0,VARCMP_LT);
6357     VARCMP(DATE,25571.0,DATE,25570.0,VARCMP_GT);
6358     VARCMP(DATE,25570.0,EMPTY,0,VARCMP_GT);
6359     VARCMP(DATE,25570.0,NULL_,0,VARCMP_NULL);
6360
6361     /* R4 precision handling */
6362     VARCMP(R4,1,R8,1+1e-8,VARCMP_EQ);
6363     VARCMP(R8,1+1e-8,R4,1,VARCMP_EQ);
6364     VARCMP(R8,1+1e-8,R8,1,VARCMP_GT);
6365     VARCMP(R8,R4_MAX*1.1,R4,R4_MAX,VARCMP_GT);
6366     VARCMP(R4,R4_MAX,R8,R8_MAX,VARCMP_LT);
6367     VARCMP(R4,1,DATE,1+1e-8,VARCMP_EQ);
6368     VARCMP(R4,1,BSTR,bstr1few,VARCMP_LT); /* bstr1few == 1+1e-8 */
6369     setdec(&dec,8,0,0,0x5F5E101);         /* 1+1e-8 */
6370     VARCMP(R4,1,DECIMAL,dec,VARCMP_LT);
6371
6372     SysFreeString(bstrhuh);
6373     SysFreeString(bstrempty);
6374     SysFreeString(bstr0);
6375     SysFreeString(bstr1);
6376     SysFreeString(bstr7);
6377     SysFreeString(bstr42);
6378     SysFreeString(bstr1neg);
6379     SysFreeString(bstr666neg);
6380     SysFreeString(bstr2cents);
6381     SysFreeString(bstr1few);
6382 }
6383
6384 static HRESULT (WINAPI *pVarPow)(LPVARIANT,LPVARIANT,LPVARIANT);
6385
6386 #define VARPOW(vt1,val1,vt2,val2,rvt,rval)               \
6387         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
6388         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6389         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
6390         test_var_call2( __LINE__, pVarPow, &left, &right, &exp )
6391
6392 /* Skip any type that is not defined or produces an error for every case */
6393 #define SKIPTESTPOW(a)                            \
6394     if (a == VT_ERROR || a == VT_VARIANT ||       \
6395         a == VT_DISPATCH || a == VT_UNKNOWN ||    \
6396         a == VT_RECORD || a > VT_UINT ||          \
6397         a == 15 /*not defined*/)                  \
6398         continue
6399
6400 static void test_VarPow(void)
6401 {
6402     static const WCHAR str2[] = { '2','\0' };
6403     static const WCHAR str3[] = { '3','\0' };
6404     VARIANT left, right, exp, result, cy, dec;
6405     BSTR num2_str, num3_str;
6406     VARTYPE i;
6407     HRESULT hres;
6408
6409     CHECKPTR(VarPow);
6410
6411     num2_str = SysAllocString(str2);
6412     num3_str = SysAllocString(str3);
6413
6414     /* Test all possible flag/vt combinations & the resulting vt type */
6415     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6416     {
6417         VARTYPE leftvt, rightvt, resvt;
6418
6419         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6420         {
6421             SKIPTESTPOW(leftvt);
6422
6423             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6424             {
6425                 BOOL bFail = FALSE;
6426                 SKIPTESTPOW(rightvt);
6427
6428                 /* Native crashes with VT_BYREF */
6429                 if (ExtraFlags[i] == VT_BYREF)
6430                     continue;
6431
6432                 memset(&left, 0, sizeof(left));
6433                 memset(&right, 0, sizeof(right));
6434                 V_VT(&left) = leftvt | ExtraFlags[i];
6435                 V_VT(&right) = rightvt | ExtraFlags[i];
6436                 V_VT(&result) = VT_EMPTY;
6437                 resvt = VT_EMPTY;
6438
6439                 if (leftvt == VT_BSTR)
6440                     V_BSTR(&left) = num2_str;
6441                 if (rightvt == VT_BSTR)
6442                     V_BSTR(&right) = num2_str;
6443
6444                 /* Native VarPow always returns an error when using extra flags */
6445                 if (ExtraFlags[i] != 0)
6446                     bFail = TRUE;
6447
6448                 /* Determine return type */
6449                 else if ((leftvt == VT_NULL || rightvt == VT_NULL) &&
6450                          ((leftvt != VT_I8 && leftvt != VT_UI8 &&
6451                            rightvt != VT_I8 && rightvt != VT_UI8) || HAVE_OLEAUT32_I8))
6452                     resvt = VT_NULL;
6453                 else if ((leftvt == VT_EMPTY || leftvt == VT_I2 ||
6454                     leftvt == VT_I4 || leftvt == VT_R4 ||
6455                     leftvt == VT_R8 || leftvt == VT_CY ||
6456                     leftvt == VT_DATE || leftvt == VT_BSTR ||
6457                     leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
6458                     (leftvt >= VT_I1 && leftvt <= VT_UI4) ||
6459                     (HAVE_OLEAUT32_I8 && (leftvt == VT_I8 || leftvt == VT_UI8)) ||
6460                     leftvt == VT_INT || leftvt == VT_UINT) &&
6461                     (rightvt == VT_EMPTY || rightvt == VT_I2 ||
6462                     rightvt == VT_I4 || rightvt == VT_R4 ||
6463                     rightvt == VT_R8 || rightvt == VT_CY ||
6464                     rightvt == VT_DATE || rightvt == VT_BSTR ||
6465                     rightvt == VT_BOOL || rightvt == VT_DECIMAL ||
6466                     (rightvt >= VT_I1 && rightvt <= VT_UI4) ||
6467                     (HAVE_OLEAUT32_I8 && (rightvt == VT_I8 || rightvt == VT_UI8)) ||
6468                     rightvt == VT_INT || rightvt == VT_UINT))
6469                     resvt = VT_R8;
6470                 else
6471                     bFail = TRUE;
6472
6473                 hres = pVarPow(&left, &right, &result);
6474
6475                 /* Check expected HRESULT and if result variant type is correct */
6476                 if (bFail)
6477                     ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
6478                         "VarPow: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
6479                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
6480                         vtstr(V_VT(&result)), hres);
6481                 else
6482                     ok (hres == S_OK && resvt == V_VT(&result),
6483                         "VarPow: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
6484                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
6485                         S_OK, vtstr(V_VT(&result)), hres);
6486             }
6487         }
6488     }
6489
6490     /* Check return values for valid variant type combinations */
6491     VARPOW(EMPTY,0,EMPTY,0,R8,1.0);
6492     VARPOW(EMPTY,0,NULL,0,NULL,0);
6493     VARPOW(EMPTY,0,I2,3,R8,0.0);
6494     VARPOW(EMPTY,0,I4,3,R8,0.0);
6495     VARPOW(EMPTY,0,R4,3.0f,R8,0.0);
6496     VARPOW(EMPTY,0,R8,3.0,R8,0.0);
6497     VARPOW(EMPTY,0,DATE,3,R8,0.0);
6498     VARPOW(EMPTY,0,BSTR,num3_str,R8,0.0);
6499     VARPOW(EMPTY,0,BOOL,VARIANT_FALSE,R8,1.0);
6500     VARPOW(EMPTY,0,I1,3,R8,0.0);
6501     VARPOW(EMPTY,0,UI1,3,R8,0.0);
6502     VARPOW(EMPTY,0,UI2,3,R8,0.0);
6503     VARPOW(EMPTY,0,UI4,3,R8,0.0);
6504     if (HAVE_OLEAUT32_I8)
6505     {
6506         VARPOW(EMPTY,0,I8,3,R8,0.0);
6507         VARPOW(EMPTY,0,UI8,3,R8,0.0);
6508     }
6509     VARPOW(EMPTY,0,INT,3,R8,0.0);
6510     VARPOW(EMPTY,0,UINT,3,R8,0.0);
6511     VARPOW(NULL,0,EMPTY,0,NULL,0);
6512     VARPOW(NULL,0,NULL,0,NULL,0);
6513     VARPOW(NULL,0,I2,3,NULL,0);
6514     VARPOW(NULL,0,I4,3,NULL,0);
6515     VARPOW(NULL,0,R4,3.0f,NULL,0);
6516     VARPOW(NULL,0,R8,3.0,NULL,0);
6517     VARPOW(NULL,0,DATE,3,NULL,0);
6518     VARPOW(NULL,0,BSTR,num3_str,NULL,0);
6519     VARPOW(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
6520     VARPOW(NULL,0,I1,3,NULL,0);
6521     VARPOW(NULL,0,UI1,3,NULL,0);
6522     VARPOW(NULL,0,UI2,3,NULL,0);
6523     VARPOW(NULL,0,UI4,3,NULL,0);
6524     if (HAVE_OLEAUT32_I8)
6525     {
6526         VARPOW(NULL,0,I8,3,NULL,0);
6527         VARPOW(NULL,0,UI8,3,NULL,0);
6528     }
6529     VARPOW(NULL,0,INT,3,NULL,0);
6530     VARPOW(NULL,0,UINT,3,NULL,0);
6531     VARPOW(I2,2,EMPTY,0,R8,1.0);
6532     VARPOW(I2,2,NULL,0,NULL,0);
6533     VARPOW(I2,2,I2,3,R8,8.0);
6534     VARPOW(I2,2,I4,3,R8,8.0);
6535     VARPOW(I2,2,R4,3.0f,R8,8.0);
6536     VARPOW(I2,2,R8,3.0,R8,8.0);
6537     VARPOW(I2,2,DATE,3,R8,8.0);
6538     VARPOW(I2,2,BSTR,num3_str,R8,8.0);
6539     VARPOW(I2,2,BOOL,VARIANT_FALSE,R8,1.0);
6540     VARPOW(I2,2,I1,3,R8,8.0);
6541     VARPOW(I2,2,UI1,3,R8,8.0);
6542     VARPOW(I2,2,UI2,3,R8,8.0);
6543     VARPOW(I2,2,UI4,3,R8,8.0);
6544     if (HAVE_OLEAUT32_I8)
6545     {
6546         VARPOW(I2,2,I8,3,R8,8.0);
6547         VARPOW(I2,2,UI8,3,R8,8.0);
6548     }
6549     VARPOW(I2,2,INT,3,R8,8.0);
6550     VARPOW(I2,2,UINT,3,R8,8.0);
6551     VARPOW(I4,2,EMPTY,0,R8,1.0);
6552     VARPOW(I4,2,NULL,0,NULL,0);
6553     VARPOW(I4,2,I2,3,R8,8.0);
6554     VARPOW(I4,2,I4,3,R8,8.0);
6555     VARPOW(I4,2,R4,3.0f,R8,8.0);
6556     VARPOW(I4,2,R8,3.0,R8,8.0);
6557     VARPOW(I4,2,DATE,3,R8,8.0);
6558     VARPOW(I4,2,BSTR,num3_str,R8,8.0);
6559     VARPOW(I4,2,BOOL,VARIANT_FALSE,R8,1.0);
6560     VARPOW(I4,2,I1,3,R8,8.0);
6561     VARPOW(I4,2,UI1,3,R8,8.0);
6562     VARPOW(I4,2,UI2,3,R8,8.0);
6563     VARPOW(I4,2,UI4,3,R8,8.0);
6564     if (HAVE_OLEAUT32_I8)
6565     {
6566         VARPOW(I4,2,I8,3,R8,8.0);
6567         VARPOW(I4,2,UI8,3,R8,8.0);
6568     }
6569     VARPOW(I4,2,INT,3,R8,8.0);
6570     VARPOW(I4,2,UINT,3,R8,8.0);
6571     VARPOW(R4,2,EMPTY,0,R8,1.0);
6572     VARPOW(R4,2,NULL,0,NULL,0);
6573     VARPOW(R4,2,I2,3,R8,8.0);
6574     VARPOW(R4,2,I4,3,R8,8.0);
6575     VARPOW(R4,2,R4,3.0f,R8,8.0);
6576     VARPOW(R4,2,R8,3.0,R8,8.0);
6577     VARPOW(R4,2,DATE,3,R8,8.0);
6578     VARPOW(R4,2,BSTR,num3_str,R8,8.0);
6579     VARPOW(R4,2,BOOL,VARIANT_FALSE,R8,1.0);
6580     VARPOW(R4,2,I1,3,R8,8.0);
6581     VARPOW(R4,2,UI1,3,R8,8.0);
6582     VARPOW(R4,2,UI2,3,R8,8.0);
6583     VARPOW(R4,2,UI4,3,R8,8.0);
6584     if (HAVE_OLEAUT32_I8)
6585     {
6586         VARPOW(R4,2,I8,3,R8,8.0);
6587         VARPOW(R4,2,UI8,3,R8,8.0);
6588     }
6589     VARPOW(R4,2,INT,3,R8,8.0);
6590     VARPOW(R4,2,UINT,3,R8,8.0);
6591     VARPOW(R8,2,EMPTY,0,R8,1.0);
6592     VARPOW(R8,2,NULL,0,NULL,0);
6593     VARPOW(R8,2,I2,3,R8,8.0);
6594     VARPOW(R8,2,I4,3,R8,8.0);
6595     VARPOW(R8,2,R4,3.0f,R8,8.0);
6596     VARPOW(R8,2,R8,3.0,R8,8.0);
6597     VARPOW(R8,2,DATE,3,R8,8.0);
6598     VARPOW(R8,2,BSTR,num3_str,R8,8.0);
6599     VARPOW(R8,2,BOOL,VARIANT_FALSE,R8,1.0);
6600     VARPOW(R8,2,I1,3,R8,8.0);
6601     VARPOW(R8,2,UI1,3,R8,8.0);
6602     VARPOW(R8,2,UI2,3,R8,8.0);
6603     VARPOW(R8,2,UI4,3,R8,8.0);
6604     if (HAVE_OLEAUT32_I8)
6605     {
6606         VARPOW(R8,2,I8,3,R8,8.0);
6607         VARPOW(R8,2,UI8,3,R8,8.0);
6608     }
6609     VARPOW(R8,2,INT,3,R8,8.0);
6610     VARPOW(R8,2,UINT,3,R8,8.0);
6611     VARPOW(DATE,2,EMPTY,0,R8,1.0);
6612     VARPOW(DATE,2,NULL,0,NULL,0);
6613     VARPOW(DATE,2,I2,3,R8,8.0);
6614     VARPOW(DATE,2,I4,3,R8,8.0);
6615     VARPOW(DATE,2,R4,3.0f,R8,8.0);
6616     VARPOW(DATE,2,R8,3.0,R8,8.0);
6617     VARPOW(DATE,2,DATE,3,R8,8.0);
6618     VARPOW(DATE,2,BSTR,num3_str,R8,8.0);
6619     VARPOW(DATE,2,BOOL,VARIANT_FALSE,R8,1.0);
6620     VARPOW(DATE,2,I1,3,R8,8.0);
6621     VARPOW(DATE,2,UI1,3,R8,8.0);
6622     VARPOW(DATE,2,UI2,3,R8,8.0);
6623     VARPOW(DATE,2,UI4,3,R8,8.0);
6624     if (HAVE_OLEAUT32_I8)
6625     {
6626         VARPOW(DATE,2,I8,3,R8,8.0);
6627         VARPOW(DATE,2,UI8,3,R8,8.0);
6628     }
6629     VARPOW(DATE,2,INT,3,R8,8.0);
6630     VARPOW(DATE,2,UINT,3,R8,8.0);
6631     VARPOW(BSTR,num2_str,EMPTY,0,R8,1.0);
6632     VARPOW(BSTR,num2_str,NULL,0,NULL,0);
6633     VARPOW(BSTR,num2_str,I2,3,R8,8.0);
6634     VARPOW(BSTR,num2_str,I4,3,R8,8.0);
6635     VARPOW(BSTR,num2_str,R4,3.0f,R8,8.0);
6636     VARPOW(BSTR,num2_str,R8,3.0,R8,8.0);
6637     VARPOW(BSTR,num2_str,DATE,3,R8,8.0);
6638     VARPOW(BSTR,num2_str,BSTR,num3_str,R8,8.0);
6639     VARPOW(BSTR,num2_str,BOOL,VARIANT_FALSE,R8,1.0);
6640     VARPOW(BSTR,num2_str,I1,3,R8,8.0);
6641     VARPOW(BSTR,num2_str,UI1,3,R8,8.0);
6642     VARPOW(BSTR,num2_str,UI2,3,R8,8.0);
6643     VARPOW(BSTR,num2_str,UI4,3,R8,8.0);
6644     if (HAVE_OLEAUT32_I8)
6645     {
6646         VARPOW(BSTR,num2_str,I8,3,R8,8.0);
6647         VARPOW(BSTR,num2_str,UI8,3,R8,8.0);
6648     }
6649     VARPOW(BSTR,num2_str,INT,3,R8,8.0);
6650     VARPOW(BSTR,num2_str,UINT,3,R8,8.0);
6651     VARPOW(BOOL,VARIANT_TRUE,EMPTY,0,R8,1.0);
6652     VARPOW(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
6653     VARPOW(BOOL,VARIANT_TRUE,I2,3,R8,-1.0);
6654     VARPOW(BOOL,VARIANT_TRUE,I4,3,R8,-1.0);
6655     VARPOW(BOOL,VARIANT_TRUE,R4,3.0f,R8,-1.0);
6656     VARPOW(BOOL,VARIANT_TRUE,R8,3.0,R8,-1.0);
6657     VARPOW(BOOL,VARIANT_TRUE,DATE,3,R8,-1.0);
6658     VARPOW(BOOL,VARIANT_TRUE,BSTR,num3_str,R8,-1.0);
6659     VARPOW(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,-1.0);
6660     VARPOW(BOOL,VARIANT_TRUE,I1,3,R8,-1.0);
6661     VARPOW(BOOL,VARIANT_TRUE,UI1,3,R8,-1.0);
6662     VARPOW(BOOL,VARIANT_TRUE,UI2,3,R8,-1.0);
6663     VARPOW(BOOL,VARIANT_TRUE,UI4,3,R8,-1.0);
6664     if (HAVE_OLEAUT32_I8)
6665     {
6666         VARPOW(BOOL,VARIANT_TRUE,I8,3,R8,-1.0);
6667         VARPOW(BOOL,VARIANT_TRUE,UI8,3,R8,-1.0);
6668     }
6669     VARPOW(BOOL,VARIANT_TRUE,INT,3,R8,-1.0);
6670     VARPOW(BOOL,VARIANT_TRUE,UINT,3,R8,-1.0);
6671     VARPOW(I1,2,EMPTY,0,R8,1.0);
6672     VARPOW(I1,2,NULL,0,NULL,0);
6673     VARPOW(I1,2,I2,3,R8,8.0);
6674     VARPOW(I1,2,I4,3,R8,8.0);
6675     VARPOW(I1,2,R4,3.0f,R8,8.0);
6676     VARPOW(I1,2,R8,3.0,R8,8.0);
6677     VARPOW(I1,2,DATE,3,R8,8.0);
6678     VARPOW(I1,2,BSTR,num3_str,R8,8.0);
6679     VARPOW(I1,2,BOOL,VARIANT_FALSE,R8,1.0);
6680     VARPOW(I1,2,I1,3,R8,8.0);
6681     VARPOW(I1,2,UI1,3,R8,8.0);
6682     VARPOW(I1,2,UI2,3,R8,8.0);
6683     VARPOW(I1,2,UI4,3,R8,8.0);
6684     if (HAVE_OLEAUT32_I8)
6685     {
6686         VARPOW(I1,2,I8,3,R8,8.0);
6687         VARPOW(I1,2,UI8,3,R8,8.0);
6688     }
6689     VARPOW(I1,2,INT,3,R8,8.0);
6690     VARPOW(I1,2,UINT,3,R8,8.0);
6691     VARPOW(UI1,2,EMPTY,0,R8,1.0);
6692     VARPOW(UI1,2,NULL,0,NULL,0);
6693     VARPOW(UI1,2,I2,3,R8,8.0);
6694     VARPOW(UI1,2,I4,3,R8,8.0);
6695     VARPOW(UI1,2,R4,3.0f,R8,8.0);
6696     VARPOW(UI1,2,R8,3.0,R8,8.0);
6697     VARPOW(UI1,2,DATE,3,R8,8.0);
6698     VARPOW(UI1,2,BSTR,num3_str,R8,8.0);
6699     VARPOW(UI1,2,BOOL,VARIANT_FALSE,R8,1.0);
6700     VARPOW(UI1,2,I1,3,R8,8.0);
6701     VARPOW(UI1,2,UI1,3,R8,8.0);
6702     VARPOW(UI1,2,UI2,3,R8,8.0);
6703     VARPOW(UI1,2,UI4,3,R8,8.0);
6704     if (HAVE_OLEAUT32_I8)
6705     {
6706         VARPOW(UI1,2,I8,3,R8,8.0);
6707         VARPOW(UI1,2,UI8,3,R8,8.0);
6708     }
6709     VARPOW(UI1,2,INT,3,R8,8.0);
6710     VARPOW(UI1,2,UINT,3,R8,8.0);
6711     VARPOW(UI2,2,EMPTY,0,R8,1.0);
6712     VARPOW(UI2,2,NULL,0,NULL,0);
6713     VARPOW(UI2,2,I2,3,R8,8.0);
6714     VARPOW(UI2,2,I4,3,R8,8.0);
6715     VARPOW(UI2,2,R4,3.0f,R8,8.0);
6716     VARPOW(UI2,2,R8,3.0,R8,8.0);
6717     VARPOW(UI2,2,DATE,3,R8,8.0);
6718     VARPOW(UI2,2,BSTR,num3_str,R8,8.0);
6719     VARPOW(UI2,2,BOOL,VARIANT_FALSE,R8,1.0);
6720     VARPOW(UI2,2,I1,3,R8,8.0);
6721     VARPOW(UI2,2,UI1,3,R8,8.0);
6722     VARPOW(UI2,2,UI2,3,R8,8.0);
6723     VARPOW(UI2,2,UI4,3,R8,8.0);
6724     if (HAVE_OLEAUT32_I8)
6725     {
6726         VARPOW(UI2,2,I8,3,R8,8.0);
6727         VARPOW(UI2,2,UI8,3,R8,8.0);
6728     }
6729     VARPOW(UI2,2,INT,3,R8,8.0);
6730     VARPOW(UI2,2,UINT,3,R8,8.0);
6731     VARPOW(UI4,2,EMPTY,0,R8,1.0);
6732     VARPOW(UI4,2,NULL,0,NULL,0);
6733     VARPOW(UI4,2,I2,3,R8,8.0);
6734     VARPOW(UI4,2,I4,3,R8,8.0);
6735     VARPOW(UI4,2,R4,3.0f,R8,8.0);
6736     VARPOW(UI4,2,R8,3.0,R8,8.0);
6737     VARPOW(UI4,2,DATE,3,R8,8.0);
6738     VARPOW(UI4,2,BSTR,num3_str,R8,8.0);
6739     VARPOW(UI4,2,BOOL,VARIANT_FALSE,R8,1.0);
6740     VARPOW(UI4,2,I1,3,R8,8.0);
6741     VARPOW(UI4,2,UI1,3,R8,8.0);
6742     VARPOW(UI4,2,UI2,3,R8,8.0);
6743     VARPOW(UI4,2,UI4,3,R8,8.0);
6744     if (HAVE_OLEAUT32_I8)
6745     {
6746         VARPOW(UI4,2,I8,3,R8,8.0);
6747         VARPOW(UI4,2,UI8,3,R8,8.0);
6748     }
6749     VARPOW(UI4,2,INT,3,R8,8.0);
6750     VARPOW(UI4,2,UINT,3,R8,8.0);
6751     if (HAVE_OLEAUT32_I8)
6752     {
6753         VARPOW(I8,2,EMPTY,0,R8,1.0);
6754         VARPOW(I8,2,NULL,0,NULL,0);
6755         VARPOW(I8,2,I2,3,R8,8.0);
6756         VARPOW(I8,2,I4,3,R8,8.0);
6757         VARPOW(I8,2,R4,3.0f,R8,8.0);
6758         VARPOW(I8,2,R8,3.0,R8,8.0);
6759         VARPOW(I8,2,DATE,3,R8,8.0);
6760         VARPOW(I8,2,BSTR,num3_str,R8,8.0);
6761         VARPOW(I8,2,BOOL,VARIANT_FALSE,R8,1.0);
6762         VARPOW(I8,2,I1,3,R8,8.0);
6763         VARPOW(I8,2,UI1,3,R8,8.0);
6764         VARPOW(I8,2,UI2,3,R8,8.0);
6765         VARPOW(I8,2,UI4,3,R8,8.0);
6766         VARPOW(I8,2,I8,3,R8,8.0);
6767         VARPOW(I8,2,UI8,3,R8,8.0);
6768         VARPOW(I8,2,INT,3,R8,8.0);
6769         VARPOW(I8,2,UINT,3,R8,8.0);
6770         VARPOW(UI8,2,EMPTY,0,R8,1.0);
6771         VARPOW(UI8,2,NULL,0,NULL,0);
6772         VARPOW(UI8,2,I2,3,R8,8.0);
6773         VARPOW(UI8,2,I4,3,R8,8.0);
6774         VARPOW(UI8,2,R4,3.0f,R8,8.0);
6775         VARPOW(UI8,2,R8,3.0,R8,8.0);
6776         VARPOW(UI8,2,DATE,3,R8,8.0);
6777         VARPOW(UI8,2,BSTR,num3_str,R8,8.0);
6778         VARPOW(UI8,2,I1,3,R8,8.0);
6779         VARPOW(UI8,2,UI1,3,R8,8.0);
6780         VARPOW(UI8,2,UI2,3,R8,8.0);
6781         VARPOW(UI8,2,UI4,3,R8,8.0);
6782         VARPOW(UI8,2,I8,3,R8,8.0);
6783         VARPOW(UI8,2,UI8,3,R8,8.0);
6784         VARPOW(UI8,2,INT,3,R8,8.0);
6785         VARPOW(UI8,2,UINT,3,R8,8.0);
6786     }
6787     VARPOW(INT,2,EMPTY,0,R8,1.0);
6788     VARPOW(INT,2,NULL,0,NULL,0);
6789     VARPOW(INT,2,I2,3,R8,8.0);
6790     VARPOW(INT,2,I4,3,R8,8.0);
6791     VARPOW(INT,2,R4,3.0f,R8,8.0);
6792     VARPOW(INT,2,R8,3.0,R8,8.0);
6793     VARPOW(INT,2,DATE,3,R8,8.0);
6794     VARPOW(INT,2,BSTR,num3_str,R8,8.0);
6795     VARPOW(INT,2,BOOL,VARIANT_FALSE,R8,1.0);
6796     VARPOW(INT,2,I1,3,R8,8.0);
6797     VARPOW(INT,2,UI1,3,R8,8.0);
6798     VARPOW(INT,2,UI2,3,R8,8.0);
6799     VARPOW(INT,2,UI4,3,R8,8.0);
6800     if (HAVE_OLEAUT32_I8)
6801     {
6802         VARPOW(INT,2,I8,3,R8,8.0);
6803         VARPOW(INT,2,UI8,3,R8,8.0);
6804     }
6805     VARPOW(INT,2,INT,3,R8,8.0);
6806     VARPOW(INT,2,UINT,3,R8,8.0);
6807     VARPOW(UINT,2,EMPTY,0,R8,1.0);
6808     VARPOW(UINT,2,NULL,0,NULL,0);
6809     VARPOW(UINT,2,I2,3,R8,8.0);
6810     VARPOW(UINT,2,I4,3,R8,8.0);
6811     VARPOW(UINT,2,R4,3.0f,R8,8.0);
6812     VARPOW(UINT,2,R8,3.0,R8,8.0);
6813     VARPOW(UINT,2,DATE,3,R8,8.0);
6814     VARPOW(UINT,2,BSTR,num3_str,R8,8.0);
6815     VARPOW(UINT,2,BOOL,VARIANT_FALSE,R8,1.0);
6816     VARPOW(UINT,2,I1,3,R8,8.0);
6817     VARPOW(UINT,2,UI1,3,R8,8.0);
6818     VARPOW(UINT,2,UI2,3,R8,8.0);
6819     VARPOW(UINT,2,UI4,3,R8,8.0);
6820     if (HAVE_OLEAUT32_I8)
6821     {
6822         VARPOW(UINT,2,I8,3,R8,8.0);
6823         VARPOW(UINT,2,UI8,3,R8,8.0);
6824     }
6825     VARPOW(UINT,2,INT,3,R8,8.0);
6826     VARPOW(UINT,2,UINT,3,R8,8.0);
6827
6828     /* Manually test some VT_CY, VT_DECIMAL variants */
6829     V_VT(&cy) = VT_CY;
6830     hres = VarCyFromI4(2, &V_CY(&cy));
6831     ok(hres == S_OK, "VarCyFromI4 failed!\n");
6832     V_VT(&dec) = VT_DECIMAL;
6833     hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
6834     ok(hres == S_OK, "VarDecFromR4 failed!\n");
6835     memset(&left, 0, sizeof(left));
6836     memset(&right, 0, sizeof(right));
6837     V_VT(&left) = VT_I4;
6838     V_I4(&left) = 100;
6839     V_VT(&right) = VT_I8;
6840     V_UI1(&right) = 2;
6841
6842     hres = pVarPow(&cy, &cy, &result);
6843     ok(hres == S_OK && V_VT(&result) == VT_R8,
6844         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6845         S_OK, hres, vtstr(V_VT(&result)));
6846     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6847         "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
6848
6849     hres = pVarPow(&cy, &right, &result);
6850     ok(hres == S_OK && V_VT(&result) == VT_R8,
6851         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6852         S_OK, hres, vtstr(V_VT(&result)));
6853     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6854         "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
6855
6856     hres = pVarPow(&left, &cy, &result);
6857     ok(hres == S_OK && V_VT(&result) == VT_R8,
6858         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6859         S_OK, hres, vtstr(V_VT(&result)));
6860     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 10000.0),
6861         "VARPOW: CY value %f, expected %f\n", V_R8(&result), 10000.0);
6862
6863     hres = pVarPow(&left, &dec, &result);
6864     ok(hres == S_OK && V_VT(&result) == VT_R8,
6865         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6866         S_OK, hres, vtstr(V_VT(&result)));
6867     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result),10000.0),
6868         "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 10000.0);
6869
6870     hres = pVarPow(&dec, &dec, &result);
6871     ok(hres == S_OK && V_VT(&result) == VT_R8,
6872         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6873         S_OK, hres, vtstr(V_VT(&result)));
6874     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6875         "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
6876
6877     hres = pVarPow(&dec, &right, &result);
6878     ok(hres == S_OK && V_VT(&result) == VT_R8,
6879         "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6880         S_OK, hres, vtstr(V_VT(&result)));
6881     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6882         "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
6883
6884     SysFreeString(num2_str);
6885     SysFreeString(num3_str);
6886 }
6887
6888 static HRESULT (WINAPI *pVarDiv)(LPVARIANT,LPVARIANT,LPVARIANT);
6889
6890 #define VARDIV(vt1,val1,vt2,val2,rvt,rval)               \
6891         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
6892         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6893         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
6894         test_var_call2( __LINE__, pVarDiv, &left, &right, &exp )
6895
6896 /* Skip any type that is not defined or produces an error for every case */
6897 #define SKIPTESTDIV(a)                            \
6898     if (a == VT_ERROR || a == VT_VARIANT ||       \
6899         a == VT_DISPATCH || a == VT_UNKNOWN ||    \
6900         a == VT_RECORD || a > VT_UINT ||          \
6901         a == VT_I1 || a == VT_UI8 ||              \
6902         a == VT_INT || a == VT_UINT ||            \
6903         a == VT_UI2 || a == VT_UI4 ||             \
6904         a == 15 /*not defined*/)                  \
6905         continue
6906
6907 static void test_VarDiv(void)
6908 {
6909     static const WCHAR str1[] = { '1','\0' };
6910     static const WCHAR str2[] = { '2','\0' };
6911     VARIANT left, right, exp, result, cy, dec;
6912     BSTR num1_str, num2_str;
6913     VARTYPE i;
6914     HRESULT hres, expectedhres;
6915     double r;
6916
6917     num1_str = SysAllocString(str1);
6918     num2_str = SysAllocString(str2);
6919
6920     CHECKPTR(VarDiv);
6921
6922     /* Test all possible flag/vt combinations & the resulting vt type */
6923     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6924     {
6925         VARTYPE leftvt, rightvt, resvt;
6926
6927         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6928         {
6929             SKIPTESTDIV(leftvt);
6930
6931             /* Check if we need/have support for I8 */
6932             if (leftvt == VT_I8 && !HAVE_OLEAUT32_I8)
6933                 continue;
6934
6935             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6936             {
6937                 BOOL bFail = FALSE;
6938                 SKIPTESTDIV(rightvt);
6939
6940                 /* Check if we need/have support for I8 */
6941                 if (rightvt == VT_I8 && !HAVE_OLEAUT32_I8)
6942                     continue;
6943
6944                 /* Native crashes with VT_BYREF */
6945                 if (ExtraFlags[i] == VT_BYREF)
6946                     continue;
6947
6948                 memset(&left, 0, sizeof(left));
6949                 memset(&right, 0, sizeof(right));
6950                 V_VT(&left) = leftvt | ExtraFlags[i];
6951                 V_VT(&right) = rightvt | ExtraFlags[i];
6952                 V_VT(&result) = VT_EMPTY;
6953                 resvt = VT_EMPTY;
6954                 expectedhres = S_OK;
6955
6956                 if (leftvt == VT_BSTR)
6957                     V_BSTR(&left) = num2_str;
6958                 else if (leftvt == VT_DECIMAL)
6959                 {
6960                     VarDecFromR8(2.0, &V_DECIMAL(&left));
6961                     V_VT(&left) = leftvt | ExtraFlags[i];
6962                 }
6963
6964                 /* Division by 0 is undefined */
6965                 switch(rightvt)
6966                 {
6967                 case VT_BSTR:
6968                     V_BSTR(&right) = num2_str;
6969                     break;
6970                 case VT_DECIMAL:
6971                     VarDecFromR8(2.0, &V_DECIMAL(&right));
6972                     V_VT(&right) = rightvt | ExtraFlags[i];
6973                     break;
6974                 case VT_BOOL:
6975                     V_BOOL(&right) = VARIANT_TRUE;
6976                     break;
6977                 case VT_I2: V_I2(&right) = 2; break;
6978                 case VT_I4: V_I4(&right) = 2; break;
6979                 case VT_R4: V_R4(&right) = 2.0f; break;
6980                 case VT_R8: V_R8(&right) = 2.0; break;
6981                 case VT_CY: V_CY(&right).int64 = 2; break;
6982                 case VT_DATE: V_DATE(&right) = 2; break;
6983                 case VT_UI1: V_UI1(&right) = 2; break;
6984                 case VT_I8: V_I8(&right) = 2; break;
6985                 default: break;
6986                 }
6987
6988                 /* Determine return type */
6989                 if (!(rightvt == VT_EMPTY))
6990                 {
6991                     if (leftvt == VT_NULL || rightvt == VT_NULL)
6992                         resvt = VT_NULL;
6993                     else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
6994                         resvt = VT_DECIMAL;
6995                     else if (leftvt == VT_I8 || rightvt == VT_I8 ||
6996                         leftvt == VT_CY || rightvt == VT_CY ||
6997                         leftvt == VT_DATE || rightvt == VT_DATE ||
6998                         leftvt == VT_I4 || rightvt == VT_I4 ||
6999                         leftvt == VT_BSTR || rightvt == VT_BSTR ||
7000                         leftvt == VT_I2 || rightvt == VT_I2 ||
7001                         leftvt == VT_BOOL || rightvt == VT_BOOL ||
7002                         leftvt == VT_R8 || rightvt == VT_R8 ||
7003                         leftvt == VT_UI1 || rightvt == VT_UI1)
7004                     {
7005                         if ((leftvt == VT_UI1 && rightvt == VT_R4) ||
7006                             (leftvt == VT_R4 && rightvt == VT_UI1))
7007                             resvt = VT_R4;
7008                         else if ((leftvt == VT_R4 && (rightvt == VT_BOOL ||
7009                             rightvt == VT_I2)) || (rightvt == VT_R4 &&
7010                             (leftvt == VT_BOOL || leftvt == VT_I2)))
7011                             resvt = VT_R4;
7012                         else
7013                             resvt = VT_R8;
7014                     }
7015                     else if (leftvt == VT_R4 || rightvt == VT_R4)
7016                         resvt = VT_R4;
7017                 }
7018                 else if (leftvt == VT_NULL && rightvt == VT_EMPTY)
7019                     resvt = VT_NULL;
7020                 else
7021                     bFail = TRUE;
7022
7023                 /* Native VarDiv always returns an error when using extra flags */
7024                 if (ExtraFlags[i] != 0)
7025                     bFail = TRUE;
7026
7027                 hres = pVarDiv(&left, &right, &result);
7028
7029                 /* Check expected HRESULT and if result variant type is correct */
7030                 if (bFail)
7031                     ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH ||
7032                         hres == DISP_E_OVERFLOW || hres == DISP_E_DIVBYZERO,
7033                         "VarDiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7034                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7035                         vtstr(V_VT(&result)), hres);
7036                 else
7037                     ok (hres == S_OK && resvt == V_VT(&result),
7038                         "VarDiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7039                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7040                         S_OK, vtstr(V_VT(&result)), hres);
7041             }
7042         }
7043     }
7044
7045     /* Test return values for all the good cases */
7046     VARDIV(EMPTY,0,NULL,0,NULL,0);
7047     VARDIV(EMPTY,0,I2,2,R8,0.0);
7048     VARDIV(EMPTY,0,I4,2,R8,0.0);
7049     VARDIV(EMPTY,0,R4,2.0f,R4,0.0f);
7050     VARDIV(EMPTY,0,R8,2.0,R8,0.0);
7051     VARDIV(EMPTY,0,DATE,2.0,R8,0.0);
7052     VARDIV(EMPTY,0,BSTR,num2_str,R8,0.0);
7053     VARDIV(EMPTY,0,BOOL,VARIANT_TRUE,R8,0.0);
7054     VARDIV(EMPTY,0,UI1,2,R8,0.0);
7055     if (HAVE_OLEAUT32_I8)
7056     {
7057         VARDIV(EMPTY,0,I8,2,R8,0.0);
7058     }
7059     VARDIV(NULL,0,EMPTY,0,NULL,0);
7060     VARDIV(NULL,0,NULL,0,NULL,0);
7061     VARDIV(NULL,0,I2,2,NULL,0);
7062     VARDIV(NULL,0,I4,2,NULL,0);
7063     VARDIV(NULL,0,R4,2.0f,NULL,0);
7064     VARDIV(NULL,0,R8,2.0,NULL,0);
7065     VARDIV(NULL,0,DATE,2,NULL,0);
7066     VARDIV(NULL,0,BSTR,num2_str,NULL,0);
7067     VARDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
7068     VARDIV(NULL,0,UI1,2,NULL,0);
7069     if (HAVE_OLEAUT32_I8)
7070     {
7071         VARDIV(NULL,0,I8,2,NULL,0);
7072     }
7073     VARDIV(I2,2,NULL,0,NULL,0);
7074     VARDIV(I2,1,I2,2,R8,0.5);
7075     VARDIV(I2,1,I4,2,R8,0.5);
7076     VARDIV(I2,1,R4,2,R4,0.5f);
7077     VARDIV(I2,1,R8,2.0,R8,0.5);
7078     VARDIV(I2,1,DATE,2,R8,0.5);
7079     VARDIV(I2,1,BOOL,VARIANT_TRUE,R8,-1.0);
7080     VARDIV(I2,1,UI1,2,R8,0.5);
7081     if (HAVE_OLEAUT32_I8)
7082     {
7083         VARDIV(I2,1,I8,2,R8,0.5);
7084     }
7085     VARDIV(I4,1,NULL,0,NULL,0);
7086     VARDIV(I4,1,I2,2,R8,0.5);
7087     VARDIV(I4,1,I4,2,R8,0.5);
7088     VARDIV(I4,1,R4,2.0f,R8,0.5);
7089     VARDIV(I4,1,R8,2.0,R8,0.5);
7090     VARDIV(I4,1,DATE,2,R8,0.5);
7091     VARDIV(I4,1,BSTR,num2_str,R8,0.5);
7092     VARDIV(I4,1,BOOL,VARIANT_TRUE,R8,-1.0);
7093     VARDIV(I4,1,UI1,2,R8,0.5);
7094     if (HAVE_OLEAUT32_I8)
7095     {
7096         VARDIV(I4,1,I8,2,R8,0.5);
7097     }
7098     VARDIV(R4,1.0f,NULL,0,NULL,0);
7099     VARDIV(R4,1.0f,I2,2,R4,0.5f);
7100     VARDIV(R4,1.0f,I4,2,R8,0.5);
7101     VARDIV(R4,1.0f,R4,2.0f,R4,0.5f);
7102     VARDIV(R4,1.0f,R8,2.0,R8,0.5);
7103     VARDIV(R4,1.0f,DATE,2,R8,0.5);
7104     VARDIV(R4,1.0f,BSTR,num2_str,R8,0.5);
7105     VARDIV(R4,1.0f,BOOL,VARIANT_TRUE,R4,-1);
7106     VARDIV(R4,1.0f,UI1,2,R4,0.5f);
7107     if (HAVE_OLEAUT32_I8)
7108     {
7109         VARDIV(R4,1.0f,I8,2,R8,0.5);
7110     }
7111     VARDIV(R8,1.0,NULL,0,NULL,0);
7112     VARDIV(R8,1.0,I2,2,R8,0.5);
7113     VARDIV(R8,1.0,I4,2,R8,0.5);
7114     VARDIV(R8,1.0,R4,2.0f,R8,0.5);
7115     VARDIV(R8,1.0,R8,2.0,R8,0.5);
7116     VARDIV(R8,1.0,DATE,2,R8,0.5);
7117     VARDIV(R8,1.0,BSTR,num2_str,R8,0.5);
7118     VARDIV(R8,1.0,BOOL,VARIANT_TRUE,R8,-1.0);
7119     VARDIV(R8,1.0,UI1,2,R8,0.5);
7120     if (HAVE_OLEAUT32_I8)
7121     {
7122         VARDIV(R8,1.0,I8,2,R8,0.5);
7123     }
7124     VARDIV(DATE,1,NULL,0,NULL,0);
7125     VARDIV(DATE,1,I2,2,R8,0.5);
7126     VARDIV(DATE,1,I4,2,R8,0.5);
7127     VARDIV(DATE,1,R4,2.0f,R8,0.5);
7128     VARDIV(DATE,1,R8,2.0,R8,0.5);
7129     VARDIV(DATE,1,DATE,2,R8,0.5);
7130     VARDIV(DATE,1,BSTR,num2_str,R8,0.5);
7131     VARDIV(DATE,1,BOOL,VARIANT_TRUE,R8,-1.0);
7132     VARDIV(DATE,1,UI1,2,R8,0.5);
7133     if (HAVE_OLEAUT32_I8)
7134     {
7135         VARDIV(DATE,1,I8,2,R8,0.5);
7136     }
7137     VARDIV(BSTR,num1_str,NULL,0,NULL,0);
7138     VARDIV(BSTR,num1_str,I2,2,R8,0.5);
7139     VARDIV(BSTR,num1_str,I4,2,R8,0.5);
7140     VARDIV(BSTR,num1_str,R4,2.0f,R8,0.5);
7141     VARDIV(BSTR,num1_str,R8,2.0,R8,0.5);
7142     VARDIV(BSTR,num1_str,DATE,2,R8,0.5);
7143     VARDIV(BSTR,num1_str,BSTR,num2_str,R8,0.5);
7144     VARDIV(BSTR,num1_str,BOOL,VARIANT_TRUE,R8,-1);
7145     VARDIV(BSTR,num1_str,UI1,2,R8,0.5);
7146     if (HAVE_OLEAUT32_I8)
7147     {
7148         VARDIV(BSTR,num1_str,I8,2,R8,0.5);
7149     }
7150     VARDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
7151     VARDIV(BOOL,VARIANT_TRUE,I2,1,R8,-1.0);
7152     VARDIV(BOOL,VARIANT_FALSE,I2,1,R8,0.0);
7153     VARDIV(BOOL,VARIANT_TRUE,I4,1,R8,-1.0);
7154     VARDIV(BOOL,VARIANT_FALSE,I4,1,R8,0.0);
7155     VARDIV(BOOL,VARIANT_TRUE,R4,1,R4,-1.0f);
7156     VARDIV(BOOL,VARIANT_FALSE,R4,1,R4,0.0f);
7157     VARDIV(BOOL,VARIANT_TRUE,R8,1.0,R8,-1.0);
7158     VARDIV(BOOL,VARIANT_FALSE,R8,1.0,R8,0.0);
7159     VARDIV(BOOL,VARIANT_FALSE,DATE,2,R8,0.0);
7160     VARDIV(BOOL,VARIANT_FALSE,BSTR,num2_str,R8,0.0);
7161     VARDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,1.0);
7162     VARDIV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,R8,0.0);
7163     VARDIV(BOOL,VARIANT_TRUE,UI1,1,R8,-1.0);
7164     if (HAVE_OLEAUT32_I8)
7165     {
7166         VARDIV(BOOL,VARIANT_TRUE,I8,1,R8,-1.0);
7167     }
7168     VARDIV(UI1,1,NULL,0,NULL,0);
7169     VARDIV(UI1,1,I2,2,R8,0.5);
7170     VARDIV(UI1,1,I4,2,R8,0.5);
7171     VARDIV(UI1,1,R4,2.0f,R4,0.5f);
7172     VARDIV(UI1,1,R8,2.0,R8,0.5);
7173     VARDIV(UI1,1,DATE,2,R8,0.5);
7174     VARDIV(UI1,1,BSTR,num2_str,R8,0.5);
7175     VARDIV(UI1,1,BOOL,VARIANT_TRUE,R8,-1);
7176     VARDIV(UI1,1,UI1,2,R8,0.5);
7177     if (HAVE_OLEAUT32_I8)
7178     {
7179         VARDIV(UI1,1,I8,2,R8,0.5);
7180         VARDIV(I8,1,NULL,0,NULL,0);
7181         VARDIV(I8,1,I2,2,R8,0.5);
7182         VARDIV(I8,1,I4,2,R8,0.5);
7183         VARDIV(I8,1,R4,2.0f,R8,0.5);
7184         VARDIV(I8,1,R8,2.0,R8,0.5);
7185         VARDIV(I8,1,DATE,2,R8,0.5);
7186         VARDIV(I8,1,BSTR,num2_str,R8,0.5);
7187         VARDIV(I8,1,BOOL,VARIANT_TRUE,R8,-1);
7188         VARDIV(I8,1,UI1,2,R8,0.5);
7189         VARDIV(I8,1,I8,2,R8,0.5);
7190     }
7191
7192     /* Manually test some VT_CY, VT_DECIMAL variants */
7193     V_VT(&cy) = VT_CY;
7194     hres = VarCyFromI4(10000, &V_CY(&cy));
7195     ok(hres == S_OK, "VarCyFromI4 failed!\n");
7196     V_VT(&dec) = VT_DECIMAL;
7197     hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
7198     ok(hres == S_OK, "VarDecFromR4 failed!\n");
7199     memset(&left, 0, sizeof(left));
7200     memset(&right, 0, sizeof(right));
7201     V_VT(&left) = VT_I4;
7202     V_I4(&left) = 100;
7203     V_VT(&right) = VT_UI1;
7204     V_UI1(&right) = 2;
7205
7206     hres = pVarDiv(&cy, &cy, &result);
7207     ok(hres == S_OK && V_VT(&result) == VT_R8,
7208         "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7209     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 1.0),
7210         "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)1.0);
7211
7212     hres = pVarDiv(&cy, &right, &result);
7213     ok(hres == S_OK && V_VT(&result) == VT_R8,
7214         "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7215     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 5000.0),
7216         "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)5000.0);
7217
7218     hres = pVarDiv(&left, &cy, &result);
7219     ok(hres == S_OK && V_VT(&result) == VT_R8,
7220         "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7221     ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0.01),
7222         "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)0.01);
7223
7224     hres = pVarDiv(&left, &dec, &result);
7225     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7226         "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7227     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7228     ok(hres == S_OK && EQ_DOUBLE(r, 50.0),
7229         "VARDIV: DECIMAL value %f, expected %f\n", r, (double)50.0);
7230
7231     hres = pVarDiv(&dec, &dec, &result);
7232     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7233         "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7234     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7235     ok(hres == S_OK && EQ_DOUBLE(r, 1.0),
7236         "VARDIV: DECIMAL value %f, expected %f\n", r, (double)1.0);
7237
7238     hres = pVarDiv(&dec, &right, &result);
7239     ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7240         "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7241     hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7242     ok(hres == S_OK && EQ_DOUBLE(r, 1.0),
7243         "VARDIV: DECIMAL value %f, expected %f\n", r, (double)1.0);
7244
7245     /* Check for division by zero and overflow */
7246     V_VT(&left) = VT_R8;
7247     V_I4(&left) = 1;
7248     V_VT(&right) = VT_R8;
7249     V_I4(&right) = 0;
7250     hres = pVarDiv(&left, &right, &result);
7251     ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7252         "VARDIV: Division by (1.0/0.0) should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7253
7254     V_VT(&left) = VT_R8;
7255     V_I4(&left) = 0;
7256     V_VT(&right) = VT_R8;
7257     V_I4(&right) = 0;
7258     hres = pVarDiv(&left, &right, &result);
7259     ok(hres == DISP_E_OVERFLOW && V_VT(&result) == VT_EMPTY,
7260         "VARDIV: Division by (0.0/0.0) should result in DISP_E_OVERFLOW but got 0x%X\n", hres);
7261
7262     SysFreeString(num1_str);
7263     SysFreeString(num2_str);
7264 }
7265
7266 static HRESULT (WINAPI *pVarIdiv)(LPVARIANT,LPVARIANT,LPVARIANT);
7267
7268 #define VARIDIV(vt1,val1,vt2,val2,rvt,rval)              \
7269         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
7270         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
7271         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
7272         test_var_call2( __LINE__, pVarIdiv, &left, &right, &exp )
7273
7274 /* Skip any type that is not defined or produces an error for every case */
7275 #define SKIPTESTIDIV(a)                           \
7276     if (a == VT_ERROR || a == VT_VARIANT ||       \
7277         a == VT_DISPATCH || a == VT_UNKNOWN ||    \
7278         a == VT_RECORD || a > VT_UINT ||          \
7279         a == 15 /*not defined*/)                  \
7280         continue
7281
7282 static void test_VarIdiv(void)
7283 {
7284     static const WCHAR str1[] = { '1','\0' };
7285     static const WCHAR str2[] = { '2','\0' };
7286     VARIANT left, right, exp, result, cy, dec;
7287     BSTR num1_str, num2_str;
7288     VARTYPE i;
7289     HRESULT hres;
7290
7291     CHECKPTR(VarIdiv);
7292
7293     num1_str = SysAllocString(str1);
7294     num2_str = SysAllocString(str2);
7295
7296     /* Test all possible flag/vt combinations & the resulting vt type */
7297     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
7298     {
7299         VARTYPE leftvt, rightvt, resvt;
7300
7301         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7302         {
7303             SKIPTESTIDIV(leftvt);
7304
7305             /* Check if we need/have support for I8 and/or UI8 */
7306             if ((leftvt == VT_I8 || leftvt == VT_UI8) && !HAVE_OLEAUT32_I8)
7307                 continue;
7308
7309             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7310             {
7311                 BOOL bFail = FALSE;
7312                 SKIPTESTIDIV(rightvt);
7313
7314                 /* Native crashes with extra flag VT_BYREF */
7315                 if (ExtraFlags[i] == VT_BYREF)
7316                     continue;
7317
7318                 /* Check if we need/have support for I8 and/or UI8 */
7319                 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !HAVE_OLEAUT32_I8)
7320                     continue;
7321
7322                 memset(&left, 0, sizeof(left));
7323                 memset(&right, 0, sizeof(right));
7324                 V_VT(&left) = leftvt | ExtraFlags[i];
7325                 V_VT(&right) = rightvt | ExtraFlags[i];
7326                 V_VT(&result) = VT_EMPTY;
7327                 resvt = VT_EMPTY;
7328
7329                 if (leftvt == VT_BSTR)
7330                     V_BSTR(&left) = num2_str;
7331                 else if (leftvt == VT_DECIMAL)
7332                 {
7333                     VarDecFromR8(2.0, &V_DECIMAL(&left));
7334                     V_VT(&left) = leftvt | ExtraFlags[i];
7335                 }
7336
7337                 /* Division by 0 is undefined */
7338                 switch(rightvt)
7339                 {
7340                 case VT_BSTR:
7341                     V_BSTR(&right) = num2_str;
7342                     break;
7343                 case VT_DECIMAL:
7344                     VarDecFromR8(2.0, &V_DECIMAL(&right));
7345                     V_VT(&right) = rightvt | ExtraFlags[i];
7346                     break;
7347                 case VT_BOOL:
7348                     V_BOOL(&right) = VARIANT_TRUE;
7349                     break;
7350                 case VT_CY:
7351                     VarCyFromI4(10000, &V_CY(&right));
7352                     V_VT(&right) = rightvt | ExtraFlags[i];
7353                     break;
7354                 case VT_I2: V_I2(&right) = 2; break;
7355                 case VT_I4: V_I4(&right) = 2; break;
7356                 case VT_R4: V_R4(&right) = 2.0f; break;
7357                 case VT_R8: V_R8(&right) = 2.0; break;
7358                 case VT_DATE: V_DATE(&right) = 2; break;
7359                 case VT_I1: V_I1(&right) = 2; break;
7360                 case VT_UI1: V_UI1(&right) = 2; break;
7361                 case VT_UI2: V_UI2(&right) = 2; break;
7362                 case VT_UI4: V_UI4(&right) = 2; break;
7363                 case VT_I8: V_I8(&right) = 2; break;
7364                 case VT_UI8: V_UI8(&right) = 2; break;
7365                 case VT_INT: V_INT(&right) = 2; break;
7366                 case VT_UINT: V_UINT(&right) = 2; break;
7367                 default: break;
7368                 }
7369
7370                 /* Native VarIdiv always returns an error when using extra
7371                  * flags or if the variant combination is I8 and INT.
7372                  */
7373                 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
7374                     (leftvt == VT_INT && rightvt == VT_I8) ||
7375                     (rightvt == VT_EMPTY && leftvt != VT_NULL) ||
7376                     ExtraFlags[i] != 0)
7377                     bFail = TRUE;
7378
7379                 /* Determine variant type */
7380                 else if (leftvt == VT_NULL || rightvt == VT_NULL)
7381                     resvt = VT_NULL;
7382                 else if (leftvt == VT_I8 || rightvt == VT_I8)
7383                     resvt = VT_I8;
7384                 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
7385                     leftvt == VT_INT || rightvt == VT_INT ||
7386                     leftvt == VT_UINT || rightvt == VT_UINT ||
7387                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
7388                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
7389                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
7390                     leftvt == VT_I1 || rightvt == VT_I1 ||
7391                     leftvt == VT_BSTR || rightvt == VT_BSTR ||
7392                     leftvt == VT_DATE || rightvt == VT_DATE ||
7393                     leftvt == VT_CY || rightvt == VT_CY ||
7394                     leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
7395                     leftvt == VT_R8 || rightvt == VT_R8 ||
7396                     leftvt == VT_R4 || rightvt == VT_R4)
7397                     resvt = VT_I4;
7398                 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
7399                     leftvt == VT_BOOL || rightvt == VT_BOOL ||
7400                     leftvt == VT_EMPTY)
7401                     resvt = VT_I2;
7402                 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
7403                     resvt = VT_UI1;
7404                 else
7405                     bFail = TRUE;
7406
7407                 hres = pVarIdiv(&left, &right, &result);
7408
7409                 /* Check expected HRESULT and if result variant type is correct */
7410                 if (bFail)
7411                     ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH ||
7412                         hres == DISP_E_DIVBYZERO,
7413                         "VarIdiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7414                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7415                         vtstr(V_VT(&result)), hres);
7416                 else
7417                     ok (hres == S_OK && resvt == V_VT(&result),
7418                         "VarIdiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7419                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7420                         S_OK, vtstr(V_VT(&result)), hres);
7421             }
7422         }
7423     }
7424
7425     /* Test return values for all the good cases */
7426     VARIDIV(EMPTY,0,NULL,0,NULL,0);
7427     VARIDIV(EMPTY,0,I2,1,I2,0);
7428     VARIDIV(EMPTY,0,I4,1,I4,0);
7429     VARIDIV(EMPTY,0,R4,1.0f,I4,0);
7430     VARIDIV(EMPTY,0,R8,1.0,I4,0);
7431     VARIDIV(EMPTY,0,DATE,1.0,I4,0);
7432     VARIDIV(EMPTY,0,BSTR,num1_str,I4,0);
7433     VARIDIV(EMPTY,0,BOOL,VARIANT_TRUE,I2,0);
7434     VARIDIV(EMPTY,0,I1,1,I4,0);
7435     VARIDIV(EMPTY,0,UI1,1,I2,0);
7436     VARIDIV(EMPTY,0,UI2,1,I4,0);
7437     VARIDIV(EMPTY,0,UI4,1,I4,0);
7438     if (HAVE_OLEAUT32_I8)
7439     {
7440         VARIDIV(EMPTY,0,I8,1,I8,0);
7441         VARIDIV(EMPTY,0,UI8,1,I4,0);
7442     }
7443     VARIDIV(EMPTY,0,INT,1,I4,0);
7444     VARIDIV(EMPTY,0,UINT,1,I4,0);
7445     VARIDIV(NULL,0,EMPTY,0,NULL,0);
7446     VARIDIV(NULL,0,NULL,0,NULL,0);
7447     VARIDIV(NULL,0,I2,1,NULL,0);
7448     VARIDIV(NULL,0,I4,1,NULL,0);
7449     VARIDIV(NULL,0,R4,1,NULL,0);
7450     VARIDIV(NULL,0,R8,1,NULL,0);
7451     VARIDIV(NULL,0,DATE,1,NULL,0);
7452     VARIDIV(NULL,0,BSTR,num1_str,NULL,0);
7453     VARIDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
7454     VARIDIV(NULL,0,I1,1,NULL,0);
7455     VARIDIV(NULL,0,UI1,1,NULL,0);
7456     VARIDIV(NULL,0,UI2,1,NULL,0);
7457     VARIDIV(NULL,0,UI4,1,NULL,0);
7458     if (HAVE_OLEAUT32_I8)
7459     {
7460         VARIDIV(NULL,0,I8,1,NULL,0);
7461         VARIDIV(NULL,0,UI8,1,NULL,0);
7462     }
7463     VARIDIV(NULL,0,INT,1,NULL,0);
7464     VARIDIV(NULL,0,UINT,1,NULL,0);
7465     VARIDIV(I2,2,NULL,0,NULL,0);
7466     VARIDIV(I2,2,I2,1,I2,2);
7467     VARIDIV(I2,2,I4,1,I4,2);
7468     VARIDIV(I2,2,R4,1,I4,2);
7469     VARIDIV(I2,2,R8,1,I4,2);
7470     VARIDIV(I2,2,DATE,1,I4,2);
7471     VARIDIV(I2,2,BSTR,num1_str,I4,2);
7472     VARIDIV(I2,2,BOOL,VARIANT_TRUE,I2,-2);
7473     VARIDIV(I2,2,I1,1,I4,2);
7474     VARIDIV(I2,2,UI1,1,I2,2);
7475     VARIDIV(I2,2,UI2,1,I4,2);
7476     VARIDIV(I2,2,UI4,1,I4,2);
7477     if (HAVE_OLEAUT32_I8)
7478     {
7479         VARIDIV(I2,2,I8,1,I8,2);
7480         VARIDIV(I2,2,UI8,1,I4,2);
7481     }
7482     VARIDIV(I2,2,INT,1,I4,2);
7483     VARIDIV(I2,2,UINT,1,I4,2);
7484     VARIDIV(I4,2,NULL,0,NULL,0);
7485     VARIDIV(I4,2,I2,1,I4,2);
7486     VARIDIV(I4,2,I4,1,I4,2);
7487     VARIDIV(I4,2,R4,1,I4,2);
7488     VARIDIV(I4,2,R8,1,I4,2);
7489     VARIDIV(I4,2,DATE,1,I4,2);
7490     VARIDIV(I4,2,BSTR,num1_str,I4,2);
7491     VARIDIV(I4,2,BOOL,VARIANT_TRUE,I4,-2);
7492     VARIDIV(I4,2,I1,1,I4,2);
7493     VARIDIV(I4,2,UI1,1,I4,2);
7494     VARIDIV(I4,2,UI2,1,I4,2);
7495     VARIDIV(I4,2,UI4,1,I4,2);
7496     if (HAVE_OLEAUT32_I8)
7497     {
7498         VARIDIV(I4,2,I8,1,I8,2);
7499         VARIDIV(I4,2,UI8,1,I4,2);
7500     }
7501     VARIDIV(I4,2,INT,1,I4,2);
7502     VARIDIV(I4,2,UINT,1,I4,2);
7503     VARIDIV(R4,2.0f,NULL,0,NULL,0);
7504     VARIDIV(R4,2.0f,I2,1,I4,2);
7505     VARIDIV(R4,2.0f,I4,1,I4,2);
7506     VARIDIV(R4,2.0f,R4,1.0f,I4,2);
7507     VARIDIV(R4,2.0f,R8,1.0,I4,2);
7508     VARIDIV(R4,2.0f,DATE,1,I4,2);
7509     VARIDIV(R4,2.0f,BSTR,num1_str,I4,2);
7510     VARIDIV(R4,2.0f,BOOL,VARIANT_TRUE,I4,-2);
7511     VARIDIV(R4,2.0f,I1,1,I4,2);
7512     VARIDIV(R4,2.0f,UI1,1,I4,2);
7513     VARIDIV(R4,2.0f,UI2,1,I4,2);
7514     VARIDIV(R4,2.0f,UI4,1,I4,2);
7515     if (HAVE_OLEAUT32_I8)
7516     {
7517         VARIDIV(R4,2.0f,I8,1,I8,2);
7518         VARIDIV(R4,2.0f,UI8,1,I4,2);
7519     }
7520     VARIDIV(R4,2.0f,INT,1,I4,2);
7521     VARIDIV(R4,2.0f,UINT,1,I4,2);
7522     VARIDIV(R8,2.0,NULL,0,NULL,0);
7523     VARIDIV(R8,2.0,I2,1,I4,2);
7524     VARIDIV(R8,2.0,I4,1,I4,2);
7525     VARIDIV(R8,2.0,R4,1,I4,2);
7526     VARIDIV(R8,2.0,R8,1,I4,2);
7527     VARIDIV(R8,2.0,DATE,1,I4,2);
7528     VARIDIV(R8,2.0,BSTR,num1_str,I4,2);
7529     VARIDIV(R8,2.0,BOOL,VARIANT_TRUE,I4,-2);
7530     VARIDIV(R8,2.0,I1,1,I4,2);
7531     VARIDIV(R8,2.0,UI1,1,I4,2);
7532     VARIDIV(R8,2.0,UI2,1,I4,2);
7533     VARIDIV(R8,2.0,UI4,1,I4,2);
7534     if (HAVE_OLEAUT32_I8)
7535     {
7536         VARIDIV(R8,2.0,I8,1,I8,2);
7537         VARIDIV(R8,2.0,UI8,1,I4,2);
7538     }
7539     VARIDIV(R8,2.0,INT,1,I4,2);
7540     VARIDIV(R8,2.0,UINT,1,I4,2);
7541     VARIDIV(DATE,2,NULL,0,NULL,0);
7542     VARIDIV(DATE,2,I2,1,I4,2);
7543     VARIDIV(DATE,2,I4,1,I4,2);
7544     VARIDIV(DATE,2,R4,1,I4,2);
7545     VARIDIV(DATE,2,R8,1,I4,2);
7546     VARIDIV(DATE,2,DATE,1,I4,2);
7547     VARIDIV(DATE,2,BSTR,num1_str,I4,2);
7548     VARIDIV(DATE,2,BOOL,VARIANT_TRUE,I4,-2);
7549     VARIDIV(DATE,2,I1,1,I4,2);
7550     VARIDIV(DATE,2,UI1,1,I4,2);
7551     VARIDIV(DATE,2,UI2,1,I4,2);
7552     VARIDIV(DATE,2,UI4,1,I4,2);
7553     if (HAVE_OLEAUT32_I8)
7554     {
7555         VARIDIV(DATE,2,I8,1,I8,2);
7556         VARIDIV(DATE,2,UI8,1,I4,2);
7557     }
7558     VARIDIV(DATE,2,INT,1,I4,2);
7559     VARIDIV(DATE,2,UINT,1,I4,2);
7560     VARIDIV(BSTR,num2_str,NULL,0,NULL,0);
7561     VARIDIV(BSTR,num2_str,I2,1,I4,2);
7562     VARIDIV(BSTR,num2_str,I4,1,I4,2);
7563     VARIDIV(BSTR,num2_str,R4,1.0f,I4,2);
7564     VARIDIV(BSTR,num2_str,R8,1.0,I4,2);
7565     VARIDIV(BSTR,num2_str,DATE,1,I4,2);
7566     VARIDIV(BSTR,num2_str,BSTR,num1_str,I4,2);
7567     VARIDIV(BSTR,num2_str,BOOL,VARIANT_TRUE,I4,-2);
7568     VARIDIV(BSTR,num2_str,I1,1,I4,2);
7569     VARIDIV(BSTR,num2_str,UI1,1,I4,2);
7570     VARIDIV(BSTR,num2_str,UI2,1,I4,2);
7571     VARIDIV(BSTR,num2_str,UI4,1,I4,2);
7572     if (HAVE_OLEAUT32_I8)
7573     {
7574         VARIDIV(BSTR,num2_str,I8,1,I8,2);
7575         VARIDIV(BSTR,num2_str,UI8,1,I4,2);
7576     }
7577     VARIDIV(BSTR,num2_str,INT,1,I4,2);
7578     VARIDIV(BSTR,num2_str,UINT,1,I4,2);
7579     VARIDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
7580     VARIDIV(BOOL,VARIANT_TRUE,I2,1,I2,-1);
7581     VARIDIV(BOOL,VARIANT_TRUE,I4,1,I4,-1);
7582     VARIDIV(BOOL,VARIANT_TRUE,R4,1.0f,I4,-1);
7583     VARIDIV(BOOL,VARIANT_TRUE,R8,1.0,I4,-1);
7584     VARIDIV(BOOL,VARIANT_TRUE,DATE,1,I4,-1);
7585     VARIDIV(BOOL,VARIANT_TRUE,BSTR,num1_str,I4,-1);
7586     VARIDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,I2,1);
7587     VARIDIV(BOOL,VARIANT_TRUE,I1,1,I4,-1);
7588     VARIDIV(BOOL,VARIANT_TRUE,UI1,1,I2,-1);
7589     VARIDIV(BOOL,VARIANT_TRUE,UI2,1,I4,-1);
7590     VARIDIV(BOOL,VARIANT_TRUE,UI4,1,I4,-1);
7591     if (HAVE_OLEAUT32_I8)
7592     {
7593         VARIDIV(BOOL,VARIANT_TRUE,I8,1,I8,-1);
7594         VARIDIV(BOOL,VARIANT_TRUE,UI8,1,I4,-1);
7595     }
7596     VARIDIV(BOOL,VARIANT_TRUE,INT,1,I4,-1);
7597     VARIDIV(BOOL,VARIANT_TRUE,UINT,1,I4,-1);
7598     VARIDIV(I1,2,NULL,0,NULL,0);
7599     VARIDIV(I1,2,I2,1,I4,2);
7600     VARIDIV(I1,2,I4,1,I4,2);
7601     VARIDIV(I1,2,R4,1.0f,I4,2);
7602     VARIDIV(I1,2,R8,1.0,I4,2);
7603     VARIDIV(I1,2,DATE,1,I4,2);
7604     VARIDIV(I1,2,BSTR,num1_str,I4,2);
7605     VARIDIV(I1,2,BOOL,VARIANT_TRUE,I4,-2);
7606     VARIDIV(I1,2,I1,1,I4,2);
7607     VARIDIV(I1,2,UI1,1,I4,2);
7608     VARIDIV(I1,2,UI2,1,I4,2);
7609     VARIDIV(I1,2,UI4,1,I4,2);
7610     if (HAVE_OLEAUT32_I8)
7611     {
7612         VARIDIV(I1,2,I8,1,I8,2);
7613         VARIDIV(I1,2,UI8,1,I4,2);
7614     }
7615     VARIDIV(I1,2,INT,1,I4,2);
7616     VARIDIV(I1,2,UINT,1,I4,2);
7617     VARIDIV(UI1,2,NULL,0,NULL,0);
7618     VARIDIV(UI1,2,I2,1,I2,2);
7619     VARIDIV(UI1,2,I4,1,I4,2);
7620     VARIDIV(UI1,2,R4,1.0f,I4,2);
7621     VARIDIV(UI1,2,R8,1.0,I4,2);
7622     VARIDIV(UI1,2,DATE,1,I4,2);
7623     VARIDIV(UI1,2,BSTR,num1_str,I4,2);
7624     VARIDIV(UI1,2,BOOL,VARIANT_TRUE,I2,-2);
7625     VARIDIV(UI1,2,I1,1,I4,2);
7626     VARIDIV(UI1,2,UI1,1,UI1,2);
7627     VARIDIV(UI1,2,UI2,1,I4,2);
7628     VARIDIV(UI1,2,UI4,1,I4,2);
7629     if (HAVE_OLEAUT32_I8)
7630     {
7631         VARIDIV(UI1,2,I8,1,I8,2);
7632         VARIDIV(UI1,2,UI8,1,I4,2);
7633     }
7634     VARIDIV(UI1,2,INT,1,I4,2);
7635     VARIDIV(UI1,2,UINT,1,I4,2);
7636     VARIDIV(UI2,2,NULL,0,NULL,0);
7637     VARIDIV(UI2,2,I2,1,I4,2);
7638     VARIDIV(UI2,2,I4,1,I4,2);
7639     VARIDIV(UI2,2,R4,1.0f,I4,2);
7640     VARIDIV(UI2,2,R8,1.0,I4,2);
7641     VARIDIV(UI2,2,DATE,1,I4,2);
7642     VARIDIV(UI2,2,BSTR,num1_str,I4,2);
7643     VARIDIV(UI2,2,BOOL,VARIANT_TRUE,I4,-2);
7644     VARIDIV(UI2,2,I1,1,I4,2);
7645     VARIDIV(UI2,2,UI1,1,I4,2);
7646     VARIDIV(UI2,2,UI2,1,I4,2);
7647     VARIDIV(UI2,2,UI4,1,I4,2);
7648     if (HAVE_OLEAUT32_I8)
7649     {
7650         VARIDIV(UI2,2,I8,1,I8,2);
7651         VARIDIV(UI2,2,UI8,1,I4,2);
7652     }
7653     VARIDIV(UI2,2,INT,1,I4,2);
7654     VARIDIV(UI2,2,UINT,1,I4,2);
7655     VARIDIV(UI4,2,NULL,0,NULL,0);
7656     VARIDIV(UI4,2,I2,1,I4,2);
7657     VARIDIV(UI4,2,I4,1,I4,2);
7658     VARIDIV(UI4,2,R4,1.0f,I4,2);
7659     VARIDIV(UI4,2,R8,1.0,I4,2);
7660     VARIDIV(UI4,2,DATE,1,I4,2);
7661     VARIDIV(UI4,2,BSTR,num1_str,I4,2);
7662     VARIDIV(UI4,2,BOOL,VARIANT_TRUE,I4,-2);
7663     VARIDIV(UI4,2,I1,1,I4,2);
7664     VARIDIV(UI4,2,UI1,1,I4,2);
7665     VARIDIV(UI4,2,UI2,1,I4,2);
7666     VARIDIV(UI4,2,UI4,1,I4,2);
7667     if (HAVE_OLEAUT32_I8)
7668     {
7669         VARIDIV(UI4,2,I8,1,I8,2);
7670         VARIDIV(UI4,2,UI8,1,I4,2);
7671     }
7672     VARIDIV(UI4,2,INT,1,I4,2);
7673     VARIDIV(UI4,2,UINT,1,I4,2);
7674     if (HAVE_OLEAUT32_I8)
7675     {
7676         VARIDIV(I8,2,NULL,0,NULL,0);
7677         VARIDIV(I8,2,I2,1,I8,2);
7678         VARIDIV(I8,2,I4,1,I8,2);
7679         VARIDIV(I8,2,R4,1.0f,I8,2);
7680         VARIDIV(I8,2,R8,1.0,I8,2);
7681         VARIDIV(I8,2,DATE,1,I8,2);
7682         VARIDIV(I8,2,BSTR,num1_str,I8,2);
7683         VARIDIV(I8,2,BOOL,1,I8,2);
7684         VARIDIV(I8,2,I1,1,I8,2);
7685         VARIDIV(I8,2,UI1,1,I8,2);
7686         VARIDIV(I8,2,UI2,1,I8,2);
7687         VARIDIV(I8,2,UI4,1,I8,2);
7688         VARIDIV(I8,2,I8,1,I8,2);
7689         VARIDIV(I8,2,UI8,1,I8,2);
7690         VARIDIV(I8,2,UINT,1,I8,2);
7691         VARIDIV(UI8,2,NULL,0,NULL,0);
7692         VARIDIV(UI8,2,I2,1,I4,2);
7693         VARIDIV(UI8,2,I4,1,I4,2);
7694         VARIDIV(UI8,2,R4,1.0f,I4,2);
7695         VARIDIV(UI8,2,R8,1.0,I4,2);
7696         VARIDIV(UI8,2,DATE,1,I4,2);
7697         VARIDIV(UI8,2,BSTR,num1_str,I4,2);
7698         VARIDIV(UI8,2,BOOL,VARIANT_TRUE,I4,-2);
7699         VARIDIV(UI8,2,I1,1,I4,2);
7700         VARIDIV(UI8,2,UI1,1,I4,2);
7701         VARIDIV(UI8,2,UI2,1,I4,2);
7702         VARIDIV(UI8,2,UI4,1,I4,2);
7703         VARIDIV(UI8,2,I8,1,I8,2);
7704         VARIDIV(UI8,2,UI8,1,I4,2);
7705         VARIDIV(UI8,2,INT,1,I4,2);
7706         VARIDIV(UI8,2,UINT,1,I4,2);
7707     }
7708     VARIDIV(INT,2,NULL,0,NULL,0);
7709     VARIDIV(INT,2,I2,1,I4,2);
7710     VARIDIV(INT,2,I4,1,I4,2);
7711     VARIDIV(INT,2,R4,1.0f,I4,2);
7712     VARIDIV(INT,2,R8,1.0,I4,2);
7713     VARIDIV(INT,2,DATE,1,I4,2);
7714     VARIDIV(INT,2,BSTR,num1_str,I4,2);
7715     VARIDIV(INT,2,BOOL,VARIANT_TRUE,I4,-2);
7716     VARIDIV(INT,2,I1,1,I4,2);
7717     VARIDIV(INT,2,UI1,1,I4,2);
7718     VARIDIV(INT,2,UI2,1,I4,2);
7719     VARIDIV(INT,2,UI4,1,I4,2);
7720     if (HAVE_OLEAUT32_I8)
7721     {
7722         VARIDIV(INT,2,UI8,1,I4,2);
7723     }
7724     VARIDIV(INT,2,INT,1,I4,2);
7725     VARIDIV(INT,2,UINT,1,I4,2);
7726     VARIDIV(UINT,2,NULL,0,NULL,0);
7727     VARIDIV(UINT,2,I2,1,I4,2);
7728     VARIDIV(UINT,2,I4,1,I4,2);
7729     VARIDIV(UINT,2,R4,1.0f,I4,2);
7730     VARIDIV(UINT,2,R8,1.0,I4,2);
7731     VARIDIV(UINT,2,DATE,1,I4,2);
7732     VARIDIV(UINT,2,BSTR,num1_str,I4,2);
7733     VARIDIV(UINT,2,BOOL,VARIANT_TRUE,I4,-2);
7734     VARIDIV(UINT,2,I1,1,I4,2);
7735     VARIDIV(UINT,2,UI1,1,I4,2);
7736     VARIDIV(UINT,2,UI2,1,I4,2);
7737     VARIDIV(UINT,2,UI4,1,I4,2);
7738     if (HAVE_OLEAUT32_I8)
7739     {
7740         VARIDIV(UINT,2,I8,1,I8,2);
7741         VARIDIV(UINT,2,UI8,1,I4,2);
7742     }
7743     VARIDIV(UINT,2,INT,1,I4,2);
7744     VARIDIV(UINT,2,UINT,1,I4,2);
7745
7746     /* Manually test some VT_CY, VT_DECIMAL variants */
7747     V_VT(&cy) = VT_CY;
7748     hres = VarCyFromI4(10000, &V_CY(&cy));
7749     ok(hres == S_OK, "VarCyFromI4 failed!\n");
7750     V_VT(&dec) = VT_DECIMAL;
7751     hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
7752     ok(hres == S_OK, "VarDecFromR4 failed!\n");
7753     memset(&left, 0, sizeof(left));
7754     memset(&right, 0, sizeof(right));
7755     V_VT(&left) = VT_I4;
7756     V_I4(&left) = 100;
7757     V_VT(&right) = VT_I8;
7758     V_UI1(&right) = 2;
7759
7760     hres = VarIdiv(&cy, &cy, &result);
7761     ok(hres == S_OK && V_VT(&result) == VT_I4,
7762         "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7763         S_OK, hres, vtstr(V_VT(&result)));
7764     ok(hres == S_OK && V_I4(&result) == 1,
7765         "VARIDIV: CY value %d, expected %d\n", V_I4(&result), 1);
7766
7767     if (HAVE_OLEAUT32_I8)
7768     {
7769         hres = VarIdiv(&cy, &right, &result);
7770         ok(hres == S_OK && V_VT(&result) == VT_I8,
7771             "VARIDIV: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
7772             S_OK, hres, vtstr(V_VT(&result)));
7773         ok(hres == S_OK && V_I8(&result) == 5000,
7774             "VARIDIV: CY value 0x%x%08x, expected 0x%x\n",
7775             (DWORD)(V_I8(&result) >>32), (DWORD)V_I8(&result), 5000);
7776     }
7777
7778     hres = VarIdiv(&left, &cy, &result);
7779     ok(hres == S_OK && V_VT(&result) == VT_I4,
7780         "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7781         S_OK, hres, vtstr(V_VT(&result)));
7782     ok(hres == S_OK && V_I4(&result) == 0,
7783         "VARIDIV: CY value %d, expected %d\n", V_I4(&result), 0);
7784
7785     hres = VarIdiv(&left, &dec, &result);
7786     ok(hres == S_OK && V_VT(&result) == VT_I4,
7787         "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7788         S_OK, hres, vtstr(V_VT(&result)));
7789     ok(hres == S_OK && V_I4(&result) == 50,
7790         "VARIDIV: DECIMAL value %d, expected %d\n", V_I4(&result), 50);
7791
7792     hres = VarIdiv(&dec, &dec, &result);
7793     ok(hres == S_OK && V_VT(&result) == VT_I4,
7794         "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7795         S_OK, hres, vtstr(V_VT(&result)));
7796     ok(hres == S_OK && V_I4(&result) == 1,
7797         "VARIDIV: DECIMAL value %d, expected %d\n", V_I4(&result), 1);
7798
7799     if (HAVE_OLEAUT32_I8)
7800     {
7801         hres = VarIdiv(&dec, &right, &result);
7802         ok(hres == S_OK && V_VT(&result) == VT_I8,
7803             "VARIDIV: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
7804             S_OK, hres, vtstr(V_VT(&result)));
7805         ok(hres == S_OK && V_I8(&result) == 1,
7806             "VARIDIV: DECIMAL value 0x%x%08x, expected %d\n",
7807             (DWORD)(V_I8(&result) >> 32), (DWORD)V_I8(&result), 1);
7808     }
7809
7810     /* Check for division by zero */
7811     V_VT(&left) = VT_INT;
7812     V_I4(&left) = 1;
7813     V_VT(&right) = VT_INT;
7814     V_I4(&right) = 0;
7815     hres = pVarIdiv(&left, &right, &result);
7816     ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7817         "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7818
7819     V_VT(&left) = VT_INT;
7820     V_I4(&left) = 0;
7821     V_VT(&right) = VT_INT;
7822     V_I4(&right) = 0;
7823     hres = pVarIdiv(&left, &right, &result);
7824     ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7825         "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7826
7827     SysFreeString(num1_str);
7828     SysFreeString(num2_str);
7829 }
7830
7831
7832 static HRESULT (WINAPI *pVarImp)(LPVARIANT,LPVARIANT,LPVARIANT);
7833
7834 #define VARIMP(vt1,val1,vt2,val2,rvt,rval)              \
7835         V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1;   \
7836         V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
7837         V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval;     \
7838         test_var_call2( __LINE__, pVarImp, &left, &right, &exp )
7839
7840 /* Skip any type that is not defined or produces an error for every case */
7841 #define SKIPTESTIMP(a)                            \
7842     if (a == VT_ERROR || a == VT_VARIANT ||       \
7843         a == VT_DISPATCH || a == VT_UNKNOWN ||    \
7844         a == VT_RECORD || a > VT_UINT ||          \
7845         a == 15 /*not defined*/)                  \
7846         continue
7847
7848 static void test_VarImp(void)
7849 {
7850     static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
7851     static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
7852     VARIANT left, right, exp, result, cy, dec;
7853     BSTR true_str, false_str;
7854     VARTYPE i;
7855     HRESULT hres;
7856
7857     CHECKPTR(VarImp);
7858
7859     true_str = SysAllocString(szTrue);
7860     false_str = SysAllocString(szFalse);
7861
7862     /* Test all possible flag/vt combinations & the resulting vt type */
7863     for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
7864     {
7865         VARTYPE leftvt, rightvt, resvt;
7866
7867         for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7868         {
7869             SKIPTESTIMP(leftvt);
7870
7871             /* Check if we need/have support for I8 and/or UI8 */
7872             if ((leftvt == VT_I8 || leftvt == VT_UI8) && !HAVE_OLEAUT32_I8)
7873                 continue;
7874
7875             for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7876             {
7877                 BOOL bFail = FALSE;
7878                 SKIPTESTIMP(rightvt);
7879
7880                 /* Native crashes using the the extra flag VT_BYREF
7881                  * or with the following VT combinations
7882                  */
7883                 if ((leftvt == VT_UI4 && rightvt == VT_BSTR) ||
7884                     (leftvt == VT_UI8 && rightvt == VT_BSTR) ||
7885                     ExtraFlags[i] == VT_BYREF)
7886                     continue;
7887
7888                 /* Check if we need/have support for I8 and/or UI8 */
7889                 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !HAVE_OLEAUT32_I8)
7890                     continue;
7891
7892                 memset(&left, 0, sizeof(left));
7893                 memset(&right, 0, sizeof(right));
7894                 V_VT(&left) = leftvt | ExtraFlags[i];
7895                 V_VT(&right) = rightvt | ExtraFlags[i];
7896                 V_VT(&result) = VT_EMPTY;
7897                 resvt = VT_EMPTY;
7898
7899                 if (leftvt == VT_BSTR)
7900                     V_BSTR(&left) = true_str;
7901
7902                 /* This allows us to test return types that are not NULL
7903                  * (NULL Imp value = n, NULL Imp 0 = NULL)
7904                  */
7905                 switch(rightvt)
7906                 {
7907                 case VT_BSTR:
7908                     V_BSTR(&right) = true_str;
7909                     break;
7910                 case VT_DECIMAL:
7911                     VarDecFromR8(2.0, &V_DECIMAL(&right));
7912                     V_VT(&right) = rightvt | ExtraFlags[i];
7913                     break;
7914                 case VT_BOOL:
7915                     V_BOOL(&right) = VARIANT_TRUE;
7916                     break;
7917                 case VT_I1: V_I1(&right) = 2; break;
7918                 case VT_I2: V_I2(&right) = 2; break;
7919                 case VT_I4: V_I4(&right) = 2; break;
7920                 case VT_R4: V_R4(&right) = 2.0f; break;
7921                 case VT_R8: V_R8(&right) = 2.0; break;
7922                 case VT_CY: V_CY(&right).int64 = 10000; break;
7923                 case VT_DATE: V_DATE(&right) = 2; break;
7924                 case VT_I8: V_I8(&right) = 2; break;
7925                 case VT_INT: V_INT(&right) = 2; break;
7926                 case VT_UINT: V_UINT(&right) = 2; break;
7927                 case VT_UI1: V_UI1(&right) = 2; break;
7928                 case VT_UI2: V_UI2(&right) = 2; break;
7929                 case VT_UI4: V_UI4(&right) = 2; break;
7930                 case VT_UI8: V_UI8(&right) = 2; break;
7931                 default: break;
7932                 }
7933
7934                 /* Native VarImp always returns an error when using extra
7935                  * flags or if the variants are I8 and INT.
7936                  */
7937                 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
7938                     ExtraFlags[i] != 0)
7939                     bFail = TRUE;
7940
7941                 /* Determine result type */
7942                 else if ((leftvt == VT_BSTR && rightvt == VT_NULL) ||
7943                     (leftvt == VT_NULL && rightvt == VT_NULL) ||
7944                     (leftvt == VT_NULL && rightvt == VT_EMPTY))
7945                     resvt = VT_NULL;
7946                 else if (leftvt == VT_I8 || rightvt == VT_I8)
7947                     resvt = VT_I8;
7948                 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
7949                     leftvt == VT_INT || rightvt == VT_INT ||
7950                     leftvt == VT_UINT || rightvt == VT_UINT ||
7951                     leftvt == VT_UI4 || rightvt == VT_UI4 ||
7952                     leftvt == VT_UI8 || rightvt == VT_UI8 ||
7953                     leftvt == VT_UI2 || rightvt == VT_UI2 ||
7954                     leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
7955                     leftvt == VT_DATE || rightvt == VT_DATE ||
7956                     leftvt == VT_CY || rightvt == VT_CY ||
7957                     leftvt == VT_R8 || rightvt == VT_R8 ||
7958                     leftvt == VT_R4 || rightvt == VT_R4 ||
7959                     leftvt == VT_I1 || rightvt == VT_I1)
7960                     resvt = VT_I4;
7961                 else if ((leftvt == VT_UI1 && rightvt == VT_UI1) ||
7962                     (leftvt == VT_UI1 && rightvt == VT_NULL) ||
7963                     (leftvt == VT_NULL && rightvt == VT_UI1))
7964                     resvt = VT_UI1;
7965                 else if (leftvt == VT_EMPTY || rightvt == VT_EMPTY ||
7966                     leftvt == VT_I2 || rightvt == VT_I2 ||
7967                     leftvt == VT_UI1 || rightvt == VT_UI1)
7968                     resvt = VT_I2;
7969                 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
7970                     leftvt == VT_BSTR || rightvt == VT_BSTR)
7971                     resvt = VT_BOOL;
7972
7973                 hres = pVarImp(&left, &right, &result);
7974
7975                 /* Check expected HRESULT and if result variant type is correct */
7976                 if (bFail)
7977                     ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
7978                         "VarImp: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7979                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7980                         vtstr(V_VT(&result)), hres);
7981                 else
7982                     ok (hres == S_OK && resvt == V_VT(&result),
7983                         "VarImp: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7984                         vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7985                         S_OK, vtstr(V_VT(&result)), hres);
7986             }
7987         }
7988     }
7989
7990     VARIMP(EMPTY,0,EMPTY,0,I2,-1);
7991     VARIMP(EMPTY,0,NULL,0,I2,-1);
7992     VARIMP(EMPTY,0,I2,-1,I2,-1);
7993     VARIMP(EMPTY,0,I4,-1,I4,-1);
7994     VARIMP(EMPTY,0,R4,0.0f,I4,-1);
7995     VARIMP(EMPTY,0,R8,-1.0,I4,-1);
7996     VARIMP(EMPTY,0,DATE,0,I4,-1);
7997     VARIMP(EMPTY,0,BSTR,true_str,I2,-1);
7998     VARIMP(EMPTY,0,BOOL,VARIANT_FALSE,I2,-1);
7999     VARIMP(EMPTY,0,I1,0,I4,-1);
8000     VARIMP(EMPTY,0,UI1,1,I2,-1);
8001     VARIMP(EMPTY,0,UI2,1,I4,-1);
8002     VARIMP(EMPTY,0,UI4,1,I4,-1);
8003     if (HAVE_OLEAUT32_I8)
8004     {
8005         VARIMP(EMPTY,0,I8,1,I8,-1);
8006         VARIMP(EMPTY,0,UI8,1,I4,-1);
8007     }
8008     VARIMP(EMPTY,0,INT,-1,I4,-1);
8009     VARIMP(EMPTY,0,UINT,1,I4,-1);
8010     VARIMP(NULL,0,EMPTY,0,NULL,0);
8011     VARIMP(NULL,0,NULL,0,NULL,0);
8012     VARIMP(NULL,0,I2,-1,I2,-1);
8013     VARIMP(NULL,0,I4,-1,I4,-1);
8014     VARIMP(NULL,0,R4,0.0f,NULL,0);
8015     VARIMP(NULL,0,R8,-1.0,I4,-1);
8016     VARIMP(NULL,0,DATE,0,NULL,0);
8017     VARIMP(NULL,0,BSTR,true_str,BOOL,-1);
8018     VARIMP(NULL,0,BOOL,VARIANT_FALSE,NULL,0);
8019     VARIMP(NULL,0,I1,0,NULL,0);
8020     VARIMP(NULL,0,UI1,1,UI1,1);
8021     VARIMP(NULL,0,UI2,1,I4,1);
8022     VARIMP(NULL,0,UI4,1,I4,1);
8023     if (HAVE_OLEAUT32_I8)
8024     {
8025         VARIMP(NULL,0,I8,1,I8,1);
8026         VARIMP(NULL,0,UI8,1,I4,1);
8027     }
8028     VARIMP(NULL,0,INT,-1,I4,-1);
8029     VARIMP(NULL,0,UINT,1,I4,1);
8030     VARIMP(I2,-1,EMPTY,0,I2,0);
8031     VARIMP(I2,-1,I2,-1,I2,-1);
8032     VARIMP(I2,-1,I4,-1,I4,-1);
8033     VARIMP(I2,-1,R4,0.0f,I4,0);
8034     VARIMP(I2,-1,R8,-1.0,I4,-1);
8035     VARIMP(I2,-1,DATE,0,I4,0);
8036     VARIMP(I2,-1,BSTR,true_str,I2,-1);
8037     VARIMP(I2,-1,BOOL,VARIANT_FALSE,I2,0);
8038     VARIMP(I2,-1,I1,0,I4,0);
8039     VARIMP(I2,-1,UI1,1,I2,1);
8040     VARIMP(I2,-1,UI2,1,I4,1);
8041     VARIMP(I2,-1,UI4,1,I4,1);
8042     if (HAVE_OLEAUT32_I8)
8043     {
8044         VARIMP(I2,-1,I8,1,I8,1);
8045         VARIMP(I2,-1,UI8,1,I4,1);
8046     }
8047     VARIMP(I2,-1,INT,-1,I4,-1);
8048     VARIMP(I2,-1,UINT,1,I4,1);
8049     VARIMP(I4,2,EMPTY,0,I4,-3);
8050     VARIMP(I4,2,NULL,0,I4,-3);
8051     VARIMP(I4,2,I2,-1,I4,-1);
8052     VARIMP(I4,2,I4,-1,I4,-1);
8053     VARIMP(I4,2,R4,0.0f,I4,-3);
8054     VARIMP(I4,2,R8,-1.0,I4,-1);
8055     VARIMP(I4,2,DATE,0,I4,-3);
8056     VARIMP(I4,2,BSTR,true_str,I4,-1);
8057     VARIMP(I4,2,BOOL,VARIANT_FALSE,I4,-3);
8058     VARIMP(I4,2,I1,0,I4,-3);
8059     VARIMP(I4,2,UI1,1,I4,-3);
8060     VARIMP(I4,2,UI2,1,I4,-3);
8061     VARIMP(I4,2,UI4,1,I4,-3);
8062     if (HAVE_OLEAUT32_I8)
8063     {
8064         VARIMP(I4,2,I8,1,I8,-3);
8065         VARIMP(I4,2,UI8,1,I4,-3);
8066     }
8067     VARIMP(I4,2,INT,-1,I4,-1);
8068     VARIMP(I4,2,UINT,1,I4,-3);
8069     VARIMP(R4,-1.0f,EMPTY,0,I4,0);
8070     VARIMP(R4,-1.0f,NULL,0,NULL,0);
8071     VARIMP(R4,-1.0f,I2,-1,I4,-1);
8072     VARIMP(R4,-1.0f,I4,-1,I4,-1);
8073     VARIMP(R4,-1.0f,R4,0.0f,I4,0);
8074     VARIMP(R4,-1.0f,R8,-1.0,I4,-1);
8075     VARIMP(R4,-1.0f,DATE,1,I4,1);
8076     VARIMP(R4,-1.0f,BSTR,true_str,I4,-1);
8077     VARIMP(R4,-1.0f,BOOL,VARIANT_FALSE,I4,0);
8078     VARIMP(R4,-1.0f,I1,0,I4,0);
8079     VARIMP(R4,-1.0f,UI1,1,I4,1);
8080     VARIMP(R4,-1.0f,UI2,1,I4,1);
8081     VARIMP(R4,-1.0f,UI4,1,I4,1);
8082     if (HAVE_OLEAUT32_I8)
8083     {
8084         VARIMP(R4,-1.0f,I8,1,I8,1);
8085         VARIMP(R4,-1.0f,UI8,1,I4,1);
8086     }
8087     VARIMP(R4,-1.0f,INT,-1,I4,-1);
8088     VARIMP(R4,-1.0f,UINT,1,I4,1);
8089     VARIMP(R8,1.0,EMPTY,0,I4,-2);
8090     VARIMP(R8,1.0,NULL,0,I4,-2);
8091     VARIMP(R8,1.0,I2,-1,I4,-1);
8092     VARIMP(R8,1.0,I4,-1,I4,-1);
8093     VARIMP(R8,1.0,R4,0.0f,I4,-2);
8094     VARIMP(R8,1.0,R8,-1.0,I4,-1);
8095     VARIMP(R8,1.0,DATE,0,I4,-2);
8096     VARIMP(R8,1.0,BSTR,true_str,I4,-1);
8097     VARIMP(R8,1.0,BOOL,VARIANT_FALSE,I4,-2);
8098     VARIMP(R8,1.0,I1,0,I4,-2);
8099     VARIMP(R8,1.0,UI1,1,I4,-1);
8100     VARIMP(R8,1.0,UI2,1,I4,-1);
8101     VARIMP(R8,1.0,UI4,1,I4,-1);
8102     if (HAVE_OLEAUT32_I8)
8103     {
8104         VARIMP(R8,1.0,I8,1,I8,-1);
8105         VARIMP(R8,1.0,UI8,1,I4,-1);
8106     }
8107     VARIMP(R8,1.0,INT,-1,I4,-1);
8108     VARIMP(R8,1.0,UINT,1,I4,-1);
8109     VARIMP(DATE,0,EMPTY,0,I4,-1);
8110     VARIMP(DATE,0,NULL,0,I4,-1);
8111     VARIMP(DATE,0,I2,-1,I4,-1);
8112     VARIMP(DATE,0,I4,-1,I4,-1);
8113     VARIMP(DATE,0,R4,0.0f,I4,-1);
8114     VARIMP(DATE,0,R8,-1.0,I4,-1);
8115     VARIMP(DATE,0,DATE,0,I4,-1);
8116     VARIMP(DATE,0,BSTR,true_str,I4,-1);
8117     VARIMP(DATE,0,BOOL,VARIANT_FALSE,I4,-1);
8118     VARIMP(DATE,0,I1,0,I4,-1);
8119     VARIMP(DATE,0,UI1,1,I4,-1);
8120     VARIMP(DATE,0,UI2,1,I4,-1);
8121     VARIMP(DATE,0,UI4,1,I4,-1);
8122     if (HAVE_OLEAUT32_I8)
8123     {
8124         VARIMP(DATE,0,I8,1,I8,-1);
8125         VARIMP(DATE,0,UI8,1,I4,-1);
8126     }
8127     VARIMP(DATE,0,INT,-1,I4,-1);
8128     VARIMP(DATE,0,UINT,1,I4,-1);
8129     VARIMP(BSTR,false_str,EMPTY,0,I2,-1);
8130     VARIMP(BSTR,false_str,NULL,0,BOOL,-1);
8131     VARIMP(BSTR,false_str,I2,-1,I2,-1);
8132     VARIMP(BSTR,false_str,I4,-1,I4,-1);
8133     VARIMP(BSTR,false_str,R4,0.0f,I4,-1);
8134     VARIMP(BSTR,false_str,R8,-1.0,I4,-1);
8135     VARIMP(BSTR,false_str,DATE,0,I4,-1);
8136     VARIMP(BSTR,false_str,BSTR,true_str,BOOL,-1);
8137     VARIMP(BSTR,false_str,BOOL,VARIANT_FALSE,BOOL,-1);
8138     VARIMP(BSTR,false_str,I1,0,I4,-1);
8139     VARIMP(BSTR,false_str,UI1,1,I2,-1);
8140     VARIMP(BSTR,false_str,UI2,1,I4,-1);
8141     VARIMP(BSTR,false_str,UI4,1,I4,-1);
8142     if (HAVE_OLEAUT32_I8)
8143     {
8144         VARIMP(BSTR,false_str,I8,1,I8,-1);
8145         VARIMP(BSTR,false_str,UI8,1,I4,-1);
8146     }
8147     VARIMP(BSTR,false_str,INT,-1,I4,-1);
8148     VARIMP(BSTR,false_str,UINT,1,I4,-1);
8149     VARIMP(BOOL,VARIANT_TRUE,EMPTY,0,I2,0);
8150     VARIMP(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
8151     VARIMP(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
8152     VARIMP(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
8153     VARIMP(BOOL,VARIANT_TRUE,R4,0.0f,I4,0);
8154     VARIMP(BOOL,VARIANT_TRUE,R8,-1.0,I4,-1);
8155     VARIMP(BOOL,VARIANT_TRUE,DATE,0,I4,0);
8156     VARIMP(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,-1);
8157     VARIMP(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,0);
8158     VARIMP(BOOL,VARIANT_TRUE,I1,0,I4,0);
8159     VARIMP(BOOL,VARIANT_TRUE,UI1,1,I2,1);
8160     VARIMP(BOOL,VARIANT_TRUE,UI2,1,I4,1);
8161     VARIMP(BOOL,VARIANT_TRUE,UI4,1,I4,1);
8162     if (HAVE_OLEAUT32_I8)
8163     {
8164         VARIMP(BOOL,VARIANT_TRUE,I8,1,I8,1);
8165         VARIMP(BOOL,VARIANT_TRUE,UI8,1,I4,1);
8166     }
8167     VARIMP(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
8168     VARIMP(BOOL,VARIANT_TRUE,UINT,1,I4,1);
8169     VARIMP(I1,-1,EMPTY,0,I4,0);
8170     VARIMP(I1,-1,NULL,0,NULL,0);
8171     VARIMP(I1,-1,I2,-1,I4,-1);
8172     VARIMP(I1,-1,I4,-1,I4,-1);
8173     VARIMP(I1,-1,R4,0.0f,I4,0);
8174     VARIMP(I1,-1,R8,-1.0,I4,-1);
8175     VARIMP(I1,-1,DATE,0,I4,0);
8176     VARIMP(I1,-1,BSTR,true_str,I4,-1);
8177     VARIMP(I1,-1,BOOL,VARIANT_FALSE,I4,0);
8178     VARIMP(I1,-1,I1,0,I4,0);
8179     VARIMP(I1,-1,UI1,1,I4,1);
8180     VARIMP(I1,-1,UI2,1,I4,1);
8181     VARIMP(I1,-1,UI4,1,I4,1);
8182     if (HAVE_OLEAUT32_I8)
8183     {
8184         VARIMP(I1,-1,I8,1,I8,1);
8185         VARIMP(I1,-1,UI8,1,I4,1);
8186     }
8187     VARIMP(I1,-1,INT,-1,I4,-1);
8188     VARIMP(I1,-1,UINT,1,I4,1);
8189     VARIMP(UI1,0,EMPTY,0,I2,-1);
8190     VARIMP(UI1,0,NULL,0,UI1,255);
8191     VARIMP(UI1,0,I2,-1,I2,-1);
8192     VARIMP(UI1,0,I4,-1,I4,-1);
8193     VARIMP(UI1,0,R4,0.0f,I4,-1);
8194     VARIMP(UI1,0,R8,-1.0,I4,-1);
8195     VARIMP(UI1,0,DATE,0,I4,-1);
8196     VARIMP(UI1,0,BSTR,true_str,I2,-1);
8197     VARIMP(UI1,0,BOOL,VARIANT_FALSE,I2,-1);
8198     VARIMP(UI1,0,I1,0,I4,-1);
8199     VARIMP(UI1,0,UI1,1,UI1,255);
8200     VARIMP(UI1,0,UI2,1,I4,-1);
8201     VARIMP(UI1,0,UI4,1,I4,-1);
8202     if (HAVE_OLEAUT32_I8)
8203     {
8204         VARIMP(UI1,0,I8,1,I8,-1);
8205         VARIMP(UI1,0,UI8,1,I4,-1);
8206     }
8207     VARIMP(UI1,0,INT,-1,I4,-1);
8208     VARIMP(UI1,0,UINT,1,I4,-1);
8209     VARIMP(UI2,0,EMPTY,0,I4,-1);
8210     VARIMP(UI2,0,NULL,0,I4,-1);
8211     VARIMP(UI2,0,I2,-1,I4,-1);
8212     VARIMP(UI2,0,I4,-1,I4,-1);
8213     VARIMP(UI2,0,R4,0.0f,I4,-1);
8214     VARIMP(UI2,0,R8,-1.0,I4,-1);
8215     VARIMP(UI2,0,DATE,0,I4,-1);
8216     VARIMP(UI2,0,BSTR,true_str,I4,-1);
8217     VARIMP(UI2,0,BOOL,VARIANT_FALSE,I4,-1);
8218     VARIMP(UI2,0,I1,0,I4,-1);
8219     VARIMP(UI2,0,UI1,1,I4,-1);
8220     VARIMP(UI2,0,UI2,1,I4,-1);
8221     VARIMP(UI2,0,UI4,1,I4,-1);
8222     if (HAVE_OLEAUT32_I8)
8223     {
8224         VARIMP(UI2,0,I8,1,I8,-1);
8225         VARIMP(UI2,0,UI8,1,I4,-1);
8226     }
8227     VARIMP(UI2,0,INT,-1,I4,-1);
8228     VARIMP(UI2,0,UINT,1,I4,-1);
8229     VARIMP(UI4,0,EMPTY,0,I4,-1);
8230     VARIMP(UI4,0,NULL,0,I4,-1);
8231     VARIMP(UI4,0,I2,-1,I4,-1);
8232     VARIMP(UI4,0,I4,-1,I4,-1);
8233     VARIMP(UI4,0,R4,0.0f,I4,-1);
8234     VARIMP(UI4,0,R8,-1.0,I4,-1);
8235     VARIMP(UI4,0,DATE,0,I4,-1);
8236     VARIMP(UI4,0,BSTR,true_str,I4,-1);
8237     VARIMP(UI4,0,BOOL,VARIANT_FALSE,I4,-1);
8238     VARIMP(UI4,0,I1,0,I4,-1);
8239     VARIMP(UI4,0,UI1,1,I4,-1);
8240     VARIMP(UI4,0,UI2,1,I4,-1);
8241     VARIMP(UI4,0,UI4,1,I4,-1);
8242     if (HAVE_OLEAUT32_I8)
8243     {
8244         VARIMP(UI4,0,I8,1,I8,-1);
8245         VARIMP(UI4,0,UI8,1,I4,-1);
8246     }
8247     VARIMP(UI4,0,INT,-1,I4,-1);
8248     VARIMP(UI4,0,UINT,1,I4,-1);
8249     if (HAVE_OLEAUT32_I8)
8250     {
8251         VARIMP(I8,-1,EMPTY,0,I8,0);
8252         VARIMP(I8,-1,NULL,0,NULL,0);
8253         VARIMP(I8,-1,I2,-1,I8,-1);
8254         VARIMP(I8,-1,I4,-1,I8,-1);
8255         VARIMP(I8,-1,R4,0.0f,I8,0);
8256         VARIMP(I8,-1,R8,-1.0,I8,-1);
8257         VARIMP(I8,-1,DATE,0,I8,0);
8258         VARIMP(I8,-1,BSTR,true_str,I8,-1);
8259         VARIMP(I8,-1,BOOL,VARIANT_FALSE,I8,0);
8260         VARIMP(I8,-1,I1,0,I8,0);
8261         VARIMP(I8,-1,UI1,1,I8,1);
8262         VARIMP(I8,-1,UI2,1,I8,1);
8263         VARIMP(I8,-1,UI4,1,I8,1);
8264         VARIMP(I8,-1,I8,1,I8,1);
8265         VARIMP(I8,-1,UI8,1,I8,1);
8266         VARIMP(I8,-1,UINT,1,I8,1);
8267         VARIMP(UI8,0,EMPTY,0,I4,-1);
8268         VARIMP(UI8,0,NULL,0,I4,-1);
8269         VARIMP(UI8,0,I2,-1,I4,-1);
8270         VARIMP(UI8,0,I4,-1,I4,-1);
8271         VARIMP(UI8,0,R4,0.0f,I4,-1);
8272         VARIMP(UI8,0,R8,-1.0,I4,-1);
8273         VARIMP(UI8,0,DATE,0,I4,-1);
8274         VARIMP(UI8,0,BSTR,true_str,I4,-1);
8275         VARIMP(UI8,0,BOOL,VARIANT_FALSE,I4,-1);
8276         VARIMP(UI8,0,I1,0,I4,-1);
8277         VARIMP(UI8,0,UI1,1,I4,-1);
8278         VARIMP(UI8,0,UI2,1,I4,-1);
8279         VARIMP(UI8,0,UI4,1,I4,-1);
8280         VARIMP(UI8,0,I8,1,I8,-1);
8281         VARIMP(UI8,0,UI8,1,I4,-1);
8282         VARIMP(UI8,0,INT,-1,I4,-1);
8283         VARIMP(UI8,0,UINT,1,I4,-1);
8284     }
8285     VARIMP(INT,-1,EMPTY,0,I4,0);
8286     VARIMP(INT,-1,NULL,0,NULL,0);
8287     VARIMP(INT,-1,I2,-1,I4,-1);
8288     VARIMP(INT,-1,I4,-1,I4,-1);
8289     VARIMP(INT,-1,R4,0.0f,I4,0);
8290     VARIMP(INT,-1,R8,-1.0,I4,-1);
8291     VARIMP(INT,-1,DATE,0,I4,0);
8292     VARIMP(INT,-1,BSTR,true_str,I4,-1);
8293     VARIMP(INT,-1,BOOL,VARIANT_FALSE,I4,0);
8294     VARIMP(INT,-1,I1,0,I4,0);
8295     VARIMP(INT,-1,UI1,1,I4,1);
8296     VARIMP(INT,-1,UI2,1,I4,1);
8297     VARIMP(INT,-1,UI4,1,I4,1);
8298     if (HAVE_OLEAUT32_I8)
8299     {
8300         VARIMP(INT,-1,I8,1,I8,1);
8301         VARIMP(INT,-1,UI8,1,I4,1);
8302     }
8303     VARIMP(INT,-1,INT,-1,I4,-1);
8304     VARIMP(INT,-1,UINT,1,I4,1);
8305     VARIMP(UINT,1,EMPTY,0,I4,-2);
8306     VARIMP(UINT,1,NULL,0,I4,-2);
8307     VARIMP(UINT,1,I2,-1,I4,-1);
8308     VARIMP(UINT,1,I4,-1,I4,-1);
8309     VARIMP(UINT,1,R4,0.0f,I4,-2);
8310     VARIMP(UINT,1,R8,-1.0,I4,-1);
8311     VARIMP(UINT,1,DATE,0,I4,-2);
8312     VARIMP(UINT,1,BSTR,true_str,I4,-1);
8313     VARIMP(UINT,1,BOOL,VARIANT_FALSE,I4,-2);
8314     VARIMP(UINT,1,I1,0,I4,-2);
8315     VARIMP(UINT,1,UI1,1,I4,-1);
8316     VARIMP(UINT,1,UI2,1,I4,-1);
8317     VARIMP(UINT,1,UI4,1,I4,-1);
8318     if (HAVE_OLEAUT32_I8)
8319     {
8320         VARIMP(UINT,1,I8,1,I8,-1);
8321         VARIMP(UINT,1,UI8,1,I4,-1);
8322     }
8323     VARIMP(UINT,1,INT,-1,I4,-1);
8324     VARIMP(UINT,1,UINT,1,I4,-1);
8325
8326     /* Manually test some VT_CY, VT_DECIMAL variants */
8327     V_VT(&cy) = VT_CY;
8328     hres = VarCyFromI4(1, &V_CY(&cy));
8329     ok(hres == S_OK, "VarCyFromI4 failed!\n");
8330     V_VT(&dec) = VT_DECIMAL;
8331     hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
8332     ok(hres == S_OK, "VarDecFromR4 failed!\n");
8333     memset(&left, 0, sizeof(left));
8334     memset(&right, 0, sizeof(right));
8335     V_VT(&left) = VT_I4;
8336     V_I4(&left) = 0;
8337     V_VT(&right) = VT_I8;
8338     V_UI1(&right) = 0;
8339
8340     hres = pVarImp(&cy, &cy, &result);
8341     ok(hres == S_OK && V_VT(&result) == VT_I4,
8342         "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8343         S_OK, hres, vtstr(V_VT(&result)));
8344     ok(hres == S_OK && V_I4(&result) == -1,
8345         "VARIMP: CY value %d, expected %d\n", V_I4(&result), -1);
8346
8347     if (HAVE_OLEAUT32_I8)
8348     {
8349         hres = pVarImp(&cy, &right, &result);
8350         ok(hres == S_OK && V_VT(&result) == VT_I8,
8351             "VARIMP: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
8352             S_OK, hres, vtstr(V_VT(&result)));
8353         ok(hres == S_OK && V_I8(&result) == -2,
8354             "VARIMP: CY value %x%08x, expected %d\n",
8355             (DWORD)((V_I8(&result)) >> 32), (DWORD)(V_I8(&result)), -2);
8356     }
8357
8358     hres = pVarImp(&left, &cy, &result);
8359     ok(hres == S_OK && V_VT(&result) == VT_I4,
8360         "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8361         S_OK, hres, vtstr(V_VT(&result)));
8362     ok(hres == S_OK && V_I4(&result) == -1,
8363         "VARIMP: CY value %d, expected %d\n", V_I4(&result), -1);
8364
8365     hres = pVarImp(&left, &dec, &result);
8366     ok(hres == S_OK && V_VT(&result) == VT_I4,
8367         "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8368         S_OK, hres, vtstr(V_VT(&result)));
8369     ok(hres == S_OK && V_I4(&result) == -1,
8370         "VARIMP: DECIMAL value %d, expected %d\n", V_I4(&result), -1);
8371
8372     hres = pVarImp(&dec, &dec, &result);
8373     ok(hres == S_OK && V_VT(&result) == VT_I4,
8374         "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8375         S_OK, hres, vtstr(V_VT(&result)));
8376     ok(hres == S_OK && V_I4(&result) == -1,
8377         "VARIMP: DECIMAL value %d, expected %d\n", V_I4(&result), -1);
8378
8379     if (HAVE_OLEAUT32_I8)
8380     {
8381         hres = pVarImp(&dec, &right, &result);
8382         ok(hres == S_OK && V_VT(&result) == VT_I8,
8383             "VARIMP: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
8384             S_OK, hres, vtstr(V_VT(&result)));
8385         ok(hres == S_OK && V_I8(&result) == -3,
8386             "VARIMP: DECIMAL value 0x%x%08x, expected %d\n",
8387             (DWORD)(V_I8(&result) >>32), (DWORD)V_I8(&result), -3);
8388     }
8389
8390     SysFreeString(false_str);
8391     SysFreeString(true_str);
8392 }
8393
8394 START_TEST(vartest)
8395 {
8396   init();
8397
8398   test_VariantInit();
8399   test_VariantClear();
8400   test_VariantCopy();
8401   test_VariantCopyInd();
8402   test_VarParseNumFromStr();
8403   test_VarNumFromParseNum();
8404   test_VarUdateFromDate();
8405   test_VarDateFromUdate();
8406   test_SystemTimeToVariantTime();
8407   test_VariantTimeToSystemTime();
8408   test_DosDateTimeToVariantTime();
8409   test_VariantTimeToDosDateTime();
8410   test_VarAbs();
8411   test_VarNot();
8412   test_VarSub();
8413   test_VarMod();
8414   test_VarFix();
8415   test_VarInt();
8416   test_VarNeg();
8417   test_VarRound();
8418   test_VarXor();
8419   test_VarOr();
8420   test_VarPow();
8421   test_VarEqv();
8422   test_VarMul();
8423   test_VarAdd();
8424   test_VarCat();
8425   test_VarCmp();
8426   test_VarAnd();
8427   test_VarDiv();
8428   test_VarIdiv();
8429   test_VarImp();
8430 }