4 * Copyright 1998 Jean-Claude Cote
5 * Copyright 2006 Google (Benjamin Arai)
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.
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.
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
31 #include "wine/test.h"
41 static HMODULE hOleaut32;
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 *);
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; }
54 /* Is a given function exported from oleaut32? */
55 #define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL)
57 /* Have IRecordInfo data type? */
58 #define HAVE_OLEAUT32_RECORD HAVE_FUNC(SafeArraySetRecordInfo)
59 /* Have CY data type? */
60 #define HAVE_OLEAUT32_CY HAVE_FUNC(VarCyAdd)
61 /* Have I8/UI8 data type? */
62 #define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
63 /* Is this an ancient version with support for only I2/I4/R4/R8/DATE? */
64 #define IS_ANCIENT (!HAVE_FUNC(VarI1FromI2))
66 /* When comparing floating point values we cannot expect an exact match
67 * because the rounding errors depend on the exact algorithm.
69 #define EQ_DOUBLE(a,b) (fabs((a)-(b))<1e-14)
70 #define EQ_FLOAT(a,b) (fabs((a)-(b))<1e-7)
72 #define SKIPTESTS(a) if((a > VT_CLSID+10) && (a < VT_BSTR_BLOB-10)) continue;
74 /* Allow our test macros to work for VT_NULL and VT_EMPTY too */
75 #define V_EMPTY(v) V_I4(v)
76 #define V_NULL(v) V_I4(v)
78 /* Size constraints for overflow tests */
80 #define I1_MIN ((-I1_MAX)-1)
84 #define I2_MIN ((-I2_MAX)-1)
85 #define UI2_MAX 0xffff
87 #define I4_MAX 0x7fffffff
88 #define I4_MIN ((-I4_MAX)-1)
89 #define UI4_MAX 0xffffffff
91 #define I8_MAX (((LONGLONG)I4_MAX << 32) | UI4_MAX)
92 #define I8_MIN ((-I8_MAX)-1)
93 #define UI8_MAX (((ULONGLONG)UI4_MAX << 32) | UI4_MAX)
95 #define DATE_MAX 2958465
96 #define DATE_MIN -657434
97 #define R4_MAX FLT_MAX
98 #define R4_MIN FLT_MIN
99 #define R8_MAX DBL_MAX
100 #define R8_MIN DBL_MIN
102 /* Macros to set a DECIMAL */
103 #define SETDEC(dec, scl, sgn, hi, lo) S(U(dec)).scale = (BYTE)scl; \
104 S(U(dec)).sign = (BYTE)sgn; dec.Hi32 = (ULONG)hi; \
105 U1(dec).Lo64 = (ULONG64)lo
106 #define SETDEC64(dec, scl, sgn, hi, mid, lo) S(U(dec)).scale = (BYTE)scl; \
107 S(U(dec)).sign = (BYTE)sgn; dec.Hi32 = (ULONG)hi; \
108 S1(U1(dec)).Mid32 = mid; S1(U1(dec)).Lo32 = lo;
110 static inline int strcmpW( const WCHAR *str1, const WCHAR *str2 )
112 while (*str1 && (*str1 == *str2)) { str1++; str2++; }
113 return *str1 - *str2;
116 /* return the string text of a given variant type */
117 static const char *vtstr(int x)
139 return "VT_DISPATCH";
175 return "VT_SAFEARRAY";
179 return "VT_USERDEFINED";
187 return "VT_FILETIME";
195 return "VT_STREAMED_OBJECT";
197 return "VT_STORED_OBJECT";
199 return "VT_BLOB_OBJECT";
205 return "VT_BSTR_BLOB/VT_ILLEGALMASKED/VT_TYPEMASK";
213 return "VT_RESERVED";
222 static BOOL is_expected_variant( const VARIANT *result, const VARIANT *expected )
224 if (V_VT(result) != V_VT(expected)) return FALSE;
225 switch(V_VT(expected))
231 #define CASE(vt) case VT_##vt: return (V_##vt(result) == V_##vt(expected))
246 return EQ_FLOAT(V_DATE(result), V_DATE(expected));
248 return EQ_FLOAT(V_R4(result), V_R4(expected));
250 return EQ_FLOAT(V_R8(result), V_R8(expected));
252 return (V_CY(result).int64 == V_CY(expected).int64);
254 return !lstrcmpW( V_BSTR(result), V_BSTR(expected) );
256 return !memcmp( &V_DECIMAL(result), &V_DECIMAL(expected), sizeof(DECIMAL) );
258 ok(0, "unhandled variant type %s\n",vtstr(V_VT(expected)));
263 static const char *variantstr( const VARIANT *var )
265 static char buffer[16][256];
280 sprintf( buffer[current], "VT_I1(%d)", V_I1(var) ); break;
282 sprintf( buffer[current], "VT_I2(%d)", V_I2(var) ); break;
284 sprintf( buffer[current], "VT_I4(%d)", V_I4(var) ); break;
286 sprintf( buffer[current], "VT_INT(%d)", V_INT(var) ); break;
288 sprintf( buffer[current], "VT_I8(%x%08x)", (UINT)(V_I8(var) >> 32), (UINT)V_I8(var) ); break;
290 sprintf( buffer[current], "VT_UI8(%x%08x)", (UINT)(V_UI8(var) >> 32), (UINT)V_UI8(var) ); break;
292 sprintf( buffer[current], "VT_R4(%g)", V_R4(var) ); break;
294 sprintf( buffer[current], "VT_R8(%g)", V_R8(var) ); break;
296 sprintf( buffer[current], "VT_UI1(%u)", V_UI1(var) ); break;
298 sprintf( buffer[current], "VT_UI2(%u)", V_UI2(var) ); break;
300 sprintf( buffer[current], "VT_UI4(%u)", V_UI4(var) ); break;
302 sprintf( buffer[current], "VT_UINT(%d)", V_UINT(var) ); break;
304 sprintf( buffer[current], "VT_CY(%x%08x)", S(V_CY(var)).Hi, S(V_CY(var)).Lo ); break;
306 sprintf( buffer[current], "VT_DATE(%g)", V_DATE(var) ); break;
308 return vtstr(V_VT(var));
310 return buffer[current++];
313 static void test_var_call1( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT),
314 VARIANT *arg, VARIANT *expected )
316 VARIANT old_arg = *arg;
320 memset( &result, 0, sizeof(result) );
321 hres = func( arg, &result );
322 ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
324 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
325 "got %s expected %s\n", variantstr(&result), variantstr(expected) );
326 ok_(__FILE__,line)( is_expected_variant( arg, &old_arg ), "Modified argument %s / %s\n",
327 variantstr(&old_arg), variantstr(arg));
330 static void test_var_call2( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT,LPVARIANT),
331 VARIANT *left, VARIANT *right, VARIANT *expected )
333 VARIANT old_left = *left, old_right = *right;
337 memset( &result, 0, sizeof(result) );
338 hres = func( left, right, &result );
339 ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
341 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
342 "got %s expected %s\n", variantstr(&result), variantstr(expected) );
343 ok_(__FILE__,line)( is_expected_variant( left, &old_left ), "Modified left argument %s / %s\n",
344 variantstr(&old_left), variantstr(left));
345 ok_(__FILE__,line)( is_expected_variant( right, &old_right ), "Modified right argument %s / %s\n",
346 variantstr(&old_right), variantstr(right));
350 static void test_VariantInit(void)
354 /* Test that VariantInit() only sets the type */
355 memset(&v1, -1, sizeof(v1));
357 V_VT(&v2) = VT_EMPTY;
359 ok(!memcmp(&v1, &v2, sizeof(v1)), "VariantInit() set extra fields\n");
362 /* All possible combinations of extra V_VT() flags */
363 static const VARTYPE ExtraFlags[16] =
372 VT_VECTOR|VT_RESERVED,
373 VT_VECTOR|VT_ARRAY|VT_BYREF,
374 VT_VECTOR|VT_ARRAY|VT_RESERVED,
375 VT_VECTOR|VT_BYREF|VT_RESERVED,
376 VT_VECTOR|VT_ARRAY|VT_BYREF|VT_RESERVED,
378 VT_ARRAY|VT_RESERVED,
379 VT_ARRAY|VT_BYREF|VT_RESERVED,
380 VT_BYREF|VT_RESERVED,
383 /* Determine if a vt is valid for VariantClear() */
384 static int IsValidVariantClearVT(VARTYPE vt, VARTYPE extraFlags)
388 /* Only the following flags/types are valid */
389 if ((vt <= VT_LPWSTR || vt == VT_RECORD || vt == VT_CLSID) &&
391 (vt < (VARTYPE)24 || vt > (VARTYPE)31) &&
392 (!(extraFlags & (VT_BYREF|VT_ARRAY)) || vt > VT_NULL) &&
393 (extraFlags == 0 || extraFlags == VT_BYREF || extraFlags == VT_ARRAY ||
394 extraFlags == (VT_ARRAY|VT_BYREF)))
397 if ((vt == VT_RECORD && !HAVE_OLEAUT32_RECORD) ||
398 ((vt == VT_I8 || vt == VT_UI8) && !HAVE_OLEAUT32_I8))
399 ret = 0; /* Old versions of oleaut32 */
405 const IUnknownVtbl *lpVtbl;
408 } test_VariantClearImpl;
410 static HRESULT WINAPI VC_QueryInterface(LPUNKNOWN iface,REFIID riid,LPVOID *ppobj)
412 test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
414 return E_NOINTERFACE;
417 static ULONG WINAPI VC_AddRef(LPUNKNOWN iface) {
418 test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
420 return InterlockedIncrement(&This->ref);
423 static ULONG WINAPI VC_Release(LPUNKNOWN iface) {
424 test_VariantClearImpl *This = (test_VariantClearImpl *)iface;
425 /* static class, won't be freed */
427 return InterlockedDecrement(&This->ref);
430 static const IUnknownVtbl test_VariantClear_vtbl = {
436 static test_VariantClearImpl test_myVariantClearImpl = {&test_VariantClear_vtbl, 1, 0};
438 static void test_VariantClear(void)
447 /* Crashes: Native does not test input for NULL, so neither does Wine */
448 if (0) hres = VariantClear(NULL);
450 /* Only the type field is set, to VT_EMPTY */
453 hres = VariantClear(&v);
454 ok((hres == S_OK && V_VT(&v) == VT_EMPTY) ||
455 (IS_ANCIENT && hres == DISP_E_BADVARTYPE && V_VT(&v) == VT_UI4),
456 "VariantClear: Type set to %d, res %08x\n", V_VT(&v), hres);
457 ok(V_UI4(&v) == ~0u, "VariantClear: Overwrote value\n");
459 /* Test all possible V_VT values.
460 * Also demonstrates that null pointers in 'v' are not dereferenced.
461 * Individual variant tests should test VariantClear() with non-NULL values.
463 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
467 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
469 HRESULT hExpected = DISP_E_BADVARTYPE;
473 memset(&v, 0, sizeof(v));
474 V_VT(&v) = vt | ExtraFlags[i];
476 hres = VariantClear(&v);
478 if (IsValidVariantClearVT(vt, ExtraFlags[i]))
481 ok(hres == hExpected, "VariantClear: expected 0x%X, got 0x%X for vt %d | 0x%X\n",
482 hExpected, hres, vt, ExtraFlags[i]);
486 /* Some BYREF tests with non-NULL ptrs */
491 V_VT(&v) = VT_VARIANT | VT_BYREF;
492 V_VARIANTREF(&v) = &v2;
494 hres = VariantClear(&v);
495 ok(hres == S_OK, "ret %08x\n", hres);
496 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
497 ok(V_VARIANTREF(&v) == &v2, "variant ref %p\n", V_VARIANTREF(&v2));
498 ok(V_VT(&v2) == VT_I4, "vt %04x\n", V_VT(&v2));
499 ok(V_I4(&v2) == 0x1234, "i4 %04x\n", V_I4(&v2));
503 V_VT(&v) = VT_I4 | VT_BYREF;
506 hres = VariantClear(&v);
507 ok(hres == S_OK, "ret %08x\n", hres);
508 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
509 ok(V_I4REF(&v) == &i4, "i4 ref %p\n", V_I4REF(&v2));
510 ok(i4 == 0x4321, "i4 changed %08x\n", i4);
514 V_VT(&v) = VT_UNKNOWN;
515 V_UNKNOWN(&v) = (IUnknown*)&test_myVariantClearImpl;
516 test_myVariantClearImpl.events = 0;
517 hres = VariantClear(&v);
518 ok(hres == S_OK, "ret %08x\n", hres);
519 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
520 ok(V_UNKNOWN(&v) == (IUnknown*)&test_myVariantClearImpl, "unknown %p\n", V_UNKNOWN(&v));
521 /* Check that Release got called, but nothing else */
522 ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
525 punk = (IUnknown*)&test_myVariantClearImpl;
526 V_VT(&v) = VT_UNKNOWN | VT_BYREF;
527 V_UNKNOWNREF(&v) = &punk;
528 test_myVariantClearImpl.events = 0;
529 hres = VariantClear(&v);
530 ok(hres == S_OK, "ret %08x\n", hres);
531 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
532 ok(V_UNKNOWNREF(&v) == &punk, "unknown ref %p\n", V_UNKNOWNREF(&v));
533 /* Check that nothing got called */
534 ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
537 V_VT(&v) = VT_DISPATCH;
538 V_DISPATCH(&v) = (IDispatch*)&test_myVariantClearImpl;
539 test_myVariantClearImpl.events = 0;
540 hres = VariantClear(&v);
541 ok(hres == S_OK, "ret %08x\n", hres);
542 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
543 ok(V_DISPATCH(&v) == (IDispatch*)&test_myVariantClearImpl, "dispatch %p\n", V_DISPATCH(&v));
544 /* Check that Release got called, but nothing else */
545 ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
548 punk = (IUnknown*)&test_myVariantClearImpl;
549 V_VT(&v) = VT_DISPATCH | VT_BYREF;
550 V_DISPATCHREF(&v) = (IDispatch**)&punk;
551 test_myVariantClearImpl.events = 0;
552 hres = VariantClear(&v);
553 ok(hres == S_OK, "ret %08x\n", hres);
554 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
555 ok(V_DISPATCHREF(&v) == (IDispatch**)&punk, "dispatch ref %p\n", V_DISPATCHREF(&v));
556 /* Check that nothing got called */
557 ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08x\n", test_myVariantClearImpl.events);
560 static void test_VariantCopy(void)
562 VARIANTARG vSrc, vDst;
565 HRESULT hres, hExpected;
567 /* Establish that the failure/other cases are dealt with. Individual tests
568 * for each type should verify that data is copied correctly, references
573 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
575 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
579 memset(&vSrc, 0, sizeof(vSrc));
580 V_VT(&vSrc) = vt | ExtraFlags[i];
582 hExpected = DISP_E_BADVARTYPE;
583 /* src is allowed to be a VT_CLSID */
584 if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
587 hres = VariantCopy(&vSrc, &vSrc);
589 ok(hres == hExpected,
590 "Copy(src==dst): expected 0x%X, got 0x%X for src==dest vt %d|0x%X\n",
591 hExpected, hres, vt, ExtraFlags[i]);
595 /* Test that if VariantClear() fails on dest, the function fails. This also
596 * shows that dest is in fact cleared and not just overwritten
598 memset(&vSrc, 0, sizeof(vSrc));
599 V_VT(&vSrc) = VT_UI1;
601 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
603 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
607 hExpected = DISP_E_BADVARTYPE;
609 memset(&vDst, 0, sizeof(vDst));
610 V_VT(&vDst) = vt | ExtraFlags[i];
612 if (IsValidVariantClearVT(vt, ExtraFlags[i]))
615 hres = VariantCopy(&vDst, &vSrc);
617 ok(hres == hExpected,
618 "Copy(bad dst): expected 0x%X, got 0x%X for dest vt %d|0x%X\n",
619 hExpected, hres, vt, ExtraFlags[i]);
621 ok(V_VT(&vDst) == VT_UI1,
622 "Copy(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
626 /* Test that VariantClear() checks vSrc for validity before copying */
627 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
629 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
633 hExpected = DISP_E_BADVARTYPE;
635 memset(&vDst, 0, sizeof(vDst));
636 V_VT(&vDst) = VT_EMPTY;
638 memset(&vSrc, 0, sizeof(vSrc));
639 V_VT(&vSrc) = vt | ExtraFlags[i];
641 /* src is allowed to be a VT_CLSID */
642 if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
645 hres = VariantCopy(&vDst, &vSrc);
647 ok(hres == hExpected,
648 "Copy(bad src): expected 0x%X, got 0x%X for src vt %d|0x%X\n",
649 hExpected, hres, vt, ExtraFlags[i]);
651 ok(V_VT(&vDst) == (vt|ExtraFlags[i]),
652 "Copy(bad src): expected vt = %d, got %d\n",
653 vt | ExtraFlags[i], V_VT(&vDst));
657 /* Test that copying a NULL BSTR results in an empty BSTR */
658 memset(&vDst, 0, sizeof(vDst));
659 V_VT(&vDst) = VT_EMPTY;
660 memset(&vSrc, 0, sizeof(vSrc));
661 V_VT(&vSrc) = VT_BSTR;
662 hres = VariantCopy(&vDst, &vSrc);
663 ok(hres == S_OK, "Copy(NULL BSTR): Failed to copy a NULL BSTR\n");
666 ok((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst),
667 "Copy(NULL BSTR): should have non-NULL result\n");
668 if ((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst))
670 ok(*V_BSTR(&vDst) == 0, "Copy(NULL BSTR): result not empty\n");
675 /* Determine if a vt is valid for VariantCopyInd() */
676 static int IsValidVariantCopyIndVT(VARTYPE vt, VARTYPE extraFlags)
680 if ((extraFlags & VT_ARRAY) ||
681 (vt > VT_NULL && vt != (VARTYPE)15 && vt < VT_VOID &&
682 !(extraFlags & (VT_VECTOR|VT_RESERVED))))
689 static void test_VariantCopyInd(void)
691 VARIANTARG vSrc, vDst, vRef, vRef2;
695 HRESULT hres, hExpected;
697 memset(buffer, 0, sizeof(buffer));
700 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
702 if (ExtraFlags[i] & VT_ARRAY)
703 continue; /* Native crashes on NULL safearray */
705 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
709 memset(&vSrc, 0, sizeof(vSrc));
710 V_VT(&vSrc) = vt | ExtraFlags[i];
712 hExpected = DISP_E_BADVARTYPE;
713 if (!(ExtraFlags[i] & VT_BYREF))
715 /* if src is not by-reference, acts as VariantCopy() */
716 if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
721 if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
722 vt == VT_DISPATCH || vt == VT_RECORD)
723 continue; /* Need valid ptrs for deep copies */
725 V_BYREF(&vSrc) = &buffer;
726 hExpected = E_INVALIDARG;
728 if ((vt == VT_I8 || vt == VT_UI8) &&
729 ExtraFlags[i] == VT_BYREF)
731 if (HAVE_OLEAUT32_I8)
732 hExpected = S_OK; /* Only valid if I8 is a known type */
734 else if (IsValidVariantCopyIndVT(vt, ExtraFlags[i]))
738 hres = VariantCopyInd(&vSrc, &vSrc);
740 ok(hres == hExpected,
741 "CopyInd(src==dst): expected 0x%X, got 0x%X for src==dst vt %d|0x%X\n",
742 hExpected, hres, vt, ExtraFlags[i]);
747 memset(&vSrc, 0, sizeof(vSrc));
748 V_VT(&vSrc) = VT_UI1|VT_BYREF;
749 V_BYREF(&vSrc) = &buffer;
751 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
753 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
757 memset(&vDst, 0, sizeof(vDst));
758 V_VT(&vDst) = vt | ExtraFlags[i];
760 hExpected = DISP_E_BADVARTYPE;
762 if (IsValidVariantClearVT(vt, ExtraFlags[i]))
765 hres = VariantCopyInd(&vDst, &vSrc);
767 ok(hres == hExpected,
768 "CopyInd(bad dst): expected 0x%X, got 0x%X for dst vt %d|0x%X\n",
769 hExpected, hres, vt, ExtraFlags[i]);
771 ok(V_VT(&vDst) == VT_UI1,
772 "CopyInd(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
777 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]) && !IS_ANCIENT; i++)
779 if (ExtraFlags[i] & VT_ARRAY)
780 continue; /* Native crashes on NULL safearray */
782 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
786 memset(&vDst, 0, sizeof(vDst));
787 V_VT(&vDst) = VT_EMPTY;
789 memset(&vSrc, 0, sizeof(vSrc));
790 V_VT(&vSrc) = vt | ExtraFlags[i];
792 hExpected = DISP_E_BADVARTYPE;
793 if (!(ExtraFlags[i] & VT_BYREF))
795 /* if src is not by-reference, acts as VariantCopy() */
796 if (vt != VT_CLSID && IsValidVariantClearVT(vt, ExtraFlags[i]))
801 if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
802 vt == VT_DISPATCH || vt == VT_RECORD)
803 continue; /* Need valid ptrs for deep copies, see vartype.c */
805 V_BYREF(&vSrc) = &buffer;
807 hExpected = E_INVALIDARG;
809 if ((vt == VT_I8 || vt == VT_UI8) &&
810 ExtraFlags[i] == VT_BYREF)
812 if (HAVE_OLEAUT32_I8)
813 hExpected = S_OK; /* Only valid if I8 is a known type */
815 else if (IsValidVariantCopyIndVT(vt, ExtraFlags[i]))
819 hres = VariantCopyInd(&vDst, &vSrc);
821 ok(hres == hExpected,
822 "CopyInd(bad src): expected 0x%X, got 0x%X for src vt %d|0x%X\n",
823 hExpected, hres, vt, ExtraFlags[i]);
826 if (vt == VT_VARIANT && ExtraFlags[i] == VT_BYREF)
828 /* Type of vDst should be the type of the referenced variant.
829 * Since we set the buffer to all zeros, its type should be
832 ok(V_VT(&vDst) == VT_EMPTY,
833 "CopyInd(bad src): expected dst vt = VT_EMPTY, got %d|0x%X\n",
834 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
838 ok(V_VT(&vDst) == (vt|(ExtraFlags[i] & ~VT_BYREF)),
839 "CopyInd(bad src): expected dst vt = %d|0x%X, got %d|0x%X\n",
840 vt, ExtraFlags[i] & ~VT_BYREF,
841 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
847 /* By-reference variants are dereferenced */
848 V_VT(&vRef) = VT_UI1;
850 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
851 V_VARIANTREF(&vSrc) = &vRef;
854 hres = VariantCopyInd(&vDst, &vSrc);
855 ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x77,
856 "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
857 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
859 /* By-reference variant to a by-reference type succeeds */
860 V_VT(&vRef) = VT_UI1|VT_BYREF;
861 V_UI1REF(&vRef) = buffer; buffer[0] = 0x88;
862 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
863 V_VARIANTREF(&vSrc) = &vRef;
866 hres = VariantCopyInd(&vDst, &vSrc);
867 ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x88,
868 "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
869 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
871 /* But a by-reference variant to a by-reference variant fails */
872 V_VT(&vRef2) = VT_UI1;
873 V_UI1(&vRef2) = 0x77;
874 V_VT(&vRef) = VT_VARIANT|VT_BYREF;
875 V_VARIANTREF(&vRef) = &vRef2;
876 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
877 V_VARIANTREF(&vSrc) = &vRef;
880 hres = VariantCopyInd(&vDst, &vSrc);
881 ok(hres == E_INVALIDARG,
882 "CopyInd(ref->ref): expected E_INVALIDARG, got 0x%08x\n", hres);
885 static HRESULT (WINAPI *pVarParseNumFromStr)(OLECHAR*,LCID,ULONG,NUMPARSE*,BYTE*);
887 /* Macros for converting and testing the result of VarParseNumFromStr */
890 static HRESULT convert_str( const char *str, INT dig, ULONG flags,
891 NUMPARSE *np, BYTE rgb[128], LCID lcid )
894 MultiByteToWideChar( CP_ACP,0, str, -1, buff, sizeof(buff)/sizeof(WCHAR) );
895 memset( rgb, FAILDIG, 128 );
896 memset( np, 255, sizeof(*np) );
898 np->dwInFlags = flags;
899 return pVarParseNumFromStr( buff, lcid, LOCALE_NOUSEROVERRIDE, np, rgb);
902 static void expect_NumFromStr( int line, HRESULT hres, NUMPARSE *np, INT a, ULONG b, ULONG c,
903 INT d, INT e, INT f )
905 if (hres == (HRESULT)S_OK)
907 ok_(__FILE__,line)(np->cDig == a, "Expected cDig = %d, got %d\n", a, np->cDig);
908 ok_(__FILE__,line)(np->dwInFlags == b, "Expected dwInFlags = 0x%x, got 0x%x\n", b, np->dwInFlags);
909 ok_(__FILE__,line)(np->dwOutFlags == c, "Expected dwOutFlags = 0x%x, got 0x%x\n", c, np->dwOutFlags);
910 ok_(__FILE__,line)(np->cchUsed == d, "Expected cchUsed = %d, got %d\n", d, np->cchUsed);
911 ok_(__FILE__,line)(np->nBaseShift == e, "Expected nBaseShift = %d, got %d\n", e, np->nBaseShift);
912 ok_(__FILE__,line)(np->nPwr10 == f, "Expected nPwr10 = %d, got %d\n", f, np->nPwr10);
916 #define CONVERTN(str,dig,flags) hres = convert_str( str, dig, flags, &np, rgb, lcid )
917 #define CONVERT(str,flags) CONVERTN(str,sizeof(rgb),flags)
918 #define EXPECT(a,b,c,d,e,f) expect_NumFromStr( __LINE__, hres, &np, a, b, c, d, e, f )
919 #define EXPECTRGB(a,b) ok(rgb[a] == b, "Digit[%d], expected %d, got %d\n", a, b, rgb[a])
920 #define EXPECTFAIL ok(hres == (HRESULT)DISP_E_TYPEMISMATCH, "Call succeeded, hres = %08x\n", hres)
921 #define EXPECT2(a,b) EXPECTRGB(0,a); EXPECTRGB(1,b)
923 static void test_VarParseNumFromStr(void)
926 /* Ensure all tests are using the same locale characters for '$', ',' etc */
927 LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
933 CHECKPTR(VarParseNumFromStr);
935 /* Consume a single digit */
940 /* cDig is not literal digits - zeros are suppressed and nPwr10 is increased */
943 /* Note: Win32 writes the trailing zeros if they are within cDig's limits,
944 * but then excludes them from the returned cDig count.
945 * In our implementation we don't bother writing them at all.
949 /* if cDig is too small and numbers follow, sets INEXACT */
951 EXPECT(1,0,NUMPRS_INEXACT,2,0,1);
954 /* Strips leading zeros */
959 /* Strips leading zeros */
965 /* Fails on non digits */
968 EXPECTRGB(0,FAILDIG);
970 /** NUMPRS_LEADING_WHITE/NUMPRS_TRAILING_WHITE **/
972 /* Without flag, fails on whitespace */
975 EXPECTRGB(0,FAILDIG);
978 /* With flag, consumes whitespace */
979 CONVERT(" 0", NUMPRS_LEADING_WHITE);
980 EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
983 /* Test TAB once, then assume it acts as space for all cases */
984 CONVERT("\t0", NUMPRS_LEADING_WHITE);
985 EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
989 /* Doesn't pick up trailing whitespace without flag */
994 /* With flag, consumes trailing whitespace */
995 CONVERT("0 ", NUMPRS_TRAILING_WHITE);
996 EXPECT(1,NUMPRS_TRAILING_WHITE,NUMPRS_TRAILING_WHITE,2,0,0);
999 /* Leading flag only consumes leading */
1000 CONVERT(" 0 ", NUMPRS_LEADING_WHITE);
1001 EXPECT(1,NUMPRS_LEADING_WHITE,NUMPRS_LEADING_WHITE,2,0,0);
1004 /* Both flags consumes both */
1005 CONVERT(" 0 ", NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE);
1006 EXPECT(1,NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE,NUMPRS_LEADING_WHITE|NUMPRS_TRAILING_WHITE,3,0,0);
1009 /** NUMPRS_LEADING_PLUS/NUMPRS_TRAILING_PLUS **/
1011 /* Without flag, fails on + */
1014 EXPECTRGB(0,FAILDIG);
1016 /* With flag, consumes + */
1017 CONVERT("+0", NUMPRS_LEADING_PLUS);
1018 EXPECT(1,NUMPRS_LEADING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
1021 /* Without flag, doesn't consume trailing + */
1023 EXPECT(1,0,0,1,0,0);
1026 /* With flag, consumes trailing + */
1027 CONVERT("0+", NUMPRS_TRAILING_PLUS);
1028 EXPECT(1,NUMPRS_TRAILING_PLUS,NUMPRS_TRAILING_PLUS,2,0,0);
1031 /* With leading flag, doesn't consume trailing + */
1032 CONVERT("+0+", NUMPRS_LEADING_PLUS);
1033 EXPECT(1,NUMPRS_LEADING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
1036 /* Trailing + doesn't get consumed if we specify both (unlike whitespace) */
1037 CONVERT("+0+", NUMPRS_LEADING_PLUS|NUMPRS_TRAILING_PLUS);
1038 EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_TRAILING_PLUS,NUMPRS_LEADING_PLUS,2,0,0);
1041 /** NUMPRS_LEADING_MINUS/NUMPRS_TRAILING_MINUS **/
1043 /* Without flag, fails on - */
1046 EXPECTRGB(0,FAILDIG);
1048 /* With flag, consumes - */
1049 CONVERT("-0", NUMPRS_LEADING_MINUS);
1050 EXPECT(1,NUMPRS_LEADING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1053 /* Without flag, doesn't consume trailing - */
1055 EXPECT(1,0,0,1,0,0);
1058 /* With flag, consumes trailing - */
1059 CONVERT("0-", NUMPRS_TRAILING_MINUS);
1060 EXPECT(1,NUMPRS_TRAILING_MINUS,NUMPRS_NEG|NUMPRS_TRAILING_MINUS,2,0,0);
1063 /* With leading flag, doesn't consume trailing - */
1064 CONVERT("-0-", NUMPRS_LEADING_MINUS);
1065 EXPECT(1,NUMPRS_LEADING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1068 /* Trailing - doesn't get consumed if we specify both (unlike whitespace) */
1069 CONVERT("-0-", NUMPRS_LEADING_MINUS|NUMPRS_TRAILING_MINUS);
1070 EXPECT(1,NUMPRS_LEADING_MINUS|NUMPRS_TRAILING_MINUS,NUMPRS_NEG|NUMPRS_LEADING_MINUS,2,0,0);
1073 /** NUMPRS_HEX_OCT **/
1075 /* Could be hex, octal or decimal - With flag reads as decimal */
1076 CONVERT("0", NUMPRS_HEX_OCT);
1077 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1080 /* Doesn't recognise hex in .asm sytax */
1081 CONVERT("0h", NUMPRS_HEX_OCT);
1082 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1085 /* Doesn't fail with valid leading string but no digits */
1086 CONVERT("0x", NUMPRS_HEX_OCT);
1087 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1090 /* Doesn't recognise hex format humbers at all! */
1091 CONVERT("0x0", NUMPRS_HEX_OCT);
1092 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1095 /* Doesn't recognise plain hex digits either */
1096 CONVERT("FE", NUMPRS_HEX_OCT);
1098 EXPECTRGB(0,FAILDIG);
1101 CONVERT("0100", NUMPRS_HEX_OCT);
1102 EXPECT(1,NUMPRS_HEX_OCT,0,4,0,2);
1106 EXPECTRGB(3,FAILDIG);
1109 CONVERT("&HF800", NUMPRS_HEX_OCT);
1110 EXPECT(4,NUMPRS_HEX_OCT,0x40,6,4,0);
1115 EXPECTRGB(4,FAILDIG);
1117 /* VB hex lower case and leading zero */
1118 CONVERT("&h0abcdef", NUMPRS_HEX_OCT);
1119 EXPECT(6,NUMPRS_HEX_OCT,0x40,9,4,0);
1126 EXPECTRGB(6,FAILDIG);
1129 CONVERT("&O300", NUMPRS_HEX_OCT);
1130 EXPECT(3,NUMPRS_HEX_OCT,0x40,5,3,0);
1134 EXPECTRGB(3,FAILDIG);
1136 /* VB oct lower case and leading zero */
1137 CONVERT("&o0777", NUMPRS_HEX_OCT);
1138 EXPECT(3,NUMPRS_HEX_OCT,0x40,6,3,0);
1142 EXPECTRGB(3,FAILDIG);
1144 /* VB oct char bigger than 7 */
1145 CONVERT("&o128", NUMPRS_HEX_OCT);
1147 Native versions 2.x of oleaut32 allow this to succeed: later versions and Wine don't
1149 EXPECTRGB(0,FAILDIG);
1151 /** NUMPRS_PARENS **/
1153 /* Empty parens = error */
1154 CONVERT("()", NUMPRS_PARENS);
1156 EXPECTRGB(0,FAILDIG);
1158 /* With flag, trailing parens not consumed */
1159 CONVERT("0()", NUMPRS_PARENS);
1160 EXPECT(1,NUMPRS_PARENS,0,1,0,0);
1163 /* With flag, Number in parens made negative and parens consumed */
1164 CONVERT("(0)", NUMPRS_PARENS);
1165 EXPECT(1,NUMPRS_PARENS,NUMPRS_NEG|NUMPRS_PARENS,3,0,0);
1168 /** NUMPRS_THOUSANDS **/
1170 /* With flag, thousands sep. not needed */
1171 CONVERT("0", NUMPRS_THOUSANDS);
1172 EXPECT(1,NUMPRS_THOUSANDS,0,1,0,0);
1175 /* With flag, thousands sep. and following digits consumed */
1176 CONVERT("1,000", NUMPRS_THOUSANDS);
1177 EXPECT(1,NUMPRS_THOUSANDS,NUMPRS_THOUSANDS,5,0,3);
1180 /* With flag and decimal point, thousands sep. but not decimals consumed */
1181 CONVERT("1,000.0", NUMPRS_THOUSANDS);
1182 EXPECT(1,NUMPRS_THOUSANDS,NUMPRS_THOUSANDS,5,0,3);
1185 /** NUMPRS_CURRENCY **/
1187 /* Without flag, chokes on currency sign */
1190 EXPECTRGB(0,FAILDIG);
1192 /* With flag, consumes currency sign */
1193 CONVERT("$11", NUMPRS_CURRENCY);
1194 EXPECT(2,NUMPRS_CURRENCY,NUMPRS_CURRENCY,3,0,0);
1196 EXPECTRGB(2,FAILDIG);
1198 /* With flag only, doesn't consume decimal point */
1199 CONVERT("$11.1", NUMPRS_CURRENCY);
1200 EXPECT(2,NUMPRS_CURRENCY,NUMPRS_CURRENCY,3,0,0);
1202 EXPECTRGB(2,FAILDIG);
1204 /* With flag and decimal flag, consumes decimal point and following digits */
1205 CONVERT("$11.1", NUMPRS_CURRENCY|NUMPRS_DECIMAL);
1206 EXPECT(3,NUMPRS_CURRENCY|NUMPRS_DECIMAL,NUMPRS_CURRENCY|NUMPRS_DECIMAL,5,0,-1);
1209 EXPECTRGB(3,FAILDIG);
1211 /* Thousands flag can only be used with currency */
1212 CONVERT("$1,234", NUMPRS_CURRENCY|NUMPRS_THOUSANDS);
1213 EXPECT(4,NUMPRS_CURRENCY|NUMPRS_THOUSANDS,NUMPRS_CURRENCY|NUMPRS_THOUSANDS,6,0,0);
1217 EXPECTRGB(4,FAILDIG);
1219 /** NUMPRS_DECIMAL **/
1221 /* With flag, consumes decimal point */
1222 CONVERT("1.1", NUMPRS_DECIMAL);
1223 EXPECT(2,NUMPRS_DECIMAL,NUMPRS_DECIMAL,3,0,-1);
1225 EXPECTRGB(2,FAILDIG);
1227 /* With flag, consumes decimal point. Skipping the decimal part is not an error */
1228 CONVERT("1.", NUMPRS_DECIMAL);
1229 EXPECT(1,NUMPRS_DECIMAL,NUMPRS_DECIMAL,2,0,0);
1232 /* Consumes only one decimal point */
1233 CONVERT("1.1.", NUMPRS_DECIMAL);
1234 EXPECT(2,NUMPRS_DECIMAL,NUMPRS_DECIMAL,3,0,-1);
1236 EXPECTRGB(2,FAILDIG);
1238 /** NUMPRS_EXPONENT **/
1240 /* Without flag, doesn't consume exponent */
1242 EXPECT(1,0,0,1,0,0);
1245 /* With flag, consumes exponent */
1246 CONVERT("1e1", NUMPRS_EXPONENT);
1247 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,1);
1250 /* Negative exponents are accepted without flags */
1251 CONVERT("1e-1", NUMPRS_EXPONENT);
1252 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,-1);
1255 /* As are positive exponents and leading exponent 0's */
1256 CONVERT("1e+01", NUMPRS_EXPONENT);
1257 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,5,0,1);
1260 /* The same for zero exponents */
1261 CONVERT("1e0", NUMPRS_EXPONENT);
1262 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,0);
1265 /* Sign on a zero exponent doesn't matter */
1266 CONVERT("1e+0", NUMPRS_EXPONENT);
1267 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,0);
1270 CONVERT("1e-0", NUMPRS_EXPONENT);
1271 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,4,0,0);
1274 /* Doesn't consume a real number exponent */
1275 CONVERT("1e1.", NUMPRS_EXPONENT);
1276 EXPECT(1,NUMPRS_EXPONENT,NUMPRS_EXPONENT,3,0,1);
1279 /* Powers of 10 are calculated from the position of any decimal point */
1280 CONVERT("1.5e20", NUMPRS_EXPONENT|NUMPRS_DECIMAL);
1281 EXPECT(2,NUMPRS_EXPONENT|NUMPRS_DECIMAL,NUMPRS_EXPONENT|NUMPRS_DECIMAL,6,0,19);
1284 CONVERT("1.5e-20", NUMPRS_EXPONENT|NUMPRS_DECIMAL);
1285 EXPECT(2,NUMPRS_EXPONENT|NUMPRS_DECIMAL,NUMPRS_EXPONENT|NUMPRS_DECIMAL,7,0,-21);
1288 /** NUMPRS_USE_ALL **/
1290 /* Flag expects all digits */
1291 CONVERT("0", NUMPRS_USE_ALL);
1292 EXPECT(1,NUMPRS_USE_ALL,0,1,0,0);
1295 /* Rejects anything trailing */
1296 CONVERT("0 ", NUMPRS_USE_ALL);
1300 /* Unless consumed by trailing flag */
1301 CONVERT("0 ", NUMPRS_USE_ALL|NUMPRS_TRAILING_WHITE);
1302 EXPECT(1,NUMPRS_USE_ALL|NUMPRS_TRAILING_WHITE,NUMPRS_TRAILING_WHITE,2,0,0);
1305 /** Combinations **/
1307 /* Leading whitepace and plus, doesn't consume trailing whitespace */
1308 CONVERT("+ 0 ", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1309 EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,3,0,0);
1312 /* Order of whitepace and plus is unimportant */
1313 CONVERT(" +0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1314 EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,3,0,0);
1317 /* Leading whitespace can be repeated */
1318 CONVERT(" + 0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1319 EXPECT(1,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE,4,0,0);
1322 /* But plus/minus etc. cannot */
1323 CONVERT("+ +0", NUMPRS_LEADING_PLUS|NUMPRS_LEADING_WHITE);
1325 EXPECTRGB(0,FAILDIG);
1327 /* Inexact is not set if trailing zeros are removed */
1328 CONVERTN("10", 1, 0);
1329 EXPECT(1,0,0,2,0,1);
1332 /* Make sure a leading 0 is stripped but decimals after it get read */
1333 CONVERT("-0.51", NUMPRS_STD);
1334 EXPECT(2,NUMPRS_STD,NUMPRS_NEG|NUMPRS_DECIMAL|NUMPRS_LEADING_MINUS,5,0,-2);
1337 /* Keep trailing zeros on whole number part of a decimal */
1338 CONVERT("10.1", NUMPRS_STD);
1339 EXPECT(3,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
1343 /* Zeros after decimal sign */
1344 CONVERT("0.01", NUMPRS_STD);
1345 EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-2);
1348 /* Trailing zeros after decimal part */
1349 CONVERT("0.10", NUMPRS_STD);
1350 EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
1354 static HRESULT (WINAPI *pVarNumFromParseNum)(NUMPARSE*,BYTE*,ULONG,VARIANT*);
1356 /* Macros for converting and testing the result of VarNumFromParseNum */
1357 #define SETRGB(indx,val) if (!indx) memset(rgb, FAILDIG, sizeof(rgb)); rgb[indx] = val
1359 #define CONVERT(a,b,c,d,e,f,bits) \
1360 np.cDig = (a); np.dwInFlags = (b); np.dwOutFlags = (c); np.cchUsed = (d); \
1361 np.nBaseShift = (e); np.nPwr10 = (f); hres = pVarNumFromParseNum(&np, rgb, bits, &vOut)
1362 static const char *szFailOverflow = "Expected overflow, hres = %08x\n";
1363 #define EXPECT_OVERFLOW ok(hres == (HRESULT)DISP_E_OVERFLOW, szFailOverflow, hres)
1364 static const char *szFailOk = "Call failed, hres = %08x\n";
1365 #define EXPECT_OK ok(hres == (HRESULT)S_OK, szFailOk, hres); \
1366 if (hres == (HRESULT)S_OK)
1367 #define EXPECT_TYPE(typ) ok(V_VT(&vOut) == typ,"Expected Type = " #typ ", got %d\n", V_VT(&vOut))
1368 #define EXPECT_I1(val) EXPECT_OK { EXPECT_TYPE(VT_I1); \
1369 ok(V_I1(&vOut) == val, "Expected i1 = %d, got %d\n", (signed char)val, V_I1(&vOut)); }
1370 #define EXPECT_UI1(val) EXPECT_OK { EXPECT_TYPE(VT_UI1); \
1371 ok(V_UI1(&vOut) == val, "Expected ui1 = %d, got %d\n", (BYTE)val, V_UI1(&vOut)); }
1372 #define EXPECT_I2(val) EXPECT_OK { EXPECT_TYPE(VT_I2); \
1373 ok(V_I2(&vOut) == val, "Expected i2 = %d, got %d\n", (SHORT)val, V_I2(&vOut)); }
1374 #define EXPECT_UI2(val) EXPECT_OK { EXPECT_TYPE(VT_UI2); \
1375 ok(V_UI2(&vOut) == val, "Expected ui2 = %d, got %d\n", (USHORT)val, V_UI2(&vOut)); }
1376 #define EXPECT_I4(val) EXPECT_OK { EXPECT_TYPE(VT_I4); \
1377 ok(V_I4(&vOut) == val, "Expected i4 = %d, got %d\n", (LONG)val, V_I4(&vOut)); }
1378 #define EXPECT_UI4(val) EXPECT_OK { EXPECT_TYPE(VT_UI4); \
1379 ok(V_UI4(&vOut) == val, "Expected ui4 = %d, got %d\n", (ULONG)val, V_UI4(&vOut)); }
1380 #define EXPECT_I8(high,low) EXPECT_OK { EXPECT_TYPE(VT_I8); \
1381 ok(V_I8(&vOut) == ((((LONG64)(high))<<32)|(low)), "Expected i8 = %x%08x, got %x%08x\n", \
1382 (LONG)(high), (LONG)(low), (LONG)(V_I8(&vOut)>>32), (LONG)V_I8(&vOut) ); }
1383 #define EXPECT_UI8(val) EXPECT_OK { EXPECT_TYPE(VT_UI8); \
1384 ok(V_UI8(&vOut) == val, "Expected ui8 = 0x%x%08x, got 0x%x%08x\n", \
1385 (DWORD)((ULONG64)val >> 32), (DWORD)(ULONG64)val, (DWORD)(V_UI8(&vOut) >> 32), (DWORD)V_UI8(&vOut)); }
1386 #define EXPECT_R4(val) EXPECT_OK { EXPECT_TYPE(VT_R4); \
1387 ok(V_R4(&vOut) == val, "Expected r4 = %f, got %f\n", val, V_R4(&vOut)); }
1388 #define EXPECT_R8(val) EXPECT_OK { EXPECT_TYPE(VT_R8); \
1389 ok(V_R8(&vOut) == val, "Expected r8 = %g, got %g\n", val, V_R8(&vOut)); }
1390 #define CY_MULTIPLIER 10000
1391 #define EXPECT_CY(val) EXPECT_OK { EXPECT_TYPE(VT_CY); \
1392 ok(V_CY(&vOut).int64 == (LONG64)(val * CY_MULTIPLIER), "Expected r8 = 0x%x%08x, got 0x%x%08x\n", \
1393 (DWORD)((LONG64)val >> 23), (DWORD)(LONG64)val, (DWORD)(V_CY(&vOut).int64 >>32), (DWORD)V_CY(&vOut).int64); }
1395 static void test_VarNumFromParseNum(void)
1402 CHECKPTR(VarNumFromParseNum);
1404 /* Convert the number 1 to different types */
1405 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1); EXPECT_I1(1);
1406 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_UI1); EXPECT_UI1(1);
1407 /* Prefers a signed type to unsigned of the same size */
1408 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1|VTBIT_UI1); EXPECT_I1(1);
1409 /* But takes the smaller size if possible */
1410 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I2|VTBIT_UI1); EXPECT_UI1(1);
1412 /* Try different integer sizes */
1413 #define INTEGER_VTBITS (VTBIT_I1|VTBIT_UI1|VTBIT_I2|VTBIT_UI2|VTBIT_I4|VTBIT_UI4|VTBIT_I8|VTBIT_UI8)
1415 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, INTEGER_VTBITS); EXPECT_I1(1);
1417 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 7);
1418 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I1(127);
1420 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
1421 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(128);
1423 SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 5);
1424 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(255);
1426 SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 6);
1427 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I2(256);
1429 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 7);
1430 CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_I2(32767);
1432 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
1433 CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_UI2(32768);
1435 /* Assume the above pattern holds for remaining positive integers; test negative */
1438 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
1439 CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I1(-128);
1441 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 9);
1442 CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I2(-129);
1444 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
1445 CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I2(-32768);
1447 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 9);
1448 CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I4(-32769);
1450 /* Assume the above pattern holds for remaining negative integers */
1452 /* Test hexadecimal conversions */
1453 SETRGB(0, 1); CONVERT(1,0,0,1,4,0, INTEGER_VTBITS); EXPECT_I1(0x01);
1455 SETRGB(0, 7); SETRGB(1, 0xf);
1456 CONVERT(2,0,0,2,4,0, INTEGER_VTBITS); EXPECT_I1(0x7f);
1458 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1459 CONVERT(4,0,0,4,4,0, INTEGER_VTBITS); EXPECT_I2(0x7fff);
1461 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1462 SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
1463 CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x7fffffffL);
1464 /* 0x7fffffffffffffff (64 bits) */
1465 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
1466 SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
1467 SETRGB(8, 0xf); SETRGB(9, 0xf); SETRGB(10, 0xf); SETRGB(11, 0xf);
1468 SETRGB(12, 0xf); SETRGB(13, 0xf); SETRGB(14, 0xf); SETRGB(15, 0xf);
1469 if (HAVE_OLEAUT32_I8)
1471 /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
1472 truncate the number to the smallest integer size requested:
1473 CONVERT(16,0,0,16,4,0, INTEGER_VTBITS); EXPECT_I1((signed char)0xff); */
1474 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x7fffffff,0xffffffff);
1477 /* Assume the above pattern holds for numbers without hi-bit set, test (preservation of) hi-bit */
1479 SETRGB(0, 8); SETRGB(1, 2);
1480 CONVERT(2,0,0,2,4,0, INTEGER_VTBITS);
1481 EXPECT_I1((signed char)0x82);
1483 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
1484 CONVERT(4,0,0,4,4,0, INTEGER_VTBITS);
1485 EXPECT_I2((signed short)0x8002);
1487 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1488 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
1489 CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x80000002);
1490 /* 0x8000000000000002 (64 bits) */
1491 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1492 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
1493 SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
1494 SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
1495 if (HAVE_OLEAUT32_I8)
1497 /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
1498 truncate the number to the smallest integer size requested:
1499 CONVERT(16,0,0,16,4,0, INTEGER_VTBITS & ~VTBIT_I1);
1500 EXPECT_I2((signed short)0x0002); */
1501 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x80000000,0x00000002);
1504 /* Test (preservation of) hi-bit with STRICT type requesting */
1506 SETRGB(0, 8); SETRGB(1, 2);
1507 CONVERT(2,0,0,2,4,0, VTBIT_I1);
1508 EXPECT_I1((signed char)0x82);
1510 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
1511 CONVERT(4,0,0,4,4,0, VTBIT_I2);
1512 EXPECT_I2((signed short)0x8002);
1514 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1515 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
1516 CONVERT(8,0,0,8,4,0, VTBIT_I4); EXPECT_I4(0x80000002);
1517 /* 0x8000000000000002 (64 bits) */
1518 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
1519 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
1520 SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
1521 SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
1522 if (HAVE_OLEAUT32_I8)
1524 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x80000000,0x00000002);
1526 /* Assume the above pattern holds for numbers with hi-bit set */
1528 /* Negative numbers overflow if we have only unsigned outputs */
1530 SETRGB(0, 1); CONVERT(1,0,NUMPRS_NEG,1,0,0, VTBIT_UI1); EXPECT_OVERFLOW;
1532 SETRGB(0, 6); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_OVERFLOW;
1534 /* Except that rounding is done first, so -0.5 to 0 are accepted as 0 */
1536 SETRGB(0, 5); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_UI1(0);
1538 /* Floating point zero is OK */
1540 SETRGB(0, 0); CONVERT(1,0,NUMPRS_DECIMAL|NUMPRS_EXPONENT,12,0,-8, VTBIT_R8);
1543 /* Float is acceptable for an integer input value */
1544 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4); EXPECT_R4(1.0f);
1546 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8); EXPECT_R8(1.0);
1547 /* As is currency */
1548 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY); EXPECT_CY(1);
1550 /* Float is preferred over double */
1551 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4|VTBIT_R8); EXPECT_R4(1.0f);
1553 /* Double is preferred over currency */
1554 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8|VTBIT_CY); EXPECT_R8(1.0);
1556 /* Currency is preferred over decimal */
1557 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY|VTBIT_DECIMAL); EXPECT_CY(1);
1561 static void test_UdateFromDate( int line, DATE dt, ULONG flags, HRESULT r, WORD d, WORD m, WORD y,
1562 WORD h, WORD mn, WORD s, WORD ms, WORD dw, WORD dy)
1567 memset(&ud, 0, sizeof(ud));
1568 res = pVarUdateFromDate(dt, flags, &ud);
1569 ok_(__FILE__,line)(r == res, "Wrong result %x/%x\n", r, res);
1571 ok_(__FILE__,line)(ud.st.wYear == y && ud.st.wMonth == m && ud.st.wDay == d &&
1572 ud.st.wHour == h && ud.st.wMinute == mn && ud.st.wSecond == s &&
1573 ud.st.wMilliseconds == ms && ud.st.wDayOfWeek == dw && ud.wDayOfYear == dy,
1574 "%.16g expected %d,%d,%d,%d,%d,%d,%d %d %d, got %d,%d,%d,%d,%d,%d,%d %d %d\n",
1575 dt, d, m, y, h, mn, s, ms, dw, dy,
1576 ud.st.wDay, ud.st.wMonth, ud.st.wYear, ud.st.wHour, ud.st.wMinute,
1577 ud.st.wSecond, ud.st.wMilliseconds, ud.st.wDayOfWeek, ud.wDayOfYear );
1579 #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)
1581 static void test_VarUdateFromDate(void)
1583 CHECKPTR(VarUdateFromDate);
1584 DT2UD(29221.0,0,S_OK,1,1,1980,0,0,0,0,2,1); /* 1 Jan 1980 */
1585 DT2UD(29222.0,0,S_OK,2,1,1980,0,0,0,0,3,2); /* 2 Jan 1980 */
1586 DT2UD(33238.0,0,S_OK,31,12,1990,0,0,0,0,1,365); /* 31 Dec 1990 */
1587 DT2UD(0.0,0,S_OK,30,12,1899,0,0,0,0,6,364); /* 30 Dec 1899 - VT_DATE 0.0 */
1588 DT2UD(-657434.0,0,S_OK,1,1,100,0,0,0,0,5,1); /* 1 Jan 100 - Min */
1589 DT2UD(-657435.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* < 1 Jan 100 => err */
1590 DT2UD(2958465.0,0,S_OK,31,12,9999,0,0,0,0,5,365); /* 31 Dec 9999 - Max */
1591 DT2UD(2958466.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* > 31 Dec 9999 => err */
1593 /* VAR_VALIDDATE doesn't prevent upper and lower bounds being checked */
1594 DT2UD(-657435.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
1595 DT2UD(2958466.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
1598 DT2UD(29221.25,0,S_OK,1,1,1980,6,0,0,0,2,1); /* 6 AM */
1599 DT2UD(29221.33333333,0,S_OK,1,1,1980,8,0,0,0,2,1); /* 8 AM */
1600 DT2UD(29221.5,0,S_OK,1,1,1980,12,0,0,0,2,1); /* 12 AM */
1601 DT2UD(29221.9888884444,0,S_OK,1,1,1980,23,44,0,0,2,1); /* 11:44 PM */
1602 DT2UD(29221.7508765432,0,S_OK,1,1,1980,18,1,16,0,2,1); /* 6:18:02 PM */
1606 static void test_DateFromUDate( int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms,
1607 WORD dw, WORD dy, ULONG flags, HRESULT r, DATE dt )
1617 ud.st.wMinute = (mn);
1618 ud.st.wSecond = (s);
1619 ud.st.wMilliseconds = (ms);
1620 ud.st.wDayOfWeek = (dw);
1621 ud.wDayOfYear = (dy);
1622 res = pVarDateFromUdate(&ud, flags, &out);
1623 ok_(__FILE__,line)((r) == res && (FAILED(r) || fabs(out-(dt)) < 1.0e-11),
1624 "expected %x, %.16g, got %x, %.16g\n", r, dt, res, out);
1626 #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)
1628 static void test_VarDateFromUdate(void)
1630 CHECKPTR(VarDateFromUdate);
1631 UD2T(1,1,1980,0,0,0,0,2,1,0,S_OK,29221.0); /* 1 Jan 1980 */
1632 UD2T(2,1,1980,0,0,0,0,3,2,0,S_OK,29222.0); /* 2 Jan 1980 */
1633 UD2T(31,12,1990,0,0,0,0,0,0,0,S_OK,33238.0); /* 31 Dec 1990 */
1634 UD2T(31,12,90,0,0,0,0,0,0,0,S_OK,33238.0); /* year < 100 is 1900+year! */
1635 UD2T(30,12,1899,0,0,0,0,6,364,0,S_OK,0.0); /* 30 Dec 1899 - VT_DATE 0.0 */
1636 UD2T(1,1,100,0,0,0,0,0,0,0,S_OK,-657434.0); /* 1 Jan 100 - Min */
1637 UD2T(31,12,9999,0,0,0,0,0,0,0,S_OK,2958465.0); /* 31 Dec 9999 - Max */
1638 UD2T(1,1,10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0); /* > 31 Dec 9999 => err */
1640 UD2T(1,1,1980,18,1,16,0,2,1,0,S_OK,29221.75087962963); /* 6:18:02 PM */
1642 UD2T(0,1,1980,0,0,0,0,2,1,0,S_OK,29220.0); /* Rolls back to 31 Dec 1899 */
1643 UD2T(1,13,1980,0,0,0,0,2,1,0,S_OK,29587.0); /* Rolls fwd to 1/1/1981 */
1646 #define ST2DT(d,m,y,h,mn,s,ms,r,dt) \
1647 st.wYear = y; st.wMonth = m; st.wDay = d; st.wHour = h; st.wMinute = mn; \
1648 st.wSecond = s; st.wMilliseconds = ms; st.wDayOfWeek = 0; \
1649 res = pSystemTimeToVariantTime(&st, &out); \
1650 ok(r == res && (!r || fabs(out-dt) < 1.0e-11), \
1651 "expected %d, %.16g, got %d, %.16g\n", r, dt, res, out)
1653 static void test_SystemTimeToVariantTime(void)
1659 CHECKPTR(SystemTimeToVariantTime);
1660 ST2DT(1,1,1980,0,0,0,0,TRUE,29221.0);
1661 ST2DT(2,1,1980,0,0,0,0,TRUE,29222.0);
1662 ST2DT(0,1,1980,0,0,0,0,TRUE,29220.0); /* Rolls back to 31 Dec 1899 */
1663 ST2DT(1,13,1980,0,0,0,0,FALSE,29587.0); /* Fails on invalid month */
1664 ST2DT(31,12,90,0,0,0,0,TRUE,33238.0); /* year < 100 is 1900+year! */
1667 #define DT2ST(dt,r,d,m,y,h,mn,s,ms) \
1668 memset(&st, 0, sizeof(st)); \
1669 res = pVariantTimeToSystemTime(dt, &st); \
1670 ok(r == res && (!r || (st.wYear == y && st.wMonth == m && st.wDay == d && \
1671 st.wHour == h && st.wMinute == mn && st.wSecond == s && \
1672 st.wMilliseconds == ms)), \
1673 "%.16g expected %d, %d,%d,%d,%d,%d,%d,%d, got %d, %d,%d,%d,%d,%d,%d,%d\n", \
1674 dt, r, d, m, y, h, mn, s, ms, res, st.wDay, st.wMonth, st.wYear, \
1675 st.wHour, st.wMinute, st.wSecond, st.wMilliseconds)
1677 static void test_VariantTimeToSystemTime(void)
1682 CHECKPTR(VariantTimeToSystemTime);
1683 DT2ST(29221.0,1,1,1,1980,0,0,0,0);
1684 DT2ST(29222.0,1,2,1,1980,0,0,0,0);
1687 #define MKDOSDATE(d,m,y) ((d & 0x1f) | ((m & 0xf) << 5) | (((y-1980) & 0x7f) << 9))
1688 #define MKDOSTIME(h,m,s) (((s>>1) & 0x1f) | ((m & 0x3f) << 5) | ((h & 0x1f) << 11))
1690 static const char *szDosDateToVarTimeFail = "expected %d, %.16g, got %d, %.16g\n";
1691 #define DOS2DT(d,m,y,h,mn,s,r,dt) out = 0.0; \
1692 dosDate = MKDOSDATE(d,m,y); \
1693 dosTime = MKDOSTIME(h,mn,s); \
1694 res = pDosDateTimeToVariantTime(dosDate, dosTime, &out); \
1695 ok(r == res && (!r || fabs(out-dt) < 1.0e-11), \
1696 szDosDateToVarTimeFail, r, dt, res, out)
1698 static void test_DosDateTimeToVariantTime(void)
1700 USHORT dosDate, dosTime;
1704 CHECKPTR(DosDateTimeToVariantTime);
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);
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 */
1732 #define DT2DOS(dt,r,d,m,y,h,mn,s) dosTime = dosDate = 0; \
1733 expDosDate = MKDOSDATE(d,m,y); \
1734 expDosTime = MKDOSTIME(h,mn,s); \
1735 res = pVariantTimeToDosDateTime(dt, &dosDate, &dosTime); \
1736 ok(r == res && (!r || (dosTime == expDosTime && dosDate == expDosDate)), \
1737 "%g: expected %d,%d(%d/%d/%d),%d(%d:%d:%d) got %d,%d(%d/%d/%d),%d(%d:%d:%d)\n", \
1738 dt, r, expDosDate, expDosDate & 0x1f, (expDosDate >> 5) & 0xf, 1980 + (expDosDate >> 9), \
1739 expDosTime, expDosTime >> 11, (expDosTime >> 5) & 0x3f, (expDosTime & 0x1f), \
1740 res, dosDate, dosDate & 0x1f, (dosDate >> 5) & 0xf, 1980 + (dosDate >> 9), \
1741 dosTime, dosTime >> 11, (dosTime >> 5) & 0x3f, (dosTime & 0x1f))
1743 static void test_VariantTimeToDosDateTime(void)
1745 USHORT dosDate, dosTime, expDosDate, expDosTime;
1748 CHECKPTR(VariantTimeToDosDateTime);
1751 DT2DOS(29221.0,1,1,1,1980,0,0,0); /* 1/1/1980 */
1752 DT2DOS(73050.0,1,31,12,2099,0,0,0); /* 31/12/2099 */
1753 DT2DOS(29220.0,0,0,0,0,0,0,0); /* 31/12/1979 - out of range */
1754 DT2DOS(73415.0,0,0,0,0,0,0,0); /* 31/12/2100 - out of range */
1757 DT2DOS(29221.00032407407,1,1,1,1980,0,0,29); /* 1/1/1980 12:00:28 AM */
1758 DT2DOS(29221.00034722222,1,1,1,1980,0,0,31); /* 1/1/1980 12:00:30 AM */
1759 DT2DOS(29221.04097222222,1,1,1,1980,0,59,0); /* 1/1/1980 12:59:00 AM */
1760 DT2DOS(29221.95833333333,1,1,1,1980,23,0,0); /* 1/1/1980 11:00:00 PM */
1763 static HRESULT (WINAPI *pVarAbs)(LPVARIANT,LPVARIANT);
1765 #define VARABS(vt,val,rvt,rval) \
1766 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
1767 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
1768 test_var_call1( __LINE__, pVarAbs, &v, &exp );
1770 static void test_VarAbs(void)
1772 static const WCHAR szNum[] = {'-','1','.','1','\0' };
1775 VARIANT v, vDst, exp;
1780 /* Test all possible V_VT values.
1782 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
1786 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1788 HRESULT hExpected = DISP_E_BADVARTYPE;
1792 memset(&v, 0, sizeof(v));
1793 V_VT(&v) = vt | ExtraFlags[i];
1794 V_VT(&vDst) = VT_EMPTY;
1796 hres = pVarAbs(&v,&vDst);
1797 if (ExtraFlags[i] & (VT_ARRAY|VT_ARRAY) ||
1798 (!ExtraFlags[i] && (vt == VT_UNKNOWN || vt == VT_BSTR ||
1799 vt == VT_DISPATCH || vt == VT_ERROR || vt == VT_RECORD)))
1801 hExpected = DISP_E_TYPEMISMATCH;
1803 else if (ExtraFlags[i] || vt >= VT_CLSID || vt == VT_VARIANT)
1805 hExpected = DISP_E_BADVARTYPE;
1807 else if (IsValidVariantClearVT(vt, ExtraFlags[i]))
1810 /* Native always fails on some vartypes that should be valid. don't
1811 * check that Wine does the same; these are bugs in native.
1813 if (vt == VT_I8 || vt == VT_UI8 || vt == VT_INT || vt == VT_UINT ||
1814 vt == VT_I1 || vt == VT_UI2 || vt == VT_UI4)
1816 ok(hres == hExpected, "VarAbs: expected 0x%X, got 0x%X for vt %d | 0x%X\n",
1817 hExpected, hres, vt, ExtraFlags[i]);
1821 /* BOOL->I2, BSTR->R8, all others remain the same */
1822 VARABS(BOOL,VARIANT_TRUE,I2,-VARIANT_TRUE);
1823 VARABS(BOOL,VARIANT_FALSE,I2,VARIANT_FALSE);
1824 VARABS(EMPTY,0,I2,0);
1825 VARABS(EMPTY,1,I2,0);
1826 VARABS(NULL,0,NULL,0);
1827 VARABS(NULL,1,NULL,0);
1832 VARABS(UI1,1,UI1,1);
1837 VARABS(DATE,1,DATE,1);
1838 VARABS(DATE,-1,DATE,1);
1840 V_CY(&v).int64 = -10000;
1841 memset(&vDst,0,sizeof(vDst));
1842 hres = pVarAbs(&v,&vDst);
1843 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
1844 "VarAbs(CY): expected 0x0 got 0x%X\n", hres);
1845 GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char));
1846 if (buff[0] != '.' || buff[1])
1848 trace("Skipping VarAbs(BSTR) as decimal separator is '%s'\n", buff);
1852 V_BSTR(&v) = (BSTR)szNum;
1853 memset(&vDst,0,sizeof(vDst));
1854 hres = pVarAbs(&v,&vDst);
1855 ok(hres == S_OK && V_VT(&vDst) == VT_R8 && V_R8(&vDst) == 1.1,
1856 "VarAbs: expected 0x0,%d,%g, got 0x%X,%d,%g\n", VT_R8, 1.1, hres, V_VT(&vDst), V_R8(&vDst));
1859 static HRESULT (WINAPI *pVarNot)(LPVARIANT,LPVARIANT);
1861 #define VARNOT(vt,val,rvt,rval) \
1862 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
1863 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
1864 test_var_call1( __LINE__, pVarNot, &v, &exp );
1866 static void test_VarNot(void)
1868 static const WCHAR szNum0[] = {'0','\0' };
1869 static const WCHAR szNum1[] = {'1','\0' };
1871 VARIANT v, exp, vDst;
1872 DECIMAL *pdec = &V_DECIMAL(&v);
1873 CY *pcy = &V_CY(&v);
1878 /* Test all possible V_VT values */
1879 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
1883 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1885 HRESULT hExpected = DISP_E_BADVARTYPE;
1889 memset(&v, 0, sizeof(v));
1890 V_VT(&v) = vt | ExtraFlags[i];
1891 V_VT(&vDst) = VT_EMPTY;
1895 case VT_I1: case VT_UI1: case VT_I2: case VT_UI2:
1896 case VT_INT: case VT_UINT: case VT_I4: case VT_UI4:
1897 case VT_R4: case VT_R8:
1898 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
1899 case VT_DATE: case VT_CY:
1902 case VT_I8: case VT_UI8:
1903 if (HAVE_OLEAUT32_I8)
1907 if (HAVE_OLEAUT32_RECORD)
1908 hExpected = DISP_E_TYPEMISMATCH;
1910 case VT_UNKNOWN: case VT_BSTR: case VT_DISPATCH: case VT_ERROR:
1911 hExpected = DISP_E_TYPEMISMATCH;
1914 if (IsValidVariantClearVT(vt, ExtraFlags[i]) && vt != VT_CLSID)
1915 hExpected = DISP_E_TYPEMISMATCH;
1919 hres = pVarNot(&v,&vDst);
1920 ok(hres == hExpected, "VarNot: expected 0x%X, got 0x%X vt %d|0x%X\n",
1921 hExpected, hres, vt, ExtraFlags[i]);
1924 /* Test the values returned by all cases that can succeed */
1925 VARNOT(EMPTY,0,I2,-1);
1926 VARNOT(EMPTY,1,I2,-1);
1927 VARNOT(NULL,0,NULL,0);
1928 VARNOT(NULL,1,NULL,0);
1929 VARNOT(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
1930 VARNOT(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
1938 VARNOT(UI1,1,UI1,254);
1939 VARNOT(UI1,0,UI1,255);
1940 VARNOT(UI2,0,I4,-1);
1941 VARNOT(UI2,1,I4,-2);
1942 VARNOT(UI4,0,I4,-1);
1943 VARNOT(UI4,1,I4,-2);
1944 VARNOT(INT,0,I4,-1);
1945 VARNOT(INT,1,I4,-2);
1946 VARNOT(UINT,0,I4,-1);
1947 VARNOT(UINT,1,I4,-2);
1948 if (HAVE_OLEAUT32_I8)
1952 VARNOT(UI8,0,I4,-1);
1953 VARNOT(UI8,1,I4,-2);
1959 VARNOT(DATE,1,I4,-2);
1960 VARNOT(DATE,0,I4,-1);
1961 VARNOT(BSTR,(BSTR)szNum0,I4,-1);
1962 ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum0, "VarNot(0): changed input\n");
1963 VARNOT(BSTR,(BSTR)szNum1,I4,-2);
1964 ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum1, "VarNot(1): changed input\n");
1966 V_VT(&v) = VT_DECIMAL;
1967 S(U(*pdec)).sign = DECIMAL_NEG;
1968 S(U(*pdec)).scale = 0;
1970 S1(U1(*pdec)).Mid32 = 0;
1971 S1(U1(*pdec)).Lo32 = 1;
1972 VARNOT(DECIMAL,*pdec,I4,0);
1975 VARNOT(CY,*pcy,I4,-2);
1978 VARNOT(CY,*pcy,I4,-1);
1981 VARNOT(CY,*pcy,I4,-1);
1984 static HRESULT (WINAPI *pVarSub)(LPVARIANT,LPVARIANT,LPVARIANT);
1986 #define VARSUB(vt1,val1,vt2,val2,rvt,rval) \
1987 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
1988 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
1989 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
1990 test_var_call2( __LINE__, pVarSub, &left, &right, &exp );
1992 static void test_VarSub(void)
1994 static const WCHAR sz12[] = {'1','2','\0'};
1995 VARIANT left, right, exp, result, cy, dec;
1998 HRESULT hres, expectedhres;
2003 lbstr = SysAllocString(sz12);
2004 rbstr = SysAllocString(sz12);
2007 VariantInit(&right);
2008 VariantInit(&result);
2010 /* Test all possible flag/vt combinations & the resulting vt type */
2011 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2014 VARTYPE leftvt, rightvt, resvt;
2016 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
2021 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
2025 expectedhres = S_OK;
2027 memset(&left, 0, sizeof(left));
2028 memset(&right, 0, sizeof(right));
2029 V_VT(&left) = leftvt | ExtraFlags[i];
2030 if (leftvt == VT_BSTR)
2031 V_BSTR(&left) = lbstr;
2032 V_VT(&right) = rightvt | ExtraFlags[i];
2033 if (rightvt == VT_BSTR)
2034 V_BSTR(&right) = rbstr;
2035 V_VT(&result) = VT_EMPTY;
2038 /* All extra flags produce errors */
2039 if (ExtraFlags[i] == (VT_VECTOR|VT_BYREF|VT_RESERVED) ||
2040 ExtraFlags[i] == (VT_VECTOR|VT_RESERVED) ||
2041 ExtraFlags[i] == (VT_VECTOR|VT_BYREF) ||
2042 ExtraFlags[i] == (VT_BYREF|VT_RESERVED) ||
2043 ExtraFlags[i] == VT_VECTOR ||
2044 ExtraFlags[i] == VT_BYREF ||
2045 ExtraFlags[i] == VT_RESERVED)
2047 expectedhres = DISP_E_BADVARTYPE;
2050 else if (ExtraFlags[i] >= VT_ARRAY)
2052 expectedhres = DISP_E_TYPEMISMATCH;
2055 /* Native VarSub cannot handle: VT_I1, VT_UI2, VT_UI4,
2056 VT_INT, VT_UINT and VT_UI8. Tested with WinXP */
2057 else if (!IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
2058 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
2059 leftvt == VT_CLSID || rightvt == VT_CLSID ||
2060 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
2061 leftvt == VT_I1 || rightvt == VT_I1 ||
2062 leftvt == VT_UI2 || rightvt == VT_UI2 ||
2063 leftvt == VT_UI4 || rightvt == VT_UI4 ||
2064 leftvt == VT_UI8 || rightvt == VT_UI8 ||
2065 leftvt == VT_INT || rightvt == VT_INT ||
2066 leftvt == VT_UINT || rightvt == VT_UINT ||
2067 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
2068 leftvt == VT_RECORD || rightvt == VT_RECORD)
2070 if (leftvt == VT_RECORD && rightvt == VT_I8)
2071 expectedhres = DISP_E_TYPEMISMATCH;
2072 else if (leftvt < VT_UI1 && rightvt == VT_RECORD)
2073 expectedhres = DISP_E_TYPEMISMATCH;
2074 else if (leftvt >= VT_UI1 && rightvt == VT_RECORD)
2075 expectedhres = DISP_E_TYPEMISMATCH;
2076 else if (leftvt == VT_RECORD && rightvt <= VT_UI1)
2077 expectedhres = DISP_E_TYPEMISMATCH;
2078 else if (leftvt == VT_RECORD && rightvt > VT_UI1)
2079 expectedhres = DISP_E_BADVARTYPE;
2081 expectedhres = DISP_E_BADVARTYPE;
2084 else if ((leftvt == VT_NULL && rightvt == VT_DISPATCH) ||
2085 (leftvt == VT_DISPATCH && rightvt == VT_NULL))
2087 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
2088 leftvt == VT_ERROR || rightvt == VT_ERROR)
2091 expectedhres = DISP_E_TYPEMISMATCH;
2093 else if (leftvt == VT_NULL || rightvt == VT_NULL)
2095 else if ((leftvt == VT_EMPTY && rightvt == VT_BSTR) ||
2096 (leftvt == VT_DATE && rightvt == VT_DATE) ||
2097 (leftvt == VT_BSTR && rightvt == VT_EMPTY) ||
2098 (leftvt == VT_BSTR && rightvt == VT_BSTR))
2100 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
2102 else if (leftvt == VT_DATE || rightvt == VT_DATE)
2104 else if (leftvt == VT_CY || rightvt == VT_CY)
2106 else if (leftvt == VT_R8 || rightvt == VT_R8)
2108 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
2110 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
2111 if (leftvt == VT_I4 || rightvt == VT_I4 ||
2112 leftvt == VT_I8 || rightvt == VT_I8)
2117 else if (leftvt == VT_I8 || rightvt == VT_I8)
2119 else if (leftvt == VT_I4 || rightvt == VT_I4)
2121 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
2122 leftvt == VT_BOOL || rightvt == VT_BOOL ||
2123 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
2125 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
2130 expectedhres = DISP_E_TYPEMISMATCH;
2133 hres = pVarSub(&left, &right, &result);
2135 ok(hres == expectedhres && V_VT(&result) == resvt,
2136 "VarSub: %d|0x%X, %d|0x%X: Expected failure 0x%X, "
2137 "got 0x%X, expected vt %d got vt %d\n",
2138 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i],
2139 expectedhres, hres, resvt, V_VT(&result));
2144 /* Test returned values */
2145 VARSUB(I4,4,I4,2,I4,2);
2146 VARSUB(I2,4,I2,2,I2,2);
2147 VARSUB(I2,-13,I4,5,I4,-18);
2148 VARSUB(I4,-13,I4,5,I4,-18);
2149 VARSUB(I2,7,R4,0.5,R4,6.5);
2150 VARSUB(R4,0.5,I4,5,R8,-4.5);
2151 VARSUB(R8,7.1,BOOL,0,R8,7.1);
2152 VARSUB(BSTR,lbstr,I2,4,R8,8);
2153 VARSUB(BSTR,lbstr,BOOL,1,R8,11);
2154 VARSUB(BSTR,lbstr,R4,0.1,R8,11.9);
2155 VARSUB(R4,0.2,BSTR,rbstr,R8,-11.8);
2156 VARSUB(DATE,2.25,I4,7,DATE,-4.75);
2157 VARSUB(DATE,1.25,R4,-1.7,DATE,2.95);
2159 VARSUB(UI1, UI1_MAX, UI1, UI1_MAX, UI1, 0);
2160 VARSUB(I2, I2_MAX, I2, I2_MAX, I2, 0);
2161 VARSUB(I2, I2_MIN, I2, I2_MIN, I2, 0);
2162 VARSUB(I4, I4_MAX, I4, I4_MAX, I4, 0.0);
2163 VARSUB(I4, I4_MIN, I4, I4_MIN, I4, 0.0);
2164 VARSUB(R4, R4_MAX, R4, R4_MAX, R4, 0.0);
2165 VARSUB(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX - R4_MIN);
2166 VARSUB(R4, R4_MIN, R4, R4_MIN, R4, 0.0);
2167 VARSUB(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX - R8_MIN);
2168 VARSUB(R8, R8_MIN, R8, R8_MIN, R8, 0.0);
2170 /* Manually test BSTR + BSTR */
2171 V_VT(&left) = VT_BSTR;
2172 V_BSTR(&left) = lbstr;
2173 V_VT(&right) = VT_BSTR;
2174 V_BSTR(&right) = rbstr;
2175 hres = VarSub(&left, &right, &result);
2176 ok(hres == S_OK && V_VT(&result) == VT_R8,
2177 "VarSub: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
2178 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0),
2179 "VarSub: BSTR + BSTR, expected %f got %f\n", 0.0, V_R8(&result));
2181 /* Manually test some VT_CY and VT_DECIMAL variants */
2183 hres = VarCyFromI4(4711, &V_CY(&cy));
2184 ok(hres == S_OK, "VarCyFromI4 failed!\n");
2185 V_VT(&dec) = VT_DECIMAL;
2186 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
2187 ok(hres == S_OK, "VarDecFromR4 failed!\n");
2188 memset(&left, 0, sizeof(left));
2189 memset(&right, 0, sizeof(right));
2190 V_VT(&left) = VT_I4;
2192 V_VT(&right) = VT_UI1;
2195 hres = VarSub(&cy, &right, &result);
2196 ok(hres == S_OK && V_VT(&result) == VT_CY,
2197 "VarSub: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
2198 hres = VarR8FromCy(V_CY(&result), &r);
2199 ok(hres == S_OK && EQ_DOUBLE(r, 4702),
2200 "VarSub: CY value %f, expected %f\n", r, (double)4720);
2202 hres = VarSub(&left, &dec, &result);
2203 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
2204 "VarSub: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
2205 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
2206 ok(hres == S_OK && EQ_DOUBLE(r, -6.8),
2207 "VarSub: DECIMAL value %f, expected %f\n", r, (double)-15.2);
2209 SysFreeString(lbstr);
2210 SysFreeString(rbstr);
2213 static HRESULT (WINAPI *pVarMod)(LPVARIANT,LPVARIANT,LPVARIANT);
2215 static void test_Mod( int line, VARIANT *left, VARIANT *right, VARIANT *expected, HRESULT expres )
2220 memset( &result, 0, sizeof(result) );
2221 hres = pVarMod( left, right, &result );
2222 ok_(__FILE__,line)( hres == expres, "wrong result %x/%x\n", hres, expres );
2224 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
2225 "got %s expected %s\n", variantstr(&result), variantstr(expected) );
2228 #define VARMOD(vt1,vt2,val1,val2,rvt,rval) \
2229 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
2230 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
2231 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2232 test_var_call2( __LINE__, pVarMod, &left, &right, &exp );
2234 #define VARMOD2(vt1,vt2,val1,val2,rvt,rval,hexpected) \
2235 V_VT(&left) = VT_##vt1; V_I4(&left) = val1; \
2236 V_VT(&right) = VT_##vt2; V_I4(&right) = val2; \
2237 V_VT(&exp) = VT_##rvt; V_I4(&exp) = rval; \
2238 test_Mod( __LINE__, &left, &right, &exp, hexpected );
2240 static void test_VarMod(void)
2242 VARIANT v1, v2, vDst, left, right, exp;
2244 HRESULT hexpected = 0;
2245 static const WCHAR szNum0[] = {'1','2','5','\0'};
2246 static const WCHAR szNum1[] = {'1','0','\0'};
2248 BOOL lFound, rFound;
2249 BOOL lValid, rValid;
2250 BSTR strNum0, strNum1;
2254 VARMOD(I1,BOOL,100,10,I4,0);
2255 VARMOD(I1,I1,100,10,I4,0);
2256 VARMOD(I1,UI1,100,10,I4,0);
2257 VARMOD(I1,I2,100,10,I4,0);
2258 VARMOD(I1,UI2,100,10,I4,0);
2259 VARMOD(I1,I4,100,10,I4,0);
2260 VARMOD(I1,UI4,100,10,I4,0);
2261 VARMOD(I1,R4,100,10,I4,0);
2262 VARMOD(I1,R8,100,10,I4,0);
2264 VARMOD(UI1,BOOL,100,10,I2,0);
2265 VARMOD(UI1,I1,100,10,I4,0);
2266 VARMOD(UI1,UI1,100,10,UI1,0);
2267 VARMOD(UI1,I2,100,10,I2,0);
2268 VARMOD(UI1,UI2,100,10,I4,0);
2269 VARMOD(UI1,I4,100,10,I4,0);
2270 VARMOD(UI1,UI4,100,10,I4,0);
2271 VARMOD(UI1,R4,100,10,I4,0);
2272 VARMOD(UI1,R8,100,10,I4,0);
2274 VARMOD(I2,BOOL,100,10,I2,0);
2275 VARMOD(I2,I1,100,10,I4,0);
2276 VARMOD(I2,UI1,100,10,I2,0);
2277 VARMOD(I2,I2,100,10,I2,0);
2278 VARMOD(I2,UI2,100,10,I4,0);
2279 VARMOD(I2,I4,100,10,I4,0);
2280 VARMOD(I2,UI4,100,10,I4,0);
2281 VARMOD(I2,R4,100,10,I4,0);
2282 VARMOD(I2,R8,100,10,I4,0);
2284 VARMOD(I4,BOOL,100,10,I4,0);
2285 VARMOD(I4,I1,100,10,I4,0);
2286 VARMOD(I4,UI1,100,10,I4,0);
2287 VARMOD(I4,I2,100,10,I4,0);
2288 VARMOD(I4,UI2,100,10,I4,0);
2289 VARMOD(I4,I4,100,10,I4,0);
2290 VARMOD(I4,UI4,100,10,I4,0);
2291 VARMOD(I4,R4,100,10,I4,0);
2292 VARMOD(I4,R8,100,10,I4,0);
2293 VARMOD(UI4,BOOL,100,10,I4,0);
2294 VARMOD(UI4,I1,100,10,I4,0);
2295 VARMOD(UI4,UI1,100,10,I4,0);
2296 VARMOD(UI4,I2,100,10,I4,0);
2297 VARMOD(UI4,UI2,100,10,I4,0);
2298 VARMOD(UI4,I4,100,10,I4,0);
2299 VARMOD(UI4,UI4,100,10,I4,0);
2300 VARMOD(UI4,R4,100,10,I4,0);
2301 VARMOD(UI4,R8,100,10,I4,0);
2302 VARMOD(R4,BOOL,100,10,I4,0);
2303 VARMOD(R4,I1,100,10,I4,0);
2304 VARMOD(R4,UI1,100,10,I4,0);
2305 VARMOD(R4,I2,100,10,I4,0);
2306 VARMOD(R4,UI2,100,10,I4,0);
2307 VARMOD(R4,I4,100,10,I4,0);
2308 VARMOD(R4,UI4,100,10,I4,0);
2309 VARMOD(R4,R4,100,10,I4,0);
2310 VARMOD(R4,R8,100,10,I4,0);
2311 VARMOD(R8,BOOL,100,10,I4,0);
2312 VARMOD(R8,I1,100,10,I4,0);
2313 VARMOD(R8,UI1,100,10,I4,0);
2314 VARMOD(R8,I2,100,10,I4,0);
2315 VARMOD(R8,UI2,100,10,I4,0);
2316 VARMOD(R8,I4,100,10,I4,0);
2317 VARMOD(R8,UI4,100,10,I4,0);
2318 VARMOD(R8,R4,100,10,I4,0);
2319 VARMOD(R8,R8,100,10,I4,0);
2321 VARMOD(INT,INT,100,10,I4,0);
2322 VARMOD(INT,UINT,100,10,I4,0);
2324 VARMOD(BOOL,BOOL,100,10,I2,0);
2325 VARMOD(BOOL,I1,100,10,I4,0);
2326 VARMOD(BOOL,UI1,100,10,I2,0);
2327 VARMOD(BOOL,I2,100,10,I2,0);
2328 VARMOD(BOOL,UI2,100,10,I4,0);
2329 VARMOD(BOOL,I4,100,10,I4,0);
2330 VARMOD(BOOL,UI4,100,10,I4,0);
2331 VARMOD(BOOL,R4,100,10,I4,0);
2332 VARMOD(BOOL,R8,100,10,I4,0);
2333 VARMOD(BOOL,DATE,100,10,I4,0);
2335 VARMOD(DATE,BOOL,100,10,I4,0);
2336 VARMOD(DATE,I1,100,10,I4,0);
2337 VARMOD(DATE,UI1,100,10,I4,0);
2338 VARMOD(DATE,I2,100,10,I4,0);
2339 VARMOD(DATE,UI2,100,10,I4,0);
2340 VARMOD(DATE,I4,100,10,I4,0);
2341 VARMOD(DATE,UI4,100,10,I4,0);
2342 VARMOD(DATE,R4,100,10,I4,0);
2343 VARMOD(DATE,R8,100,10,I4,0);
2344 VARMOD(DATE,DATE,100,10,I4,0);
2346 strNum0 = SysAllocString(szNum0);
2347 strNum1 = SysAllocString(szNum1);
2348 VARMOD(BSTR,BSTR,strNum0,strNum1,I4,5);
2349 VARMOD(BSTR,I1,strNum0,10,I4,5);
2350 VARMOD(BSTR,I2,strNum0,10,I4,5);
2351 VARMOD(BSTR,I4,strNum0,10,I4,5);
2352 VARMOD(BSTR,R4,strNum0,10,I4,5);
2353 VARMOD(BSTR,R8,strNum0,10,I4,5);
2354 VARMOD(I4,BSTR,125,strNum1,I4,5);
2356 if (HAVE_OLEAUT32_I8)
2358 VARMOD(BOOL,I8,100,10,I8,0);
2359 VARMOD(I1,I8,100,10,I8,0);
2360 VARMOD(UI1,I8,100,10,I8,0);
2361 VARMOD(I2,I8,100,10,I8,0);
2362 VARMOD(I4,I8,100,10,I8,0);
2363 VARMOD(UI4,I8,100,10,I8,0);
2364 VARMOD(R4,I8,100,10,I8,0);
2365 VARMOD(R8,I8,100,10,I8,0);
2366 VARMOD(DATE,I8,100,10,I8,0);
2368 VARMOD(I8,BOOL,100,10,I8,0);
2369 VARMOD(I8,I1,100,10,I8,0);
2370 VARMOD(I8,UI1,100,10,I8,0);
2371 VARMOD(I8,I2,100,10,I8,0);
2372 VARMOD(I8,UI2,100,10,I8,0);
2373 VARMOD(I8,I4,100,10,I8,0);
2374 VARMOD(I8,UI4,100,10,I8,0);
2375 VARMOD(I8,R4,100,10,I8,0);
2376 VARMOD(I8,R8,100,10,I8,0);
2377 VARMOD(I8,I8,100,10,I8,0);
2379 VARMOD(BSTR,I8,strNum0,10,I8,5);
2382 /* test all combinations of types */
2383 for(l = 0; l < VT_BSTR_BLOB; l++)
2387 for(r = 0; r < VT_BSTR_BLOB; r++)
2391 if(l == VT_BSTR) continue;
2392 if(l == VT_DISPATCH) continue;
2393 if(r == VT_BSTR) continue;
2394 if(r == VT_DISPATCH) continue;
2428 hexpected = DISP_E_BADVARTYPE;
2467 if(((l == VT_I8) && (r == VT_INT)) || ((l == VT_INT) && (r == VT_I8)))
2469 hexpected = DISP_E_TYPEMISMATCH;
2470 } else if((l == VT_EMPTY) && (r == VT_NULL))
2473 } else if((l == VT_NULL) && (r == VT_EMPTY))
2476 } else if((l == VT_EMPTY) && (r == VT_CY))
2479 } else if((l == VT_EMPTY) && (r == VT_RECORD))
2481 hexpected = DISP_E_TYPEMISMATCH;
2482 } else if((r == VT_EMPTY) && lFound && lValid)
2484 hexpected = DISP_E_DIVBYZERO;
2485 } else if((l == VT_ERROR) || ((r == VT_ERROR) && lFound && lValid))
2487 hexpected = DISP_E_TYPEMISMATCH;
2488 } else if((l == VT_NULL) && (r == VT_NULL))
2491 } else if((l == VT_VARIANT) || ((r == VT_VARIANT) && lFound && lValid))
2493 hexpected = DISP_E_TYPEMISMATCH;
2494 } else if((l == VT_NULL) && (r == VT_RECORD))
2496 hexpected = DISP_E_TYPEMISMATCH;
2497 } else if((l == VT_I8) && (r == VT_DECIMAL))
2500 } else if((l == VT_DECIMAL) && (r == VT_I8))
2503 } else if((l == VT_UNKNOWN) || ((r == VT_UNKNOWN) && lFound && lValid))
2505 hexpected = DISP_E_TYPEMISMATCH;
2506 } else if((l == VT_NULL) && rFound)
2509 } else if(l == VT_RECORD)
2511 hexpected = DISP_E_TYPEMISMATCH;
2512 } else if((r == VT_RECORD) && lValid && lFound)
2514 hexpected = DISP_E_TYPEMISMATCH;
2515 } else if((l == VT_EMPTY) && (r == VT_EMPTY))
2517 hexpected = DISP_E_DIVBYZERO;
2518 } else if((l == VT_CY) && !rFound)
2520 hexpected = DISP_E_BADVARTYPE;
2521 } else if(lFound && !rFound)
2523 hexpected = DISP_E_BADVARTYPE;
2524 } else if(!lFound && rFound)
2526 hexpected = DISP_E_BADVARTYPE;
2527 } else if((r == VT_NULL) && lFound && lValid)
2530 } else if((l == VT_NULL) || (r == VT_NULL))
2532 hexpected = DISP_E_BADVARTYPE;
2533 } else if((l == VT_VARIANT) || (r == VT_VARIANT))
2535 hexpected = DISP_E_BADVARTYPE;
2536 } else if(lFound && !rFound)
2538 hexpected = DISP_E_BADVARTYPE;
2539 } else if(!lFound && !rFound)
2541 hexpected = DISP_E_BADVARTYPE;
2548 V_CY(&v1).int64 = 1000000;
2553 else if(l == VT_UI8)
2557 else if(l == VT_DATE)
2559 else if (l == VT_DECIMAL)
2561 V_DECIMAL(&v1).Hi32 = 0;
2562 U1(V_DECIMAL(&v1)).Lo64 = 100;
2563 U(V_DECIMAL(&v1)).signscale = 0;
2569 V_CY(&v2).int64 = 10000;
2574 else if(r == VT_UI8)
2578 else if(r == VT_DATE)
2580 else if (r == VT_DECIMAL)
2582 V_DECIMAL(&v2).Hi32 = 0;
2583 U1(V_DECIMAL(&v2)).Lo64 = 100;
2584 U(V_DECIMAL(&v2)).signscale = 0;
2589 if ((l != VT_I8 && l != VT_UI8 && r != VT_I8 && r != VT_UI8) || HAVE_OLEAUT32_I8)
2591 hres = pVarMod(&v1,&v2,&vDst);
2592 ok(hres == hexpected,
2593 "VarMod: expected 0x%x, got 0x%X for l type of %d, r type of %d,\n", hexpected, hres, l, r);
2599 /****************************/
2600 /* test some bad parameters */
2601 VARMOD(I4,I4,-1,-1,I4,0);
2603 /* test modulus with zero */
2604 VARMOD2(I4,I4,100,0,EMPTY,0,DISP_E_DIVBYZERO);
2606 VARMOD(I4,I4,0,10,I4,0); /* test 0 mod 10 */
2608 /* right parameter is type empty */
2609 VARMOD2(I4,EMPTY,100,10,EMPTY,0,DISP_E_DIVBYZERO);
2611 /* left parameter is type empty */
2612 VARMOD2(EMPTY,I4,100,10,I4,0,S_OK);
2614 /* mod with a null left value */
2615 VARMOD2(NULL,I4,125,10,NULL,0,S_OK);
2617 /* mod with a null right value */
2618 VARMOD2(I4,NULL,100,10,NULL,0,S_OK);
2620 /* void left value */
2621 VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2623 /* void right value */
2624 VARMOD2(I4,VOID,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2626 /* null left value, void right value */
2627 VARMOD2(NULL,VOID,100,10,EMPTY, 0, DISP_E_BADVARTYPE);
2629 /* void left value, null right value */
2630 VARMOD2(VOID,NULL,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2632 /* some currencies */
2635 V_CY(&v1).int64 = 100000;
2636 V_CY(&v2).int64 = 100000;
2637 hres = pVarMod(&v1,&v2,&vDst);
2638 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2639 "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
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));
2650 V_VT(&v1) = VT_DECIMAL;
2651 V_VT(&v2) = VT_DECIMAL;
2652 VarDecFromI4(100, &V_DECIMAL(&v1));
2653 VarDecFromI4(10, &V_DECIMAL(&v2));
2654 hres = pVarMod(&v1,&v2,&vDst);
2655 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
2656 "VarMod: expected 0x%x,%d,%d, got 0x%X,%d,%d\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
2659 V_VT(&v2) = VT_DECIMAL;
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));
2666 VARMOD2(UINT,I4,100,10,I4,0,S_OK);
2668 /* test that an error results in the type of the result changing but not its value */
2669 V_VT(&v1) = VT_UNKNOWN;
2670 V_VT(&v2) = VT_EMPTY;
2672 V_CY(&v2).int64 = 100000;
2673 V_VT(&vDst) = VT_I4;
2675 hres = pVarMod(&v1,&v2,&vDst);
2676 ok(hres == DISP_E_TYPEMISMATCH && V_VT(&vDst) == VT_EMPTY && V_I4(&vDst) == 1231,
2677 "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));
2680 /* test some invalid types */
2681 /*TODO: not testing VT_DISPATCH */
2682 if (HAVE_OLEAUT32_I8)
2684 VARMOD2(I8,INT,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2686 VARMOD2(ERROR,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2687 VARMOD2(VARIANT,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2688 VARMOD2(UNKNOWN,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2689 VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2690 VARMOD2(HRESULT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2691 VARMOD2(PTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2692 VARMOD2(SAFEARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2693 VARMOD2(CARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2694 VARMOD2(USERDEFINED,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2695 VARMOD2(LPSTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2696 VARMOD2(LPWSTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2697 VARMOD2(RECORD,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
2698 VARMOD2(FILETIME,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2699 VARMOD2(BLOB,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2700 VARMOD2(STREAM,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2701 VARMOD2(STORAGE,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2702 VARMOD2(STREAMED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2703 VARMOD2(STORED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2704 VARMOD2(BLOB_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2705 VARMOD2(CF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2706 VARMOD2(CLSID,CLSID,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2707 VARMOD2(VECTOR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2708 VARMOD2(ARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2709 VARMOD2(BYREF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
2711 /* test some more invalid types */
2716 hres = pVarMod(&v1,&v2,&vDst);
2717 ok(hres == DISP_E_BADVARTYPE && V_VT(&vDst) == VT_EMPTY,
2718 "VarMod: expected 0x%x,%d, got 0x%X,%d\n", DISP_E_BADVARTYPE, VT_EMPTY, hres, V_VT(&vDst));
2721 static HRESULT (WINAPI *pVarFix)(LPVARIANT,LPVARIANT);
2723 #define VARFIX(vt,val,rvt,rval) \
2724 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
2725 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2726 test_var_call1( __LINE__, pVarFix, &v, &exp );
2728 static void test_VarFix(void)
2730 static const WCHAR szNumMinus1[] = {'-','1','\0' };
2732 VARIANT v, exp, vDst;
2733 DECIMAL *pdec = &V_DECIMAL(&v);
2734 CY *pcy = &V_CY(&v);
2739 /* Test all possible V_VT values */
2740 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2744 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2746 HRESULT bFail = TRUE;
2750 memset(&v, 0, sizeof(v));
2751 V_VT(&v) = vt | ExtraFlags[i];
2752 V_VT(&vDst) = VT_EMPTY;
2756 case VT_UI1: case VT_I2: case VT_I4: case VT_R4: case VT_R8:
2757 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
2758 case VT_DATE: case VT_CY:
2762 if (HAVE_OLEAUT32_I8)
2767 hres = pVarFix(&v,&vDst);
2769 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
2770 "VarFix: expected failure, got 0x%X vt %d|0x%X\n",
2771 hres, vt, ExtraFlags[i]);
2773 ok(hres == S_OK, "VarFix: expected S_OK, got 0x%X vt %d|0x%X\n",
2774 hres, vt, ExtraFlags[i]);
2778 VARFIX(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
2779 VARFIX(BOOL,VARIANT_FALSE,I2,0);
2780 VARFIX(BOOL,1,I2,1);
2781 VARFIX(UI1,1,UI1,1);
2782 VARFIX(I2,-1,I2,-1);
2783 VARFIX(I4,-1,I4,-1);
2784 if (HAVE_OLEAUT32_I8)
2786 VARFIX(I8,-1,I8,-1);
2788 VARFIX(R4,1.4,R4,1);
2789 VARFIX(R4,1.5,R4,1);
2790 VARFIX(R4,1.6,R4,1);
2791 VARFIX(R4,-1.4,R4,-1);
2792 VARFIX(R4,-1.5,R4,-1);
2793 VARFIX(R4,-1.6,R4,-1);
2794 /* DATE & R8 round as for R4 */
2795 VARFIX(DATE,-1,DATE,-1);
2796 VARFIX(R8,-1,R8,-1);
2797 VARFIX(BSTR,(BSTR)szNumMinus1,R8,-1);
2799 V_VT(&v) = VT_EMPTY;
2800 hres = pVarFix(&v,&vDst);
2801 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
2802 "VarFix: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
2803 hres, V_VT(&vDst), V_I2(&vDst));
2806 hres = pVarFix(&v,&vDst);
2807 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
2808 "VarFix: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
2810 V_VT(&v) = VT_DECIMAL;
2811 S(U(*pdec)).sign = DECIMAL_NEG;
2812 S(U(*pdec)).scale = 0;
2814 S1(U1(*pdec)).Mid32 = 0;
2815 S1(U1(*pdec)).Lo32 = 1;
2816 hres = pVarFix(&v,&vDst);
2817 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&v, &vDst, sizeof(v)),
2818 "VarFix: expected 0x0,%d,identical, got 0x%X,%d\n", VT_DECIMAL,
2821 /* FIXME: Test some fractional decimals when VarDecFix is implemented */
2824 pcy->int64 = -10000;
2825 hres = pVarFix(&v,&vDst);
2826 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2827 "VarFix: VT_CY wrong, hres=0x%X\n", hres);
2830 pcy->int64 = -16000;
2831 hres = pVarFix(&v,&vDst);
2832 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2833 "VarFix: VT_CY wrong, hres=0x%X\n", hres);
2836 static HRESULT (WINAPI *pVarInt)(LPVARIANT,LPVARIANT);
2838 #define VARINT(vt,val,rvt,rval) \
2839 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
2840 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2841 test_var_call1( __LINE__, pVarInt, &v, &exp );
2843 static void test_VarInt(void)
2845 static const WCHAR szNumMinus1[] = {'-','1','\0' };
2847 VARIANT v, exp, vDst;
2848 DECIMAL *pdec = &V_DECIMAL(&v);
2849 CY *pcy = &V_CY(&v);
2854 /* Test all possible V_VT values */
2855 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2859 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2861 HRESULT bFail = TRUE;
2865 memset(&v, 0, sizeof(v));
2866 V_VT(&v) = vt | ExtraFlags[i];
2867 V_VT(&vDst) = VT_EMPTY;
2871 case VT_UI1: case VT_I2: case VT_I4: case VT_R4: case VT_R8:
2872 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
2873 case VT_DATE: case VT_CY:
2877 if (HAVE_OLEAUT32_I8)
2882 hres = pVarInt(&v,&vDst);
2884 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
2885 "VarInt: expected failure, got 0x%X vt %d|0x%X\n",
2886 hres, vt, ExtraFlags[i]);
2888 ok(hres == S_OK, "VarInt: expected S_OK, got 0x%X vt %d|0x%X\n",
2889 hres, vt, ExtraFlags[i]);
2893 VARINT(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
2894 VARINT(BOOL,VARIANT_FALSE,I2,0);
2895 VARINT(BOOL,1,I2,1);
2896 VARINT(UI1,1,UI1,1);
2897 VARINT(I2,-1,I2,-1);
2898 VARINT(I4,-1,I4,-1);
2899 if (HAVE_OLEAUT32_I8)
2901 VARINT(I8,-1,I8,-1);
2903 VARINT(R4,1.4,R4,1);
2904 VARINT(R4,1.5,R4,1);
2905 VARINT(R4,1.6,R4,1);
2906 VARINT(R4,-1.4,R4,-2); /* Note these 3 are different from VarFix */
2907 VARINT(R4,-1.5,R4,-2);
2908 VARINT(R4,-1.6,R4,-2);
2909 /* DATE & R8 round as for R4 */
2910 VARINT(DATE,-1,DATE,-1);
2911 VARINT(R8,-1,R8,-1);
2912 VARINT(BSTR,(BSTR)szNumMinus1,R8,-1);
2914 V_VT(&v) = VT_EMPTY;
2915 hres = pVarInt(&v,&vDst);
2916 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
2917 "VarInt: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
2918 hres, V_VT(&vDst), V_I2(&vDst));
2921 hres = pVarInt(&v,&vDst);
2922 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
2923 "VarInt: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
2925 V_VT(&v) = VT_DECIMAL;
2926 S(U(*pdec)).sign = DECIMAL_NEG;
2927 S(U(*pdec)).scale = 0;
2929 S1(U1(*pdec)).Mid32 = 0;
2930 S1(U1(*pdec)).Lo32 = 1;
2931 hres = pVarInt(&v,&vDst);
2932 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&v, &vDst, sizeof(v)),
2933 "VarInt: expected 0x0,%d,identical, got 0x%X,%d\n", VT_DECIMAL,
2936 /* FIXME: Test some fractional decimals when VarDecInt is implemented */
2939 pcy->int64 = -10000;
2940 hres = pVarInt(&v,&vDst);
2941 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
2942 "VarInt: VT_CY wrong, hres=0x%X\n", hres);
2945 pcy->int64 = -11000;
2946 hres = pVarInt(&v,&vDst);
2947 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -20000,
2948 "VarInt: VT_CY wrong, hres=0x%X 0x%x%08x\n",
2949 hres, (DWORD)(V_CY(&vDst).int64 >> 32), (DWORD)V_CY(&vDst).int64);
2952 static HRESULT (WINAPI *pVarNeg)(LPVARIANT,LPVARIANT);
2954 #define VARNEG(vt,val,rvt,rval) \
2955 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
2956 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2957 test_var_call1( __LINE__, pVarNeg, &v, &exp );
2959 static void test_VarNeg(void)
2961 static const WCHAR szNumMinus1[] = {'-','1','\0' };
2962 static const WCHAR szNum1[] = {'1','\0' };
2964 VARIANT v, exp, vDst;
2965 DECIMAL *pdec = &V_DECIMAL(&v);
2966 CY *pcy = &V_CY(&v);
2971 /* Test all possible V_VT values. But don't test the exact return values
2972 * except for success/failure, since M$ made a hash of them in the
2973 * native version. This at least ensures (as with all tests here) that
2974 * we will notice if/when new vtypes/flags are added in native.
2976 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
2980 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2982 HRESULT bFail = TRUE;
2986 memset(&v, 0, sizeof(v));
2987 V_VT(&v) = vt | ExtraFlags[i];
2988 V_VT(&vDst) = VT_EMPTY;
2992 case VT_UI1: case VT_I2: case VT_I4:
2993 case VT_R4: case VT_R8:
2994 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
2995 case VT_DATE: case VT_CY:
2999 if (HAVE_OLEAUT32_I8)
3003 hres = pVarNeg(&v,&vDst);
3005 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
3006 "VarNeg: expected failure, got 0x%X vt %d|0x%X\n",
3007 hres, vt, ExtraFlags[i]);
3009 ok(hres == S_OK, "VarNeg: expected S_OK, got 0x%X vt %d|0x%X\n",
3010 hres, vt, ExtraFlags[i]);
3014 VARNEG(BOOL,VARIANT_TRUE,I2,1);
3015 VARNEG(BOOL,VARIANT_FALSE,I2,0);
3016 VARNEG(BOOL,1,I2,-1);
3017 VARNEG(UI1,1,I2,-1);
3018 VARNEG(UI1,254,I2,-254);
3019 VARNEG(I2,-32768,I4,32768);
3022 VARNEG(I4,-((int)(~0u >> 1)) - 1,R8,-2147483648u);
3025 if (HAVE_OLEAUT32_I8)
3032 VARNEG(DATE,1,DATE,-1);
3033 VARNEG(DATE,-1,DATE,1);
3036 VARNEG(BSTR,(BSTR)szNumMinus1,R8,1);
3037 VARNEG(BSTR,(BSTR)szNum1,R8,-1);
3039 V_VT(&v) = VT_EMPTY;
3040 hres = pVarNeg(&v,&vDst);
3041 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
3042 "VarNeg: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
3043 hres, V_VT(&vDst), V_I2(&vDst));
3046 hres = pVarNeg(&v,&vDst);
3047 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
3048 "VarNeg: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
3050 V_VT(&v) = VT_DECIMAL;
3051 S(U(*pdec)).sign = DECIMAL_NEG;
3052 S(U(*pdec)).scale = 0;
3054 S1(U1(*pdec)).Mid32 = 0;
3055 S1(U1(*pdec)).Lo32 = 1;
3056 hres = pVarNeg(&v,&vDst);
3057 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3058 S(U(V_DECIMAL(&vDst))).sign == 0,
3059 "VarNeg: expected 0x0,%d,0x00, got 0x%X,%d,%02x\n", VT_DECIMAL,
3060 hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3062 S(U(*pdec)).sign = 0;
3063 hres = pVarNeg(&v,&vDst);
3064 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3065 S(U(V_DECIMAL(&vDst))).sign == DECIMAL_NEG,
3066 "VarNeg: expected 0x0,%d,0x7f, got 0x%X,%d,%02x\n", VT_DECIMAL,
3067 hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3070 pcy->int64 = -10000;
3071 hres = pVarNeg(&v,&vDst);
3072 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
3073 "VarNeg: VT_CY wrong, hres=0x%X\n", hres);
3076 static HRESULT (WINAPI *pVarRound)(LPVARIANT,int,LPVARIANT);
3078 static void test_Round( int line, VARIANT *arg, int deci, VARIANT *expected )
3083 memset( &result, 0, sizeof(result) );
3084 hres = pVarRound( arg, deci, &result );
3085 ok_(__FILE__,line)( hres == S_OK, "wrong result %x\n", hres );
3087 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
3088 "got %s expected %s\n", variantstr(&result), variantstr(expected) );
3090 #define VARROUND(vt,val,deci,rvt,rval) \
3091 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
3092 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3093 test_Round( __LINE__, &v, deci, &exp );
3095 static void test_VarRound(void)
3097 static const WCHAR szNumMin[] = {'-','1','.','4','5','\0' };
3098 static const WCHAR szNum[] = {'1','.','4','5','\0' };
3100 VARIANT v, exp, vDst;
3101 CY *pcy = &V_CY(&v);
3105 /* first check valid integer types */
3106 VARROUND(BOOL,VARIANT_TRUE,0,I2,-1);
3107 VARROUND(BOOL,VARIANT_FALSE,0,I2,0);
3108 VARROUND(BOOL,1,0,I2,1);
3109 VARROUND(UI1,1,0,UI1,1);
3110 VARROUND(UI1,254,0,UI1,254);
3111 VARROUND(I2,-32768,0,I2,-32768);
3112 VARROUND(I2,-1,0,I2,-1);
3113 VARROUND(I2,1,0,I2,1);
3114 VARROUND(I4,-((int)(~0u >> 1)) - 1,0,I4,-((int)(~0u >> 1)) - 1);
3115 VARROUND(I4,-1,0,I4,-1);
3116 VARROUND(I4,1,0,I4,1);
3119 /* MSDN states that rounding of R4/R8 is dependent on the underlying
3120 * bit pattern of the number and so is architecture dependent. In this
3121 * case Wine returns .2 (which is more correct) and Native returns .3
3124 VARROUND(R4,1.0,0,R4,1.0);
3125 VARROUND(R4,-1.0,0,R4,-1.0);
3126 VARROUND(R8,1.0,0,R8,1.0);
3127 VARROUND(R8,-1.0,0,R8,-1.0);
3129 /* floating point numbers aren't exactly equal and we can't just
3130 * compare the first few digits. */
3131 VARROUND(DATE,1.451,1,DATE,1.5);
3132 VARROUND(DATE,-1.45,1,DATE,-1.4);
3133 VARROUND(BSTR,(BSTR)szNumMin,1,R8,-1.40);
3134 if (0) { VARROUND(BSTR,(BSTR)szNum,1,R8,1.50); }
3136 VARROUND(R4,1.23456,0,R4,1.0);
3137 VARROUND(R4,1.23456,1,R4,1.2);
3138 VARROUND(R4,1.23456,2,R4,1.23);
3139 VARROUND(R4,1.23456,3,R4,1.235);
3140 VARROUND(R4,1.23456,4,R4,1.2346);
3141 VARROUND(R4,-1.23456,0,R4,-1.0);
3142 VARROUND(R4,-1.23456,1,R4,-1.2);
3143 VARROUND(R4,-1.23456,2,R4,-1.23);
3144 VARROUND(R4,-1.23456,3,R4,-1.235);
3145 VARROUND(R4,-1.23456,4,R4,-1.2346);
3147 VARROUND(R8,1.23456,0,R8,1.0);
3148 VARROUND(R8,1.23456,1,R8,1.2);
3149 VARROUND(R8,1.23456,2,R8,1.23);
3150 VARROUND(R8,1.23456,3,R8,1.235);
3151 VARROUND(R8,1.23456,4,R8,1.2346);
3152 VARROUND(R8,-1.23456,0,R8,-1.0);
3153 VARROUND(R8,-1.23456,1,R8,-1.2);
3154 VARROUND(R8,-1.23456,2,R8,-1.23);
3155 VARROUND(R8,-1.23456,3,R8,-1.235);
3156 VARROUND(R8,-1.23456,4,R8,-1.2346);
3158 V_VT(&v) = VT_EMPTY;
3159 hres = pVarRound(&v,0,&vDst);
3160 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
3161 "VarRound: expected 0x0,%d,0 got 0x%X,%d,%d\n", VT_EMPTY,
3162 hres, V_VT(&vDst), V_I2(&vDst));
3165 hres = pVarRound(&v,0,&vDst);
3166 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
3167 "VarRound: expected 0x0,%d got 0x%X,%d\n", VT_NULL, hres, V_VT(&vDst));
3169 /* not yet implemented so no use testing yet
3171 DECIMAL *pdec = &V_DECIMAL(&v);
3172 V_VT(&v) = VT_DECIMAL;
3173 S(U(*pdec)).sign = DECIMAL_NEG;
3174 S(U(*pdec)).scale = 0;
3176 S1(U1(*pdec)).Mid32 = 0;
3177 S1(U1(*pdec)).Lo32 = 1;
3178 hres = pVarRound(&v,0,&vDst);
3179 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3180 S(U(V_DECIMAL(&vDst))).sign == 0,
3181 "VarRound: expected 0x0,%d,0x00, got 0x%X,%d,%02x\n", VT_DECIMAL,
3182 hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3184 S(U(*pdec)).sign = 0;
3185 hres = pVarRound(&v,0,&vDst);
3186 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
3187 S(U(V_DECIMAL(&vDst))).sign == DECIMAL_NEG,
3188 "VarRound: expected 0x0,%d,0x7f, got 0x%X,%d,%02x\n", VT_DECIMAL,
3189 hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign);
3195 hres = pVarRound(&v,0,&vDst);
3196 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
3197 "VarRound: VT_CY wrong, hres=0x%X\n", hres);
3201 static HRESULT (WINAPI *pVarXor)(LPVARIANT,LPVARIANT,LPVARIANT);
3203 #define VARXOR(vt1,val1,vt2,val2,rvt,rval) \
3204 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3205 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3206 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3207 test_var_call2( __LINE__, pVarXor, &left, &right, &exp );
3209 #define VARXORCY(vt1,val1,val2,rvt,rval) \
3210 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3211 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
3212 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3213 test_var_call2( __LINE__, pVarXor, &left, &right, &exp );
3215 static void test_VarXor(void)
3217 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
3218 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
3219 VARIANT left, right, exp, result;
3226 /* Test all possible flag/vt combinations & the resulting vt type */
3227 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
3229 VARTYPE leftvt, rightvt, resvt;
3231 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
3236 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
3242 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
3243 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
3244 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
3247 memset(&left, 0, sizeof(left));
3248 memset(&right, 0, sizeof(right));
3249 V_VT(&left) = leftvt | ExtraFlags[i];
3250 V_VT(&right) = rightvt | ExtraFlags[i];
3251 V_VT(&result) = VT_EMPTY;
3254 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
3255 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
3256 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
3257 leftvt == VT_CLSID || rightvt == VT_CLSID ||
3258 leftvt == VT_RECORD || rightvt == VT_RECORD ||
3259 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
3260 leftvt == VT_ERROR || rightvt == VT_ERROR)
3264 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
3266 if (leftvt == rightvt ||
3267 leftvt == VT_I2 || rightvt == VT_I2 ||
3268 leftvt == VT_UI1 || rightvt == VT_UI1 ||
3269 leftvt == VT_BOOL || rightvt == VT_BOOL)
3271 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3273 else if (leftvt == VT_I8 || rightvt == VT_I8)
3276 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3280 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
3282 if (leftvt == rightvt)
3284 else if (leftvt == rightvt ||
3285 leftvt == VT_I2 || rightvt == VT_I2 ||
3286 leftvt == VT_BOOL || rightvt == VT_BOOL)
3290 else if (leftvt == VT_I8 || rightvt == VT_I8)
3293 else if (leftvt == VT_I2 || rightvt == VT_I2)
3295 if (leftvt == rightvt ||
3296 leftvt == VT_BOOL || rightvt == VT_BOOL)
3298 else if (leftvt == VT_I8 || rightvt == VT_I8)
3301 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
3305 else if (leftvt == VT_I8 || rightvt == VT_I8)
3307 if (leftvt == VT_INT || rightvt == VT_INT)
3312 hres = pVarXor(&left, &right, &result);
3314 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
3315 "VarXor: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
3316 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
3319 ok(hres == S_OK && V_VT(&result) == resvt,
3320 "VarXor: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
3321 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
3327 /* Test returned values
3328 * FIXME: Test VT_DECIMAL/VT_DISPATCH
3330 VARXOR(EMPTY,0,EMPTY,0,I2,0);
3331 VARXOR(EMPTY,1,EMPTY,0,I2,0);
3332 VARXOR(EMPTY,0,NULL,0,NULL,0);
3333 VARXOR(EMPTY,0,I1,0,I4,0);
3334 VARXOR(EMPTY,0,I1,1,I4,1);
3335 VARXOR(EMPTY,0,UI1,0,I2,0);
3336 VARXOR(EMPTY,0,UI1,1,I2,1);
3337 VARXOR(EMPTY,0,I2,0,I2,0);
3338 VARXOR(EMPTY,0,I2,1,I2,1);
3339 VARXOR(EMPTY,0,UI2,0,I4,0);
3340 VARXOR(EMPTY,0,UI2,1,I4,1);
3341 VARXOR(EMPTY,0,I4,0,I4,0);
3342 VARXOR(EMPTY,0,I4,1,I4,1);
3343 VARXOR(EMPTY,0,UI4,0,I4,0);
3344 VARXOR(EMPTY,0,UI4,1,I4,1);
3345 if (HAVE_OLEAUT32_I8)
3347 VARXOR(EMPTY,0,I8,0,I8,0);
3348 VARXOR(EMPTY,0,I8,1,I8,1);
3349 VARXOR(EMPTY,0,UI8,0,I4,0);
3350 VARXOR(EMPTY,0,UI8,1,I4,1);
3352 VARXOR(EMPTY,0,INT,0,I4,0);
3353 VARXOR(EMPTY,0,INT,1,I4,1);
3354 VARXOR(EMPTY,0,UINT,0,I4,0);
3355 VARXOR(EMPTY,0,UINT,1,I4,1);
3356 VARXOR(EMPTY,0,BOOL,0,I2,0);
3357 VARXOR(EMPTY,0,BOOL,1,I2,1);
3358 VARXOR(EMPTY,0,R4,0,I4,0);
3359 VARXOR(EMPTY,0,R4,1,I4,1);
3360 VARXOR(EMPTY,0,R8,0,I4,0);
3361 VARXOR(EMPTY,0,R8,1,I4,1);
3362 rbstr = SysAllocString(szFalse);
3363 VARXOR(EMPTY,0,BSTR,rbstr,I2,0);
3364 rbstr = SysAllocString(szTrue);
3365 VARXOR(EMPTY,0,BSTR,rbstr,I2,-1);
3366 VARXORCY(EMPTY,0,10000,I4,1);
3368 /* NULL OR 0 = NULL. NULL OR n = n */
3369 VARXOR(NULL,0,NULL,0,NULL,0);
3370 VARXOR(NULL,1,NULL,0,NULL,0);
3371 VARXOR(NULL,0,I1,0,NULL,0);
3372 VARXOR(NULL,0,I1,1,NULL,0);
3373 VARXOR(NULL,0,UI1,0,NULL,0);
3374 VARXOR(NULL,0,UI1,1,NULL,0);
3375 VARXOR(NULL,0,I2,0,NULL,0);
3376 VARXOR(NULL,0,I2,1,NULL,0);
3377 VARXOR(NULL,0,UI2,0,NULL,0);
3378 VARXOR(NULL,0,UI2,1,NULL,0);
3379 VARXOR(NULL,0,I4,0,NULL,0);
3380 VARXOR(NULL,0,I4,1,NULL,0);
3381 VARXOR(NULL,0,UI4,0,NULL,0);
3382 VARXOR(NULL,0,UI4,1,NULL,0);
3383 if (HAVE_OLEAUT32_I8)
3385 VARXOR(NULL,0,I8,0,NULL,0);
3386 VARXOR(NULL,0,I8,1,NULL,0);
3387 VARXOR(NULL,0,UI8,0,NULL,0);
3388 VARXOR(NULL,0,UI8,1,NULL,0);
3390 VARXOR(NULL,0,INT,0,NULL,0);
3391 VARXOR(NULL,0,INT,1,NULL,0);
3392 VARXOR(NULL,0,UINT,0,NULL,0);
3393 VARXOR(NULL,0,UINT,1,NULL,0);
3394 VARXOR(NULL,0,BOOL,0,NULL,0);
3395 VARXOR(NULL,0,BOOL,1,NULL,0);
3396 VARXOR(NULL,0,R4,0,NULL,0);
3397 VARXOR(NULL,0,R4,1,NULL,0);
3398 VARXOR(NULL,0,R8,0,NULL,0);
3399 VARXOR(NULL,0,R8,1,NULL,0);
3400 rbstr = SysAllocString(szFalse);
3401 VARXOR(NULL,0,BSTR,rbstr,NULL,0);
3402 rbstr = SysAllocString(szTrue);
3403 VARXOR(NULL,0,BSTR,rbstr,NULL,0);
3404 VARXORCY(NULL,0,10000,NULL,0);
3405 VARXORCY(NULL,0,0,NULL,0);
3407 VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
3408 VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
3409 VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
3410 VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
3411 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
3412 VARXOR(BOOL,VARIANT_TRUE,I1,-1,I4,0);
3413 VARXOR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
3414 VARXOR(BOOL,VARIANT_FALSE,I1,0,I4,0);
3415 VARXOR(BOOL,VARIANT_TRUE,UI1,255,I2,-256);
3416 VARXOR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
3417 VARXOR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
3418 VARXOR(BOOL,VARIANT_TRUE,I2,-1,I2,0);
3419 VARXOR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
3420 VARXOR(BOOL,VARIANT_FALSE,I2,0,I2,0);
3421 VARXOR(BOOL,VARIANT_TRUE,UI2,65535,I4,-65536);
3422 VARXOR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
3423 VARXOR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
3424 VARXOR(BOOL,VARIANT_TRUE,I4,-1,I4,0);
3425 VARXOR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
3426 VARXOR(BOOL,VARIANT_FALSE,I4,0,I4,0);
3427 VARXOR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,0);
3428 VARXOR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
3429 VARXOR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
3430 VARXOR(BOOL,VARIANT_TRUE,R4,-1,I4,0);
3431 VARXOR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
3432 VARXOR(BOOL,VARIANT_FALSE,R4,0,I4,0);
3433 VARXOR(BOOL,VARIANT_TRUE,R8,-1,I4,0);
3434 VARXOR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
3435 VARXOR(BOOL,VARIANT_FALSE,R8,0,I4,0);
3436 VARXOR(BOOL,VARIANT_TRUE,DATE,-1,I4,0);
3437 VARXOR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
3438 VARXOR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
3439 if (HAVE_OLEAUT32_I8)
3441 VARXOR(BOOL,VARIANT_TRUE,I8,-1,I8,0);
3442 VARXOR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
3443 VARXOR(BOOL,VARIANT_FALSE,I8,0,I8,0);
3444 /* This returns DISP_E_OVERFLOW which indicates that a conversion
3445 * to I4 is performed.
3447 /* VARXOR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
3448 VARXOR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
3449 VARXOR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
3451 VARXOR(BOOL,VARIANT_TRUE,INT,-1,I4,0);
3452 VARXOR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
3453 VARXOR(BOOL,VARIANT_FALSE,INT,0,I4,0);
3454 VARXOR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,0);
3455 VARXOR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
3456 VARXOR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
3457 rbstr = SysAllocString(szFalse);
3458 VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
3459 VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
3460 rbstr = SysAllocString(szTrue);
3461 VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
3462 VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_FALSE);
3463 VARXORCY(BOOL,VARIANT_TRUE,10000,I4,-2);
3464 VARXORCY(BOOL,VARIANT_TRUE,0,I4,-1);
3465 VARXORCY(BOOL,VARIANT_FALSE,0,I4,0);
3467 VARXOR(I1,-1,I1,-1,I4,0);
3468 VARXOR(I1,-1,I1,0,I4,-1);
3469 VARXOR(I1,0,I1,0,I4,0);
3470 VARXOR(I1,-1,UI1,255,I4,-256);
3471 VARXOR(I1,-1,UI1,0,I4,-1);
3472 VARXOR(I1,0,UI1,0,I4,0);
3473 VARXOR(I1,-1,I2,-1,I4,0);
3474 VARXOR(I1,-1,I2,0,I4,-1);
3475 VARXOR(I1,0,I2,0,I4,0);
3476 VARXOR(I1,-1,UI2,65535,I4,-65536);
3477 VARXOR(I1,-1,UI2,0,I4,-1);
3478 VARXOR(I1,0,UI2,0,I4,0);
3479 VARXOR(I1,-1,I4,-1,I4,0);
3480 VARXOR(I1,-1,I4,0,I4,-1);
3481 VARXOR(I1,0,I4,0,I4,0);
3482 VARXOR(I1,-1,UI4,0xffffffff,I4,0);
3483 VARXOR(I1,-1,UI4,0,I4,-1);
3484 VARXOR(I1,0,UI4,0,I4,0);
3485 VARXOR(I1,-1,R4,-1,I4,0);
3486 VARXOR(I1,-1,R4,0,I4,-1);
3487 VARXOR(I1,0,R4,0,I4,0);
3488 VARXOR(I1,-1,R8,-1,I4,0);
3489 VARXOR(I1,-1,R8,0,I4,-1);
3490 VARXOR(I1,0,R8,0,I4,0);
3491 VARXOR(I1,-1,DATE,-1,I4,0);
3492 VARXOR(I1,-1,DATE,0,I4,-1);
3493 VARXOR(I1,0,DATE,0,I4,0);
3494 if (HAVE_OLEAUT32_I8)
3496 VARXOR(I1,-1,I8,-1,I8,0);
3497 VARXOR(I1,-1,I8,0,I8,-1);
3498 VARXOR(I1,0,I8,0,I8,0);
3499 VARXOR(I1,-1,UI8,0,I4,-1);
3500 VARXOR(I1,0,UI8,0,I4,0);
3502 VARXOR(I1,-1,INT,-1,I4,0);
3503 VARXOR(I1,-1,INT,0,I4,-1);
3504 VARXOR(I1,0,INT,0,I4,0);
3505 VARXOR(I1,-1,UINT,0xffffffff,I4,0);
3506 VARXOR(I1,-1,UINT,0,I4,-1);
3507 VARXOR(I1,0,UINT,0,I4,0);
3508 rbstr = SysAllocString(szFalse);
3509 VARXOR(I1,0,BSTR,rbstr,I4,0);
3510 VARXOR(I1,-1,BSTR,rbstr,I4,-1);
3511 rbstr = SysAllocString(szTrue);
3512 VARXOR(I1,0,BSTR,rbstr,I4,-1);
3513 VARXOR(I1,-1,BSTR,rbstr,I4,0);
3514 VARXORCY(I1,-1,10000,I4,-2);
3515 VARXORCY(I1,-1,0,I4,-1);
3516 VARXORCY(I1,0,0,I4,0);
3518 VARXOR(UI1,255,UI1,255,UI1,0);
3519 VARXOR(UI1,255,UI1,0,UI1,255);
3520 VARXOR(UI1,0,UI1,0,UI1,0);
3521 VARXOR(UI1,255,I2,-1,I2,-256);
3522 VARXOR(UI1,255,I2,0,I2,255);
3523 VARXOR(UI1,0,I2,0,I2,0);
3524 VARXOR(UI1,255,UI2,65535,I4,65280);
3525 VARXOR(UI1,255,UI2,0,I4,255);
3526 VARXOR(UI1,0,UI2,0,I4,0);
3527 VARXOR(UI1,255,I4,-1,I4,-256);
3528 VARXOR(UI1,255,I4,0,I4,255);
3529 VARXOR(UI1,0,I4,0,I4,0);
3530 VARXOR(UI1,255,UI4,0xffffffff,I4,-256);
3531 VARXOR(UI1,255,UI4,0,I4,255);
3532 VARXOR(UI1,0,UI4,0,I4,0);
3533 VARXOR(UI1,255,R4,-1,I4,-256);
3534 VARXOR(UI1,255,R4,0,I4,255);
3535 VARXOR(UI1,0,R4,0,I4,0);
3536 VARXOR(UI1,255,R8,-1,I4,-256);
3537 VARXOR(UI1,255,R8,0,I4,255);
3538 VARXOR(UI1,0,R8,0,I4,0);
3539 VARXOR(UI1,255,DATE,-1,I4,-256);
3540 VARXOR(UI1,255,DATE,0,I4,255);
3541 VARXOR(UI1,0,DATE,0,I4,0);
3542 if (HAVE_OLEAUT32_I8)
3544 VARXOR(UI1,255,I8,-1,I8,-256);
3545 VARXOR(UI1,255,I8,0,I8,255);
3546 VARXOR(UI1,0,I8,0,I8,0);
3547 VARXOR(UI1,255,UI8,0,I4,255);
3548 VARXOR(UI1,0,UI8,0,I4,0);
3550 VARXOR(UI1,255,INT,-1,I4,-256);
3551 VARXOR(UI1,255,INT,0,I4,255);
3552 VARXOR(UI1,0,INT,0,I4,0);
3553 VARXOR(UI1,255,UINT,0xffffffff,I4,-256);
3554 VARXOR(UI1,255,UINT,0,I4,255);
3555 VARXOR(UI1,0,UINT,0,I4,0);
3556 rbstr = SysAllocString(szFalse);
3557 VARXOR(UI1,0,BSTR,rbstr,I2,0);
3558 VARXOR(UI1,255,BSTR,rbstr,I2,255);
3559 rbstr = SysAllocString(szTrue);
3560 VARXOR(UI1,0,BSTR,rbstr,I2,-1);
3561 VARXOR(UI1,255,BSTR,rbstr,I2,-256);
3562 VARXORCY(UI1,255,10000,I4,254);
3563 VARXORCY(UI1,255,0,I4,255);
3564 VARXORCY(UI1,0,0,I4,0);
3566 VARXOR(I2,-1,I2,-1,I2,0);
3567 VARXOR(I2,-1,I2,0,I2,-1);
3568 VARXOR(I2,0,I2,0,I2,0);
3569 VARXOR(I2,-1,UI2,65535,I4,-65536);
3570 VARXOR(I2,-1,UI2,0,I4,-1);
3571 VARXOR(I2,0,UI2,0,I4,0);
3572 VARXOR(I2,-1,I4,-1,I4,0);
3573 VARXOR(I2,-1,I4,0,I4,-1);
3574 VARXOR(I2,0,I4,0,I4,0);
3575 VARXOR(I2,-1,UI4,0xffffffff,I4,0);
3576 VARXOR(I2,-1,UI4,0,I4,-1);
3577 VARXOR(I2,0,UI4,0,I4,0);
3578 VARXOR(I2,-1,R4,-1,I4,0);
3579 VARXOR(I2,-1,R4,0,I4,-1);
3580 VARXOR(I2,0,R4,0,I4,0);
3581 VARXOR(I2,-1,R8,-1,I4,0);
3582 VARXOR(I2,-1,R8,0,I4,-1);
3583 VARXOR(I2,0,R8,0,I4,0);
3584 VARXOR(I2,-1,DATE,-1,I4,0);
3585 VARXOR(I2,-1,DATE,0,I4,-1);
3586 VARXOR(I2,0,DATE,0,I4,0);
3587 if (HAVE_OLEAUT32_I8)
3589 VARXOR(I2,-1,I8,-1,I8,0);
3590 VARXOR(I2,-1,I8,0,I8,-1);
3591 VARXOR(I2,0,I8,0,I8,0);
3592 VARXOR(I2,-1,UI8,0,I4,-1);
3593 VARXOR(I2,0,UI8,0,I4,0);
3595 VARXOR(I2,-1,INT,-1,I4,0);
3596 VARXOR(I2,-1,INT,0,I4,-1);
3597 VARXOR(I2,0,INT,0,I4,0);
3598 VARXOR(I2,-1,UINT,0xffffffff,I4,0);
3599 VARXOR(I2,-1,UINT,0,I4,-1);
3600 VARXOR(I2,0,UINT,0,I4,0);
3601 rbstr = SysAllocString(szFalse);
3602 VARXOR(I2,0,BSTR,rbstr,I2,0);
3603 VARXOR(I2,-1,BSTR,rbstr,I2,-1);
3604 rbstr = SysAllocString(szTrue);
3605 VARXOR(I2,0,BSTR,rbstr,I2,-1);
3606 VARXOR(I2,-1,BSTR,rbstr,I2,0);
3607 VARXORCY(I2,-1,10000,I4,-2);
3608 VARXORCY(I2,-1,0,I4,-1);
3609 VARXORCY(I2,0,0,I4,0);
3611 VARXOR(UI2,65535,UI2,65535,I4,0);
3612 VARXOR(UI2,65535,UI2,0,I4,65535);
3613 VARXOR(UI2,0,UI2,0,I4,0);
3614 VARXOR(UI2,65535,I4,-1,I4,-65536);
3615 VARXOR(UI2,65535,I4,0,I4,65535);
3616 VARXOR(UI2,0,I4,0,I4,0);
3617 VARXOR(UI2,65535,UI4,0xffffffff,I4,-65536);
3618 VARXOR(UI2,65535,UI4,0,I4,65535);
3619 VARXOR(UI2,0,UI4,0,I4,0);
3620 VARXOR(UI2,65535,R4,-1,I4,-65536);
3621 VARXOR(UI2,65535,R4,0,I4,65535);
3622 VARXOR(UI2,0,R4,0,I4,0);
3623 VARXOR(UI2,65535,R8,-1,I4,-65536);
3624 VARXOR(UI2,65535,R8,0,I4,65535);
3625 VARXOR(UI2,0,R8,0,I4,0);
3626 VARXOR(UI2,65535,DATE,-1,I4,-65536);
3627 VARXOR(UI2,65535,DATE,0,I4,65535);
3628 VARXOR(UI2,0,DATE,0,I4,0);
3629 if (HAVE_OLEAUT32_I8)
3631 VARXOR(UI2,65535,I8,-1,I8,-65536);
3632 VARXOR(UI2,65535,I8,0,I8,65535);
3633 VARXOR(UI2,0,I8,0,I8,0);
3634 VARXOR(UI2,65535,UI8,0,I4,65535);
3635 VARXOR(UI2,0,UI8,0,I4,0);
3637 VARXOR(UI2,65535,INT,-1,I4,-65536);
3638 VARXOR(UI2,65535,INT,0,I4,65535);
3639 VARXOR(UI2,0,INT,0,I4,0);
3640 VARXOR(UI2,65535,UINT,0xffffffff,I4,-65536);
3641 VARXOR(UI2,65535,UINT,0,I4,65535);
3642 VARXOR(UI2,0,UINT,0,I4,0);
3643 rbstr = SysAllocString(szFalse);
3644 VARXOR(UI2,0,BSTR,rbstr,I4,0);
3645 VARXOR(UI2,65535,BSTR,rbstr,I4,65535);
3646 rbstr = SysAllocString(szTrue);
3647 VARXOR(UI2,0,BSTR,rbstr,I4,-1);
3648 VARXOR(UI2,65535,BSTR,rbstr,I4,-65536);
3649 VARXORCY(UI2,65535,10000,I4,65534);
3650 VARXORCY(UI2,65535,0,I4,65535);
3651 VARXORCY(UI2,0,0,I4,0);
3653 VARXOR(I4,-1,I4,-1,I4,0);
3654 VARXOR(I4,-1,I4,0,I4,-1);
3655 VARXOR(I4,0,I4,0,I4,0);
3656 VARXOR(I4,-1,UI4,0xffffffff,I4,0);
3657 VARXOR(I4,-1,UI4,0,I4,-1);
3658 VARXOR(I4,0,UI4,0,I4,0);
3659 VARXOR(I4,-1,R4,-1,I4,0);
3660 VARXOR(I4,-1,R4,0,I4,-1);
3661 VARXOR(I4,0,R4,0,I4,0);
3662 VARXOR(I4,-1,R8,-1,I4,0);
3663 VARXOR(I4,-1,R8,0,I4,-1);
3664 VARXOR(I4,0,R8,0,I4,0);
3665 VARXOR(I4,-1,DATE,-1,I4,0);
3666 VARXOR(I4,-1,DATE,0,I4,-1);
3667 VARXOR(I4,0,DATE,0,I4,0);
3668 if (HAVE_OLEAUT32_I8)
3670 VARXOR(I4,-1,I8,-1,I8,0);
3671 VARXOR(I4,-1,I8,0,I8,-1);
3672 VARXOR(I4,0,I8,0,I8,0);
3673 VARXOR(I4,-1,UI8,0,I4,-1);
3674 VARXOR(I4,0,UI8,0,I4,0);
3676 VARXOR(I4,-1,INT,-1,I4,0);
3677 VARXOR(I4,-1,INT,0,I4,-1);
3678 VARXOR(I4,0,INT,0,I4,0);
3679 VARXOR(I4,-1,UINT,0xffffffff,I4,0);
3680 VARXOR(I4,-1,UINT,0,I4,-1);
3681 VARXOR(I4,0,UINT,0,I4,0);
3682 rbstr = SysAllocString(szFalse);
3683 VARXOR(I4,0,BSTR,rbstr,I4,0);
3684 VARXOR(I4,-1,BSTR,rbstr,I4,-1);
3685 rbstr = SysAllocString(szTrue);
3686 VARXOR(I4,0,BSTR,rbstr,I4,-1);
3687 VARXOR(I4,-1,BSTR,rbstr,I4,0);
3688 VARXORCY(I4,-1,10000,I4,-2);
3689 VARXORCY(I4,-1,0,I4,-1);
3690 VARXORCY(I4,0,0,I4,0);
3692 VARXOR(UI4,0xffffffff,UI4,0xffffffff,I4,0);
3693 VARXOR(UI4,0xffffffff,UI4,0,I4,-1);
3694 VARXOR(UI4,0,UI4,0,I4,0);
3695 VARXOR(UI4,0xffffffff,R4,-1,I4,0);
3696 VARXOR(UI4,0xffffffff,R4,0,I4,-1);
3697 VARXOR(UI4,0,R4,0,I4,0);
3698 VARXOR(UI4,0xffffffff,R8,-1,I4,0);
3699 VARXOR(UI4,0xffffffff,R8,0,I4,-1);
3700 VARXOR(UI4,0,R8,0,I4,0);
3701 VARXOR(UI4,0xffffffff,DATE,-1,I4,0);
3702 VARXOR(UI4,0xffffffff,DATE,0,I4,-1);
3703 VARXOR(UI4,0,DATE,0,I4,0);
3704 if (HAVE_OLEAUT32_I8)
3706 VARXOR(UI4,0xffffffff,I8,0,I8,0xffffffff);
3707 VARXOR(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,0);
3708 VARXOR(UI4,0,I8,0,I8,0);
3709 VARXOR(UI4,0xffffffff,UI8,0,I4,-1);
3710 VARXOR(UI4,0,UI8,0,I4,0);
3712 VARXOR(UI4,0xffffffff,INT,-1,I4,0);
3713 VARXOR(UI4,0xffffffff,INT,0,I4,-1);
3714 VARXOR(UI4,0,INT,0,I4,0);
3715 VARXOR(UI4,0xffffffff,UINT,0xffffffff,I4,0);
3716 VARXOR(UI4,0xffffffff,UINT,0,I4,-1);
3717 VARXOR(UI4,0,UINT,0,I4,0);
3718 rbstr = SysAllocString(szFalse);
3719 VARXOR(UI4,0,BSTR,rbstr,I4,0);
3720 VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
3721 rbstr = SysAllocString(szTrue);
3722 VARXOR(UI4,0,BSTR,rbstr,I4,-1);
3723 VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,0);
3724 VARXORCY(UI4,0xffffffff,10000,I4,-2);
3725 VARXORCY(UI4,0xffffffff,0,I4,-1);
3726 VARXORCY(UI4,0,0,I4,0);
3728 VARXOR(R4,-1,R4,-1,I4,0);
3729 VARXOR(R4,-1,R4,0,I4,-1);
3730 VARXOR(R4,0,R4,0,I4,0);
3731 VARXOR(R4,-1,R8,-1,I4,0);
3732 VARXOR(R4,-1,R8,0,I4,-1);
3733 VARXOR(R4,0,R8,0,I4,0);
3734 VARXOR(R4,-1,DATE,-1,I4,0);
3735 VARXOR(R4,-1,DATE,0,I4,-1);
3736 VARXOR(R4,0,DATE,0,I4,0);
3737 if (HAVE_OLEAUT32_I8)
3739 VARXOR(R4,-1,I8,-1,I8,0);
3740 VARXOR(R4,-1,I8,0,I8,-1);
3741 VARXOR(R4,0,I8,0,I8,0);
3742 VARXOR(R4,-1,UI8,0,I4,-1);
3743 VARXOR(R4,0,UI8,0,I4,0);
3745 VARXOR(R4,-1,INT,-1,I4,0);
3746 VARXOR(R4,-1,INT,0,I4,-1);
3747 VARXOR(R4,0,INT,0,I4,0);
3748 VARXOR(R4,-1,UINT,0xffffffff,I4,0);
3749 VARXOR(R4,-1,UINT,0,I4,-1);
3750 VARXOR(R4,0,UINT,0,I4,0);
3751 rbstr = SysAllocString(szFalse);
3752 VARXOR(R4,0,BSTR,rbstr,I4,0);
3753 VARXOR(R4,-1,BSTR,rbstr,I4,-1);
3754 rbstr = SysAllocString(szTrue);
3755 VARXOR(R4,0,BSTR,rbstr,I4,-1);
3756 VARXOR(R4,-1,BSTR,rbstr,I4,0);
3757 VARXORCY(R4,-1,10000,I4,-2);
3758 VARXORCY(R4,-1,0,I4,-1);
3759 VARXORCY(R4,0,0,I4,0);
3761 VARXOR(R8,-1,R8,-1,I4,0);
3762 VARXOR(R8,-1,R8,0,I4,-1);
3763 VARXOR(R8,0,R8,0,I4,0);
3764 VARXOR(R8,-1,DATE,-1,I4,0);
3765 VARXOR(R8,-1,DATE,0,I4,-1);
3766 VARXOR(R8,0,DATE,0,I4,0);
3767 if (HAVE_OLEAUT32_I8)
3769 VARXOR(R8,-1,I8,-1,I8,0);
3770 VARXOR(R8,-1,I8,0,I8,-1);
3771 VARXOR(R8,0,I8,0,I8,0);
3772 VARXOR(R8,-1,UI8,0,I4,-1);
3773 VARXOR(R8,0,UI8,0,I4,0);
3775 VARXOR(R8,-1,INT,-1,I4,0);
3776 VARXOR(R8,-1,INT,0,I4,-1);
3777 VARXOR(R8,0,INT,0,I4,0);
3778 VARXOR(R8,-1,UINT,0xffffffff,I4,0);
3779 VARXOR(R8,-1,UINT,0,I4,-1);
3780 VARXOR(R8,0,UINT,0,I4,0);
3781 rbstr = SysAllocString(szFalse);
3782 VARXOR(R8,0,BSTR,rbstr,I4,0);
3783 VARXOR(R8,-1,BSTR,rbstr,I4,-1);
3784 rbstr = SysAllocString(szTrue);
3785 VARXOR(R8,0,BSTR,rbstr,I4,-1);
3786 VARXOR(R8,-1,BSTR,rbstr,I4,0);
3787 VARXORCY(R8,-1,10000,I4,-2);
3788 VARXORCY(R8,-1,0,I4,-1);
3789 VARXORCY(R8,0,0,I4,0);
3791 VARXOR(DATE,-1,DATE,-1,I4,0);
3792 VARXOR(DATE,-1,DATE,0,I4,-1);
3793 VARXOR(DATE,0,DATE,0,I4,0);
3794 if (HAVE_OLEAUT32_I8)
3796 VARXOR(DATE,-1,I8,-1,I8,0);
3797 VARXOR(DATE,-1,I8,0,I8,-1);
3798 VARXOR(DATE,0,I8,0,I8,0);
3799 VARXOR(DATE,-1,UI8,0,I4,-1);
3800 VARXOR(DATE,0,UI8,0,I4,0);
3802 VARXOR(DATE,-1,INT,-1,I4,0);
3803 VARXOR(DATE,-1,INT,0,I4,-1);
3804 VARXOR(DATE,0,INT,0,I4,0);
3805 VARXOR(DATE,-1,UINT,0xffffffff,I4,0);
3806 VARXOR(DATE,-1,UINT,0,I4,-1);
3807 VARXOR(DATE,0,UINT,0,I4,0);
3808 rbstr = SysAllocString(szFalse);
3809 VARXOR(DATE,0,BSTR,rbstr,I4,0);
3810 VARXOR(DATE,-1,BSTR,rbstr,I4,-1);
3811 rbstr = SysAllocString(szTrue);
3812 VARXOR(DATE,0,BSTR,rbstr,I4,-1);
3813 VARXOR(DATE,-1,BSTR,rbstr,I4,0);
3814 VARXORCY(DATE,-1,10000,I4,-2);
3815 VARXORCY(DATE,-1,0,I4,-1);
3816 VARXORCY(DATE,0,0,I4,0);
3818 if (HAVE_OLEAUT32_I8)
3820 VARXOR(I8,-1,I8,-1,I8,0);
3821 VARXOR(I8,-1,I8,0,I8,-1);
3822 VARXOR(I8,0,I8,0,I8,0);
3823 VARXOR(I8,-1,UI8,0,I8,-1);
3824 VARXOR(I8,0,UI8,0,I8,0);
3825 VARXOR(I8,-1,UINT,0,I8,-1);
3826 VARXOR(I8,0,UINT,0,I8,0);
3827 rbstr = SysAllocString(szFalse);
3828 VARXOR(I8,0,BSTR,rbstr,I8,0);
3829 VARXOR(I8,-1,BSTR,rbstr,I8,-1);
3830 rbstr = SysAllocString(szTrue);
3831 VARXOR(I8,0,BSTR,rbstr,I8,-1);
3832 VARXOR(I8,-1,BSTR,rbstr,I8,0);
3833 VARXORCY(I8,-1,10000,I8,-2);
3834 VARXORCY(I8,-1,0,I8,-1);
3835 VARXORCY(I8,0,0,I8,0);
3837 VARXOR(UI8,0xffff,UI8,0xffff,I4,0);
3838 VARXOR(UI8,0xffff,UI8,0,I4,0xffff);
3839 VARXOR(UI8,0,UI8,0,I4,0);
3840 VARXOR(UI8,0xffff,INT,-1,I4,-65536);
3841 VARXOR(UI8,0xffff,INT,0,I4,0xffff);
3842 VARXOR(UI8,0,INT,0,I4,0);
3843 VARXOR(UI8,0xffff,UINT,0xffff,I4,0);
3844 VARXOR(UI8,0xffff,UINT,0,I4,0xffff);
3845 VARXOR(UI8,0,UINT,0,I4,0);
3846 rbstr = SysAllocString(szFalse);
3847 VARXOR(UI8,0,BSTR,rbstr,I4,0);
3848 VARXOR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
3849 rbstr = SysAllocString(szTrue);
3850 VARXOR(UI8,0,BSTR,rbstr,I4,-1);
3851 VARXOR(UI8,0xffff,BSTR,rbstr,I4,-65536);
3852 VARXORCY(UI8,0xffff,10000,I4,65534);
3853 VARXORCY(UI8,0xffff,0,I4,0xffff);
3854 VARXORCY(UI8,0,0,I4,0);
3857 VARXOR(INT,-1,INT,-1,I4,0);
3858 VARXOR(INT,-1,INT,0,I4,-1);
3859 VARXOR(INT,0,INT,0,I4,0);
3860 VARXOR(INT,-1,UINT,0xffff,I4,-65536);
3861 VARXOR(INT,-1,UINT,0,I4,-1);
3862 VARXOR(INT,0,UINT,0,I4,0);
3863 rbstr = SysAllocString(szFalse);
3864 VARXOR(INT,0,BSTR,rbstr,I4,0);
3865 VARXOR(INT,-1,BSTR,rbstr,I4,-1);
3866 rbstr = SysAllocString(szTrue);
3867 VARXOR(INT,0,BSTR,rbstr,I4,-1);
3868 VARXOR(INT,-1,BSTR,rbstr,I4,0);
3869 VARXORCY(INT,-1,10000,I4,-2);
3870 VARXORCY(INT,-1,0,I4,-1);
3871 VARXORCY(INT,0,0,I4,0);
3873 VARXOR(UINT,0xffff,UINT,0xffff,I4,0);
3874 VARXOR(UINT,0xffff,UINT,0,I4,0xffff);
3875 VARXOR(UINT,0,UINT,0,I4,0);
3876 rbstr = SysAllocString(szFalse);
3877 VARXOR(UINT,0,BSTR,rbstr,I4,0);
3878 VARXOR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
3879 rbstr = SysAllocString(szTrue);
3880 VARXOR(UINT,0,BSTR,rbstr,I4,-1);
3881 VARXOR(UINT,0xffff,BSTR,rbstr,I4,-65536);
3882 VARXORCY(UINT,0xffff,10000,I4,65534);
3883 VARXORCY(UINT,0xffff,0,I4,0xffff);
3884 VARXORCY(UINT,0,0,I4,0);
3886 lbstr = SysAllocString(szFalse);
3887 rbstr = SysAllocString(szFalse);
3888 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
3889 rbstr = SysAllocString(szTrue);
3890 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
3891 lbstr = SysAllocString(szTrue);
3892 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_FALSE);
3893 VARXORCY(BSTR,lbstr,10000,I4,-2);
3894 lbstr = SysAllocString(szFalse);
3895 VARXORCY(BSTR,lbstr,10000,I4,1);
3898 static HRESULT (WINAPI *pVarOr)(LPVARIANT,LPVARIANT,LPVARIANT);
3900 #define VAROR(vt1,val1,vt2,val2,rvt,rval) \
3901 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3902 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3903 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3904 test_var_call2( __LINE__, pVarOr, &left, &right, &exp );
3906 #define VARORCY(vt1,val1,val2,rvt,rval) \
3907 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3908 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
3909 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3910 test_var_call2( __LINE__, pVarOr, &left, &right, &exp );
3912 static void test_VarOr(void)
3914 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
3915 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
3916 VARIANT left, right, exp, result;
3923 /* Test all possible flag/vt combinations & the resulting vt type */
3924 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
3926 VARTYPE leftvt, rightvt, resvt;
3928 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
3933 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
3939 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
3940 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
3941 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
3944 memset(&left, 0, sizeof(left));
3945 memset(&right, 0, sizeof(right));
3946 V_VT(&left) = leftvt | ExtraFlags[i];
3947 V_VT(&right) = rightvt | ExtraFlags[i];
3948 V_VT(&result) = VT_EMPTY;
3951 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
3952 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
3953 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
3954 leftvt == VT_CLSID || rightvt == VT_CLSID ||
3955 leftvt == VT_RECORD || rightvt == VT_RECORD ||
3956 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
3957 leftvt == VT_ERROR || rightvt == VT_ERROR)
3961 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
3963 if (leftvt == rightvt ||
3964 leftvt == VT_I2 || rightvt == VT_I2 ||
3965 leftvt == VT_UI1 || rightvt == VT_UI1 ||
3966 leftvt == VT_BOOL || rightvt == VT_BOOL)
3968 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3970 else if (leftvt == VT_I8 || rightvt == VT_I8)
3973 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3977 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
3979 if (leftvt == rightvt)
3981 else if (leftvt == rightvt ||
3982 leftvt == VT_I2 || rightvt == VT_I2 ||
3983 leftvt == VT_BOOL || rightvt == VT_BOOL)
3987 else if (leftvt == VT_I8 || rightvt == VT_I8)
3990 else if (leftvt == VT_I2 || rightvt == VT_I2)
3992 if (leftvt == rightvt ||
3993 leftvt == VT_BOOL || rightvt == VT_BOOL)
3995 else if (leftvt == VT_I8 || rightvt == VT_I8)
3998 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
4002 else if (leftvt == VT_I8 || rightvt == VT_I8)
4004 if (leftvt == VT_INT || rightvt == VT_INT)
4009 hres = pVarOr(&left, &right, &result);
4011 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4012 "VarOr: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4013 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4016 ok(hres == S_OK && V_VT(&result) == resvt,
4017 "VarOr: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4018 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4024 /* Test returned values. Since we know the returned type is correct
4025 * and that we handle all combinations of invalid types, just check
4026 * that good type combinations produce the desired value.
4027 * FIXME: Test VT_DECIMAL/VT_DISPATCH
4029 VAROR(EMPTY,0,EMPTY,0,I2,0);
4030 VAROR(EMPTY,1,EMPTY,0,I2,0);
4031 VAROR(EMPTY,0,NULL,0,NULL,0);
4032 VAROR(EMPTY,0,I1,0,I4,0);
4033 VAROR(EMPTY,0,I1,1,I4,1);
4034 VAROR(EMPTY,0,UI1,0,I2,0);
4035 VAROR(EMPTY,0,UI1,1,I2,1);
4036 VAROR(EMPTY,0,I2,0,I2,0);
4037 VAROR(EMPTY,0,I2,1,I2,1);
4038 VAROR(EMPTY,0,UI2,0,I4,0);
4039 VAROR(EMPTY,0,UI2,1,I4,1);
4040 VAROR(EMPTY,0,I4,0,I4,0);
4041 VAROR(EMPTY,0,I4,1,I4,1);
4042 VAROR(EMPTY,0,UI4,0,I4,0);
4043 VAROR(EMPTY,0,UI4,1,I4,1);
4044 if (HAVE_OLEAUT32_I8)
4046 VAROR(EMPTY,0,I8,0,I8,0);
4047 VAROR(EMPTY,0,I8,1,I8,1);
4048 VAROR(EMPTY,0,UI8,0,I4,0);
4049 VAROR(EMPTY,0,UI8,1,I4,1);
4051 VAROR(EMPTY,0,INT,0,I4,0);
4052 VAROR(EMPTY,0,INT,1,I4,1);
4053 VAROR(EMPTY,0,UINT,0,I4,0);
4054 VAROR(EMPTY,0,UINT,1,I4,1);
4055 VAROR(EMPTY,0,BOOL,0,I2,0);
4056 VAROR(EMPTY,0,BOOL,1,I2,1);
4057 VAROR(EMPTY,0,R4,0,I4,0);
4058 VAROR(EMPTY,0,R4,1,I4,1);
4059 VAROR(EMPTY,0,R8,0,I4,0);
4060 VAROR(EMPTY,0,R8,1,I4,1);
4061 rbstr = SysAllocString(szFalse);
4062 VAROR(EMPTY,0,BSTR,rbstr,I2,0);
4063 rbstr = SysAllocString(szTrue);
4064 VAROR(EMPTY,0,BSTR,rbstr,I2,-1);
4065 VARORCY(EMPTY,0,10000,I4,1);
4067 /* NULL OR 0 = NULL. NULL OR n = n */
4068 VAROR(NULL,0,NULL,0,NULL,0);
4069 VAROR(NULL,1,NULL,0,NULL,0);
4070 VAROR(NULL,0,I1,0,NULL,0);
4071 VAROR(NULL,0,I1,1,I4,1);
4072 VAROR(NULL,0,UI1,0,NULL,0);
4073 VAROR(NULL,0,UI1,1,UI1,1);
4074 VAROR(NULL,0,I2,0,NULL,0);
4075 VAROR(NULL,0,I2,1,I2,1);
4076 VAROR(NULL,0,UI2,0,NULL,0);
4077 VAROR(NULL,0,UI2,1,I4,1);
4078 VAROR(NULL,0,I4,0,NULL,0);
4079 VAROR(NULL,0,I4,1,I4,1);
4080 VAROR(NULL,0,UI4,0,NULL,0);
4081 VAROR(NULL,0,UI4,1,I4,1);
4082 if (HAVE_OLEAUT32_I8)
4084 VAROR(NULL,0,I8,0,NULL,0);
4085 VAROR(NULL,0,I8,1,I8,1);
4086 VAROR(NULL,0,UI8,0,NULL,0);
4087 VAROR(NULL,0,UI8,1,I4,1);
4089 VAROR(NULL,0,INT,0,NULL,0);
4090 VAROR(NULL,0,INT,1,I4,1);
4091 VAROR(NULL,0,UINT,0,NULL,0);
4092 VAROR(NULL,0,UINT,1,I4,1);
4093 VAROR(NULL,0,BOOL,0,NULL,0);
4094 VAROR(NULL,0,BOOL,1,BOOL,1);
4095 VAROR(NULL,0,R4,0,NULL,0);
4096 VAROR(NULL,0,R4,1,I4,1);
4097 VAROR(NULL,0,R8,0,NULL,0);
4098 VAROR(NULL,0,R8,1,I4,1);
4099 rbstr = SysAllocString(szFalse);
4100 VAROR(NULL,0,BSTR,rbstr,NULL,0);
4101 rbstr = SysAllocString(szTrue);
4102 VAROR(NULL,0,BSTR,rbstr,BOOL,VARIANT_TRUE);
4103 VARORCY(NULL,0,10000,I4,1);
4104 VARORCY(NULL,0,0,NULL,0);
4106 VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4107 VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
4108 VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4109 VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
4110 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
4111 VAROR(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
4112 VAROR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
4113 VAROR(BOOL,VARIANT_FALSE,I1,0,I4,0);
4114 VAROR(BOOL,VARIANT_TRUE,UI1,255,I2,-1);
4115 VAROR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
4116 VAROR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
4117 VAROR(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
4118 VAROR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
4119 VAROR(BOOL,VARIANT_FALSE,I2,0,I2,0);
4120 VAROR(BOOL,VARIANT_TRUE,UI2,65535,I4,-1);
4121 VAROR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
4122 VAROR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
4123 VAROR(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
4124 VAROR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
4125 VAROR(BOOL,VARIANT_FALSE,I4,0,I4,0);
4126 VAROR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
4127 VAROR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
4128 VAROR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
4129 VAROR(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
4130 VAROR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
4131 VAROR(BOOL,VARIANT_FALSE,R4,0,I4,0);
4132 VAROR(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
4133 VAROR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
4134 VAROR(BOOL,VARIANT_FALSE,R8,0,I4,0);
4135 VAROR(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
4136 VAROR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
4137 VAROR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
4138 if (HAVE_OLEAUT32_I8)
4140 VAROR(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
4141 VAROR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
4142 VAROR(BOOL,VARIANT_FALSE,I8,0,I8,0);
4143 /* This returns DISP_E_OVERFLOW which indicates that a conversion
4144 * to I4 is performed.
4146 /* VAROR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
4147 VAROR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
4148 VAROR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
4150 VAROR(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
4151 VAROR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
4152 VAROR(BOOL,VARIANT_FALSE,INT,0,I4,0);
4153 VAROR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
4154 VAROR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
4155 VAROR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
4156 rbstr = SysAllocString(szFalse);
4157 VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
4158 VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4159 rbstr = SysAllocString(szTrue);
4160 VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4161 VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4162 VARORCY(BOOL,VARIANT_TRUE,10000,I4,-1);
4163 VARORCY(BOOL,VARIANT_TRUE,0,I4,-1);
4164 VARORCY(BOOL,VARIANT_FALSE,0,I4,0);
4166 VAROR(I1,-1,I1,-1,I4,-1);
4167 VAROR(I1,-1,I1,0,I4,-1);
4168 VAROR(I1,0,I1,0,I4,0);
4169 VAROR(I1,-1,UI1,255,I4,-1);
4170 VAROR(I1,-1,UI1,0,I4,-1);
4171 VAROR(I1,0,UI1,0,I4,0);
4172 VAROR(I1,-1,I2,-1,I4,-1);
4173 VAROR(I1,-1,I2,0,I4,-1);
4174 VAROR(I1,0,I2,0,I4,0);
4175 VAROR(I1,-1,UI2,65535,I4,-1);
4176 VAROR(I1,-1,UI2,0,I4,-1);
4177 VAROR(I1,0,UI2,0,I4,0);
4178 VAROR(I1,-1,I4,-1,I4,-1);
4179 VAROR(I1,-1,I4,0,I4,-1);
4180 VAROR(I1,0,I4,0,I4,0);
4181 VAROR(I1,-1,UI4,0xffffffff,I4,-1);
4182 VAROR(I1,-1,UI4,0,I4,-1);
4183 VAROR(I1,0,UI4,0,I4,0);
4184 VAROR(I1,-1,R4,-1,I4,-1);
4185 VAROR(I1,-1,R4,0,I4,-1);
4186 VAROR(I1,0,R4,0,I4,0);
4187 VAROR(I1,-1,R8,-1,I4,-1);
4188 VAROR(I1,-1,R8,0,I4,-1);
4189 VAROR(I1,0,R8,0,I4,0);
4190 VAROR(I1,-1,DATE,-1,I4,-1);
4191 VAROR(I1,-1,DATE,0,I4,-1);
4192 VAROR(I1,0,DATE,0,I4,0);
4193 if (HAVE_OLEAUT32_I8)
4195 VAROR(I1,-1,I8,-1,I8,-1);
4196 VAROR(I1,-1,I8,0,I8,-1);
4197 VAROR(I1,0,I8,0,I8,0);
4198 VAROR(I1,-1,UI8,0,I4,-1);
4199 VAROR(I1,0,UI8,0,I4,0);
4201 VAROR(I1,-1,INT,-1,I4,-1);
4202 VAROR(I1,-1,INT,0,I4,-1);
4203 VAROR(I1,0,INT,0,I4,0);
4204 VAROR(I1,-1,UINT,0xffffffff,I4,-1);
4205 VAROR(I1,-1,UINT,0,I4,-1);
4206 VAROR(I1,0,UINT,0,I4,0);
4207 rbstr = SysAllocString(szFalse);
4208 VAROR(I1,0,BSTR,rbstr,I4,0);
4209 VAROR(I1,-1,BSTR,rbstr,I4,-1);
4210 rbstr = SysAllocString(szTrue);
4211 VAROR(I1,0,BSTR,rbstr,I4,-1);
4212 VAROR(I1,-1,BSTR,rbstr,I4,-1);
4213 VARORCY(I1,-1,10000,I4,-1);
4214 VARORCY(I1,-1,0,I4,-1);
4215 VARORCY(I1,0,0,I4,0);
4217 VAROR(UI1,255,UI1,255,UI1,255);
4218 VAROR(UI1,255,UI1,0,UI1,255);
4219 VAROR(UI1,0,UI1,0,UI1,0);
4220 VAROR(UI1,255,I2,-1,I2,-1);
4221 VAROR(UI1,255,I2,0,I2,255);
4222 VAROR(UI1,0,I2,0,I2,0);
4223 VAROR(UI1,255,UI2,65535,I4,65535);
4224 VAROR(UI1,255,UI2,0,I4,255);
4225 VAROR(UI1,0,UI2,0,I4,0);
4226 VAROR(UI1,255,I4,-1,I4,-1);
4227 VAROR(UI1,255,I4,0,I4,255);
4228 VAROR(UI1,0,I4,0,I4,0);
4229 VAROR(UI1,255,UI4,0xffffffff,I4,-1);
4230 VAROR(UI1,255,UI4,0,I4,255);
4231 VAROR(UI1,0,UI4,0,I4,0);
4232 VAROR(UI1,255,R4,-1,I4,-1);
4233 VAROR(UI1,255,R4,0,I4,255);
4234 VAROR(UI1,0,R4,0,I4,0);
4235 VAROR(UI1,255,R8,-1,I4,-1);
4236 VAROR(UI1,255,R8,0,I4,255);
4237 VAROR(UI1,0,R8,0,I4,0);
4238 VAROR(UI1,255,DATE,-1,I4,-1);
4239 VAROR(UI1,255,DATE,0,I4,255);
4240 VAROR(UI1,0,DATE,0,I4,0);
4241 if (HAVE_OLEAUT32_I8)
4243 VAROR(UI1,255,I8,-1,I8,-1);
4244 VAROR(UI1,255,I8,0,I8,255);
4245 VAROR(UI1,0,I8,0,I8,0);
4246 VAROR(UI1,255,UI8,0,I4,255);
4247 VAROR(UI1,0,UI8,0,I4,0);
4249 VAROR(UI1,255,INT,-1,I4,-1);
4250 VAROR(UI1,255,INT,0,I4,255);
4251 VAROR(UI1,0,INT,0,I4,0);
4252 VAROR(UI1,255,UINT,0xffffffff,I4,-1);
4253 VAROR(UI1,255,UINT,0,I4,255);
4254 VAROR(UI1,0,UINT,0,I4,0);
4255 rbstr = SysAllocString(szFalse);
4256 VAROR(UI1,0,BSTR,rbstr,I2,0);
4257 VAROR(UI1,255,BSTR,rbstr,I2,255);
4258 rbstr = SysAllocString(szTrue);
4259 VAROR(UI1,0,BSTR,rbstr,I2,-1);
4260 VAROR(UI1,255,BSTR,rbstr,I2,-1);
4261 VARORCY(UI1,255,10000,I4,255);
4262 VARORCY(UI1,255,0,I4,255);
4263 VARORCY(UI1,0,0,I4,0);
4265 VAROR(I2,-1,I2,-1,I2,-1);
4266 VAROR(I2,-1,I2,0,I2,-1);
4267 VAROR(I2,0,I2,0,I2,0);
4268 VAROR(I2,-1,UI2,65535,I4,-1);
4269 VAROR(I2,-1,UI2,0,I4,-1);
4270 VAROR(I2,0,UI2,0,I4,0);
4271 VAROR(I2,-1,I4,-1,I4,-1);
4272 VAROR(I2,-1,I4,0,I4,-1);
4273 VAROR(I2,0,I4,0,I4,0);
4274 VAROR(I2,-1,UI4,0xffffffff,I4,-1);
4275 VAROR(I2,-1,UI4,0,I4,-1);
4276 VAROR(I2,0,UI4,0,I4,0);
4277 VAROR(I2,-1,R4,-1,I4,-1);
4278 VAROR(I2,-1,R4,0,I4,-1);
4279 VAROR(I2,0,R4,0,I4,0);
4280 VAROR(I2,-1,R8,-1,I4,-1);
4281 VAROR(I2,-1,R8,0,I4,-1);
4282 VAROR(I2,0,R8,0,I4,0);
4283 VAROR(I2,-1,DATE,-1,I4,-1);
4284 VAROR(I2,-1,DATE,0,I4,-1);
4285 VAROR(I2,0,DATE,0,I4,0);
4286 if (HAVE_OLEAUT32_I8)
4288 VAROR(I2,-1,I8,-1,I8,-1);
4289 VAROR(I2,-1,I8,0,I8,-1);
4290 VAROR(I2,0,I8,0,I8,0);
4291 VAROR(I2,-1,UI8,0,I4,-1);
4292 VAROR(I2,0,UI8,0,I4,0);
4294 VAROR(I2,-1,INT,-1,I4,-1);
4295 VAROR(I2,-1,INT,0,I4,-1);
4296 VAROR(I2,0,INT,0,I4,0);
4297 VAROR(I2,-1,UINT,0xffffffff,I4,-1);
4298 VAROR(I2,-1,UINT,0,I4,-1);
4299 VAROR(I2,0,UINT,0,I4,0);
4300 rbstr = SysAllocString(szFalse);
4301 VAROR(I2,0,BSTR,rbstr,I2,0);
4302 VAROR(I2,-1,BSTR,rbstr,I2,-1);
4303 rbstr = SysAllocString(szTrue);
4304 VAROR(I2,0,BSTR,rbstr,I2,-1);
4305 VAROR(I2,-1,BSTR,rbstr,I2,-1);
4306 VARORCY(I2,-1,10000,I4,-1);
4307 VARORCY(I2,-1,0,I4,-1);
4308 VARORCY(I2,0,0,I4,0);
4310 VAROR(UI2,65535,UI2,65535,I4,65535);
4311 VAROR(UI2,65535,UI2,0,I4,65535);
4312 VAROR(UI2,0,UI2,0,I4,0);
4313 VAROR(UI2,65535,I4,-1,I4,-1);
4314 VAROR(UI2,65535,I4,0,I4,65535);
4315 VAROR(UI2,0,I4,0,I4,0);
4316 VAROR(UI2,65535,UI4,0xffffffff,I4,-1);
4317 VAROR(UI2,65535,UI4,0,I4,65535);
4318 VAROR(UI2,0,UI4,0,I4,0);
4319 VAROR(UI2,65535,R4,-1,I4,-1);
4320 VAROR(UI2,65535,R4,0,I4,65535);
4321 VAROR(UI2,0,R4,0,I4,0);
4322 VAROR(UI2,65535,R8,-1,I4,-1);
4323 VAROR(UI2,65535,R8,0,I4,65535);
4324 VAROR(UI2,0,R8,0,I4,0);
4325 VAROR(UI2,65535,DATE,-1,I4,-1);
4326 VAROR(UI2,65535,DATE,0,I4,65535);
4327 VAROR(UI2,0,DATE,0,I4,0);
4328 if (HAVE_OLEAUT32_I8)
4330 VAROR(UI2,65535,I8,-1,I8,-1);
4331 VAROR(UI2,65535,I8,0,I8,65535);
4332 VAROR(UI2,0,I8,0,I8,0);
4333 VAROR(UI2,65535,UI8,0,I4,65535);
4334 VAROR(UI2,0,UI8,0,I4,0);
4336 VAROR(UI2,65535,INT,-1,I4,-1);
4337 VAROR(UI2,65535,INT,0,I4,65535);
4338 VAROR(UI2,0,INT,0,I4,0);
4339 VAROR(UI2,65535,UINT,0xffffffff,I4,-1);
4340 VAROR(UI2,65535,UINT,0,I4,65535);
4341 VAROR(UI2,0,UINT,0,I4,0);
4342 rbstr = SysAllocString(szFalse);
4343 VAROR(UI2,0,BSTR,rbstr,I4,0);
4344 VAROR(UI2,65535,BSTR,rbstr,I4,65535);
4345 rbstr = SysAllocString(szTrue);
4346 VAROR(UI2,0,BSTR,rbstr,I4,-1);
4347 VAROR(UI2,65535,BSTR,rbstr,I4,-1);
4348 VARORCY(UI2,65535,10000,I4,65535);
4349 VARORCY(UI2,65535,0,I4,65535);
4350 VARORCY(UI2,0,0,I4,0);
4352 VAROR(I4,-1,I4,-1,I4,-1);
4353 VAROR(I4,-1,I4,0,I4,-1);
4354 VAROR(I4,0,I4,0,I4,0);
4355 VAROR(I4,-1,UI4,0xffffffff,I4,-1);
4356 VAROR(I4,-1,UI4,0,I4,-1);
4357 VAROR(I4,0,UI4,0,I4,0);
4358 VAROR(I4,-1,R4,-1,I4,-1);
4359 VAROR(I4,-1,R4,0,I4,-1);
4360 VAROR(I4,0,R4,0,I4,0);
4361 VAROR(I4,-1,R8,-1,I4,-1);
4362 VAROR(I4,-1,R8,0,I4,-1);
4363 VAROR(I4,0,R8,0,I4,0);
4364 VAROR(I4,-1,DATE,-1,I4,-1);
4365 VAROR(I4,-1,DATE,0,I4,-1);
4366 VAROR(I4,0,DATE,0,I4,0);
4367 if (HAVE_OLEAUT32_I8)
4369 VAROR(I4,-1,I8,-1,I8,-1);
4370 VAROR(I4,-1,I8,0,I8,-1);
4371 VAROR(I4,0,I8,0,I8,0);
4372 VAROR(I4,-1,UI8,0,I4,-1);
4373 VAROR(I4,0,UI8,0,I4,0);
4375 VAROR(I4,-1,INT,-1,I4,-1);
4376 VAROR(I4,-1,INT,0,I4,-1);
4377 VAROR(I4,0,INT,0,I4,0);
4378 VAROR(I4,-1,UINT,0xffffffff,I4,-1);
4379 VAROR(I4,-1,UINT,0,I4,-1);
4380 VAROR(I4,0,UINT,0,I4,0);
4381 rbstr = SysAllocString(szFalse);
4382 VAROR(I4,0,BSTR,rbstr,I4,0);
4383 VAROR(I4,-1,BSTR,rbstr,I4,-1);
4384 rbstr = SysAllocString(szTrue);
4385 VAROR(I4,0,BSTR,rbstr,I4,-1);
4386 VAROR(I4,-1,BSTR,rbstr,I4,-1);
4387 VARORCY(I4,-1,10000,I4,-1);
4388 VARORCY(I4,-1,0,I4,-1);
4389 VARORCY(I4,0,0,I4,0);
4391 VAROR(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
4392 VAROR(UI4,0xffffffff,UI4,0,I4,-1);
4393 VAROR(UI4,0,UI4,0,I4,0);
4394 VAROR(UI4,0xffffffff,R4,-1,I4,-1);
4395 VAROR(UI4,0xffffffff,R4,0,I4,-1);
4396 VAROR(UI4,0,R4,0,I4,0);
4397 VAROR(UI4,0xffffffff,R8,-1,I4,-1);
4398 VAROR(UI4,0xffffffff,R8,0,I4,-1);
4399 VAROR(UI4,0,R8,0,I4,0);
4400 VAROR(UI4,0xffffffff,DATE,-1,I4,-1);
4401 VAROR(UI4,0xffffffff,DATE,0,I4,-1);
4402 VAROR(UI4,0,DATE,0,I4,0);
4403 if (HAVE_OLEAUT32_I8)
4405 VAROR(UI4,0xffffffff,I8,-1,I8,-1);
4406 VAROR(UI4,0xffffffff,I8,0,I8,0xffffffff);
4407 VAROR(UI4,0,I8,0,I8,0);
4408 VAROR(UI4,0xffffffff,UI8,0,I4,-1);
4409 VAROR(UI4,0,UI8,0,I4,0);
4411 VAROR(UI4,0xffffffff,INT,-1,I4,-1);
4412 VAROR(UI4,0xffffffff,INT,0,I4,-1);
4413 VAROR(UI4,0,INT,0,I4,0);
4414 VAROR(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
4415 VAROR(UI4,0xffffffff,UINT,0,I4,-1);
4416 VAROR(UI4,0,UINT,0,I4,0);
4417 rbstr = SysAllocString(szFalse);
4418 VAROR(UI4,0,BSTR,rbstr,I4,0);
4419 VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
4420 rbstr = SysAllocString(szTrue);
4421 VAROR(UI4,0,BSTR,rbstr,I4,-1);
4422 VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
4423 VARORCY(UI4,0xffffffff,10000,I4,-1);
4424 VARORCY(UI4,0xffffffff,0,I4,-1);
4425 VARORCY(UI4,0,0,I4,0);
4427 VAROR(R4,-1,R4,-1,I4,-1);
4428 VAROR(R4,-1,R4,0,I4,-1);
4429 VAROR(R4,0,R4,0,I4,0);
4430 VAROR(R4,-1,R8,-1,I4,-1);
4431 VAROR(R4,-1,R8,0,I4,-1);
4432 VAROR(R4,0,R8,0,I4,0);
4433 VAROR(R4,-1,DATE,-1,I4,-1);
4434 VAROR(R4,-1,DATE,0,I4,-1);
4435 VAROR(R4,0,DATE,0,I4,0);
4436 if (HAVE_OLEAUT32_I8)
4438 VAROR(R4,-1,I8,-1,I8,-1);
4439 VAROR(R4,-1,I8,0,I8,-1);
4440 VAROR(R4,0,I8,0,I8,0);
4441 VAROR(R4,-1,UI8,0,I4,-1);
4442 VAROR(R4,0,UI8,0,I4,0);
4444 VAROR(R4,-1,INT,-1,I4,-1);
4445 VAROR(R4,-1,INT,0,I4,-1);
4446 VAROR(R4,0,INT,0,I4,0);
4447 VAROR(R4,-1,UINT,0xffffffff,I4,-1);
4448 VAROR(R4,-1,UINT,0,I4,-1);
4449 VAROR(R4,0,UINT,0,I4,0);
4450 rbstr = SysAllocString(szFalse);
4451 VAROR(R4,0,BSTR,rbstr,I4,0);
4452 VAROR(R4,-1,BSTR,rbstr,I4,-1);
4453 rbstr = SysAllocString(szTrue);
4454 VAROR(R4,0,BSTR,rbstr,I4,-1);
4455 VAROR(R4,-1,BSTR,rbstr,I4,-1);
4456 VARORCY(R4,-1,10000,I4,-1);
4457 VARORCY(R4,-1,0,I4,-1);
4458 VARORCY(R4,0,0,I4,0);
4460 VAROR(R8,-1,R8,-1,I4,-1);
4461 VAROR(R8,-1,R8,0,I4,-1);
4462 VAROR(R8,0,R8,0,I4,0);
4463 VAROR(R8,-1,DATE,-1,I4,-1);
4464 VAROR(R8,-1,DATE,0,I4,-1);
4465 VAROR(R8,0,DATE,0,I4,0);
4466 if (HAVE_OLEAUT32_I8)
4468 VAROR(R8,-1,I8,-1,I8,-1);
4469 VAROR(R8,-1,I8,0,I8,-1);
4470 VAROR(R8,0,I8,0,I8,0);
4471 VAROR(R8,-1,UI8,0,I4,-1);
4472 VAROR(R8,0,UI8,0,I4,0);
4474 VAROR(R8,-1,INT,-1,I4,-1);
4475 VAROR(R8,-1,INT,0,I4,-1);
4476 VAROR(R8,0,INT,0,I4,0);
4477 VAROR(R8,-1,UINT,0xffffffff,I4,-1);
4478 VAROR(R8,-1,UINT,0,I4,-1);
4479 VAROR(R8,0,UINT,0,I4,0);
4480 rbstr = SysAllocString(szFalse);
4481 VAROR(R8,0,BSTR,rbstr,I4,0);
4482 VAROR(R8,-1,BSTR,rbstr,I4,-1);
4483 rbstr = SysAllocString(szTrue);
4484 VAROR(R8,0,BSTR,rbstr,I4,-1);
4485 VAROR(R8,-1,BSTR,rbstr,I4,-1);
4486 VARORCY(R8,-1,10000,I4,-1);
4487 VARORCY(R8,-1,0,I4,-1);
4488 VARORCY(R8,0,0,I4,0);
4490 VAROR(DATE,-1,DATE,-1,I4,-1);
4491 VAROR(DATE,-1,DATE,0,I4,-1);
4492 VAROR(DATE,0,DATE,0,I4,0);
4493 if (HAVE_OLEAUT32_I8)
4495 VAROR(DATE,-1,I8,-1,I8,-1);
4496 VAROR(DATE,-1,I8,0,I8,-1);
4497 VAROR(DATE,0,I8,0,I8,0);
4498 VAROR(DATE,-1,UI8,0,I4,-1);
4499 VAROR(DATE,0,UI8,0,I4,0);
4501 VAROR(DATE,-1,INT,-1,I4,-1);
4502 VAROR(DATE,-1,INT,0,I4,-1);
4503 VAROR(DATE,0,INT,0,I4,0);
4504 VAROR(DATE,-1,UINT,0xffffffff,I4,-1);
4505 VAROR(DATE,-1,UINT,0,I4,-1);
4506 VAROR(DATE,0,UINT,0,I4,0);
4507 rbstr = SysAllocString(szFalse);
4508 VAROR(DATE,0,BSTR,rbstr,I4,0);
4509 VAROR(DATE,-1,BSTR,rbstr,I4,-1);
4510 rbstr = SysAllocString(szTrue);
4511 VAROR(DATE,0,BSTR,rbstr,I4,-1);
4512 VAROR(DATE,-1,BSTR,rbstr,I4,-1);
4513 VARORCY(DATE,-1,10000,I4,-1);
4514 VARORCY(DATE,-1,0,I4,-1);
4515 VARORCY(DATE,0,0,I4,0);
4517 if (HAVE_OLEAUT32_I8)
4519 VAROR(I8,-1,I8,-1,I8,-1);
4520 VAROR(I8,-1,I8,0,I8,-1);
4521 VAROR(I8,0,I8,0,I8,0);
4522 VAROR(I8,-1,UI8,0,I8,-1);
4523 VAROR(I8,0,UI8,0,I8,0);
4524 /* These overflow under native and Wine
4525 VAROR(I8,-1,INT,-1,I4,-1);
4526 VAROR(I8,-1,INT,0,I4,-1);
4527 VAROR(I8,0,INT,0,I4,0); */
4528 VAROR(I8,-1,UINT,0xffffffff,I8,-1);
4529 VAROR(I8,-1,UINT,0,I8,-1);
4530 VAROR(I8,0,UINT,0,I8,0);
4531 rbstr = SysAllocString(szFalse);
4532 VAROR(I8,0,BSTR,rbstr,I8,0);
4533 VAROR(I8,-1,BSTR,rbstr,I8,-1);
4534 rbstr = SysAllocString(szTrue);
4535 VAROR(I8,0,BSTR,rbstr,I8,-1);
4536 VAROR(I8,-1,BSTR,rbstr,I8,-1);
4537 VARORCY(I8,-1,10000,I8,-1);
4538 VARORCY(I8,-1,0,I8,-1);
4539 VARORCY(I8,0,0,I8,0);
4541 VAROR(UI8,0xffff,UI8,0xffff,I4,0xffff);
4542 VAROR(UI8,0xffff,UI8,0,I4,0xffff);
4543 VAROR(UI8,0,UI8,0,I4,0);
4544 VAROR(UI8,0xffff,INT,-1,I4,-1);
4545 VAROR(UI8,0xffff,INT,0,I4,0xffff);
4546 VAROR(UI8,0,INT,0,I4,0);
4547 VAROR(UI8,0xffff,UINT,0xffff,I4,0xffff);
4548 VAROR(UI8,0xffff,UINT,0,I4,0xffff);
4549 VAROR(UI8,0,UINT,0,I4,0);
4550 rbstr = SysAllocString(szFalse);
4551 VAROR(UI8,0,BSTR,rbstr,I4,0);
4552 VAROR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
4553 rbstr = SysAllocString(szTrue);
4554 VAROR(UI8,0,BSTR,rbstr,I4,-1);
4555 VAROR(UI8,0xffff,BSTR,rbstr,I4,-1);
4556 VARORCY(UI8,0xffff,10000,I4,0xffff);
4557 VARORCY(UI8,0xffff,0,I4,0xffff);
4558 VARORCY(UI8,0,0,I4,0);
4561 VAROR(INT,-1,INT,-1,I4,-1);
4562 VAROR(INT,-1,INT,0,I4,-1);
4563 VAROR(INT,0,INT,0,I4,0);
4564 VAROR(INT,-1,UINT,0xffff,I4,-1);
4565 VAROR(INT,-1,UINT,0,I4,-1);
4566 VAROR(INT,0,UINT,0,I4,0);
4567 rbstr = SysAllocString(szFalse);
4568 VAROR(INT,0,BSTR,rbstr,I4,0);
4569 VAROR(INT,-1,BSTR,rbstr,I4,-1);
4570 rbstr = SysAllocString(szTrue);
4571 VAROR(INT,0,BSTR,rbstr,I4,-1);
4572 VAROR(INT,-1,BSTR,rbstr,I4,-1);
4573 VARORCY(INT,-1,10000,I4,-1);
4574 VARORCY(INT,-1,0,I4,-1);
4575 VARORCY(INT,0,0,I4,0);
4577 VAROR(UINT,0xffff,UINT,0xffff,I4,0xffff);
4578 VAROR(UINT,0xffff,UINT,0,I4,0xffff);
4579 VAROR(UINT,0,UINT,0,I4,0);
4580 rbstr = SysAllocString(szFalse);
4581 VAROR(UINT,0,BSTR,rbstr,I4,0);
4582 VAROR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
4583 rbstr = SysAllocString(szTrue);
4584 VAROR(UINT,0,BSTR,rbstr,I4,-1);
4585 VAROR(UINT,0xffff,BSTR,rbstr,I4,-1);
4586 VARORCY(UINT,0xffff,10000,I4,0xffff);
4587 VARORCY(UINT,0xffff,0,I4,0xffff);
4588 VARORCY(UINT,0,0,I4,0);
4590 lbstr = SysAllocString(szFalse);
4591 rbstr = SysAllocString(szFalse);
4592 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
4593 rbstr = SysAllocString(szTrue);
4594 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
4595 lbstr = SysAllocString(szTrue);
4596 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
4597 VARORCY(BSTR,lbstr,10000,I4,-1);
4598 lbstr = SysAllocString(szFalse);
4599 VARORCY(BSTR,lbstr,10000,I4,1);
4602 static HRESULT (WINAPI *pVarEqv)(LPVARIANT,LPVARIANT,LPVARIANT);
4604 #define VAREQV(vt1,val1,vt2,val2,rvt,rval) \
4605 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
4606 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4607 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4608 test_var_call2( __LINE__, pVarEqv, &left, &right, &exp );
4610 static void test_VarEqv(void)
4612 VARIANT left, right, exp, result;
4618 /* Test all possible flag/vt combinations & the resulting vt type */
4619 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4621 VARTYPE leftvt, rightvt, resvt;
4623 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4627 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4633 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
4634 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
4635 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4638 memset(&left, 0, sizeof(left));
4639 memset(&right, 0, sizeof(right));
4640 V_VT(&left) = leftvt | ExtraFlags[i];
4641 V_VT(&right) = rightvt | ExtraFlags[i];
4642 V_VT(&result) = VT_EMPTY;
4645 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4646 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4647 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4648 leftvt == VT_CLSID || rightvt == VT_CLSID ||
4649 leftvt == VT_RECORD || rightvt == VT_RECORD ||
4650 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4651 leftvt == VT_ERROR || rightvt == VT_ERROR)
4655 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
4657 if (leftvt == rightvt ||
4658 leftvt == VT_I2 || rightvt == VT_I2 ||
4659 leftvt == VT_UI1 || rightvt == VT_UI1 ||
4660 leftvt == VT_BOOL || rightvt == VT_BOOL)
4662 else if (leftvt == VT_NULL || rightvt == VT_NULL)
4664 else if (leftvt == VT_I8 || rightvt == VT_I8)
4667 else if (leftvt == VT_NULL || rightvt == VT_NULL)
4671 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
4673 if (leftvt == rightvt)
4675 else if (leftvt == rightvt ||
4676 leftvt == VT_I2 || rightvt == VT_I2 ||
4677 leftvt == VT_BOOL || rightvt == VT_BOOL)
4681 else if (leftvt == VT_I8 || rightvt == VT_I8)
4684 else if (leftvt == VT_I2 || rightvt == VT_I2)
4686 if (leftvt == rightvt ||
4687 leftvt == VT_BOOL || rightvt == VT_BOOL)
4689 else if (leftvt == VT_I8 || rightvt == VT_I8)
4692 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
4696 else if (leftvt == VT_I8 || rightvt == VT_I8)
4698 if (leftvt == VT_INT || rightvt == VT_INT)
4703 hres = pVarEqv(&left, &right, &result);
4705 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4706 "VarEqv: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4707 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4710 ok(hres == S_OK && V_VT(&result) == resvt,
4711 "VarEqv: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4712 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4718 /* Test returned values */
4719 VAREQV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4720 VAREQV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
4721 VAREQV(BOOL,TRUE,BOOL,TRUE,BOOL,VARIANT_TRUE);
4722 VAREQV(BOOL,FALSE,BOOL,FALSE,BOOL,VARIANT_TRUE);
4723 VAREQV(BOOL,TRUE,BOOL,FALSE,BOOL,-2);
4724 VAREQV(BOOL,FALSE,BOOL,TRUE,BOOL,-2);
4725 VAREQV(BOOL,6,BOOL,7,BOOL,-2);
4726 VAREQV(BOOL,6,BOOL,6,BOOL,VARIANT_TRUE);
4727 VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE,I2,VARIANT_TRUE);
4728 VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_FALSE,I2,VARIANT_FALSE);
4729 VAREQV(BOOL,6,I2,7,I2,-2);
4730 VAREQV(UI1,1,UI1,1,UI1,255);
4731 VAREQV(UI1,1,UI1,0,UI1,254);
4732 VAREQV(UI1,0,UI1,1,UI1,254);
4733 if (HAVE_OLEAUT32_I8)
4735 VAREQV(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,-1);
4736 VAREQV(UI4,5,I8,19,I8,-23);
4737 VAREQV(UI4,VARIANT_FALSE,UI8,VARIANT_FALSE,I4,-1);
4741 static HRESULT (WINAPI *pVarMul)(LPVARIANT,LPVARIANT,LPVARIANT);
4743 #define VARMUL(vt1,val1,vt2,val2,rvt,rval) \
4744 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
4745 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4746 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4747 test_var_call2( __LINE__, pVarMul, &left, &right, &exp );
4749 static void test_VarMul(void)
4751 static const WCHAR sz12[] = {'1','2','\0'};
4752 VARIANT left, right, exp, result, cy, dec;
4760 lbstr = SysAllocString(sz12);
4761 rbstr = SysAllocString(sz12);
4763 /* Test all possible flag/vt combinations & the resulting vt type */
4764 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4766 VARTYPE leftvt, rightvt, resvt;
4768 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4773 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4779 if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
4780 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4783 memset(&left, 0, sizeof(left));
4784 memset(&right, 0, sizeof(right));
4785 V_VT(&left) = leftvt | ExtraFlags[i];
4786 if (leftvt == VT_BSTR)
4787 V_BSTR(&left) = lbstr;
4788 V_VT(&right) = rightvt | ExtraFlags[i];
4789 if (rightvt == VT_BSTR)
4790 V_BSTR(&right) = rbstr;
4791 V_VT(&result) = VT_EMPTY;
4794 /* Don't ask me why but native VarMul cannot handle:
4795 VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
4796 Tested with DCOM98, Win2k, WinXP */
4797 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4798 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4799 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4800 leftvt == VT_CLSID || rightvt == VT_CLSID ||
4801 leftvt == VT_RECORD || rightvt == VT_RECORD ||
4802 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4803 leftvt == VT_ERROR || rightvt == VT_ERROR ||
4804 leftvt == VT_I1 || rightvt == VT_I1 ||
4805 leftvt == VT_UI2 || rightvt == VT_UI2 ||
4806 leftvt == VT_UI4 || rightvt == VT_UI4 ||
4807 leftvt == VT_UI8 || rightvt == VT_UI8 ||
4808 leftvt == VT_INT || rightvt == VT_INT ||
4809 leftvt == VT_UINT || rightvt == VT_UINT) {
4813 if (leftvt == VT_NULL || rightvt == VT_NULL)
4815 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
4817 else if (leftvt == VT_R8 || rightvt == VT_R8 ||
4818 leftvt == VT_BSTR || rightvt == VT_BSTR ||
4819 leftvt == VT_DATE || rightvt == VT_DATE)
4821 else if (leftvt == VT_R4 || rightvt == VT_R4) {
4822 if (leftvt == VT_I4 || rightvt == VT_I4 ||
4823 leftvt == VT_I8 || rightvt == VT_I8 ||
4824 leftvt == VT_CY || rightvt == VT_CY)
4828 } else if (leftvt == VT_CY || rightvt == VT_CY)
4830 else if (leftvt == VT_I8 || rightvt == VT_I8)
4832 else if (leftvt == VT_I4 || rightvt == VT_I4)
4834 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
4835 leftvt == VT_BOOL || rightvt == VT_BOOL ||
4836 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
4838 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
4841 hres = pVarMul(&left, &right, &result);
4843 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
4844 "VarMul: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
4845 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4848 ok(hres == S_OK && V_VT(&result) == resvt,
4849 "VarMul: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
4850 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4857 /* Test returned values */
4858 VARMUL(I4,4,I4,2,I4,8);
4859 VARMUL(I2,4,I2,2,I2,8);
4860 VARMUL(I2,-13,I4,5,I4,-65);
4861 VARMUL(I4,-13,I4,5,I4,-65);
4862 VARMUL(I2,7,R4,0.5,R4,3.5);
4863 VARMUL(R4,0.5,I4,5,R8,2.5);
4864 VARMUL(R8,7.1,BOOL,0,R8,0);
4865 VARMUL(BSTR,lbstr,I2,4,R8,48);
4866 VARMUL(BSTR,lbstr,BOOL,1,R8,12);
4867 VARMUL(BSTR,lbstr,R4,0.1,R8,1.2);
4868 VARMUL(BSTR,lbstr,BSTR,rbstr,R8,144);
4869 VARMUL(R4,0.2,BSTR,rbstr,R8,2.4);
4870 VARMUL(DATE,2.25,I4,7,R8,15.75);
4872 VARMUL(UI1, UI1_MAX, UI1, UI1_MAX, I4, UI1_MAX * UI1_MAX);
4873 VARMUL(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX * I2_MAX);
4874 VARMUL(I2, I2_MAX, I2, I2_MIN, I4, I2_MAX * I2_MIN);
4875 VARMUL(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN * I2_MIN);
4876 VARMUL(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX * I4_MAX);
4877 VARMUL(I4, I4_MAX, I4, I4_MIN, R8, (double)I4_MAX * I4_MIN);
4878 VARMUL(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN * I4_MIN);
4879 VARMUL(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX * R4_MAX);
4880 VARMUL(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX * R4_MIN);
4881 VARMUL(R4, R4_MIN, R4, R4_MIN, R4, R4_MIN * R4_MIN);
4882 VARMUL(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX * R8_MIN);
4883 VARMUL(R8, R8_MIN, R8, R8_MIN, R8, R8_MIN * R8_MIN);
4885 /* Manuly test some VT_CY and VT_DECIMAL variants */
4887 hres = VarCyFromI4(4711, &V_CY(&cy));
4888 ok(hres == S_OK, "VarCyFromI4 failed!\n");
4889 V_VT(&dec) = VT_DECIMAL;
4890 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
4891 ok(hres == S_OK, "VarDecFromR4 failed!\n");
4892 memset(&left, 0, sizeof(left));
4893 memset(&right, 0, sizeof(right));
4894 V_VT(&left) = VT_I4;
4896 V_VT(&right) = VT_UI1;
4899 hres = VarMul(&cy, &right, &result);
4900 ok(hres == S_OK && V_VT(&result) == VT_CY, "VarMul: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
4901 hres = VarR8FromCy(V_CY(&result), &r);
4902 ok(hres == S_OK && EQ_DOUBLE(r, 42399), "VarMul: CY value %f, expected %f\n", r, (double)42399);
4904 hres = VarMul(&left, &dec, &result);
4905 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarMul: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
4906 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
4907 ok(hres == S_OK && EQ_DOUBLE(r, 46.2), "VarMul: DECIMAL value %f, expected %f\n", r, (double)46.2);
4909 SysFreeString(lbstr);
4910 SysFreeString(rbstr);
4913 static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT);
4915 #define VARADD(vt1,val1,vt2,val2,rvt,rval) \
4916 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
4917 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4918 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4919 test_var_call2( __LINE__, pVarAdd, &left, &right, &exp );
4921 static void test_VarAdd(void)
4923 static const WCHAR sz12[] = {'1','2','\0'};
4924 VARIANT left, right, exp, result, cy, dec;
4932 lbstr = SysAllocString(sz12);
4933 rbstr = SysAllocString(sz12);
4935 /* Test all possible flag/vt combinations & the resulting vt type */
4936 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
4938 VARTYPE leftvt, rightvt, resvt;
4940 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4945 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4951 if (leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4954 memset(&left, 0, sizeof(left));
4955 memset(&right, 0, sizeof(right));
4956 V_VT(&left) = leftvt | ExtraFlags[i];
4957 if (leftvt == VT_BSTR)
4958 V_BSTR(&left) = lbstr;
4959 V_VT(&right) = rightvt | ExtraFlags[i];
4960 if (rightvt == VT_BSTR)
4961 V_BSTR(&right) = rbstr;
4962 V_VT(&result) = VT_EMPTY;
4965 /* Don't ask me why but native VarAdd cannot handle:
4966 VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
4967 Tested with DCOM98, Win2k, WinXP */
4968 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4969 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4970 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4971 leftvt == VT_CLSID || rightvt == VT_CLSID ||
4972 leftvt == VT_RECORD || rightvt == VT_RECORD ||
4973 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4974 leftvt == VT_ERROR || rightvt == VT_ERROR ||
4975 leftvt == VT_I1 || rightvt == VT_I1 ||
4976 leftvt == VT_UI2 || rightvt == VT_UI2 ||
4977 leftvt == VT_UI4 || rightvt == VT_UI4 ||
4978 leftvt == VT_UI8 || rightvt == VT_UI8 ||
4979 leftvt == VT_INT || rightvt == VT_INT ||
4980 leftvt == VT_UINT || rightvt == VT_UINT) {
4984 if (leftvt == VT_NULL || rightvt == VT_NULL)
4986 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH)
4988 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
4990 else if (leftvt == VT_DATE || rightvt == VT_DATE)
4992 else if (leftvt == VT_CY || rightvt == VT_CY)
4994 else if (leftvt == VT_R8 || rightvt == VT_R8)
4996 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
4997 if ((leftvt == VT_BSTR && rightvt == VT_BSTR) ||
4998 leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5002 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
5003 if (leftvt == VT_I4 || rightvt == VT_I4 ||
5004 leftvt == VT_I8 || rightvt == VT_I8)
5009 else if (leftvt == VT_I8 || rightvt == VT_I8)
5011 else if (leftvt == VT_I4 || rightvt == VT_I4)
5013 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
5014 leftvt == VT_BOOL || rightvt == VT_BOOL ||
5015 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
5017 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
5020 hres = pVarAdd(&left, &right, &result);
5022 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
5023 "VarAdd: %d|0x%X, %d|0x%X: Expected failure, got 0x%X vt %d\n",
5024 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
5027 ok(hres == S_OK && V_VT(&result) == resvt,
5028 "VarAdd: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%X vt %d\n",
5029 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
5036 /* Test returned values */
5037 VARADD(I4,4,I4,2,I4,6);
5038 VARADD(I2,4,I2,2,I2,6);
5039 VARADD(I2,-13,I4,5,I4,-8);
5040 VARADD(I4,-13,I4,5,I4,-8);
5041 VARADD(I2,7,R4,0.5,R4,7.5);
5042 VARADD(R4,0.5,I4,5,R8,5.5);
5043 VARADD(R8,7.1,BOOL,0,R8,7.1);
5044 VARADD(BSTR,lbstr,I2,4,R8,16);
5045 VARADD(BSTR,lbstr,BOOL,1,R8,13);
5046 VARADD(BSTR,lbstr,R4,0.1,R8,12.1);
5047 VARADD(R4,0.2,BSTR,rbstr,R8,12.2);
5048 VARADD(DATE,2.25,I4,7,DATE,9.25);
5049 VARADD(DATE,1.25,R4,-1.7,DATE,-0.45);
5051 VARADD(UI1, UI1_MAX, UI1, UI1_MAX, I2, UI1_MAX + UI1_MAX);
5052 VARADD(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX + I2_MAX);
5053 VARADD(I2, I2_MAX, I2, I2_MIN, I2, I2_MAX + I2_MIN);
5054 VARADD(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN + I2_MIN);
5055 VARADD(I4, I4_MAX, I4, I4_MIN, I4, I4_MAX + I4_MIN);
5056 VARADD(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX + I4_MAX);
5057 VARADD(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN + I4_MIN);
5058 VARADD(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX + R4_MAX);
5059 VARADD(R4, R4_MAX, R4, R4_MIN, R4, R4_MAX + R4_MIN);
5060 VARADD(R4, R4_MIN, R4, R4_MIN, R4, R4_MIN + R4_MIN);
5061 VARADD(R8, R8_MAX, R8, R8_MIN, R8, R8_MAX + R8_MIN);
5062 VARADD(R8, R8_MIN, R8, R8_MIN, R8, R8_MIN + R8_MIN);
5064 /* Manualy test BSTR + BSTR */
5065 V_VT(&left) = VT_BSTR;
5066 V_BSTR(&left) = lbstr;
5067 V_VT(&right) = VT_BSTR;
5068 V_BSTR(&right) = rbstr;
5069 hres = VarAdd(&left, &right, &result);
5070 ok(hres == S_OK && V_VT(&result) == VT_BSTR, "VarAdd: expected coerced type VT_BSTR, got %s!\n", vtstr(V_VT(&result)));
5071 hres = VarR8FromStr(V_BSTR(&result), 0, 0, &r);
5072 ok(hres == S_OK && EQ_DOUBLE(r, 1212), "VarAdd: BSTR value %f, expected %f\n", r, (double)1212);
5074 /* Manuly test some VT_CY and VT_DECIMAL variants */
5076 hres = VarCyFromI4(4711, &V_CY(&cy));
5077 ok(hres == S_OK, "VarCyFromI4 failed!\n");
5078 V_VT(&dec) = VT_DECIMAL;
5079 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
5080 ok(hres == S_OK, "VarDecFromR4 failed!\n");
5081 memset(&left, 0, sizeof(left));
5082 memset(&right, 0, sizeof(right));
5083 V_VT(&left) = VT_I4;
5085 V_VT(&right) = VT_UI1;
5088 hres = VarAdd(&cy, &right, &result);
5089 ok(hres == S_OK && V_VT(&result) == VT_CY, "VarAdd: expected coerced type VT_CY, got %s!\n", vtstr(V_VT(&result)));
5090 hres = VarR8FromCy(V_CY(&result), &r);
5091 ok(hres == S_OK && EQ_DOUBLE(r, 4720), "VarAdd: CY value %f, expected %f\n", r, (double)4720);
5093 hres = VarAdd(&left, &dec, &result);
5094 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarAdd: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
5095 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
5096 ok(hres == S_OK && EQ_DOUBLE(r, -15.2), "VarAdd: DECIMAL value %f, expected %f\n", r, (double)-15.2);
5098 SysFreeString(lbstr);
5099 SysFreeString(rbstr);
5102 static void test_VarCat(void)
5105 VARIANT left, right, result, expected;
5106 static const WCHAR sz12[] = {'1','2','\0'};
5107 static const WCHAR sz34[] = {'3','4','\0'};
5108 static const WCHAR sz1234[] = {'1','2','3','4','\0'};
5109 static const WCHAR date_sz12[] = {'9','/','3','0','/','1','9','8','0','1','2','\0'};
5110 static const WCHAR sz12_date[] = {'1','2','9','/','3','0','/','1','9','8','0','\0'};
5111 static const WCHAR sz_empty[] = {'\0'};
5112 static const WCHAR sz12_true[] = {'1','2','T','r','u','e','\0'};
5113 static const WCHAR sz12_false[] = {'1','2','F','a','l','s','e','\0'};
5114 TCHAR orig_date_format[128];
5115 VARTYPE leftvt, rightvt, resultvt;
5117 HRESULT expected_error_num;
5119 /* Set date format for testing */
5120 lcid = LOCALE_USER_DEFAULT;
5121 GetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format,128);
5122 SetLocaleInfo(lcid,LOCALE_SSHORTDATE,"M/d/yyyy");
5125 VariantInit(&right);
5126 VariantInit(&result);
5127 VariantInit(&expected);
5129 /* Check expected types for all combinations */
5130 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5135 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5139 expected_error_num = S_OK;
5140 resultvt = VT_EMPTY;
5142 if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
5143 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
5144 leftvt == VT_RECORD || rightvt == VT_RECORD ||
5145 leftvt == 15 || rightvt == 15 /* Undefined type */)
5148 if (leftvt == VT_NULL && rightvt == VT_NULL)
5150 else if (leftvt == VT_VARIANT && (rightvt == VT_ERROR ||
5151 rightvt == VT_DATE || rightvt == VT_DECIMAL))
5152 expected_error_num = DISP_E_TYPEMISMATCH;
5153 else if ((leftvt == VT_I2 || leftvt == VT_I4 ||
5154 leftvt == VT_R4 || leftvt == VT_R8 ||
5155 leftvt == VT_CY || leftvt == VT_BOOL ||
5156 leftvt == VT_BSTR || leftvt == VT_I1 ||
5157 leftvt == VT_UI1 || leftvt == VT_UI2 ||
5158 leftvt == VT_UI4 || leftvt == VT_I8 ||
5159 leftvt == VT_UI8 || leftvt == VT_INT ||
5160 leftvt == VT_UINT || leftvt == VT_EMPTY ||
5161 leftvt == VT_NULL || leftvt == VT_DECIMAL ||
5164 (rightvt == VT_I2 || rightvt == VT_I4 ||
5165 rightvt == VT_R4 || rightvt == VT_R8 ||
5166 rightvt == VT_CY || rightvt == VT_BOOL ||
5167 rightvt == VT_BSTR || rightvt == VT_I1 ||
5168 rightvt == VT_UI1 || rightvt == VT_UI2 ||
5169 rightvt == VT_UI4 || rightvt == VT_I8 ||
5170 rightvt == VT_UI8 || rightvt == VT_INT ||
5171 rightvt == VT_UINT || rightvt == VT_EMPTY ||
5172 rightvt == VT_NULL || rightvt == VT_DECIMAL ||
5173 rightvt == VT_DATE))
5175 else if (rightvt == VT_ERROR && leftvt < VT_VOID)
5176 expected_error_num = DISP_E_TYPEMISMATCH;
5177 else if (leftvt == VT_ERROR && (rightvt == VT_DATE ||
5178 rightvt == VT_ERROR || rightvt == VT_DECIMAL))
5179 expected_error_num = DISP_E_TYPEMISMATCH;
5180 else if (rightvt == VT_DATE || rightvt == VT_ERROR ||
5181 rightvt == VT_DECIMAL)
5182 expected_error_num = DISP_E_BADVARTYPE;
5183 else if (leftvt == VT_ERROR || rightvt == VT_ERROR)
5184 expected_error_num = DISP_E_TYPEMISMATCH;
5185 else if (leftvt == VT_VARIANT)
5186 expected_error_num = DISP_E_TYPEMISMATCH;
5187 else if (rightvt == VT_VARIANT && (leftvt == VT_EMPTY ||
5188 leftvt == VT_NULL || leftvt == VT_I2 ||
5189 leftvt == VT_I4 || leftvt == VT_R4 ||
5190 leftvt == VT_R8 || leftvt == VT_CY ||
5191 leftvt == VT_DATE || leftvt == VT_BSTR ||
5192 leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
5193 leftvt == VT_I1 || leftvt == VT_UI1 ||
5194 leftvt == VT_UI2 || leftvt == VT_UI4 ||
5195 leftvt == VT_I8 || leftvt == VT_UI8 ||
5196 leftvt == VT_INT || leftvt == VT_UINT
5198 expected_error_num = DISP_E_TYPEMISMATCH;
5200 expected_error_num = DISP_E_BADVARTYPE;
5202 V_VT(&left) = leftvt;
5203 V_VT(&right) = rightvt;
5205 if (leftvt == VT_BSTR)
5206 V_BSTR(&left) = SysAllocString(sz_empty);
5207 if (rightvt == VT_BSTR)
5208 V_BSTR(&right) = SysAllocString(sz_empty);
5209 if (leftvt == VT_DATE)
5210 V_DATE(&left) = 0.0;
5211 if (rightvt == VT_DATE)
5212 V_DATE(&right) = 0.0;
5213 if (leftvt == VT_DECIMAL)
5214 VarDecFromR8(0.0, &V_DECIMAL(&left));
5215 if (rightvt == VT_DECIMAL)
5216 VarDecFromR8(0.0, &V_DECIMAL(&right));
5218 hres = VarCat(&left, &right, &result);
5220 /* Determine the error code for the vt combination */
5221 ok(hres == expected_error_num,
5222 "VarCat: %d, %d returned error, 0x%X expected 0x%X.\n",
5223 leftvt, rightvt, expected_error_num, hres);
5225 /* Check types are correct */
5226 ok(V_VT(&result) == resultvt,
5227 "VarCat: %d, %d: expected vt %d, got vt %d\n",
5228 leftvt, rightvt, resultvt, V_VT(&result));
5230 VariantClear(&left);
5231 VariantClear(&right);
5232 VariantClear(&result);
5236 /* Runnning single comparison tests to compare outputs */
5238 /* Test concat strings */
5239 V_VT(&left) = VT_BSTR;
5240 V_VT(&right) = VT_BSTR;
5241 V_VT(&expected) = VT_BSTR;
5242 V_BSTR(&left) = SysAllocString(sz12);
5243 V_BSTR(&right) = SysAllocString(sz34);
5244 V_BSTR(&expected) = SysAllocString(sz1234);
5245 hres = VarCat(&left,&right,&result);
5246 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5247 ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5248 "VarCat: VT_BSTR concat with VT_BSTR failed to return correct result\n");
5250 VariantClear(&left);
5251 VariantClear(&right);
5252 VariantClear(&result);
5254 /* Test if expression is VT_ERROR */
5255 V_VT(&left) = VT_ERROR;
5256 V_VT(&right) = VT_BSTR;
5257 V_BSTR(&right) = SysAllocString(sz1234);
5258 hres = VarCat(&left,&right,&result);
5259 ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08x\n", hres);
5260 ok(V_VT(&result) == VT_EMPTY,
5261 "VarCat: VT_ERROR concat with VT_BSTR should have returned VT_EMPTY\n");
5263 VariantClear(&left);
5264 VariantClear(&right);
5265 VariantClear(&result);
5267 V_VT(&left) = VT_BSTR;
5268 V_VT(&right) = VT_ERROR;
5269 V_BSTR(&left) = SysAllocString(sz1234);
5270 hres = VarCat(&left,&right,&result);
5271 ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08x\n", hres);
5272 ok(V_VT(&result) == VT_EMPTY,
5273 "VarCat: VT_BSTR concat with VT_ERROR should have returned VT_EMPTY\n");
5275 VariantClear(&left);
5276 VariantClear(&right);
5277 VariantClear(&result);
5278 VariantClear(&expected);
5280 /* Test combining boolean with number */
5281 V_VT(&left) = VT_INT;
5282 V_VT(&right) = VT_BOOL;
5283 V_VT(&expected) = VT_BSTR;
5285 V_BOOL(&right) = TRUE;
5286 V_BSTR(&expected) = SysAllocString(sz12_true);
5287 hres = VarCat(&left,&right,&result);
5288 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5289 ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5290 "VarCat: VT_INT concat with VT_BOOL (TRUE) returned incorrect result\n");
5292 VariantClear(&left);
5293 VariantClear(&right);
5294 VariantClear(&result);
5295 VariantClear(&expected);
5297 V_VT(&left) = VT_INT;
5298 V_VT(&right) = VT_BOOL;
5299 V_VT(&expected) = VT_BSTR;
5301 V_BOOL(&right) = FALSE;
5302 V_BSTR(&expected) = SysAllocString(sz12_false);
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 (FALSE) returned inncorrect result\n");
5308 VariantClear(&left);
5309 VariantClear(&right);
5310 VariantClear(&result);
5311 VariantClear(&expected);
5313 /* Test when both expressions are numeric */
5314 V_VT(&left) = VT_INT;
5315 V_VT(&right) = VT_INT;
5316 V_VT(&expected) = VT_BSTR;
5319 V_BSTR(&expected) = SysAllocString(sz1234);
5320 hres = VarCat(&left,&right,&result);
5321 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5322 ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5323 "VarCat: NUMBER concat with NUMBER returned inncorrect result\n");
5325 VariantClear(&left);
5326 VariantClear(&right);
5327 VariantClear(&result);
5329 /* Test if one expression is numeric and the other is a string */
5330 V_VT(&left) = VT_INT;
5331 V_VT(&right) = VT_BSTR;
5333 V_BSTR(&right) = SysAllocString(sz34);
5334 hres = VarCat(&left,&right,&result);
5335 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5336 ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5337 "VarCat: NUMBER concat with VT_BSTR, inncorrect result\n");
5339 VariantClear(&left);
5340 VariantClear(&right);
5341 VariantClear(&result);
5343 V_VT(&left) = VT_BSTR;
5344 V_VT(&right) = VT_INT;
5345 V_BSTR(&left) = SysAllocString(sz12);
5347 hres = VarCat(&left,&right,&result);
5348 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5349 ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
5350 "VarCat: VT_BSTR concat with NUMBER, inncorrect result\n");
5352 VariantClear(&left);
5353 VariantClear(&right);
5354 VariantClear(&result);
5356 /* Test concat dates with strings */
5357 V_VT(&left) = VT_BSTR;
5358 V_VT(&right) = VT_DATE;
5359 V_VT(&expected) = VT_BSTR;
5360 V_BSTR(&left) = SysAllocString(sz12);
5361 V_DATE(&right) = 29494.0;
5362 V_BSTR(&expected)= SysAllocString(sz12_date);
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 VT_DATE returned inncorrect result\n");
5368 VariantClear(&left);
5369 VariantClear(&right);
5370 VariantClear(&result);
5371 VariantClear(&expected);
5373 V_VT(&left) = VT_DATE;
5374 V_VT(&right) = VT_BSTR;
5375 V_VT(&expected) = VT_BSTR;
5376 V_DATE(&left) = 29494.0;
5377 V_BSTR(&right) = SysAllocString(sz12);
5378 V_BSTR(&expected)= SysAllocString(date_sz12);
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_DATE concat with VT_BSTR returned inncorrect result\n");
5384 VariantClear(&left);
5385 VariantClear(&right);
5386 VariantClear(&result);
5387 VariantClear(&expected);
5389 /* Test of both expressions are empty */
5390 V_VT(&left) = VT_BSTR;
5391 V_VT(&right) = VT_BSTR;
5392 V_VT(&expected) = VT_BSTR;
5393 V_BSTR(&left) = SysAllocString(sz_empty);
5394 V_BSTR(&right) = SysAllocString(sz_empty);
5395 V_BSTR(&expected)= SysAllocString(sz_empty);
5396 hres = VarCat(&left,&right,&result);
5397 ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres);
5398 ok(VarCmp(&result,&left,lcid,0) == VARCMP_EQ,
5399 "VarCat: EMPTY concat with EMPTY did not return empty VT_BSTR\n");
5401 /* Restore original date format settings */
5402 SetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format);
5404 VariantClear(&left);
5405 VariantClear(&right);
5406 VariantClear(&result);
5407 VariantClear(&expected);
5410 static HRESULT (WINAPI *pVarAnd)(LPVARIANT,LPVARIANT,LPVARIANT);
5412 #define VARAND(vt1,val1,vt2,val2,rvt,rval) \
5413 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
5414 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
5415 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
5416 test_var_call2( __LINE__, pVarAnd, &left, &right, &exp );
5418 #define VARANDCY(vt1,val1,val2,rvt,rval) \
5419 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
5420 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
5421 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
5422 test_var_call2( __LINE__, pVarAnd, &left, &right, &exp );
5424 /* Skip any type that is not defined or produces a error for every case */
5425 #define SKIPTESTAND(a) \
5426 if (a == VT_ERROR || a == VT_VARIANT || \
5427 a == VT_DISPATCH || a == VT_UNKNOWN || \
5428 a > VT_UINT || a == 15 /*not defined*/) \
5431 static void test_VarAnd(void)
5433 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
5434 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
5435 VARIANT left, right, exp, result;
5436 BSTR false_str, true_str;
5440 true_str = SysAllocString(szTrue);
5441 false_str = SysAllocString(szFalse);
5445 /* Test all possible flag/vt combinations & the resulting vt type */
5446 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
5448 VARTYPE leftvt, rightvt, resvt;
5450 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5452 SKIPTESTAND(leftvt);
5454 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5457 SKIPTESTAND(rightvt);
5459 memset(&left, 0, sizeof(left));
5460 memset(&right, 0, sizeof(right));
5461 V_VT(&left) = leftvt | ExtraFlags[i];
5462 V_VT(&right) = rightvt | ExtraFlags[i];
5463 V_VT(&result) = VT_EMPTY;
5465 if ((leftvt | ExtraFlags[i]) == VT_BSTR)
5466 V_BSTR(&left) = true_str;
5467 if ((rightvt | ExtraFlags[i]) == VT_BSTR)
5468 V_BSTR(&right) = true_str;
5470 /* Native VarAnd always returns a error when using any extra
5471 * flags or if the variant combination is I8 and INT.
5473 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
5474 (leftvt == VT_INT && rightvt == VT_I8) ||
5478 /* Determine return type */
5479 else if (leftvt == VT_I8 || rightvt == VT_I8)
5481 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
5482 leftvt == VT_UINT || rightvt == VT_UINT ||
5483 leftvt == VT_INT || rightvt == VT_INT ||
5484 leftvt == VT_UINT || rightvt == VT_UINT ||
5485 leftvt == VT_R4 || rightvt == VT_R4 ||
5486 leftvt == VT_R8 || rightvt == VT_R8 ||
5487 leftvt == VT_CY || rightvt == VT_CY ||
5488 leftvt == VT_DATE || rightvt == VT_DATE ||
5489 leftvt == VT_I1 || rightvt == VT_I1 ||
5490 leftvt == VT_UI2 || rightvt == VT_UI2 ||
5491 leftvt == VT_UI4 || rightvt == VT_UI4 ||
5492 leftvt == VT_UI8 || rightvt == VT_UI8 ||
5493 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
5495 else if (leftvt == VT_UI1 || rightvt == VT_UI1 ||
5496 leftvt == VT_I2 || rightvt == VT_I2 ||
5497 leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5498 if ((leftvt == VT_NULL && rightvt == VT_UI1) ||
5499 (leftvt == VT_UI1 && rightvt == VT_NULL) ||
5500 (leftvt == VT_UI1 && rightvt == VT_UI1))
5504 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
5505 (leftvt == VT_BSTR && rightvt == VT_BSTR))
5507 else if (leftvt == VT_NULL || rightvt == VT_NULL ||
5508 leftvt == VT_BSTR || rightvt == VT_BSTR)
5513 hres = pVarAnd(&left, &right, &result);
5515 /* Check expected HRESULT and if result variant type is correct */
5517 ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
5518 "VarAnd: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
5519 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
5520 vtstr(V_VT(&result)), hres);
5522 ok (hres == S_OK && resvt == V_VT(&result),
5523 "VarAnd: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
5524 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
5525 S_OK, vtstr(V_VT(&result)), hres);
5531 * Test returned values. Since we know the returned type is correct
5532 * and that we handle all combinations of invalid types, just check
5533 * that good type combinations produce the desired value.
5534 * FIXME: Test VT_DECIMAL
5536 VARAND(EMPTY,0,EMPTY,0,I2,0);
5537 VARAND(EMPTY,1,EMPTY,0,I2,0);
5538 VARAND(EMPTY,1,EMPTY,1,I2,0);
5539 VARAND(EMPTY,0,NULL,0,I2,0);
5540 VARAND(EMPTY,1,NULL,0,I2,0);
5541 VARAND(EMPTY,1,NULL,1,I2,0);
5542 VARAND(EMPTY,0,I1,0,I4,0);
5543 VARAND(EMPTY,0,I1,1,I4,0);
5544 VARAND(EMPTY,1,I1,1,I4,0);
5545 VARAND(EMPTY,0,UI1,0,I2,0);
5546 VARAND(EMPTY,0,UI1,1,I2,0);
5547 VARAND(EMPTY,1,UI1,1,I2,0);
5548 VARAND(EMPTY,0,I2,0,I2,0);
5549 VARAND(EMPTY,0,I2,1,I2,0);
5550 VARAND(EMPTY,1,I2,1,I2,0);
5551 VARAND(EMPTY,0,UI2,0,I4,0);
5552 VARAND(EMPTY,0,UI2,1,I4,0);
5553 VARAND(EMPTY,1,UI2,1,I4,0);
5554 VARAND(EMPTY,0,I4,0,I4,0);
5555 VARAND(EMPTY,0,I4,1,I4,0);
5556 VARAND(EMPTY,1,I4,1,I4,0);
5557 VARAND(EMPTY,0,UI4,0,I4,0);
5558 VARAND(EMPTY,0,UI4,1,I4,0);
5559 VARAND(EMPTY,1,UI4,1,I4,0);
5560 if (HAVE_OLEAUT32_I8)
5562 VARAND(EMPTY,0,I8,0,I8,0);
5563 VARAND(EMPTY,0,I8,1,I8,0);
5564 VARAND(EMPTY,1,I8,1,I8,0);
5565 VARAND(EMPTY,0,UI8,0,I4,0);
5566 VARAND(EMPTY,0,UI8,1,I4,0);
5567 VARAND(EMPTY,1,UI8,1,I4,0);
5569 VARAND(EMPTY,0,INT,0,I4,0);
5570 VARAND(EMPTY,0,INT,1,I4,0);
5571 VARAND(EMPTY,1,INT,1,I4,0);
5572 VARAND(EMPTY,0,UINT,0,I4,0);
5573 VARAND(EMPTY,0,UINT,1,I4,0);
5574 VARAND(EMPTY,1,UINT,1,I4,0);
5575 VARAND(EMPTY,0,BOOL,0,I2,0);
5576 VARAND(EMPTY,0,BOOL,1,I2,0);
5577 VARAND(EMPTY,1,BOOL,1,I2,0);
5578 VARAND(EMPTY,0,R4,0,I4,0);
5579 VARAND(EMPTY,0,R4,1,I4,0);
5580 VARAND(EMPTY,1,R4,1,I4,0);
5581 VARAND(EMPTY,0,R8,0,I4,0);
5582 VARAND(EMPTY,0,R8,1,I4,0);
5583 VARAND(EMPTY,1,R8,1,I4,0);
5584 VARAND(EMPTY,0,BSTR,false_str,I2,0);
5585 VARAND(EMPTY,0,BSTR,true_str,I2,0);
5586 VARANDCY(EMPTY,0,10000,I4,0);
5588 /* NULL OR 0 = NULL. NULL OR n = n */
5589 VARAND(NULL,0,NULL,0,NULL,0);
5590 VARAND(NULL,1,NULL,0,NULL,0);
5591 VARAND(NULL,0,I1,0,I4,0);
5592 VARAND(NULL,0,I1,1,NULL,0);
5593 VARAND(NULL,0,UI1,0,UI1,0);
5594 VARAND(NULL,0,UI1,1,NULL,0);
5595 VARAND(NULL,0,I2,0,I2,0);
5596 VARAND(NULL,0,I2,1,NULL,0);
5597 VARAND(NULL,0,UI2,0,I4,0);
5598 VARAND(NULL,0,UI2,1,NULL,0);
5599 VARAND(NULL,0,I4,0,I4,0);
5600 VARAND(NULL,0,I4,1,NULL,0);
5601 VARAND(NULL,0,UI4,0,I4,0);
5602 VARAND(NULL,0,UI4,1,NULL,0);
5603 if (HAVE_OLEAUT32_I8)
5605 VARAND(NULL,0,I8,0,I8,0);
5606 VARAND(NULL,0,I8,1,NULL,0);
5607 VARAND(NULL,0,UI8,0,I4,0);
5608 VARAND(NULL,0,UI8,1,NULL,0);
5610 VARAND(NULL,0,INT,0,I4,0);
5611 VARAND(NULL,0,INT,1,NULL,0);
5612 VARAND(NULL,0,UINT,0,I4,0);
5613 VARAND(NULL,0,UINT,1,NULL,0);
5614 VARAND(NULL,0,BOOL,0,BOOL,0);
5615 VARAND(NULL,0,BOOL,1,NULL,0);
5616 VARAND(NULL,0,R4,0,I4,0);
5617 VARAND(NULL,0,R4,1,NULL,0);
5618 VARAND(NULL,0,R8,0,I4,0);
5619 VARAND(NULL,0,R8,1,NULL,0);
5620 VARAND(NULL,0,BSTR,false_str,BOOL,0);
5621 VARAND(NULL,0,BSTR,true_str,NULL,VARIANT_FALSE);
5622 VARANDCY(NULL,0,10000,NULL,0);
5623 VARANDCY(NULL,0,0,I4,0);
5624 VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
5625 VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
5626 VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
5627 VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
5629 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
5630 VARAND(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
5631 VARAND(BOOL,VARIANT_TRUE,I1,0,I4,0);
5632 VARAND(BOOL,VARIANT_FALSE,I1,0,I4,0);
5633 VARAND(BOOL,VARIANT_TRUE,UI1,255,I2,255);
5634 VARAND(BOOL,VARIANT_TRUE,UI1,0,I2,0);
5635 VARAND(BOOL,VARIANT_FALSE,UI1,0,I2,0);
5636 VARAND(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
5637 VARAND(BOOL,VARIANT_TRUE,I2,0,I2,0);
5638 VARAND(BOOL,VARIANT_FALSE,I2,0,I2,0);
5639 VARAND(BOOL,VARIANT_TRUE,UI2,65535,I4,65535);
5640 VARAND(BOOL,VARIANT_TRUE,UI2,0,I4,0);
5641 VARAND(BOOL,VARIANT_FALSE,UI2,0,I4,0);
5642 VARAND(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
5643 VARAND(BOOL,VARIANT_TRUE,I4,0,I4,0);
5644 VARAND(BOOL,VARIANT_FALSE,I4,0,I4,0);
5645 VARAND(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
5646 VARAND(BOOL,VARIANT_TRUE,UI4,0,I4,0);
5647 VARAND(BOOL,VARIANT_FALSE,UI4,0,I4,0);
5648 VARAND(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
5649 VARAND(BOOL,VARIANT_TRUE,R4,0,I4,0);
5650 VARAND(BOOL,VARIANT_FALSE,R4,0,I4,0);
5651 VARAND(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
5652 VARAND(BOOL,VARIANT_TRUE,R8,0,I4,0);
5653 VARAND(BOOL,VARIANT_FALSE,R8,0,I4,0);
5654 VARAND(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
5655 VARAND(BOOL,VARIANT_TRUE,DATE,0,I4,0);
5656 VARAND(BOOL,VARIANT_FALSE,DATE,0,I4,0);
5657 if (HAVE_OLEAUT32_I8)
5659 VARAND(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
5660 VARAND(BOOL,VARIANT_TRUE,I8,0,I8,0);
5661 VARAND(BOOL,VARIANT_FALSE,I8,0,I8,0);
5662 VARAND(BOOL,VARIANT_TRUE,UI8,0,I4,0);
5663 VARAND(BOOL,VARIANT_FALSE,UI8,0,I4,0);
5665 VARAND(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
5666 VARAND(BOOL,VARIANT_TRUE,INT,0,I4,0);
5667 VARAND(BOOL,VARIANT_FALSE,INT,0,I4,0);
5668 VARAND(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
5669 VARAND(BOOL,VARIANT_TRUE,UINT,0,I4,0);
5670 VARAND(BOOL,VARIANT_FALSE,UINT,0,I4,0);
5671 VARAND(BOOL,VARIANT_FALSE,BSTR,false_str,BOOL,VARIANT_FALSE);
5672 VARAND(BOOL,VARIANT_TRUE,BSTR,false_str,BOOL,VARIANT_FALSE);
5673 VARAND(BOOL,VARIANT_FALSE,BSTR,true_str,BOOL,VARIANT_FALSE);
5674 VARAND(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,VARIANT_TRUE);
5675 VARANDCY(BOOL,VARIANT_TRUE,10000,I4,1);
5676 VARANDCY(BOOL,VARIANT_TRUE,0,I4,0);
5677 VARANDCY(BOOL,VARIANT_FALSE,0,I4,0);
5678 VARAND(I1,-1,I1,-1,I4,-1);
5679 VARAND(I1,-1,I1,0,I4,0);
5680 VARAND(I1,0,I1,0,I4,0);
5681 VARAND(I1,-1,UI1,255,I4,255);
5682 VARAND(I1,-1,UI1,0,I4,0);
5683 VARAND(I1,0,UI1,0,I4,0);
5684 VARAND(I1,-1,I2,-1,I4,-1);
5685 VARAND(I1,-1,I2,0,I4,0);
5686 VARAND(I1,0,I2,0,I4,0);
5687 VARAND(I1,-1,UI2,65535,I4,65535);
5688 VARAND(I1,-1,UI2,0,I4,0);
5689 VARAND(I1,0,UI2,0,I4,0);
5690 VARAND(I1,-1,I4,-1,I4,-1);
5691 VARAND(I1,-1,I4,0,I4,0);
5692 VARAND(I1,0,I4,0,I4,0);
5693 VARAND(I1,-1,UI4,0xffffffff,I4,-1);
5694 VARAND(I1,-1,UI4,0,I4,0);
5695 VARAND(I1,0,UI4,0,I4,0);
5696 VARAND(I1,-1,R4,-1,I4,-1);
5697 VARAND(I1,-1,R4,0,I4,0);
5698 VARAND(I1,0,R4,0,I4,0);
5699 VARAND(I1,-1,R8,-1,I4,-1);
5700 VARAND(I1,-1,R8,0,I4,0);
5701 VARAND(I1,0,R8,0,I4,0);
5702 VARAND(I1,-1,DATE,-1,I4,-1);
5703 VARAND(I1,-1,DATE,0,I4,0);
5704 VARAND(I1,0,DATE,0,I4,0);
5705 if (HAVE_OLEAUT32_I8)
5707 VARAND(I1,-1,I8,-1,I8,-1);
5708 VARAND(I1,-1,I8,0,I8,0);
5709 VARAND(I1,0,I8,0,I8,0);
5710 VARAND(I1,-1,UI8,0,I4,0);
5711 VARAND(I1,0,UI8,0,I4,0);
5713 VARAND(I1,-1,INT,-1,I4,-1);
5714 VARAND(I1,-1,INT,0,I4,0);
5715 VARAND(I1,0,INT,0,I4,0);
5716 VARAND(I1,-1,UINT,0xffffffff,I4,-1);
5717 VARAND(I1,-1,UINT,0,I4,0);
5718 VARAND(I1,0,UINT,0,I4,0);
5719 VARAND(I1,0,BSTR,false_str,I4,0);
5720 VARAND(I1,-1,BSTR,false_str,I4,0);
5721 VARAND(I1,0,BSTR,true_str,I4,0);
5722 VARAND(I1,-1,BSTR,true_str,I4,-1);
5723 VARANDCY(I1,-1,10000,I4,1);
5724 VARANDCY(I1,-1,0,I4,0);
5725 VARANDCY(I1,0,0,I4,0);
5727 VARAND(UI1,255,UI1,255,UI1,255);
5728 VARAND(UI1,255,UI1,0,UI1,0);
5729 VARAND(UI1,0,UI1,0,UI1,0);
5730 VARAND(UI1,255,I2,-1,I2,255);
5731 VARAND(UI1,255,I2,0,I2,0);
5732 VARAND(UI1,0,I2,0,I2,0);
5733 VARAND(UI1,255,UI2,65535,I4,255);
5734 VARAND(UI1,255,UI2,0,I4,0);
5735 VARAND(UI1,0,UI2,0,I4,0);
5736 VARAND(UI1,255,I4,-1,I4,255);
5737 VARAND(UI1,255,I4,0,I4,0);
5738 VARAND(UI1,0,I4,0,I4,0);
5739 VARAND(UI1,255,UI4,0xffffffff,I4,255);
5740 VARAND(UI1,255,UI4,0,I4,0);
5741 VARAND(UI1,0,UI4,0,I4,0);
5742 VARAND(UI1,255,R4,-1,I4,255);
5743 VARAND(UI1,255,R4,0,I4,0);
5744 VARAND(UI1,0,R4,0,I4,0);
5745 VARAND(UI1,255,R8,-1,I4,255);
5746 VARAND(UI1,255,R8,0,I4,0);
5747 VARAND(UI1,0,R8,0,I4,0);
5748 VARAND(UI1,255,DATE,-1,I4,255);
5749 VARAND(UI1,255,DATE,0,I4,0);
5750 VARAND(UI1,0,DATE,0,I4,0);
5751 if (HAVE_OLEAUT32_I8)
5753 VARAND(UI1,255,I8,-1,I8,255);
5754 VARAND(UI1,255,I8,0,I8,0);
5755 VARAND(UI1,0,I8,0,I8,0);
5756 VARAND(UI1,255,UI8,0,I4,0);
5757 VARAND(UI1,0,UI8,0,I4,0);
5759 VARAND(UI1,255,INT,-1,I4,255);
5760 VARAND(UI1,255,INT,0,I4,0);
5761 VARAND(UI1,0,INT,0,I4,0);
5762 VARAND(UI1,255,UINT,0xffffffff,I4,255);
5763 VARAND(UI1,255,UINT,0,I4,0);
5764 VARAND(UI1,0,UINT,0,I4,0);
5765 VARAND(UI1,0,BSTR,false_str,I2,0);
5766 VARAND(UI1,255,BSTR,false_str,I2,0);
5767 VARAND(UI1,0,BSTR,true_str,I2,0);
5768 VARAND(UI1,255,BSTR,true_str,I2,255);
5769 VARANDCY(UI1,255,10000,I4,1);
5770 VARANDCY(UI1,255,0,I4,0);
5771 VARANDCY(UI1,0,0,I4,0);
5773 VARAND(I2,-1,I2,-1,I2,-1);
5774 VARAND(I2,-1,I2,0,I2,0);
5775 VARAND(I2,0,I2,0,I2,0);
5776 VARAND(I2,-1,UI2,65535,I4,65535);
5777 VARAND(I2,-1,UI2,0,I4,0);
5778 VARAND(I2,0,UI2,0,I4,0);
5779 VARAND(I2,-1,I4,-1,I4,-1);
5780 VARAND(I2,-1,I4,0,I4,0);
5781 VARAND(I2,0,I4,0,I4,0);
5782 VARAND(I2,-1,UI4,0xffffffff,I4,-1);
5783 VARAND(I2,-1,UI4,0,I4,0);
5784 VARAND(I2,0,UI4,0,I4,0);
5785 VARAND(I2,-1,R4,-1,I4,-1);
5786 VARAND(I2,-1,R4,0,I4,0);
5787 VARAND(I2,0,R4,0,I4,0);
5788 VARAND(I2,-1,R8,-1,I4,-1);
5789 VARAND(I2,-1,R8,0,I4,0);
5790 VARAND(I2,0,R8,0,I4,0);
5791 VARAND(I2,-1,DATE,-1,I4,-1);
5792 VARAND(I2,-1,DATE,0,I4,0);
5793 VARAND(I2,0,DATE,0,I4,0);
5794 if (HAVE_OLEAUT32_I8)
5796 VARAND(I2,-1,I8,-1,I8,-1);
5797 VARAND(I2,-1,I8,0,I8,0);
5798 VARAND(I2,0,I8,0,I8,0);
5799 VARAND(I2,-1,UI8,0,I4,0);
5800 VARAND(I2,0,UI8,0,I4,0);
5802 VARAND(I2,-1,INT,-1,I4,-1);
5803 VARAND(I2,-1,INT,0,I4,0);
5804 VARAND(I2,0,INT,0,I4,0);
5805 VARAND(I2,-1,UINT,0xffffffff,I4,-1);
5806 VARAND(I2,-1,UINT,0,I4,0);
5807 VARAND(I2,0,UINT,0,I4,0);
5808 VARAND(I2,0,BSTR,false_str,I2,0);
5809 VARAND(I2,-1,BSTR,false_str,I2,0);
5810 VARAND(I2,0,BSTR,true_str,I2,0);
5811 VARAND(I2,-1,BSTR,true_str,I2,-1);
5812 VARANDCY(I2,-1,10000,I4,1);
5813 VARANDCY(I2,-1,0,I4,0);
5814 VARANDCY(I2,0,0,I4,0);
5816 VARAND(UI2,65535,UI2,65535,I4,65535);
5817 VARAND(UI2,65535,UI2,0,I4,0);
5818 VARAND(UI2,0,UI2,0,I4,0);
5819 VARAND(UI2,65535,I4,-1,I4,65535);
5820 VARAND(UI2,65535,I4,0,I4,0);
5821 VARAND(UI2,0,I4,0,I4,0);
5822 VARAND(UI2,65535,UI4,0xffffffff,I4,65535);
5823 VARAND(UI2,65535,UI4,0,I4,0);
5824 VARAND(UI2,0,UI4,0,I4,0);
5825 VARAND(UI2,65535,R4,-1,I4,65535);
5826 VARAND(UI2,65535,R4,0,I4,0);
5827 VARAND(UI2,0,R4,0,I4,0);
5828 VARAND(UI2,65535,R8,-1,I4,65535);
5829 VARAND(UI2,65535,R8,0,I4,0);
5830 VARAND(UI2,0,R8,0,I4,0);
5831 VARAND(UI2,65535,DATE,-1,I4,65535);
5832 VARAND(UI2,65535,DATE,0,I4,0);
5833 VARAND(UI2,0,DATE,0,I4,0);
5834 if (HAVE_OLEAUT32_I8)
5836 VARAND(UI2,65535,I8,-1,I8,65535);
5837 VARAND(UI2,65535,I8,0,I8,0);
5838 VARAND(UI2,0,I8,0,I8,0);
5839 VARAND(UI2,65535,UI8,0,I4,0);
5840 VARAND(UI2,0,UI8,0,I4,0);
5842 VARAND(UI2,65535,INT,-1,I4,65535);
5843 VARAND(UI2,65535,INT,0,I4,0);
5844 VARAND(UI2,0,INT,0,I4,0);
5845 VARAND(UI2,65535,UINT,0xffffffff,I4,65535);
5846 VARAND(UI2,65535,UINT,0,I4,0);
5847 VARAND(UI2,0,UINT,0,I4,0);
5848 VARAND(UI2,0,BSTR,false_str,I4,0);
5849 VARAND(UI2,65535,BSTR,false_str,I4,0);
5850 VARAND(UI2,0,BSTR,true_str,I4,0);
5851 VARAND(UI2,65535,BSTR,true_str,I4,65535);
5852 VARANDCY(UI2,65535,10000,I4,1);
5853 VARANDCY(UI2,65535,0,I4,0);
5854 VARANDCY(UI2,0,0,I4,0);
5856 VARAND(I4,-1,I4,-1,I4,-1);
5857 VARAND(I4,-1,I4,0,I4,0);
5858 VARAND(I4,0,I4,0,I4,0);
5859 VARAND(I4,-1,UI4,0xffffffff,I4,-1);
5860 VARAND(I4,-1,UI4,0,I4,0);
5861 VARAND(I4,0,UI4,0,I4,0);
5862 VARAND(I4,-1,R4,-1,I4,-1);
5863 VARAND(I4,-1,R4,0,I4,0);
5864 VARAND(I4,0,R4,0,I4,0);
5865 VARAND(I4,-1,R8,-1,I4,-1);
5866 VARAND(I4,-1,R8,0,I4,0);
5867 VARAND(I4,0,R8,0,I4,0);
5868 VARAND(I4,-1,DATE,-1,I4,-1);
5869 VARAND(I4,-1,DATE,0,I4,0);
5870 VARAND(I4,0,DATE,0,I4,0);
5871 if (HAVE_OLEAUT32_I8)
5873 VARAND(I4,-1,I8,-1,I8,-1);
5874 VARAND(I4,-1,I8,0,I8,0);
5875 VARAND(I4,0,I8,0,I8,0);
5876 VARAND(I4,-1,UI8,0,I4,0);
5877 VARAND(I4,0,UI8,0,I4,0);
5879 VARAND(I4,-1,INT,-1,I4,-1);
5880 VARAND(I4,-1,INT,0,I4,0);
5881 VARAND(I4,0,INT,0,I4,0);
5882 VARAND(I4,-1,UINT,0xffffffff,I4,-1);
5883 VARAND(I4,-1,UINT,0,I4,0);
5884 VARAND(I4,0,UINT,0,I4,0);
5885 VARAND(I4,0,BSTR,false_str,I4,0);
5886 VARAND(I4,-1,BSTR,false_str,I4,0);
5887 VARAND(I4,0,BSTR,true_str,I4,0);
5888 VARAND(I4,-1,BSTR,true_str,I4,-1);
5889 VARANDCY(I4,-1,10000,I4,1);
5890 VARANDCY(I4,-1,0,I4,0);
5891 VARANDCY(I4,0,0,I4,0);
5893 VARAND(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
5894 VARAND(UI4,0xffffffff,UI4,0,I4,0);
5895 VARAND(UI4,0,UI4,0,I4,0);
5896 VARAND(UI4,0xffffffff,R4,-1,I4,-1);
5897 VARAND(UI4,0xffffffff,R4,0,I4,0);
5898 VARAND(UI4,0,R4,0,I4,0);
5899 VARAND(UI4,0xffffffff,R8,-1,I4,-1);
5900 VARAND(UI4,0xffffffff,R8,0,I4,0);
5901 VARAND(UI4,0,R8,0,I4,0);
5902 VARAND(UI4,0xffffffff,DATE,-1,I4,-1);
5903 VARAND(UI4,0xffffffff,DATE,0,I4,0);
5904 VARAND(UI4,0,DATE,0,I4,0);
5905 if (HAVE_OLEAUT32_I8)
5907 VARAND(UI4,0xffffffff,I8,0,I8,0);
5908 VARAND(UI4,0,I8,0,I8,0);
5909 VARAND(UI4,0xffffffff,UI8,0,I4,0);
5910 VARAND(UI4,0,UI8,0,I4,0);
5912 VARAND(UI4,0xffffffff,INT,-1,I4,-1);
5913 VARAND(UI4,0xffffffff,INT,0,I4,0);
5914 VARAND(UI4,0,INT,0,I4,0);
5915 VARAND(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
5916 VARAND(UI4,0xffffffff,UINT,0,I4,0);
5917 VARAND(UI4,0,UINT,0,I4,0);
5918 VARAND(UI4,0,BSTR,false_str,I4,0);
5919 VARAND(UI4,0xffffffff,BSTR,false_str,I4,0);
5920 VARAND(UI4,0,BSTR,true_str,I4,0);
5921 VARAND(UI4,0xffffffff,BSTR,true_str,I4,-1);
5922 VARANDCY(UI4,0xffffffff,10000,I4,1);
5923 VARANDCY(UI4,0xffffffff,0,I4,0);
5924 VARANDCY(UI4,0,0,I4,0);
5926 VARAND(R4,-1,R4,-1,I4,-1);
5927 VARAND(R4,-1,R4,0,I4,0);
5928 VARAND(R4,0,R4,0,I4,0);
5929 VARAND(R4,-1,R8,-1,I4,-1);
5930 VARAND(R4,-1,R8,0,I4,0);
5931 VARAND(R4,0,R8,0,I4,0);
5932 VARAND(R4,-1,DATE,-1,I4,-1);
5933 VARAND(R4,-1,DATE,0,I4,0);
5934 VARAND(R4,0,DATE,0,I4,0);
5935 if (HAVE_OLEAUT32_I8)
5937 VARAND(R4,-1,I8,-1,I8,-1);
5938 VARAND(R4,-1,I8,0,I8,0);
5939 VARAND(R4,0,I8,0,I8,0);
5940 VARAND(R4,-1,UI8,0,I4,0);
5941 VARAND(R4,0,UI8,0,I4,0);
5943 VARAND(R4,-1,INT,-1,I4,-1);
5944 VARAND(R4,-1,INT,0,I4,0);
5945 VARAND(R4,0,INT,0,I4,0);
5946 VARAND(R4,-1,UINT,0xffffffff,I4,-1);
5947 VARAND(R4,-1,UINT,0,I4,0);
5948 VARAND(R4,0,UINT,0,I4,0);
5949 VARAND(R4,0,BSTR,false_str,I4,0);
5950 VARAND(R4,-1,BSTR,false_str,I4,0);
5951 VARAND(R4,0,BSTR,true_str,I4,0);
5952 VARAND(R4,-1,BSTR,true_str,I4,-1);
5953 VARANDCY(R4,-1,10000,I4,1);
5954 VARANDCY(R4,-1,0,I4,0);
5955 VARANDCY(R4,0,0,I4,0);
5957 VARAND(R8,-1,R8,-1,I4,-1);
5958 VARAND(R8,-1,R8,0,I4,0);
5959 VARAND(R8,0,R8,0,I4,0);
5960 VARAND(R8,-1,DATE,-1,I4,-1);
5961 VARAND(R8,-1,DATE,0,I4,0);
5962 VARAND(R8,0,DATE,0,I4,0);
5963 if (HAVE_OLEAUT32_I8)
5965 VARAND(R8,-1,I8,-1,I8,-1);
5966 VARAND(R8,-1,I8,0,I8,0);
5967 VARAND(R8,0,I8,0,I8,0);
5968 VARAND(R8,-1,UI8,0,I4,0);
5969 VARAND(R8,0,UI8,0,I4,0);
5971 VARAND(R8,-1,INT,-1,I4,-1);
5972 VARAND(R8,-1,INT,0,I4,0);
5973 VARAND(R8,0,INT,0,I4,0);
5974 VARAND(R8,-1,UINT,0xffffffff,I4,-1);
5975 VARAND(R8,-1,UINT,0,I4,0);
5976 VARAND(R8,0,UINT,0,I4,0);
5977 VARAND(R8,0,BSTR,false_str,I4,0);
5978 VARAND(R8,-1,BSTR,false_str,I4,0);
5979 VARAND(R8,0,BSTR,true_str,I4,0);
5980 VARAND(R8,-1,BSTR,true_str,I4,-1);
5981 VARANDCY(R8,-1,10000,I4,1);
5982 VARANDCY(R8,-1,0,I4,0);
5983 VARANDCY(R8,0,0,I4,0);
5985 VARAND(DATE,-1,DATE,-1,I4,-1);
5986 VARAND(DATE,-1,DATE,0,I4,0);
5987 VARAND(DATE,0,DATE,0,I4,0);
5988 if (HAVE_OLEAUT32_I8)
5990 VARAND(DATE,-1,I8,-1,I8,-1);
5991 VARAND(DATE,-1,I8,0,I8,0);
5992 VARAND(DATE,0,I8,0,I8,0);
5993 VARAND(DATE,-1,UI8,0,I4,0);
5994 VARAND(DATE,0,UI8,0,I4,0);
5996 VARAND(DATE,-1,INT,-1,I4,-1);
5997 VARAND(DATE,-1,INT,0,I4,0);
5998 VARAND(DATE,0,INT,0,I4,0);
5999 VARAND(DATE,-1,UINT,0xffffffff,I4,-1);
6000 VARAND(DATE,-1,UINT,0,I4,0);
6001 VARAND(DATE,0,UINT,0,I4,0);
6002 VARAND(DATE,0,BSTR,false_str,I4,0);
6003 VARAND(DATE,-1,BSTR,false_str,I4,0);
6004 VARAND(DATE,0,BSTR,true_str,I4,0);
6005 VARAND(DATE,-1,BSTR,true_str,I4,-1);
6006 VARANDCY(DATE,-1,10000,I4,1);
6007 VARANDCY(DATE,-1,0,I4,0);
6008 VARANDCY(DATE,0,0,I4,0);
6010 if (HAVE_OLEAUT32_I8)
6012 VARAND(I8,-1,I8,-1,I8,-1);
6013 VARAND(I8,-1,I8,0,I8,0);
6014 VARAND(I8,0,I8,0,I8,0);
6015 VARAND(I8,-1,UI8,0,I8,0);
6016 VARAND(I8,0,UI8,0,I8,0);
6017 VARAND(I8,-1,UINT,0,I8,0);
6018 VARAND(I8,0,UINT,0,I8,0);
6019 VARAND(I8,0,BSTR,false_str,I8,0);
6020 VARAND(I8,-1,BSTR,false_str,I8,0);
6021 VARAND(I8,0,BSTR,true_str,I8,0);
6022 VARAND(I8,-1,BSTR,true_str,I8,-1);
6023 VARANDCY(I8,-1,10000,I8,1);
6024 VARANDCY(I8,-1,0,I8,0);
6025 VARANDCY(I8,0,0,I8,0);
6027 VARAND(UI8,0xffff,UI8,0xffff,I4,0xffff);
6028 VARAND(UI8,0xffff,UI8,0,I4,0);
6029 VARAND(UI8,0,UI8,0,I4,0);
6030 VARAND(UI8,0xffff,INT,-1,I4,65535);
6031 VARAND(UI8,0xffff,INT,0,I4,0);
6032 VARAND(UI8,0,INT,0,I4,0);
6033 VARAND(UI8,0xffff,UINT,0xffff,I4,0xffff);
6034 VARAND(UI8,0xffff,UINT,0,I4,0);
6035 VARAND(UI8,0,UINT,0,I4,0);
6036 VARAND(UI8,0,BSTR,false_str,I4,0);
6037 VARAND(UI8,0xffff,BSTR,false_str,I4,0);
6038 VARAND(UI8,0,BSTR,true_str,I4,0);
6039 VARAND(UI8,0xffff,BSTR,true_str,I4,65535);
6040 VARANDCY(UI8,0xffff,10000,I4,1);
6041 VARANDCY(UI8,0xffff,0,I4,0);
6042 VARANDCY(UI8,0,0,I4,0);
6045 VARAND(INT,-1,INT,-1,I4,-1);
6046 VARAND(INT,-1,INT,0,I4,0);
6047 VARAND(INT,0,INT,0,I4,0);
6048 VARAND(INT,-1,UINT,0xffff,I4,65535);
6049 VARAND(INT,-1,UINT,0,I4,0);
6050 VARAND(INT,0,UINT,0,I4,0);
6051 VARAND(INT,0,BSTR,false_str,I4,0);
6052 VARAND(INT,-1,BSTR,false_str,I4,0);
6053 VARAND(INT,0,BSTR,true_str,I4,0);
6054 VARAND(INT,-1,BSTR,true_str,I4,-1);
6055 VARANDCY(INT,-1,10000,I4,1);
6056 VARANDCY(INT,-1,0,I4,0);
6057 VARANDCY(INT,0,0,I4,0);
6059 VARAND(UINT,0xffff,UINT,0xffff,I4,0xffff);
6060 VARAND(UINT,0xffff,UINT,0,I4,0);
6061 VARAND(UINT,0,UINT,0,I4,0);
6062 VARAND(UINT,0,BSTR,false_str,I4,0);
6063 VARAND(UINT,0xffff,BSTR, false_str,I4,0);
6064 VARAND(UINT,0,BSTR,true_str,I4,0);
6065 VARAND(UINT,0xffff,BSTR,true_str,I4,65535);
6066 VARANDCY(UINT,0xffff,10000,I4,1);
6067 VARANDCY(UINT,0xffff,0,I4,0);
6068 VARANDCY(UINT,0,0,I4,0);
6070 VARAND(BSTR,false_str,BSTR,false_str,BOOL,0);
6071 VARAND(BSTR,true_str,BSTR,false_str,BOOL,VARIANT_FALSE);
6072 VARAND(BSTR,true_str,BSTR,true_str,BOOL,VARIANT_TRUE);
6073 VARANDCY(BSTR,true_str,10000,I4,1);
6074 VARANDCY(BSTR,false_str,10000,I4,0);
6076 SysFreeString(true_str);
6077 SysFreeString(false_str);
6080 static HRESULT (WINAPI *pVarCmp)(LPVARIANT,LPVARIANT,LCID,ULONG);
6082 static void test_cmp( int line, LCID lcid, UINT flags, VARIANT *left, VARIANT *right, HRESULT result )
6086 hres = pVarCmp(left,right,lcid,flags);
6087 ok_(__FILE__,line)(hres == result, "VarCmp(%s,%s): expected 0x%x, got hres=0x%x\n",
6088 variantstr(left), variantstr(right), result, hres );
6090 static void test_cmpex( int line, LCID lcid, VARIANT *left, VARIANT *right,
6091 HRESULT res1, HRESULT res2, HRESULT res3, HRESULT res4 )
6093 test_cmp( line, lcid, 0, left, right, res1 );
6094 V_VT(left) |= VT_RESERVED;
6095 test_cmp( line, lcid, 0, left, right, res2 );
6096 V_VT(left) &= ~VT_RESERVED;
6097 V_VT(right) |= VT_RESERVED;
6098 test_cmp( line, lcid, 0, left, right, res3 );
6099 V_VT(left) |= VT_RESERVED;
6100 test_cmp( line, lcid, 0, left, right, res4 );
6101 ok_(__FILE__,line)(V_VT(left) & V_VT(right) & VT_RESERVED, "VT_RESERVED filtered out\n");
6104 /* ERROR from wingdi.h is interfering here */
6106 #define _VARCMP(vt1,val1,vtfl1,vt2,val2,vtfl2,lcid,flags,result) \
6107 V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1 | vtfl1; \
6108 V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2 | vtfl2; \
6109 test_cmp( __LINE__, lcid, flags, &left, &right, result );
6110 #define VARCMPEX(vt1,val1,vt2,val2,res1,res2,res3,res4) \
6111 V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1; \
6112 V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2; \
6113 test_cmpex( __LINE__, lcid, &left, &right, res1, res2, res3, res4 );
6114 #define VARCMP(vt1,val1,vt2,val2,result) \
6115 VARCMPEX(vt1,val1,vt2,val2,result,result,result,result)
6116 /* The above macros do not work for VT_NULL as NULL gets expanded first */
6117 #define V_NULL_ V_NULL
6118 #define VT_NULL_ VT_NULL
6120 static void test_VarCmp(void)
6122 VARIANT left, right;
6127 static const WCHAR szhuh[] = {'h','u','h','?','\0'};
6128 static const WCHAR sz2cents[] = {'2','c','e','n','t','s','\0'};
6129 static const WCHAR szempty[] = {'\0'};
6130 static const WCHAR sz0[] = {'0','\0'};
6131 static const WCHAR sz1[] = {'1','\0'};
6132 static const WCHAR sz7[] = {'7','\0'};
6133 static const WCHAR sz42[] = {'4','2','\0'};
6134 static const WCHAR sz1neg[] = {'-','1','\0'};
6135 static const WCHAR sz666neg[] = {'-','6','6','6','\0'};
6136 static const WCHAR sz1few[] = {'1','.','0','0','0','0','0','0','0','1','\0'};
6137 BSTR bstrhuh, bstrempty, bstr0, bstr1, bstr7, bstr42, bstr1neg, bstr666neg;
6138 BSTR bstr2cents, bstr1few;
6142 lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
6143 bstrempty = SysAllocString(szempty);
6144 bstrhuh = SysAllocString(szhuh);
6145 bstr2cents = SysAllocString(sz2cents);
6146 bstr0 = SysAllocString(sz0);
6147 bstr1 = SysAllocString(sz1);
6148 bstr7 = SysAllocString(sz7);
6149 bstr42 = SysAllocString(sz42);
6150 bstr1neg = SysAllocString(sz1neg);
6151 bstr666neg = SysAllocString(sz666neg);
6152 bstr1few = SysAllocString(sz1few);
6154 /* Test all possible flag/vt combinations & the resulting vt type */
6155 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6157 VARTYPE leftvt, rightvt;
6159 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6164 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6167 HRESULT expect = VARCMP_EQ;
6171 memset(&left, 0, sizeof(left));
6172 memset(&right, 0, sizeof(right));
6173 V_VT(&left) = leftvt | ExtraFlags[i];
6174 if (leftvt == VT_BSTR) {
6175 V_BSTR(&left) = bstr1neg;
6176 if (ExtraFlags[i] & VT_RESERVED)
6181 V_VT(&right) = rightvt | ExtraFlags[i];
6182 if (rightvt == VT_BSTR) {
6183 V_BSTR(&right) = bstr1neg;
6184 if (ExtraFlags[i] & VT_RESERVED)
6190 /* Don't ask me why but native VarCmp cannot handle:
6191 VT_I1, VT_UI2, VT_UI4, VT_UINT and VT_UI8.
6192 VT_INT is only supported as left variant. Go figure.
6193 Tested with DCOM98, Win2k, WinXP */
6194 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
6195 !IsValidVariantClearVT(leftvt, ExtraFlags[i] & ~VT_RESERVED) ||
6196 !IsValidVariantClearVT(rightvt, ExtraFlags[i] & ~VT_RESERVED) ||
6197 leftvt == VT_CLSID || rightvt == VT_CLSID ||
6198 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
6199 leftvt == VT_ERROR || rightvt == VT_ERROR ||
6200 leftvt == VT_RECORD || rightvt == VT_RECORD ||
6201 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
6202 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
6203 leftvt == VT_I1 || rightvt == VT_I1 ||
6204 leftvt == VT_UI2 || rightvt == VT_UI2 ||
6205 leftvt == VT_UI4 || rightvt == VT_UI4 ||
6206 leftvt == VT_UI8 || rightvt == VT_UI8 ||
6207 rightvt == VT_INT ||
6208 leftvt == VT_UINT || rightvt == VT_UINT) {
6212 if (leftvt == VT_ERROR && rightvt == VT_ERROR &&
6213 !(ExtraFlags[i] & ~VT_RESERVED)) {
6216 } else if (leftvt == VT_NULL || rightvt == VT_NULL)
6217 expect = VARCMP_NULL;
6218 else if (leftvt == VT_BSTR && rightvt == VT_BSTR)
6220 else if (leftvt == VT_BSTR && rightvt == VT_EMPTY)
6222 else if (leftvt == VT_EMPTY && rightvt == VT_BSTR)
6225 hres = pVarCmp(&left, &right, LOCALE_USER_DEFAULT, 0);
6227 ok(hres == DISP_E_TYPEMISMATCH || hres == DISP_E_BADVARTYPE,
6228 "VarCmp: %d|0x%X, %d|0x%X: Expected failure, got 0x%X\n",
6229 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres);
6232 "VarCmp: %d|0x%X, %d|0x%X: Expected 0x%X, got 0x%X\n",
6233 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], expect,
6240 /* VARCMP{,EX} run each 4 tests with a permutation of all posible
6241 input variants with (1) and without (0) VT_RESERVED set. The order
6242 of the permutations is (0,0); (1,0); (0,1); (1,1) */
6243 VARCMP(INT,4711,I2,4711,VARCMP_EQ);
6244 VARCMP(INT,4711,I2,-4711,VARCMP_GT);
6245 VARCMP(ERROR,0,ERROR,0,VARCMP_EQ);
6246 VARCMP(ERROR,0,UI1,0,DISP_E_TYPEMISMATCH);
6247 VARCMP(EMPTY,0,EMPTY,0,VARCMP_EQ);
6248 VARCMP(I4,1,R8,1.0,VARCMP_EQ);
6249 VARCMP(EMPTY,19,I2,0,VARCMP_EQ);
6250 ok(V_EMPTY(&left) == 19, "VT_EMPTY modified!\n");
6251 VARCMP(I4,1,UI1,1,VARCMP_EQ);
6252 VARCMP(I2,2,I2,2,VARCMP_EQ);
6253 VARCMP(I2,1,I2,2,VARCMP_LT);
6254 VARCMP(I2,2,I2,1,VARCMP_GT);
6255 VARCMP(I2,2,EMPTY,1,VARCMP_GT);
6256 VARCMP(I2,2,NULL_,1,VARCMP_NULL);
6258 /* BSTR handling, especially in conjunction with VT_RESERVED */
6259 VARCMP(BSTR,bstr0,NULL_,0,VARCMP_NULL);
6260 VARCMP(BSTR,bstr0,BSTR,bstr0,VARCMP_EQ);
6261 VARCMP(BSTR,bstrempty,BSTR,bstr0,VARCMP_LT);
6262 VARCMP(BSTR,bstr7,BSTR,bstr0,VARCMP_GT);
6263 VARCMP(BSTR,bstr7,BSTR,bstr1neg,VARCMP_GT);
6264 VARCMP(BSTR,bstr0,BSTR,NULL,VARCMP_GT);
6265 VARCMP(BSTR,NULL,BSTR,NULL,VARCMP_EQ);
6266 VARCMP(BSTR,bstrempty,BSTR,NULL,VARCMP_EQ);
6267 VARCMP(BSTR,NULL,EMPTY,0,VARCMP_EQ);
6268 VARCMP(EMPTY,0,BSTR,NULL,VARCMP_EQ);
6269 VARCMP(EMPTY,0,BSTR,bstrempty,VARCMP_EQ);
6270 VARCMP(EMPTY,1,BSTR,bstrempty,VARCMP_EQ);
6271 VARCMP(BSTR,bstr0,EMPTY,0,VARCMP_GT);
6272 VARCMP(BSTR,bstr42,EMPTY,0,VARCMP_GT);
6273 VARCMPEX(BSTR,bstrempty,UI1,0,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6274 VARCMPEX(BSTR,bstrempty,I2,-1,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6275 VARCMPEX(I4,0,BSTR,bstrempty,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6276 VARCMPEX(BSTR,NULL,UI1,0,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6277 VARCMPEX(I4,7,BSTR,NULL,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6278 _VARCMP(BSTR,(BSTR)100,0,I2,100,0,lcid,0,VARCMP_GT);
6279 VARCMPEX(BSTR,bstr0,UI1,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6280 VARCMPEX(I2,0,BSTR,bstr0,VARCMP_LT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6281 VARCMP(BSTR,bstrhuh,I4,I4_MAX,VARCMP_GT);
6282 VARCMP(BSTR,bstr2cents,I4,2,VARCMP_GT);
6283 VARCMPEX(BSTR,bstr2cents,I4,42,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6284 VARCMP(BSTR,bstr2cents,I4,-1,VARCMP_GT);
6285 VARCMPEX(BSTR,bstr2cents,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6286 VARCMPEX(BSTR,bstr0,I2,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6287 VARCMPEX(BSTR,bstr0,I4,0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6288 VARCMPEX(BSTR,bstr0,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6289 VARCMP(BSTR,bstr1,I4,0,VARCMP_GT);
6290 VARCMPEX(BSTR,bstr1,I4,1,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6291 VARCMPEX(BSTR,bstr1,I4,I4_MAX,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_GT);
6292 VARCMPEX(BSTR,bstr1,I4,-1,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6293 VARCMP(BSTR,bstr7,I4,1,VARCMP_GT);
6294 VARCMPEX(BSTR,bstr7,I4,7,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6295 VARCMPEX(BSTR,bstr7,I4,42,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_GT);
6296 VARCMPEX(BSTR,bstr42,I4,7,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
6297 VARCMPEX(BSTR,bstr42,I4,42,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6298 VARCMPEX(BSTR,bstr42,I4,I4_MAX,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_GT);
6299 VARCMPEX(BSTR,bstr1neg,I4,1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6300 VARCMPEX(BSTR,bstr1neg,I4,42,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_LT);
6301 VARCMPEX(BSTR,bstr1neg,I4,-1,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6302 VARCMPEX(BSTR,bstr1neg,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6303 VARCMPEX(BSTR,bstr666neg,I4,1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6304 VARCMPEX(BSTR,bstr666neg,I4,7,VARCMP_GT,VARCMP_LT,VARCMP_LT,VARCMP_LT);
6305 VARCMPEX(BSTR,bstr666neg,I4,42,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6306 VARCMPEX(BSTR,bstr666neg,I4,I4_MAX,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6307 VARCMPEX(BSTR,bstr666neg,I4,-1,VARCMP_GT,VARCMP_GT,VARCMP_LT,VARCMP_LT);
6308 VARCMPEX(BSTR,bstr666neg,I4,-666,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6309 VARCMPEX(BSTR,bstr7,R8,7.0,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_GT);
6310 VARCMPEX(R8,3.141592,BSTR,NULL,VARCMP_LT,VARCMP_LT,VARCMP_GT,VARCMP_LT);
6311 VARCMP(BSTR,bstr7,BSTR,bstr7,VARCMP_EQ);
6312 VARCMP(BSTR,bstr7,BSTR,bstr42,VARCMP_GT);
6313 VARCMP(BSTR,bstr42,BSTR,bstr7,VARCMP_LT);
6315 /* DECIMAL handling */
6316 SETDEC(dec,0,0,0,0);
6317 VARCMPEX(DECIMAL,dec,BSTR,bstr0,VARCMP_LT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
6318 SETDEC64(dec,0,0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF); /* max DECIMAL */
6319 VARCMP(DECIMAL,dec,R8,R8_MAX,VARCMP_LT); /* R8 has bigger range */
6320 VARCMP(DECIMAL,dec,DATE,R8_MAX,VARCMP_LT); /* DATE has bigger range */
6321 SETDEC64(dec,0,0x80,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
6322 VARCMP(DECIMAL,dec,R8,-R8_MAX,VARCMP_GT);
6323 SETDEC64(dec,20,0,0x5,0x6BC75E2D,0x63100001); /* 1+1e-20 */
6324 VARCMP(DECIMAL,dec,R8,1,VARCMP_GT); /* DECIMAL has higher precision */
6326 /* Show that DATE is handled just as a R8 */
6327 VARCMP(DATE,DATE_MAX,DATE,DATE_MAX+1,VARCMP_LT);
6328 VARCMP(DATE,DATE_MIN,DATE,DATE_MIN-1,VARCMP_GT);
6329 VARCMP(DATE,R8_MIN,R8,R8_MIN,VARCMP_EQ);
6330 VARCMP(DATE,1,DATE,1+1e-15,VARCMP_LT); /* 1e-15 == 8.64e-11 seconds */
6331 VARCMP(DATE,25570.0,DATE,25570.0,VARCMP_EQ);
6332 VARCMP(DATE,25570.0,DATE,25571.0,VARCMP_LT);
6333 VARCMP(DATE,25571.0,DATE,25570.0,VARCMP_GT);
6334 VARCMP(DATE,25570.0,EMPTY,0,VARCMP_GT);
6335 VARCMP(DATE,25570.0,NULL_,0,VARCMP_NULL);
6337 /* R4 precision handling */
6338 VARCMP(R4,1,R8,1+1e-8,VARCMP_EQ);
6339 VARCMP(R8,1+1e-8,R4,1,VARCMP_EQ);
6340 VARCMP(R8,1+1e-8,R8,1,VARCMP_GT);
6341 VARCMP(R8,R4_MAX*1.1,R4,R4_MAX,VARCMP_GT);
6342 VARCMP(R4,R4_MAX,R8,R8_MAX,VARCMP_LT);
6343 VARCMP(R4,1,DATE,1+1e-8,VARCMP_EQ);
6344 VARCMP(R4,1,BSTR,bstr1few,VARCMP_LT); /* bstr1few == 1+1e-8 */
6345 SETDEC(dec,8,0,0,0x5F5E101); /* 1+1e-8 */
6346 VARCMP(R4,1,DECIMAL,dec,VARCMP_LT);
6348 SysFreeString(bstrhuh);
6349 SysFreeString(bstrempty);
6350 SysFreeString(bstr0);
6351 SysFreeString(bstr1);
6352 SysFreeString(bstr7);
6353 SysFreeString(bstr42);
6354 SysFreeString(bstr1neg);
6355 SysFreeString(bstr666neg);
6356 SysFreeString(bstr2cents);
6357 SysFreeString(bstr1few);
6360 static HRESULT (WINAPI *pVarPow)(LPVARIANT,LPVARIANT,LPVARIANT);
6362 #define VARPOW(vt1,val1,vt2,val2,rvt,rval) \
6363 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6364 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6365 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6366 test_var_call2( __LINE__, pVarPow, &left, &right, &exp );
6368 /* Skip any type that is not defined or produces a error for every case */
6369 #define SKIPTESTPOW(a) \
6370 if (a == VT_ERROR || a == VT_VARIANT || \
6371 a == VT_DISPATCH || a == VT_UNKNOWN || \
6372 a == VT_RECORD || a > VT_UINT || \
6373 a == 15 /*not defined*/) \
6376 static void test_VarPow(void)
6378 static const WCHAR str2[] = { '2','\0' };
6379 static const WCHAR str3[] = { '3','\0' };
6380 VARIANT left, right, exp, result, cy, dec;
6381 BSTR num2_str, num3_str;
6387 num2_str = SysAllocString(str2);
6388 num3_str = SysAllocString(str3);
6390 /* Test all possible flag/vt combinations & the resulting vt type */
6391 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6393 VARTYPE leftvt, rightvt, resvt;
6395 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6397 SKIPTESTPOW(leftvt);
6399 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6402 SKIPTESTPOW(rightvt);
6404 /* Native crashes with VT_BYREF */
6405 if (ExtraFlags[i] == VT_BYREF)
6408 memset(&left, 0, sizeof(left));
6409 memset(&right, 0, sizeof(right));
6410 V_VT(&left) = leftvt | ExtraFlags[i];
6411 V_VT(&right) = rightvt | ExtraFlags[i];
6412 V_VT(&result) = VT_EMPTY;
6415 if (leftvt == VT_BSTR)
6416 V_BSTR(&left) = num2_str;
6417 if (rightvt == VT_BSTR)
6418 V_BSTR(&right) = num2_str;
6420 /* Native VarPow always returns a error when using any extra flags */
6421 if (ExtraFlags[i] != 0)
6424 /* Determine return type */
6425 else if ((leftvt == VT_NULL || rightvt == VT_NULL) &&
6426 ((leftvt != VT_I8 && leftvt != VT_UI8 &&
6427 rightvt != VT_I8 && rightvt != VT_UI8) || HAVE_OLEAUT32_I8))
6429 else if ((leftvt == VT_EMPTY || leftvt == VT_I2 ||
6430 leftvt == VT_I4 || leftvt == VT_R4 ||
6431 leftvt == VT_R8 || leftvt == VT_CY ||
6432 leftvt == VT_DATE || leftvt == VT_BSTR ||
6433 leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
6434 (leftvt >= VT_I1 && leftvt <= VT_UI4) ||
6435 (HAVE_OLEAUT32_I8 && (leftvt == VT_I8 || leftvt == VT_UI8)) ||
6436 leftvt == VT_INT || leftvt == VT_UINT) &&
6437 (rightvt == VT_EMPTY || rightvt == VT_I2 ||
6438 rightvt == VT_I4 || rightvt == VT_R4 ||
6439 rightvt == VT_R8 || rightvt == VT_CY ||
6440 rightvt == VT_DATE || rightvt == VT_BSTR ||
6441 rightvt == VT_BOOL || rightvt == VT_DECIMAL ||
6442 (rightvt >= VT_I1 && rightvt <= VT_UI4) ||
6443 (HAVE_OLEAUT32_I8 && (rightvt == VT_I8 || rightvt == VT_UI8)) ||
6444 rightvt == VT_INT || rightvt == VT_UINT))
6449 hres = pVarPow(&left, &right, &result);
6451 /* Check expected HRESULT and if result variant type is correct */
6453 ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
6454 "VarPow: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
6455 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
6456 vtstr(V_VT(&result)), hres);
6458 ok (hres == S_OK && resvt == V_VT(&result),
6459 "VarPow: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
6460 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
6461 S_OK, vtstr(V_VT(&result)), hres);
6466 /* Check return values for valid variant type combinations */
6467 VARPOW(EMPTY,0,EMPTY,0,R8,1.0);
6468 VARPOW(EMPTY,0,NULL,0,NULL,0);
6469 VARPOW(EMPTY,0,I2,3,R8,0.0);
6470 VARPOW(EMPTY,0,I4,3,R8,0.0);
6471 VARPOW(EMPTY,0,R4,3.0,R8,0.0);
6472 VARPOW(EMPTY,0,R8,3.0,R8,0.0);
6473 VARPOW(EMPTY,0,DATE,3,R8,0.0);
6474 VARPOW(EMPTY,0,BSTR,num3_str,R8,0.0);
6475 VARPOW(EMPTY,0,BOOL,VARIANT_FALSE,R8,1.0);
6476 VARPOW(EMPTY,0,I1,3,R8,0.0);
6477 VARPOW(EMPTY,0,UI1,3,R8,0.0);
6478 VARPOW(EMPTY,0,UI2,3,R8,0.0);
6479 VARPOW(EMPTY,0,UI4,3,R8,0.0);
6480 if (HAVE_OLEAUT32_I8)
6482 VARPOW(EMPTY,0,I8,3,R8,0.0);
6483 VARPOW(EMPTY,0,UI8,3,R8,0.0);
6485 VARPOW(EMPTY,0,INT,3,R8,0.0);
6486 VARPOW(EMPTY,0,UINT,3,R8,0.0);
6487 VARPOW(NULL,0,EMPTY,0,NULL,0);
6488 VARPOW(NULL,0,NULL,0,NULL,0);
6489 VARPOW(NULL,0,I2,3,NULL,0);
6490 VARPOW(NULL,0,I4,3,NULL,0);
6491 VARPOW(NULL,0,R4,3.0,NULL,0);
6492 VARPOW(NULL,0,R8,3.0,NULL,0);
6493 VARPOW(NULL,0,DATE,3,NULL,0);
6494 VARPOW(NULL,0,BSTR,num3_str,NULL,0);
6495 VARPOW(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
6496 VARPOW(NULL,0,I1,3,NULL,0);
6497 VARPOW(NULL,0,UI1,3,NULL,0);
6498 VARPOW(NULL,0,UI2,3,NULL,0);
6499 VARPOW(NULL,0,UI4,3,NULL,0);
6500 if (HAVE_OLEAUT32_I8)
6502 VARPOW(NULL,0,I8,3,NULL,0);
6503 VARPOW(NULL,0,UI8,3,NULL,0);
6505 VARPOW(NULL,0,INT,3,NULL,0);
6506 VARPOW(NULL,0,UINT,3,NULL,0);
6507 VARPOW(I2,2,EMPTY,0,R8,1.0);
6508 VARPOW(I2,2,NULL,0,NULL,0);
6509 VARPOW(I2,2,I2,3,R8,8.0);
6510 VARPOW(I2,2,I4,3,R8,8.0);
6511 VARPOW(I2,2,R4,3.0,R8,8.0);
6512 VARPOW(I2,2,R8,3.0,R8,8.0);
6513 VARPOW(I2,2,DATE,3,R8,8.0);
6514 VARPOW(I2,2,BSTR,num3_str,R8,8.0);
6515 VARPOW(I2,2,BOOL,VARIANT_FALSE,R8,1.0);
6516 VARPOW(I2,2,I1,3,R8,8.0);
6517 VARPOW(I2,2,UI1,3,R8,8.0);
6518 VARPOW(I2,2,UI2,3,R8,8.0);
6519 VARPOW(I2,2,UI4,3,R8,8.0);
6520 if (HAVE_OLEAUT32_I8)
6522 VARPOW(I2,2,I8,3,R8,8.0);
6523 VARPOW(I2,2,UI8,3,R8,8.0);
6525 VARPOW(I2,2,INT,3,R8,8.0);
6526 VARPOW(I2,2,UINT,3,R8,8.0);
6527 VARPOW(I4,2,EMPTY,0,R8,1.0);
6528 VARPOW(I4,2,NULL,0,NULL,0);
6529 VARPOW(I4,2,I2,3,R8,8.0);
6530 VARPOW(I4,2,I4,3,R8,8.0);
6531 VARPOW(I4,2,R4,3.0,R8,8.0);
6532 VARPOW(I4,2,R8,3.0,R8,8.0);
6533 VARPOW(I4,2,DATE,3,R8,8.0);
6534 VARPOW(I4,2,BSTR,num3_str,R8,8.0);
6535 VARPOW(I4,2,BOOL,VARIANT_FALSE,R8,1.0);
6536 VARPOW(I4,2,I1,3,R8,8.0);
6537 VARPOW(I4,2,UI1,3,R8,8.0);
6538 VARPOW(I4,2,UI2,3,R8,8.0);
6539 VARPOW(I4,2,UI4,3,R8,8.0);
6540 if (HAVE_OLEAUT32_I8)
6542 VARPOW(I4,2,I8,3,R8,8.0);
6543 VARPOW(I4,2,UI8,3,R8,8.0);
6545 VARPOW(I4,2,INT,3,R8,8.0);
6546 VARPOW(I4,2,UINT,3,R8,8.0);
6547 VARPOW(R4,2,EMPTY,0,R8,1.0);
6548 VARPOW(R4,2,NULL,0,NULL,0);
6549 VARPOW(R4,2,I2,3,R8,8.0);
6550 VARPOW(R4,2,I4,3,R8,8.0);
6551 VARPOW(R4,2,R4,3.0,R8,8.0);
6552 VARPOW(R4,2,R8,3.0,R8,8.0);
6553 VARPOW(R4,2,DATE,3,R8,8.0);
6554 VARPOW(R4,2,BSTR,num3_str,R8,8.0);
6555 VARPOW(R4,2,BOOL,VARIANT_FALSE,R8,1.0);
6556 VARPOW(R4,2,I1,3,R8,8.0);
6557 VARPOW(R4,2,UI1,3,R8,8.0);
6558 VARPOW(R4,2,UI2,3,R8,8.0);
6559 VARPOW(R4,2,UI4,3,R8,8.0);
6560 if (HAVE_OLEAUT32_I8)
6562 VARPOW(R4,2,I8,3,R8,8.0);
6563 VARPOW(R4,2,UI8,3,R8,8.0);
6565 VARPOW(R4,2,INT,3,R8,8.0);
6566 VARPOW(R4,2,UINT,3,R8,8.0);
6567 VARPOW(R8,2,EMPTY,0,R8,1.0);
6568 VARPOW(R8,2,NULL,0,NULL,0);
6569 VARPOW(R8,2,I2,3,R8,8.0);
6570 VARPOW(R8,2,I4,3,R8,8.0);
6571 VARPOW(R8,2,R4,3.0,R8,8.0);
6572 VARPOW(R8,2,R8,3.0,R8,8.0);
6573 VARPOW(R8,2,DATE,3,R8,8.0);
6574 VARPOW(R8,2,BSTR,num3_str,R8,8.0);
6575 VARPOW(R8,2,BOOL,VARIANT_FALSE,R8,1.0);
6576 VARPOW(R8,2,I1,3,R8,8.0);
6577 VARPOW(R8,2,UI1,3,R8,8.0);
6578 VARPOW(R8,2,UI2,3,R8,8.0);
6579 VARPOW(R8,2,UI4,3,R8,8.0);
6580 if (HAVE_OLEAUT32_I8)
6582 VARPOW(R8,2,I8,3,R8,8.0);
6583 VARPOW(R8,2,UI8,3,R8,8.0);
6585 VARPOW(R8,2,INT,3,R8,8.0);
6586 VARPOW(R8,2,UINT,3,R8,8.0);
6587 VARPOW(DATE,2,EMPTY,0,R8,1.0);
6588 VARPOW(DATE,2,NULL,0,NULL,0);
6589 VARPOW(DATE,2,I2,3,R8,8.0);
6590 VARPOW(DATE,2,I4,3,R8,8.0);
6591 VARPOW(DATE,2,R4,3.0,R8,8.0);
6592 VARPOW(DATE,2,R8,3.0,R8,8.0);
6593 VARPOW(DATE,2,DATE,3,R8,8.0);
6594 VARPOW(DATE,2,BSTR,num3_str,R8,8.0);
6595 VARPOW(DATE,2,BOOL,VARIANT_FALSE,R8,1.0);
6596 VARPOW(DATE,2,I1,3,R8,8.0);
6597 VARPOW(DATE,2,UI1,3,R8,8.0);
6598 VARPOW(DATE,2,UI2,3,R8,8.0);
6599 VARPOW(DATE,2,UI4,3,R8,8.0);
6600 if (HAVE_OLEAUT32_I8)
6602 VARPOW(DATE,2,I8,3,R8,8.0);
6603 VARPOW(DATE,2,UI8,3,R8,8.0);
6605 VARPOW(DATE,2,INT,3,R8,8.0);
6606 VARPOW(DATE,2,UINT,3,R8,8.0);
6607 VARPOW(BSTR,num2_str,EMPTY,0,R8,1.0);
6608 VARPOW(BSTR,num2_str,NULL,0,NULL,0);
6609 VARPOW(BSTR,num2_str,I2,3,R8,8.0);
6610 VARPOW(BSTR,num2_str,I4,3,R8,8.0);
6611 VARPOW(BSTR,num2_str,R4,3.0,R8,8.0);
6612 VARPOW(BSTR,num2_str,R8,3.0,R8,8.0);
6613 VARPOW(BSTR,num2_str,DATE,3,R8,8.0);
6614 VARPOW(BSTR,num2_str,BSTR,num3_str,R8,8.0);
6615 VARPOW(BSTR,num2_str,BOOL,VARIANT_FALSE,R8,1.0);
6616 VARPOW(BSTR,num2_str,I1,3,R8,8.0);
6617 VARPOW(BSTR,num2_str,UI1,3,R8,8.0);
6618 VARPOW(BSTR,num2_str,UI2,3,R8,8.0);
6619 VARPOW(BSTR,num2_str,UI4,3,R8,8.0);
6620 if (HAVE_OLEAUT32_I8)
6622 VARPOW(BSTR,num2_str,I8,3,R8,8.0);
6623 VARPOW(BSTR,num2_str,UI8,3,R8,8.0);
6625 VARPOW(BSTR,num2_str,INT,3,R8,8.0);
6626 VARPOW(BSTR,num2_str,UINT,3,R8,8.0);
6627 VARPOW(BOOL,VARIANT_TRUE,EMPTY,0,R8,1.0);
6628 VARPOW(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
6629 VARPOW(BOOL,VARIANT_TRUE,I2,3,R8,-1.0);
6630 VARPOW(BOOL,VARIANT_TRUE,I4,3,R8,-1.0);
6631 VARPOW(BOOL,VARIANT_TRUE,R4,3.0,R8,-1.0);
6632 VARPOW(BOOL,VARIANT_TRUE,R8,3.0,R8,-1.0);
6633 VARPOW(BOOL,VARIANT_TRUE,DATE,3,R8,-1.0);
6634 VARPOW(BOOL,VARIANT_TRUE,BSTR,num3_str,R8,-1.0);
6635 VARPOW(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,-1.0);
6636 VARPOW(BOOL,VARIANT_TRUE,I1,3,R8,-1.0);
6637 VARPOW(BOOL,VARIANT_TRUE,UI1,3,R8,-1.0);
6638 VARPOW(BOOL,VARIANT_TRUE,UI2,3,R8,-1.0);
6639 VARPOW(BOOL,VARIANT_TRUE,UI4,3,R8,-1.0);
6640 if (HAVE_OLEAUT32_I8)
6642 VARPOW(BOOL,VARIANT_TRUE,I8,3,R8,-1.0);
6643 VARPOW(BOOL,VARIANT_TRUE,UI8,3,R8,-1.0);
6645 VARPOW(BOOL,VARIANT_TRUE,INT,3,R8,-1.0);
6646 VARPOW(BOOL,VARIANT_TRUE,UINT,3,R8,-1.0);
6647 VARPOW(I1,2,EMPTY,0,R8,1.0);
6648 VARPOW(I1,2,NULL,0,NULL,0);
6649 VARPOW(I1,2,I2,3,R8,8.0);
6650 VARPOW(I1,2,I4,3,R8,8.0);
6651 VARPOW(I1,2,R4,3.0,R8,8.0);
6652 VARPOW(I1,2,R8,3.0,R8,8.0);
6653 VARPOW(I1,2,DATE,3,R8,8.0);
6654 VARPOW(I1,2,BSTR,num3_str,R8,8.0);
6655 VARPOW(I1,2,BOOL,VARIANT_FALSE,R8,1.0);
6656 VARPOW(I1,2,I1,3,R8,8.0);
6657 VARPOW(I1,2,UI1,3,R8,8.0);
6658 VARPOW(I1,2,UI2,3,R8,8.0);
6659 VARPOW(I1,2,UI4,3,R8,8.0);
6660 if (HAVE_OLEAUT32_I8)
6662 VARPOW(I1,2,I8,3,R8,8.0);
6663 VARPOW(I1,2,UI8,3,R8,8.0);
6665 VARPOW(I1,2,INT,3,R8,8.0);
6666 VARPOW(I1,2,UINT,3,R8,8.0);
6667 VARPOW(UI1,2,EMPTY,0,R8,1.0);
6668 VARPOW(UI1,2,NULL,0,NULL,0);
6669 VARPOW(UI1,2,I2,3,R8,8.0);
6670 VARPOW(UI1,2,I4,3,R8,8.0);
6671 VARPOW(UI1,2,R4,3.0,R8,8.0);
6672 VARPOW(UI1,2,R8,3.0,R8,8.0);
6673 VARPOW(UI1,2,DATE,3,R8,8.0);
6674 VARPOW(UI1,2,BSTR,num3_str,R8,8.0);
6675 VARPOW(UI1,2,BOOL,VARIANT_FALSE,R8,1.0);
6676 VARPOW(UI1,2,I1,3,R8,8.0);
6677 VARPOW(UI1,2,UI1,3,R8,8.0);
6678 VARPOW(UI1,2,UI2,3,R8,8.0);
6679 VARPOW(UI1,2,UI4,3,R8,8.0);
6680 if (HAVE_OLEAUT32_I8)
6682 VARPOW(UI1,2,I8,3,R8,8.0);
6683 VARPOW(UI1,2,UI8,3,R8,8.0);
6685 VARPOW(UI1,2,INT,3,R8,8.0);
6686 VARPOW(UI1,2,UINT,3,R8,8.0);
6687 VARPOW(UI2,2,EMPTY,0,R8,1.0);
6688 VARPOW(UI2,2,NULL,0,NULL,0);
6689 VARPOW(UI2,2,I2,3,R8,8.0);
6690 VARPOW(UI2,2,I4,3,R8,8.0);
6691 VARPOW(UI2,2,R4,3.0,R8,8.0);
6692 VARPOW(UI2,2,R8,3.0,R8,8.0);
6693 VARPOW(UI2,2,DATE,3,R8,8.0);
6694 VARPOW(UI2,2,BSTR,num3_str,R8,8.0);
6695 VARPOW(UI2,2,BOOL,VARIANT_FALSE,R8,1.0);
6696 VARPOW(UI2,2,I1,3,R8,8.0);
6697 VARPOW(UI2,2,UI1,3,R8,8.0);
6698 VARPOW(UI2,2,UI2,3,R8,8.0);
6699 VARPOW(UI2,2,UI4,3,R8,8.0);
6700 if (HAVE_OLEAUT32_I8)
6702 VARPOW(UI2,2,I8,3,R8,8.0);
6703 VARPOW(UI2,2,UI8,3,R8,8.0);
6705 VARPOW(UI2,2,INT,3,R8,8.0);
6706 VARPOW(UI2,2,UINT,3,R8,8.0);
6707 VARPOW(UI4,2,EMPTY,0,R8,1.0);
6708 VARPOW(UI4,2,NULL,0,NULL,0);
6709 VARPOW(UI4,2,I2,3,R8,8.0);
6710 VARPOW(UI4,2,I4,3,R8,8.0);
6711 VARPOW(UI4,2,R4,3.0,R8,8.0);
6712 VARPOW(UI4,2,R8,3.0,R8,8.0);
6713 VARPOW(UI4,2,DATE,3,R8,8.0);
6714 VARPOW(UI4,2,BSTR,num3_str,R8,8.0);
6715 VARPOW(UI4,2,BOOL,VARIANT_FALSE,R8,1.0);
6716 VARPOW(UI4,2,I1,3,R8,8.0);
6717 VARPOW(UI4,2,UI1,3,R8,8.0);
6718 VARPOW(UI4,2,UI2,3,R8,8.0);
6719 VARPOW(UI4,2,UI4,3,R8,8.0);
6720 if (HAVE_OLEAUT32_I8)
6722 VARPOW(UI4,2,I8,3,R8,8.0);
6723 VARPOW(UI4,2,UI8,3,R8,8.0);
6725 VARPOW(UI4,2,INT,3,R8,8.0);
6726 VARPOW(UI4,2,UINT,3,R8,8.0);
6727 if (HAVE_OLEAUT32_I8)
6729 VARPOW(I8,2,EMPTY,0,R8,1.0);
6730 VARPOW(I8,2,NULL,0,NULL,0);
6731 VARPOW(I8,2,I2,3,R8,8.0);
6732 VARPOW(I8,2,I4,3,R8,8.0);
6733 VARPOW(I8,2,R4,3.0,R8,8.0);
6734 VARPOW(I8,2,R8,3.0,R8,8.0);
6735 VARPOW(I8,2,DATE,3,R8,8.0);
6736 VARPOW(I8,2,BSTR,num3_str,R8,8.0);
6737 VARPOW(I8,2,BOOL,VARIANT_FALSE,R8,1.0);
6738 VARPOW(I8,2,I1,3,R8,8.0);
6739 VARPOW(I8,2,UI1,3,R8,8.0);
6740 VARPOW(I8,2,UI2,3,R8,8.0);
6741 VARPOW(I8,2,UI4,3,R8,8.0);
6742 VARPOW(I8,2,I8,3,R8,8.0);
6743 VARPOW(I8,2,UI8,3,R8,8.0);
6744 VARPOW(I8,2,INT,3,R8,8.0);
6745 VARPOW(I8,2,UINT,3,R8,8.0);
6746 VARPOW(UI8,2,EMPTY,0,R8,1.0);
6747 VARPOW(UI8,2,NULL,0,NULL,0);
6748 VARPOW(UI8,2,I2,3,R8,8.0);
6749 VARPOW(UI8,2,I4,3,R8,8.0);
6750 VARPOW(UI8,2,R4,3.0,R8,8.0);
6751 VARPOW(UI8,2,R8,3.0,R8,8.0);
6752 VARPOW(UI8,2,DATE,3,R8,8.0);
6753 VARPOW(UI8,2,BSTR,num3_str,R8,8.0);
6754 VARPOW(UI8,2,I1,3,R8,8.0);
6755 VARPOW(UI8,2,UI1,3,R8,8.0);
6756 VARPOW(UI8,2,UI2,3,R8,8.0);
6757 VARPOW(UI8,2,UI4,3,R8,8.0);
6758 VARPOW(UI8,2,I8,3,R8,8.0);
6759 VARPOW(UI8,2,UI8,3,R8,8.0);
6760 VARPOW(UI8,2,INT,3,R8,8.0);
6761 VARPOW(UI8,2,UINT,3,R8,8.0);
6763 VARPOW(INT,2,EMPTY,0,R8,1.0);
6764 VARPOW(INT,2,NULL,0,NULL,0);
6765 VARPOW(INT,2,I2,3,R8,8.0);
6766 VARPOW(INT,2,I4,3,R8,8.0);
6767 VARPOW(INT,2,R4,3.0,R8,8.0);
6768 VARPOW(INT,2,R8,3.0,R8,8.0);
6769 VARPOW(INT,2,DATE,3,R8,8.0);
6770 VARPOW(INT,2,BSTR,num3_str,R8,8.0);
6771 VARPOW(INT,2,BOOL,VARIANT_FALSE,R8,1.0);
6772 VARPOW(INT,2,I1,3,R8,8.0);
6773 VARPOW(INT,2,UI1,3,R8,8.0);
6774 VARPOW(INT,2,UI2,3,R8,8.0);
6775 VARPOW(INT,2,UI4,3,R8,8.0);
6776 if (HAVE_OLEAUT32_I8)
6778 VARPOW(INT,2,I8,3,R8,8.0);
6779 VARPOW(INT,2,UI8,3,R8,8.0);
6781 VARPOW(INT,2,INT,3,R8,8.0);
6782 VARPOW(INT,2,UINT,3,R8,8.0);
6783 VARPOW(UINT,2,EMPTY,0,R8,1.0);
6784 VARPOW(UINT,2,NULL,0,NULL,0);
6785 VARPOW(UINT,2,I2,3,R8,8.0);
6786 VARPOW(UINT,2,I4,3,R8,8.0);
6787 VARPOW(UINT,2,R4,3.0,R8,8.0);
6788 VARPOW(UINT,2,R8,3.0,R8,8.0);
6789 VARPOW(UINT,2,DATE,3,R8,8.0);
6790 VARPOW(UINT,2,BSTR,num3_str,R8,8.0);
6791 VARPOW(UINT,2,BOOL,VARIANT_FALSE,R8,1.0);
6792 VARPOW(UINT,2,I1,3,R8,8.0);
6793 VARPOW(UINT,2,UI1,3,R8,8.0);
6794 VARPOW(UINT,2,UI2,3,R8,8.0);
6795 VARPOW(UINT,2,UI4,3,R8,8.0);
6796 if (HAVE_OLEAUT32_I8)
6798 VARPOW(UINT,2,I8,3,R8,8.0);
6799 VARPOW(UINT,2,UI8,3,R8,8.0);
6801 VARPOW(UINT,2,INT,3,R8,8.0);
6802 VARPOW(UINT,2,UINT,3,R8,8.0);
6804 /* Manually test some VT_CY, VT_DECIMAL variants */
6806 hres = VarCyFromI4(2, &V_CY(&cy));
6807 ok(hres == S_OK, "VarCyFromI4 failed!\n");
6808 V_VT(&dec) = VT_DECIMAL;
6809 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
6810 ok(hres == S_OK, "VarDecFromR4 failed!\n");
6811 memset(&left, 0, sizeof(left));
6812 memset(&right, 0, sizeof(right));
6813 V_VT(&left) = VT_I4;
6815 V_VT(&right) = VT_I8;
6818 hres = pVarPow(&cy, &cy, &result);
6819 ok(hres == S_OK && V_VT(&result) == VT_R8,
6820 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6821 S_OK, hres, vtstr(V_VT(&result)));
6822 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6823 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
6825 hres = pVarPow(&cy, &right, &result);
6826 ok(hres == S_OK && V_VT(&result) == VT_R8,
6827 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6828 S_OK, hres, vtstr(V_VT(&result)));
6829 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6830 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
6832 hres = pVarPow(&left, &cy, &result);
6833 ok(hres == S_OK && V_VT(&result) == VT_R8,
6834 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6835 S_OK, hres, vtstr(V_VT(&result)));
6836 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 10000.0),
6837 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 10000.0);
6839 hres = pVarPow(&left, &dec, &result);
6840 ok(hres == S_OK && V_VT(&result) == VT_R8,
6841 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6842 S_OK, hres, vtstr(V_VT(&result)));
6843 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result),10000.0),
6844 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 10000.0);
6846 hres = pVarPow(&dec, &dec, &result);
6847 ok(hres == S_OK && V_VT(&result) == VT_R8,
6848 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type %s!\n",
6849 S_OK, hres, vtstr(V_VT(&result)));
6850 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6851 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
6853 hres = pVarPow(&dec, &right, &result);
6854 ok(hres == S_OK && V_VT(&result) == VT_R8,
6855 "VARPOW: expected coerced hres 0x%X type VT_R8, got hres 0x%X type%s!\n",
6856 S_OK, hres, vtstr(V_VT(&result)));
6857 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
6858 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
6860 SysFreeString(num2_str);
6861 SysFreeString(num3_str);
6864 static HRESULT (WINAPI *pVarDiv)(LPVARIANT,LPVARIANT,LPVARIANT);
6866 #define VARDIV(vt1,val1,vt2,val2,rvt,rval) \
6867 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6868 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6869 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6870 test_var_call2( __LINE__, pVarDiv, &left, &right, &exp );
6872 /* Skip any type that is not defined or produces a error for every case */
6873 #define SKIPTESTDIV(a) \
6874 if (a == VT_ERROR || a == VT_VARIANT || \
6875 a == VT_DISPATCH || a == VT_UNKNOWN || \
6876 a == VT_RECORD || a > VT_UINT || \
6877 a == VT_I1 || a == VT_UI8 || \
6878 a == VT_INT || a == VT_UINT || \
6879 a == VT_UI2 || a == VT_UI4 || \
6880 a == 15 /*not defined*/) \
6883 static void test_VarDiv(void)
6885 static const WCHAR str1[] = { '1','\0' };
6886 static const WCHAR str2[] = { '2','\0' };
6887 VARIANT left, right, exp, result, cy, dec;
6888 BSTR num1_str, num2_str;
6890 HRESULT hres, expectedhres;
6893 num1_str = SysAllocString(str1);
6894 num2_str = SysAllocString(str2);
6898 /* Test all possible flag/vt combinations & the resulting vt type */
6899 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
6901 VARTYPE leftvt, rightvt, resvt;
6903 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6905 SKIPTESTDIV(leftvt);
6907 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6910 SKIPTESTDIV(rightvt);
6912 /* Native crashes with VT_BYREF */
6913 if (ExtraFlags[i] == VT_BYREF)
6916 memset(&left, 0, sizeof(left));
6917 memset(&right, 0, sizeof(right));
6918 V_VT(&left) = leftvt | ExtraFlags[i];
6919 V_VT(&right) = rightvt | ExtraFlags[i];
6920 V_VT(&result) = VT_EMPTY;
6922 expectedhres = S_OK;
6924 if (leftvt == VT_BSTR)
6925 V_BSTR(&left) = num2_str;
6926 else if (leftvt == VT_DECIMAL)
6928 VarDecFromR8(2.0, &V_DECIMAL(&left));
6929 V_VT(&left) = leftvt | ExtraFlags[i];
6932 /* Division by 0 is undefined */
6936 V_BSTR(&right) = num2_str;
6939 VarDecFromR8(2.0, &V_DECIMAL(&right));
6940 V_VT(&right) = rightvt | ExtraFlags[i];
6943 V_BOOL(&right) = VARIANT_TRUE;
6945 case VT_I2: V_I2(&right) = 2; break;
6946 case VT_I4: V_I4(&right) = 2; break;
6947 case VT_R4: V_R4(&right) = 2.0; break;
6948 case VT_R8: V_R8(&right) = 2.0; break;
6949 case VT_CY: V_CY(&right).int64 = 2; break;
6950 case VT_DATE: V_DATE(&right) = 2; break;
6951 case VT_UI1: V_UI1(&right) = 2; break;
6952 case VT_I8: V_I8(&right) = 2; break;
6956 /* Determine return type */
6957 if (!(rightvt == VT_EMPTY))
6959 if (leftvt == VT_NULL || rightvt == VT_NULL)
6961 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
6963 else if (leftvt == VT_I8 || rightvt == VT_I8 ||
6964 leftvt == VT_CY || rightvt == VT_CY ||
6965 leftvt == VT_DATE || rightvt == VT_DATE ||
6966 leftvt == VT_I4 || rightvt == VT_I4 ||
6967 leftvt == VT_BSTR || rightvt == VT_BSTR ||
6968 leftvt == VT_I2 || rightvt == VT_I2 ||
6969 leftvt == VT_BOOL || rightvt == VT_BOOL ||
6970 leftvt == VT_R8 || rightvt == VT_R8 ||
6971 leftvt == VT_UI1 || rightvt == VT_UI1)
6973 if ((leftvt == VT_UI1 && rightvt == VT_R4) ||
6974 (leftvt == VT_R4 && rightvt == VT_UI1))
6976 else if ((leftvt == VT_R4 && (rightvt == VT_BOOL ||
6977 rightvt == VT_I2)) || (rightvt == VT_R4 &&
6978 (leftvt == VT_BOOL || leftvt == VT_I2)))
6983 else if (leftvt == VT_R4 || rightvt == VT_R4)
6986 else if (leftvt == VT_NULL && rightvt == VT_EMPTY)
6991 /* Native VarDiv always returns a error when using any extra flags */
6992 if (ExtraFlags[i] != 0)
6995 hres = pVarDiv(&left, &right, &result);
6997 /* Check expected HRESULT and if result variant type is correct */
6999 ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH ||
7000 hres == DISP_E_OVERFLOW || hres == DISP_E_DIVBYZERO,
7001 "VarDiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7002 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7003 vtstr(V_VT(&result)), hres);
7005 ok (hres == S_OK && resvt == V_VT(&result),
7006 "VarDiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7007 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7008 S_OK, vtstr(V_VT(&result)), hres);
7013 /* Test return values for all the good cases */
7014 VARDIV(EMPTY,0,NULL,0,NULL,0);
7015 VARDIV(EMPTY,0,I2,2,R8,0.0);
7016 VARDIV(EMPTY,0,I4,2,R8,0.0);
7017 VARDIV(EMPTY,0,R4,2.0,R4,0.0);
7018 VARDIV(EMPTY,0,R8,2.0,R8,0.0);
7019 VARDIV(EMPTY,0,DATE,2.0,R8,0.0);
7020 VARDIV(EMPTY,0,BSTR,num2_str,R8,0.0);
7021 VARDIV(EMPTY,0,BOOL,VARIANT_TRUE,R8,0.0);
7022 VARDIV(EMPTY,0,UI1,2,R8,0.0);
7023 VARDIV(EMPTY,0,I8,2,R8,0.0);
7024 VARDIV(NULL,0,EMPTY,0,NULL,0);
7025 VARDIV(NULL,0,NULL,0,NULL,0);
7026 VARDIV(NULL,0,I2,2,NULL,0);
7027 VARDIV(NULL,0,I4,2,NULL,0);
7028 VARDIV(NULL,0,R4,2.0,NULL,0);
7029 VARDIV(NULL,0,R8,2.0,NULL,0);
7030 VARDIV(NULL,0,DATE,2,NULL,0);
7031 VARDIV(NULL,0,BSTR,num2_str,NULL,0);
7032 VARDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
7033 VARDIV(NULL,0,UI1,2,NULL,0);
7034 VARDIV(NULL,0,I8,2,NULL,0);
7035 VARDIV(I2,2,NULL,0,NULL,0);
7036 VARDIV(I2,1,I2,2,R8,0.5);
7037 VARDIV(I2,1,I4,2,R8,0.5);
7038 VARDIV(I2,1,R4,2,R4,0.5);
7039 VARDIV(I2,1,R8,2.0,R8,0.5);
7040 VARDIV(I2,1,DATE,2,R8,0.5);
7041 VARDIV(I2,1,BOOL,VARIANT_TRUE,R8,-1.0);
7042 VARDIV(I2,1,UI1,2,R8,0.5);
7043 VARDIV(I2,1,I8,2,R8,0.5);
7044 VARDIV(I4,1,NULL,0,NULL,0);
7045 VARDIV(I4,1,I2,2,R8,0.5);
7046 VARDIV(I4,1,I4,2,R8,0.5);
7047 VARDIV(I4,1,R4,2.0,R8,0.5);
7048 VARDIV(I4,1,R8,2.0,R8,0.5);
7049 VARDIV(I4,1,DATE,2,R8,0.5);
7050 VARDIV(I4,1,BSTR,num2_str,R8,0.5);
7051 VARDIV(I4,1,BOOL,VARIANT_TRUE,R8,-1.0);
7052 VARDIV(I4,1,UI1,2,R8,0.5);
7053 VARDIV(I4,1,I8,2.0,R8,0.5);
7054 VARDIV(R4,1.0,NULL,0,NULL,0);
7055 VARDIV(R4,1.0,I2,2,R4,0.5);
7056 VARDIV(R4,1.0,I4,2,R8,0.5);
7057 VARDIV(R4,1.0,R4,2.0,R4,0.5);
7058 VARDIV(R4,1.0,R8,2.0,R8,0.5);
7059 VARDIV(R4,1.0,DATE,2,R8,0.5);
7060 VARDIV(R4,1.0,BSTR,num2_str,R8,0.5);
7061 VARDIV(R4,1.0,BOOL,VARIANT_TRUE,R4,-1);
7062 VARDIV(R4,1.0,UI1,2,R4,0.5);
7063 VARDIV(R4,1.0,I8,2,R8,0.5);
7064 VARDIV(R8,1.0,NULL,0,NULL,0);
7065 VARDIV(R8,1.0,I2,2,R8,0.5);
7066 VARDIV(R8,1.0,I4,2,R8,0.5);
7067 VARDIV(R8,1.0,R4,2.0,R8,0.5);
7068 VARDIV(R8,1.0,R8,2.0,R8,0.5);
7069 VARDIV(R8,1.0,DATE,2,R8,0.5);
7070 VARDIV(R8,1.0,BSTR,num2_str,R8,0.5);
7071 VARDIV(R8,1.0,BOOL,VARIANT_TRUE,R8,-1.0);
7072 VARDIV(R8,1.0,UI1,2,R8,0.5);
7073 VARDIV(R8,1.0,I8,2,R8,0.5);
7074 VARDIV(DATE,1,NULL,0,NULL,0);
7075 VARDIV(DATE,1,I2,2,R8,0.5);
7076 VARDIV(DATE,1,I4,2,R8,0.5);
7077 VARDIV(DATE,1,R4,2.0,R8,0.5);
7078 VARDIV(DATE,1,R8,2.0,R8,0.5);
7079 VARDIV(DATE,1,DATE,2,R8,0.5);
7080 VARDIV(DATE,1,BSTR,num2_str,R8,0.5);
7081 VARDIV(DATE,1,BOOL,VARIANT_TRUE,R8,-1.0);
7082 VARDIV(DATE,1,UI1,2,R8,0.5);
7083 VARDIV(DATE,1,I8,2,R8,0.5);
7084 VARDIV(BSTR,num1_str,NULL,0,NULL,0);
7085 VARDIV(BSTR,num1_str,I2,2,R8,0.5);
7086 VARDIV(BSTR,num1_str,I4,2,R8,0.5);
7087 VARDIV(BSTR,num1_str,R4,2.0,R8,0.5);
7088 VARDIV(BSTR,num1_str,R8,2.0,R8,0.5);
7089 VARDIV(BSTR,num1_str,DATE,2,R8,0.5);
7090 VARDIV(BSTR,num1_str,BSTR,num2_str,R8,0.5);
7091 VARDIV(BSTR,num1_str,BOOL,VARIANT_TRUE,R8,-1);
7092 VARDIV(BSTR,num1_str,UI1,2,R8,0.5);
7093 VARDIV(BSTR,num1_str,I8,2.0,R8,0.5);
7094 VARDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
7095 VARDIV(BOOL,VARIANT_TRUE,I2,1,R8,-1.0);
7096 VARDIV(BOOL,VARIANT_FALSE,I2,1,R8,0.0);
7097 VARDIV(BOOL,VARIANT_TRUE,I4,1,R8,-1.0);
7098 VARDIV(BOOL,VARIANT_FALSE,I4,1,R8,0.0);
7099 VARDIV(BOOL,VARIANT_TRUE,R4,1,R4,-1.0);
7100 VARDIV(BOOL,VARIANT_FALSE,R4,1,R4,0.0);
7101 VARDIV(BOOL,VARIANT_TRUE,R8,1.0,R8,-1.0);
7102 VARDIV(BOOL,VARIANT_FALSE,R8,1.0,R8,0.0);
7103 VARDIV(BOOL,VARIANT_FALSE,DATE,2,R8,0.0);
7104 VARDIV(BOOL,VARIANT_FALSE,BSTR,num2_str,R8,0.0);
7105 VARDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,1.0);
7106 VARDIV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,R8,0.0);
7107 VARDIV(BOOL,VARIANT_TRUE,UI1,1,R8,-1.0);
7108 VARDIV(BOOL,VARIANT_TRUE,I8,1,R8,-1.0);
7109 VARDIV(UI1,1,NULL,0,NULL,0);
7110 VARDIV(UI1,1,I2,2,R8,0.5);
7111 VARDIV(UI1,1,I4,2,R8,0.5);
7112 VARDIV(UI1,1,R4,2.0,R4,0.5);
7113 VARDIV(UI1,1,R8,2.0,R8,0.5);
7114 VARDIV(UI1,1,DATE,2,R8,0.5);
7115 VARDIV(UI1,1,BSTR,num2_str,R8,0.5);
7116 VARDIV(UI1,1,BOOL,VARIANT_TRUE,R8,-1);
7117 VARDIV(UI1,1,UI1,2,R8,0.5);
7118 VARDIV(UI1,1,I8,2,R8,0.5);
7119 VARDIV(I8,1,NULL,0,NULL,0);
7120 VARDIV(I8,1,I2,2,R8,0.5);
7121 VARDIV(I8,1,I4,2,R8,0.5);
7122 VARDIV(I8,1,R4,2.0,R8,0.5);
7123 VARDIV(I8,1,R8,2.0,R8,0.5);
7124 VARDIV(I8,1,DATE,2,R8,0.5);
7125 VARDIV(I8,1,BSTR,num2_str,R8,0.5);
7126 VARDIV(I8,1,BOOL,VARIANT_TRUE,R8,-1);
7127 VARDIV(I8,1,UI1,2,R8,0.5);
7128 VARDIV(I8,1,I8,2,R8,0.5);
7130 /* Manually test some VT_CY, VT_DECIMAL variants */
7132 hres = VarCyFromI4(10000, &V_CY(&cy));
7133 ok(hres == S_OK, "VarCyFromI4 failed!\n");
7134 V_VT(&dec) = VT_DECIMAL;
7135 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
7136 ok(hres == S_OK, "VarDecFromR4 failed!\n");
7137 memset(&left, 0, sizeof(left));
7138 memset(&right, 0, sizeof(right));
7139 V_VT(&left) = VT_I4;
7141 V_VT(&right) = VT_UI1;
7144 hres = pVarDiv(&cy, &cy, &result);
7145 ok(hres == S_OK && V_VT(&result) == VT_R8,
7146 "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7147 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 1.0),
7148 "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)1.0);
7150 hres = pVarDiv(&cy, &right, &result);
7151 ok(hres == S_OK && V_VT(&result) == VT_R8,
7152 "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7153 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 5000.0),
7154 "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)5000.0);
7156 hres = pVarDiv(&left, &cy, &result);
7157 ok(hres == S_OK && V_VT(&result) == VT_R8,
7158 "VARDIV: expected coerced type VT_R8, got %s!\n", vtstr(V_VT(&result)));
7159 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0.01),
7160 "VARDIV: CY value %f, expected %f\n", V_R8(&result), (double)0.01);
7162 hres = pVarDiv(&left, &dec, &result);
7163 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7164 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7165 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7166 ok(hres == S_OK && EQ_DOUBLE(r, 50.0),
7167 "VARDIV: DECIMAL value %f, expected %f\n", r, (double)50.0);
7169 hres = pVarDiv(&dec, &dec, &result);
7170 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7171 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7172 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7173 ok(hres == S_OK && EQ_DOUBLE(r, 1.0),
7174 "VARDIV: DECIMAL value %f, expected %f\n", r, (double)1.0);
7176 hres = pVarDiv(&dec, &right, &result);
7177 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
7178 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", vtstr(V_VT(&result)));
7179 hres = VarR8FromDec(&V_DECIMAL(&result), &r);
7180 ok(hres == S_OK && EQ_DOUBLE(r, 1.0),
7181 "VARDIV: DECIMAL value %f, expected %f\n", r, (double)1.0);
7183 /* Check for division by zero and overflow */
7184 V_VT(&left) = VT_R8;
7186 V_VT(&right) = VT_R8;
7188 hres = pVarDiv(&left, &right, &result);
7189 ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7190 "VARDIV: Division by (1.0/0.0) should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7192 V_VT(&left) = VT_R8;
7194 V_VT(&right) = VT_R8;
7196 hres = pVarDiv(&left, &right, &result);
7197 ok(hres == DISP_E_OVERFLOW && V_VT(&result) == VT_EMPTY,
7198 "VARDIV: Division by (0.0/0.0) should result in DISP_E_OVERFLOW but got 0x%X\n", hres);
7200 SysFreeString(num1_str);
7201 SysFreeString(num2_str);
7204 static HRESULT (WINAPI *pVarIdiv)(LPVARIANT,LPVARIANT,LPVARIANT);
7206 #define VARIDIV(vt1,val1,vt2,val2,rvt,rval) \
7207 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
7208 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
7209 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
7210 test_var_call2( __LINE__, pVarIdiv, &left, &right, &exp );
7212 /* Skip any type that is not defined or produces a error for every case */
7213 #define SKIPTESTIDIV(a) \
7214 if (a == VT_ERROR || a == VT_VARIANT || \
7215 a == VT_DISPATCH || a == VT_UNKNOWN || \
7216 a == VT_RECORD || a > VT_UINT || \
7217 a == 15 /*not defined*/) \
7220 static void test_VarIdiv(void)
7222 static const WCHAR str1[] = { '1','\0' };
7223 static const WCHAR str2[] = { '2','\0' };
7224 VARIANT left, right, exp, result, cy, dec;
7225 BSTR num1_str, num2_str;
7231 num1_str = SysAllocString(str1);
7232 num2_str = SysAllocString(str2);
7234 /* Test all possible flag/vt combinations & the resulting vt type */
7235 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
7237 VARTYPE leftvt, rightvt, resvt;
7239 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7241 SKIPTESTIDIV(leftvt);
7243 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7246 SKIPTESTIDIV(rightvt);
7248 /* Native crashes with extra flag VT_BYREF */
7249 if (ExtraFlags[i] == VT_BYREF)
7252 memset(&left, 0, sizeof(left));
7253 memset(&right, 0, sizeof(right));
7254 V_VT(&left) = leftvt | ExtraFlags[i];
7255 V_VT(&right) = rightvt | ExtraFlags[i];
7256 V_VT(&result) = VT_EMPTY;
7259 if (leftvt == VT_BSTR)
7260 V_BSTR(&left) = num2_str;
7261 else if (leftvt == VT_DECIMAL)
7263 VarDecFromR8(2.0, &V_DECIMAL(&left));
7264 V_VT(&left) = leftvt | ExtraFlags[i];
7267 /* Division by 0 is undefined */
7271 V_BSTR(&right) = num2_str;
7274 VarDecFromR8(2.0, &V_DECIMAL(&right));
7275 V_VT(&right) = rightvt | ExtraFlags[i];
7278 V_BOOL(&right) = VARIANT_TRUE;
7281 VarCyFromI4(10000, &V_CY(&right));
7282 V_VT(&right) = rightvt | ExtraFlags[i];
7284 case VT_I2: V_I2(&right) = 2; break;
7285 case VT_I4: V_I4(&right) = 2; break;
7286 case VT_R4: V_R4(&right) = 2.0; break;
7287 case VT_R8: V_R8(&right) = 2.0; break;
7288 case VT_DATE: V_DATE(&right) = 2; break;
7289 case VT_I1: V_I1(&right) = 2; break;
7290 case VT_UI1: V_UI1(&right) = 2; break;
7291 case VT_UI2: V_UI2(&right) = 2; break;
7292 case VT_UI4: V_UI4(&right) = 2; break;
7293 case VT_I8: V_I8(&right) = 2; break;
7294 case VT_UI8: V_UI8(&right) = 2; break;
7295 case VT_INT: V_INT(&right) = 2; break;
7296 case VT_UINT: V_UINT(&right) = 2; break;
7300 /* Native VarIdiv always returns a error when using any extra
7301 * flags or if the variant combination is I8 and INT.
7303 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
7304 (leftvt == VT_INT && rightvt == VT_I8) ||
7305 (rightvt == VT_EMPTY && leftvt != VT_NULL) ||
7309 /* Determine variant type */
7310 else if (leftvt == VT_NULL || rightvt == VT_NULL)
7312 else if (leftvt == VT_I8 || rightvt == VT_I8)
7314 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
7315 leftvt == VT_INT || rightvt == VT_INT ||
7316 leftvt == VT_UINT || rightvt == VT_UINT ||
7317 leftvt == VT_UI8 || rightvt == VT_UI8 ||
7318 leftvt == VT_UI4 || rightvt == VT_UI4 ||
7319 leftvt == VT_UI2 || rightvt == VT_UI2 ||
7320 leftvt == VT_I1 || rightvt == VT_I1 ||
7321 leftvt == VT_BSTR || rightvt == VT_BSTR ||
7322 leftvt == VT_DATE || rightvt == VT_DATE ||
7323 leftvt == VT_CY || rightvt == VT_CY ||
7324 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
7325 leftvt == VT_R8 || rightvt == VT_R8 ||
7326 leftvt == VT_R4 || rightvt == VT_R4)
7328 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
7329 leftvt == VT_BOOL || rightvt == VT_BOOL ||
7332 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
7337 hres = pVarIdiv(&left, &right, &result);
7339 /* Check expected HRESULT and if result variant type is correct */
7341 ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH ||
7342 hres == DISP_E_DIVBYZERO,
7343 "VarIdiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7344 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7345 vtstr(V_VT(&result)), hres);
7347 ok (hres == S_OK && resvt == V_VT(&result),
7348 "VarIdiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7349 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7350 S_OK, vtstr(V_VT(&result)), hres);
7355 /* Test return values for all the good cases */
7356 VARIDIV(EMPTY,0,NULL,0,NULL,0);
7357 VARIDIV(EMPTY,0,I2,1,I2,0);
7358 VARIDIV(EMPTY,0,I4,1,I4,0);
7359 VARIDIV(EMPTY,0,R4,1.0,I4,0);
7360 VARIDIV(EMPTY,0,R8,1.0,I4,0);
7361 VARIDIV(EMPTY,0,DATE,1.0,I4,0);
7362 VARIDIV(EMPTY,0,BSTR,num1_str,I4,0);
7363 VARIDIV(EMPTY,0,BOOL,VARIANT_TRUE,I2,0);
7364 VARIDIV(EMPTY,0,I1,1,I4,0);
7365 VARIDIV(EMPTY,0,UI1,1,I2,0);
7366 VARIDIV(EMPTY,0,UI2,1,I4,0);
7367 VARIDIV(EMPTY,0,UI4,1,I4,0);
7368 VARIDIV(EMPTY,0,I8,1,I8,0);
7369 VARIDIV(EMPTY,0,UI8,1,I4,0);
7370 VARIDIV(EMPTY,0,INT,1,I4,0);
7371 VARIDIV(EMPTY,0,UINT,1,I4,0);
7372 VARIDIV(NULL,0,EMPTY,0,NULL,0);
7373 VARIDIV(NULL,0,NULL,0,NULL,0);
7374 VARIDIV(NULL,0,I2,1,NULL,0);
7375 VARIDIV(NULL,0,I4,1,NULL,0);
7376 VARIDIV(NULL,0,R4,1,NULL,0);
7377 VARIDIV(NULL,0,R8,1,NULL,0);
7378 VARIDIV(NULL,0,DATE,1,NULL,0);
7379 VARIDIV(NULL,0,BSTR,num1_str,NULL,0);
7380 VARIDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
7381 VARIDIV(NULL,0,I1,1,NULL,0);
7382 VARIDIV(NULL,0,UI1,1,NULL,0);
7383 VARIDIV(NULL,0,UI2,1,NULL,0);
7384 VARIDIV(NULL,0,UI4,1,NULL,0);
7385 VARIDIV(NULL,0,I8,1,NULL,0);
7386 VARIDIV(NULL,0,UI8,1,NULL,0);
7387 VARIDIV(NULL,0,INT,1,NULL,0);
7388 VARIDIV(NULL,0,UINT,1,NULL,0);
7389 VARIDIV(I2,2,NULL,0,NULL,0);
7390 VARIDIV(I2,2,I2,1,I2,2);
7391 VARIDIV(I2,2,I4,1,I4,2);
7392 VARIDIV(I2,2,R4,1,I4,2);
7393 VARIDIV(I2,2,R8,1,I4,2);
7394 VARIDIV(I2,2,DATE,1,I4,2);
7395 VARIDIV(I2,2,BSTR,num1_str,I4,2);
7396 VARIDIV(I2,2,BOOL,VARIANT_TRUE,I2,-2);
7397 VARIDIV(I2,2,I1,1,I4,2);
7398 VARIDIV(I2,2,UI1,1,I2,2);
7399 VARIDIV(I2,2,UI2,1,I4,2);
7400 VARIDIV(I2,2,UI4,1,I4,2);
7401 VARIDIV(I2,2,I8,1,I8,2);
7402 VARIDIV(I2,2,UI8,1,I4,2);
7403 VARIDIV(I2,2,INT,1,I4,2);
7404 VARIDIV(I2,2,UINT,1,I4,2);
7405 VARIDIV(I4,2,NULL,0,NULL,0);
7406 VARIDIV(I4,2,I2,1,I4,2);
7407 VARIDIV(I4,2,I4,1,I4,2);
7408 VARIDIV(I4,2,R4,1,I4,2);
7409 VARIDIV(I4,2,R8,1,I4,2);
7410 VARIDIV(I4,2,DATE,1,I4,2);
7411 VARIDIV(I4,2,BSTR,num1_str,I4,2);
7412 VARIDIV(I4,2,BOOL,VARIANT_TRUE,I4,-2);
7413 VARIDIV(I4,2,I1,1,I4,2);
7414 VARIDIV(I4,2,UI1,1,I4,2);
7415 VARIDIV(I4,2,UI2,1,I4,2);
7416 VARIDIV(I4,2,UI4,1,I4,2);
7417 VARIDIV(I4,2,I8,1,I8,2);
7418 VARIDIV(I4,2,UI8,1,I4,2);
7419 VARIDIV(I4,2,INT,1,I4,2);
7420 VARIDIV(I4,2,UINT,1,I4,2);
7421 VARIDIV(R4,2.0,NULL,0,NULL,0);
7422 VARIDIV(R4,2.0,I2,1,I4,2);
7423 VARIDIV(R4,2.0,I4,1,I4,2);
7424 VARIDIV(R4,2.0,R4,1.0,I4,2);
7425 VARIDIV(R4,2.0,R8,1.0,I4,2);
7426 VARIDIV(R4,2.0,DATE,1,I4,2);
7427 VARIDIV(R4,2.0,BSTR,num1_str,I4,2);
7428 VARIDIV(R4,2.0,BOOL,VARIANT_TRUE,I4,-2);
7429 VARIDIV(R4,2.0,I1,1,I4,2);
7430 VARIDIV(R4,2.0,UI1,1,I4,2);
7431 VARIDIV(R4,2.0,UI2,1,I4,2);
7432 VARIDIV(R4,2.0,UI4,1,I4,2);
7433 VARIDIV(R4,2.0,I8,1,I8,2);
7434 VARIDIV(R4,2.0,UI8,1,I4,2);
7435 VARIDIV(R4,2.0,INT,1,I4,2);
7436 VARIDIV(R4,2.0,UINT,1,I4,2);
7437 VARIDIV(R8,2.0,NULL,0,NULL,0);
7438 VARIDIV(R8,2.0,I2,1,I4,2);
7439 VARIDIV(R8,2.0,I4,1,I4,2);
7440 VARIDIV(R8,2.0,R4,1,I4,2);
7441 VARIDIV(R8,2.0,R8,1,I4,2);
7442 VARIDIV(R8,2.0,DATE,1,I4,2);
7443 VARIDIV(R8,2.0,BSTR,num1_str,I4,2);
7444 VARIDIV(R8,2.0,BOOL,VARIANT_TRUE,I4,-2);
7445 VARIDIV(R8,2.0,I1,1,I4,2);
7446 VARIDIV(R8,2.0,UI1,1,I4,2);
7447 VARIDIV(R8,2.0,UI2,1,I4,2);
7448 VARIDIV(R8,2.0,UI4,1,I4,2);
7449 VARIDIV(R8,2.0,I8,1,I8,2);
7450 VARIDIV(R8,2.0,UI8,1,I4,2);
7451 VARIDIV(R8,2.0,INT,1,I4,2);
7452 VARIDIV(R8,2.0,UINT,1,I4,2);
7453 VARIDIV(DATE,2,NULL,0,NULL,0);
7454 VARIDIV(DATE,2,I2,1,I4,2);
7455 VARIDIV(DATE,2,I4,1,I4,2);
7456 VARIDIV(DATE,2,R4,1,I4,2);
7457 VARIDIV(DATE,2,R8,1,I4,2);
7458 VARIDIV(DATE,2,DATE,1,I4,2);
7459 VARIDIV(DATE,2,BSTR,num1_str,I4,2);
7460 VARIDIV(DATE,2,BOOL,VARIANT_TRUE,I4,-2);
7461 VARIDIV(DATE,2,I1,1,I4,2);
7462 VARIDIV(DATE,2,UI1,1,I4,2);
7463 VARIDIV(DATE,2,UI2,1,I4,2);
7464 VARIDIV(DATE,2,UI4,1,I4,2);
7465 VARIDIV(DATE,2,I8,1,I8,2);
7466 VARIDIV(DATE,2,UI8,1,I4,2);
7467 VARIDIV(DATE,2,INT,1,I4,2);
7468 VARIDIV(DATE,2,UINT,1,I4,2);
7469 VARIDIV(BSTR,num2_str,NULL,0,NULL,0);
7470 VARIDIV(BSTR,num2_str,I2,1,I4,2);
7471 VARIDIV(BSTR,num2_str,I4,1,I4,2);
7472 VARIDIV(BSTR,num2_str,R4,1.0,I4,2);
7473 VARIDIV(BSTR,num2_str,R8,1.0,I4,2);
7474 VARIDIV(BSTR,num2_str,DATE,1,I4,2);
7475 VARIDIV(BSTR,num2_str,BSTR,num1_str,I4,2);
7476 VARIDIV(BSTR,num2_str,BOOL,VARIANT_TRUE,I4,-2);
7477 VARIDIV(BSTR,num2_str,I1,1,I4,2);
7478 VARIDIV(BSTR,num2_str,UI1,1,I4,2);
7479 VARIDIV(BSTR,num2_str,UI2,1,I4,2);
7480 VARIDIV(BSTR,num2_str,UI4,1,I4,2);
7481 VARIDIV(BSTR,num2_str,I8,1,I8,2);
7482 VARIDIV(BSTR,num2_str,UI8,1,I4,2);
7483 VARIDIV(BSTR,num2_str,INT,1,I4,2);
7484 VARIDIV(BSTR,num2_str,UINT,1,I4,2);
7485 VARIDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
7486 VARIDIV(BOOL,VARIANT_TRUE,I2,1,I2,-1);
7487 VARIDIV(BOOL,VARIANT_TRUE,I4,1,I4,-1);
7488 VARIDIV(BOOL,VARIANT_TRUE,R4,1.0,I4,-1);
7489 VARIDIV(BOOL,VARIANT_TRUE,R8,1.0,I4,-1);
7490 VARIDIV(BOOL,VARIANT_TRUE,DATE,1,I4,-1);
7491 VARIDIV(BOOL,VARIANT_TRUE,BSTR,num1_str,I4,-1);
7492 VARIDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,I2,1);
7493 VARIDIV(BOOL,VARIANT_TRUE,I1,1,I4,-1);
7494 VARIDIV(BOOL,VARIANT_TRUE,UI1,1,I2,-1);
7495 VARIDIV(BOOL,VARIANT_TRUE,UI2,1,I4,-1);
7496 VARIDIV(BOOL,VARIANT_TRUE,UI4,1,I4,-1);
7497 VARIDIV(BOOL,VARIANT_TRUE,I8,1,I8,-1);
7498 VARIDIV(BOOL,VARIANT_TRUE,UI8,1,I4,-1);
7499 VARIDIV(BOOL,VARIANT_TRUE,INT,1,I4,-1);
7500 VARIDIV(BOOL,VARIANT_TRUE,UINT,1,I4,-1);
7501 VARIDIV(I1,2,NULL,0,NULL,0);
7502 VARIDIV(I1,2,I2,1,I4,2);
7503 VARIDIV(I1,2,I4,1,I4,2);
7504 VARIDIV(I1,2,R4,1.0,I4,2);
7505 VARIDIV(I1,2,R8,1.0,I4,2);
7506 VARIDIV(I1,2,DATE,1,I4,2);
7507 VARIDIV(I1,2,BSTR,num1_str,I4,2);
7508 VARIDIV(I1,2,BOOL,VARIANT_TRUE,I4,-2);
7509 VARIDIV(I1,2,I1,1,I4,2);
7510 VARIDIV(I1,2,UI1,1,I4,2);
7511 VARIDIV(I1,2,UI2,1,I4,2);
7512 VARIDIV(I1,2,UI4,1,I4,2);
7513 VARIDIV(I1,2,I8,1,I8,2);
7514 VARIDIV(I1,2,UI8,1,I4,2);
7515 VARIDIV(I1,2,INT,1,I4,2);
7516 VARIDIV(I1,2,UINT,1,I4,2);
7517 VARIDIV(UI1,2,NULL,0,NULL,0);
7518 VARIDIV(UI1,2,I2,1,I2,2);
7519 VARIDIV(UI1,2,I4,1,I4,2);
7520 VARIDIV(UI1,2,R4,1.0,I4,2);
7521 VARIDIV(UI1,2,R8,1.0,I4,2);
7522 VARIDIV(UI1,2,DATE,1,I4,2);
7523 VARIDIV(UI1,2,BSTR,num1_str,I4,2);
7524 VARIDIV(UI1,2,BOOL,VARIANT_TRUE,I2,-2);
7525 VARIDIV(UI1,2,I1,1,I4,2);
7526 VARIDIV(UI1,2,UI1,1,UI1,2);
7527 VARIDIV(UI1,2,UI2,1,I4,2);
7528 VARIDIV(UI1,2,UI4,1,I4,2);
7529 VARIDIV(UI1,2,I8,1,I8,2);
7530 VARIDIV(UI1,2,UI8,1,I4,2);
7531 VARIDIV(UI1,2,INT,1,I4,2);
7532 VARIDIV(UI1,2,UINT,1,I4,2);
7533 VARIDIV(UI2,2,NULL,0,NULL,0);
7534 VARIDIV(UI2,2,I2,1,I4,2);
7535 VARIDIV(UI2,2,I4,1,I4,2);
7536 VARIDIV(UI2,2,R4,1.0,I4,2);
7537 VARIDIV(UI2,2,R8,1.0,I4,2);
7538 VARIDIV(UI2,2,DATE,1,I4,2);
7539 VARIDIV(UI2,2,BSTR,num1_str,I4,2);
7540 VARIDIV(UI2,2,BOOL,VARIANT_TRUE,I4,-2);
7541 VARIDIV(UI2,2,I1,1,I4,2);
7542 VARIDIV(UI2,2,UI1,1,I4,2);
7543 VARIDIV(UI2,2,UI2,1,I4,2);
7544 VARIDIV(UI2,2,UI4,1,I4,2);
7545 VARIDIV(UI2,2,I8,1,I8,2);
7546 VARIDIV(UI2,2,UI8,1,I4,2);
7547 VARIDIV(UI2,2,INT,1,I4,2);
7548 VARIDIV(UI2,2,UINT,1,I4,2);
7549 VARIDIV(UI4,2,NULL,0,NULL,0);
7550 VARIDIV(UI4,2,I2,1,I4,2);
7551 VARIDIV(UI4,2,I4,1,I4,2);
7552 VARIDIV(UI4,2,R4,1.0,I4,2);
7553 VARIDIV(UI4,2,R8,1.0,I4,2);
7554 VARIDIV(UI4,2,DATE,1,I4,2);
7555 VARIDIV(UI4,2,BSTR,num1_str,I4,2);
7556 VARIDIV(UI4,2,BOOL,VARIANT_TRUE,I4,-2);
7557 VARIDIV(UI4,2,I1,1,I4,2);
7558 VARIDIV(UI4,2,UI1,1,I4,2);
7559 VARIDIV(UI4,2,UI2,1,I4,2);
7560 VARIDIV(UI4,2,UI4,1,I4,2);
7561 VARIDIV(UI4,2,I8,1,I8,2);
7562 VARIDIV(UI4,2,UI8,1,I4,2);
7563 VARIDIV(UI4,2,INT,1,I4,2);
7564 VARIDIV(UI4,2,UINT,1,I4,2);
7565 VARIDIV(I8,2,NULL,0,NULL,0);
7566 VARIDIV(I8,2,I2,1,I8,2);
7567 VARIDIV(I8,2,I4,1,I8,2);
7568 VARIDIV(I8,2,R4,1.0,I8,2);
7569 VARIDIV(I8,2,R8,1.0,I8,2);
7570 VARIDIV(I8,2,DATE,1,I8,2);
7571 VARIDIV(I8,2,BSTR,num1_str,I8,2);
7572 VARIDIV(I8,2,BOOL,1,I8,2);
7573 VARIDIV(I8,2,I1,1,I8,2);
7574 VARIDIV(I8,2,UI1,1,I8,2);
7575 VARIDIV(I8,2,UI2,1,I8,2);
7576 VARIDIV(I8,2,UI4,1,I8,2);
7577 VARIDIV(I8,2,I8,1,I8,2);
7578 VARIDIV(I8,2,UI8,1,I8,2);
7579 VARIDIV(I8,2,UINT,1,I8,2);
7580 VARIDIV(UI8,2,NULL,0,NULL,0);
7581 VARIDIV(UI8,2,I2,1,I4,2);
7582 VARIDIV(UI8,2,I4,1,I4,2);
7583 VARIDIV(UI8,2,R4,1.0,I4,2);
7584 VARIDIV(UI8,2,R8,1.0,I4,2);
7585 VARIDIV(UI8,2,DATE,1,I4,2);
7586 VARIDIV(UI8,2,BSTR,num1_str,I4,2);
7587 VARIDIV(UI8,2,BOOL,VARIANT_TRUE,I4,-2);
7588 VARIDIV(UI8,2,I1,1,I4,2);
7589 VARIDIV(UI8,2,UI1,1,I4,2);
7590 VARIDIV(UI8,2,UI2,1,I4,2);
7591 VARIDIV(UI8,2,UI4,1,I4,2);
7592 VARIDIV(UI8,2,I8,1,I8,2);
7593 VARIDIV(UI8,2,UI8,1,I4,2);
7594 VARIDIV(UI8,2,INT,1,I4,2);
7595 VARIDIV(UI8,2,UINT,1,I4,2);
7596 VARIDIV(INT,2,NULL,0,NULL,0);
7597 VARIDIV(INT,2,I2,1,I4,2);
7598 VARIDIV(INT,2,I4,1,I4,2);
7599 VARIDIV(INT,2,R4,1.0,I4,2);
7600 VARIDIV(INT,2,R8,1.0,I4,2);
7601 VARIDIV(INT,2,DATE,1,I4,2);
7602 VARIDIV(INT,2,BSTR,num1_str,I4,2);
7603 VARIDIV(INT,2,BOOL,VARIANT_TRUE,I4,-2);
7604 VARIDIV(INT,2,I1,1,I4,2);
7605 VARIDIV(INT,2,UI1,1,I4,2);
7606 VARIDIV(INT,2,UI2,1,I4,2);
7607 VARIDIV(INT,2,UI4,1,I4,2);
7608 VARIDIV(INT,2,UI8,1,I4,2);
7609 VARIDIV(INT,2,INT,1,I4,2);
7610 VARIDIV(INT,2,UINT,1,I4,2);
7611 VARIDIV(UINT,2,NULL,0,NULL,0);
7612 VARIDIV(UINT,2,I2,1,I4,2);
7613 VARIDIV(UINT,2,I4,1,I4,2);
7614 VARIDIV(UINT,2,R4,1.0,I4,2);
7615 VARIDIV(UINT,2,R8,1.0,I4,2);
7616 VARIDIV(UINT,2,DATE,1,I4,2);
7617 VARIDIV(UINT,2,BSTR,num1_str,I4,2);
7618 VARIDIV(UINT,2,BOOL,VARIANT_TRUE,I4,-2);
7619 VARIDIV(UINT,2,I1,1,I4,2);
7620 VARIDIV(UINT,2,UI1,1,I4,2);
7621 VARIDIV(UINT,2,UI2,1,I4,2);
7622 VARIDIV(UINT,2,UI4,1,I4,2);
7623 VARIDIV(UINT,2,I8,1,I8,2);
7624 VARIDIV(UINT,2,UI8,1,I4,2);
7625 VARIDIV(UINT,2,INT,1,I4,2);
7626 VARIDIV(UINT,2,UINT,1,I4,2);
7628 /* Manually test some VT_CY, VT_DECIMAL variants */
7630 hres = VarCyFromI4(10000, &V_CY(&cy));
7631 ok(hres == S_OK, "VarCyFromI4 failed!\n");
7632 V_VT(&dec) = VT_DECIMAL;
7633 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
7634 ok(hres == S_OK, "VarDecFromR4 failed!\n");
7635 memset(&left, 0, sizeof(left));
7636 memset(&right, 0, sizeof(right));
7637 V_VT(&left) = VT_I4;
7639 V_VT(&right) = VT_I8;
7642 hres = VarIdiv(&cy, &cy, &result);
7643 ok(hres == S_OK && V_VT(&result) == VT_I4,
7644 "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7645 S_OK, hres, vtstr(V_VT(&result)));
7646 ok(hres == S_OK && V_I4(&result) == 1,
7647 "VARIDIV: CY value %d, expected %d\n", V_I4(&result), 1);
7649 hres = VarIdiv(&cy, &right, &result);
7650 ok(hres == S_OK && V_VT(&result) == VT_I8,
7651 "VARIDIV: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
7652 S_OK, hres, vtstr(V_VT(&result)));
7653 ok(hres == S_OK && V_I8(&result) == 5000,
7654 "VARIDIV: CY value 0x%x%08x, expected 0x%x\n",
7655 (DWORD)(V_I8(&result) >>32), (DWORD)V_I8(&result), 5000);
7657 hres = VarIdiv(&left, &cy, &result);
7658 ok(hres == S_OK && V_VT(&result) == VT_I4,
7659 "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7660 S_OK, hres, vtstr(V_VT(&result)));
7661 ok(hres == S_OK && V_I4(&result) == 0,
7662 "VARIDIV: CY value %d, expected %d\n", V_I4(&result), 0);
7664 hres = VarIdiv(&left, &dec, &result);
7665 ok(hres == S_OK && V_VT(&result) == VT_I4,
7666 "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7667 S_OK, hres, vtstr(V_VT(&result)));
7668 ok(hres == S_OK && V_I4(&result) == 50,
7669 "VARIDIV: DECIMAL value %d, expected %d\n", V_I4(&result), 50);
7671 hres = VarIdiv(&dec, &dec, &result);
7672 ok(hres == S_OK && V_VT(&result) == VT_I4,
7673 "VARIDIV: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
7674 S_OK, hres, vtstr(V_VT(&result)));
7675 ok(hres == S_OK && V_I4(&result) == 1,
7676 "VARIDIV: DECIMAL value %d, expected %d\n", V_I4(&result), 1);
7678 hres = VarIdiv(&dec, &right, &result);
7679 ok(hres == S_OK && V_VT(&result) == VT_I8,
7680 "VARIDIV: expected coerced hres 0x%X type VT_I8, got hres 0x%X type%s!\n",
7681 S_OK, hres, vtstr(V_VT(&result)));
7682 ok(hres == S_OK && V_I8(&result) == 1,
7683 "VARIDIV: DECIMAL value 0x%x%08x, expected %d\n",
7684 (DWORD)(V_I8(&result) >> 32), (DWORD)V_I8(&result), 1);
7686 /* Check for division by zero */
7687 V_VT(&left) = VT_INT;
7689 V_VT(&right) = VT_INT;
7691 hres = pVarIdiv(&left, &right, &result);
7692 ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7693 "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7695 V_VT(&left) = VT_INT;
7697 V_VT(&right) = VT_INT;
7699 hres = pVarIdiv(&left, &right, &result);
7700 ok(hres == DISP_E_DIVBYZERO && V_VT(&result) == VT_EMPTY,
7701 "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%X\n", hres);
7703 SysFreeString(num1_str);
7704 SysFreeString(num2_str);
7708 static HRESULT (WINAPI *pVarImp)(LPVARIANT,LPVARIANT,LPVARIANT);
7710 #define VARIMP(vt1,val1,vt2,val2,rvt,rval) \
7711 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
7712 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
7713 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
7714 test_var_call2( __LINE__, pVarImp, &left, &right, &exp );
7716 /* Skip any type that is not defined or produces a error for every case */
7717 #define SKIPTESTIMP(a) \
7718 if (a == VT_ERROR || a == VT_VARIANT || \
7719 a == VT_DISPATCH || a == VT_UNKNOWN || \
7720 a == VT_RECORD || a > VT_UINT || \
7721 a == 15 /*not defined*/) \
7724 static void test_VarImp(void)
7726 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
7727 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
7728 VARIANT left, right, exp, result, cy, dec;
7729 BSTR true_str, false_str;
7735 true_str = SysAllocString(szTrue);
7736 false_str = SysAllocString(szFalse);
7738 /* Test all possible flag/vt combinations & the resulting vt type */
7739 for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
7741 VARTYPE leftvt, rightvt, resvt;
7743 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7745 SKIPTESTIMP(leftvt);
7747 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7750 SKIPTESTIMP(rightvt);
7752 /* Native crashes using the the extra flag VT_BYREF
7753 * or with the following VT combinations
7755 if ((leftvt == VT_UI4 && rightvt == VT_BSTR) ||
7756 (leftvt == VT_UI8 && rightvt == VT_BSTR) ||
7757 ExtraFlags[i] == VT_BYREF)
7760 memset(&left, 0, sizeof(left));
7761 memset(&right, 0, sizeof(right));
7762 V_VT(&left) = leftvt | ExtraFlags[i];
7763 V_VT(&right) = rightvt | ExtraFlags[i];
7764 V_VT(&result) = VT_EMPTY;
7767 if (leftvt == VT_BSTR)
7768 V_BSTR(&left) = true_str;
7770 /* This allows us to test return types that are not NULL
7771 * (NULL Imp value = n, NULL Imp 0 = NULL)
7776 V_BSTR(&right) = true_str;
7779 VarDecFromR8(2.0, &V_DECIMAL(&right));
7780 V_VT(&right) = rightvt | ExtraFlags[i];
7783 V_BOOL(&right) = VARIANT_TRUE;
7785 case VT_I1: V_I1(&right) = 2; break;
7786 case VT_I2: V_I2(&right) = 2; break;
7787 case VT_I4: V_I4(&right) = 2; break;
7788 case VT_R4: V_R4(&right) = 2.0; break;
7789 case VT_R8: V_R8(&right) = 2.0; break;
7790 case VT_CY: V_CY(&right).int64 = 10000; break;
7791 case VT_DATE: V_DATE(&right) = 2; break;
7792 case VT_I8: V_I8(&right) = 2; break;
7793 case VT_INT: V_INT(&right) = 2; break;
7794 case VT_UINT: V_UINT(&right) = 2; break;
7795 case VT_UI1: V_UI1(&right) = 2; break;
7796 case VT_UI2: V_UI2(&right) = 2; break;
7797 case VT_UI4: V_UI4(&right) = 2; break;
7798 case VT_UI8: V_UI8(&right) = 2; break;
7802 /* Native VarImp always returns a error when using any extra
7803 * flags or if the variants are I8 and INT.
7805 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
7809 /* Determine result type */
7810 else if ((leftvt == VT_BSTR && rightvt == VT_NULL) ||
7811 (leftvt == VT_NULL && rightvt == VT_NULL) ||
7812 (leftvt == VT_NULL && rightvt == VT_EMPTY))
7814 else if (leftvt == VT_I8 || rightvt == VT_I8)
7816 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
7817 leftvt == VT_INT || rightvt == VT_INT ||
7818 leftvt == VT_UINT || rightvt == VT_UINT ||
7819 leftvt == VT_UI4 || rightvt == VT_UI4 ||
7820 leftvt == VT_UI8 || rightvt == VT_UI8 ||
7821 leftvt == VT_UI2 || rightvt == VT_UI2 ||
7822 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
7823 leftvt == VT_DATE || rightvt == VT_DATE ||
7824 leftvt == VT_CY || rightvt == VT_CY ||
7825 leftvt == VT_R8 || rightvt == VT_R8 ||
7826 leftvt == VT_R4 || rightvt == VT_R4 ||
7827 leftvt == VT_I1 || rightvt == VT_I1)
7829 else if ((leftvt == VT_UI1 && rightvt == VT_UI1) ||
7830 (leftvt == VT_UI1 && rightvt == VT_NULL) ||
7831 (leftvt == VT_NULL && rightvt == VT_UI1))
7833 else if (leftvt == VT_EMPTY || rightvt == VT_EMPTY ||
7834 leftvt == VT_I2 || rightvt == VT_I2 ||
7835 leftvt == VT_UI1 || rightvt == VT_UI1)
7837 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
7838 leftvt == VT_BSTR || rightvt == VT_BSTR)
7841 hres = pVarImp(&left, &right, &result);
7843 /* Check expected HRESULT and if result variant type is correct */
7845 ok (hres == DISP_E_BADVARTYPE || hres == DISP_E_TYPEMISMATCH,
7846 "VarImp: %s|0x%X, %s|0x%X: got vt %s hr 0x%X\n",
7847 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i],
7848 vtstr(V_VT(&result)), hres);
7850 ok (hres == S_OK && resvt == V_VT(&result),
7851 "VarImp: %s|0x%X, %s|0x%X: expected vt %s hr 0x%X, got vt %s hr 0x%X\n",
7852 vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
7853 S_OK, vtstr(V_VT(&result)), hres);
7858 VARIMP(EMPTY,0,EMPTY,0,I2,-1);
7859 VARIMP(EMPTY,0,NULL,0,I2,-1);
7860 VARIMP(EMPTY,0,I2,-1,I2,-1);
7861 VARIMP(EMPTY,0,I4,-1,I4,-1);
7862 VARIMP(EMPTY,0,R4,0.0,I4,-1);
7863 VARIMP(EMPTY,0,R8,-1.0,I4,-1);
7864 VARIMP(EMPTY,0,DATE,0,I4,-1);
7865 VARIMP(EMPTY,0,BSTR,true_str,I2,-1);
7866 VARIMP(EMPTY,0,BOOL,VARIANT_FALSE,I2,-1);
7867 VARIMP(EMPTY,0,I1,0,I4,-1);
7868 VARIMP(EMPTY,0,UI1,1,I2,-1);
7869 VARIMP(EMPTY,0,UI2,1,I4,-1);
7870 VARIMP(EMPTY,0,UI4,1,I4,-1);
7871 VARIMP(EMPTY,0,I8,1,I8,-1);
7872 VARIMP(EMPTY,0,UI8,1,I4,-1);
7873 VARIMP(EMPTY,0,INT,-1,I4,-1);
7874 VARIMP(EMPTY,0,UINT,1,I4,-1);
7875 VARIMP(NULL,0,EMPTY,0,NULL,0);
7876 VARIMP(NULL,0,NULL,0,NULL,0);
7877 VARIMP(NULL,0,I2,-1,I2,-1);
7878 VARIMP(NULL,0,I4,-1,I4,-1);
7879 VARIMP(NULL,0,R4,0.0,NULL,0);
7880 VARIMP(NULL,0,R8,-1.0,I4,-1);
7881 VARIMP(NULL,0,DATE,0,NULL,0);
7882 VARIMP(NULL,0,BSTR,true_str,BOOL,-1);
7883 VARIMP(NULL,0,BOOL,VARIANT_FALSE,NULL,0);
7884 VARIMP(NULL,0,I1,0,NULL,0);
7885 VARIMP(NULL,0,UI1,1,UI1,1);
7886 VARIMP(NULL,0,UI2,1,I4,1);
7887 VARIMP(NULL,0,UI4,1,I4,1);
7888 VARIMP(NULL,0,I8,1,I8,1);
7889 VARIMP(NULL,0,UI8,1,I4,1);
7890 VARIMP(NULL,0,INT,-1,I4,-1);
7891 VARIMP(NULL,0,UINT,1,I4,1);
7892 VARIMP(I2,-1,EMPTY,0,I2,0);
7893 VARIMP(I2,-1,I2,-1,I2,-1);
7894 VARIMP(I2,-1,I4,-1,I4,-1);
7895 VARIMP(I2,-1,R4,0.0,I4,0);
7896 VARIMP(I2,-1,R8,-1.0,I4,-1);
7897 VARIMP(I2,-1,DATE,0,I4,0);
7898 VARIMP(I2,-1,BSTR,true_str,I2,-1);
7899 VARIMP(I2,-1,BOOL,VARIANT_FALSE,I2,0);
7900 VARIMP(I2,-1,I1,0,I4,0);
7901 VARIMP(I2,-1,UI1,1,I2,1);
7902 VARIMP(I2,-1,UI2,1,I4,1);
7903 VARIMP(I2,-1,UI4,1,I4,1);
7904 VARIMP(I2,-1,I8,1,I8,1);
7905 VARIMP(I2,-1,UI8,1,I4,1);
7906 VARIMP(I2,-1,INT,-1,I4,-1);
7907 VARIMP(I2,-1,UINT,1,I4,1);
7908 VARIMP(I4,2,EMPTY,0,I4,-3);
7909 VARIMP(I4,2,NULL,0,I4,-3);
7910 VARIMP(I4,2,I2,-1,I4,-1);
7911 VARIMP(I4,2,I4,-1,I4,-1);
7912 VARIMP(I4,2,R4,0.0,I4,-3);
7913 VARIMP(I4,2,R8,-1.0,I4,-1);
7914 VARIMP(I4,2,DATE,0,I4,-3);
7915 VARIMP(I4,2,BSTR,true_str,I4,-1);
7916 VARIMP(I4,2,BOOL,VARIANT_FALSE,I4,-3);
7917 VARIMP(I4,2,I1,0,I4,-3);
7918 VARIMP(I4,2,UI1,1,I4,-3);
7919 VARIMP(I4,2,UI2,1,I4,-3);
7920 VARIMP(I4,2,UI4,1,I4,-3);
7921 VARIMP(I4,2,I8,1,I8,-3);
7922 VARIMP(I4,2,UI8,1,I4,-3);
7923 VARIMP(I4,2,INT,-1,I4,-1);
7924 VARIMP(I4,2,UINT,1,I4,-3);
7925 VARIMP(R4,-1.0,EMPTY,0,I4,0);
7926 VARIMP(R4,-1.0,NULL,0,NULL,0);
7927 VARIMP(R4,-1.0,I2,-1,I4,-1);
7928 VARIMP(R4,-1.0,I4,-1,I4,-1);
7929 VARIMP(R4,-1.0,R4,0.0,I4,0);
7930 VARIMP(R4,-1.0,R8,-1.0,I4,-1);
7931 VARIMP(R4,-1.0,DATE,1,I4,1);
7932 VARIMP(R4,-1.0,BSTR,true_str,I4,-1);
7933 VARIMP(R4,-1.0,BOOL,VARIANT_FALSE,I4,0);
7934 VARIMP(R4,-1.0,I1,0,I4,0);
7935 VARIMP(R4,-1.0,UI1,1,I4,1);
7936 VARIMP(R4,-1.0,UI2,1,I4,1);
7937 VARIMP(R4,-1.0,UI4,1,I4,1);
7938 VARIMP(R4,-1.0,I8,1,I8,1);
7939 VARIMP(R4,-1.0,UI8,1,I4,1);
7940 VARIMP(R4,-1.0,INT,-1,I4,-1);
7941 VARIMP(R4,-1.0,UINT,1,I4,1);
7942 VARIMP(R8,1.0,EMPTY,0,I4,-2);
7943 VARIMP(R8,1.0,NULL,0,I4,-2);
7944 VARIMP(R8,1.0,I2,-1,I4,-1);
7945 VARIMP(R8,1.0,I4,-1,I4,-1);
7946 VARIMP(R8,1.0,R4,0.0,I4,-2);
7947 VARIMP(R8,1.0,R8,-1.0,I4,-1);
7948 VARIMP(R8,1.0,DATE,0,I4,-2);
7949 VARIMP(R8,1.0,BSTR,true_str,I4,-1);
7950 VARIMP(R8,1.0,BOOL,VARIANT_FALSE,I4,-2);
7951 VARIMP(R8,1.0,I1,0,I4,-2);
7952 VARIMP(R8,1.0,UI1,1,I4,-1);
7953 VARIMP(R8,1.0,UI2,1,I4,-1);
7954 VARIMP(R8,1.0,UI4,1,I4,-1);
7955 VARIMP(R8,1.0,I8,1,I8,-1);
7956 VARIMP(R8,1.0,UI8,1,I4,-1);
7957 VARIMP(R8,1.0,INT,-1,I4,-1);
7958 VARIMP(R8,1.0,UINT,1,I4,-1);
7959 VARIMP(DATE,0,EMPTY,0,I4,-1);
7960 VARIMP(DATE,0,NULL,0,I4,-1);
7961 VARIMP(DATE,0,I2,-1,I4,-1);
7962 VARIMP(DATE,0,I4,-1,I4,-1);
7963 VARIMP(DATE,0,R4,0.0,I4,-1);
7964 VARIMP(DATE,0,R8,-1.0,I4,-1);
7965 VARIMP(DATE,0,DATE,0,I4,-1);
7966 VARIMP(DATE,0,BSTR,true_str,I4,-1);
7967 VARIMP(DATE,0,BOOL,VARIANT_FALSE,I4,-1);
7968 VARIMP(DATE,0,I1,0,I4,-1);
7969 VARIMP(DATE,0,UI1,1,I4,-1);
7970 VARIMP(DATE,0,UI2,1,I4,-1);
7971 VARIMP(DATE,0,UI4,1,I4,-1);
7972 VARIMP(DATE,0,I8,1,I8,-1);
7973 VARIMP(DATE,0,UI8,1,I4,-1);
7974 VARIMP(DATE,0,INT,-1,I4,-1);
7975 VARIMP(DATE,0,UINT,1,I4,-1);
7976 VARIMP(BSTR,false_str,EMPTY,0,I2,-1);
7977 VARIMP(BSTR,false_str,NULL,0,BOOL,-1);
7978 VARIMP(BSTR,false_str,I2,-1,I2,-1);
7979 VARIMP(BSTR,false_str,I4,-1,I4,-1);
7980 VARIMP(BSTR,false_str,R4,0.0,I4,-1);
7981 VARIMP(BSTR,false_str,R8,-1.0,I4,-1);
7982 VARIMP(BSTR,false_str,DATE,0,I4,-1);
7983 VARIMP(BSTR,false_str,BSTR,true_str,BOOL,-1);
7984 VARIMP(BSTR,false_str,BOOL,VARIANT_FALSE,BOOL,-1);
7985 VARIMP(BSTR,false_str,I1,0,I4,-1);
7986 VARIMP(BSTR,false_str,UI1,1,I2,-1);
7987 VARIMP(BSTR,false_str,UI2,1,I4,-1);
7988 VARIMP(BSTR,false_str,UI4,1,I4,-1);
7989 VARIMP(BSTR,false_str,I8,1,I8,-1);
7990 VARIMP(BSTR,false_str,UI8,1,I4,-1);
7991 VARIMP(BSTR,false_str,INT,-1,I4,-1);
7992 VARIMP(BSTR,false_str,UINT,1,I4,-1);
7993 VARIMP(BOOL,VARIANT_TRUE,EMPTY,0,I2,0);
7994 VARIMP(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
7995 VARIMP(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
7996 VARIMP(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
7997 VARIMP(BOOL,VARIANT_TRUE,R4,0.0,I4,0);
7998 VARIMP(BOOL,VARIANT_TRUE,R8,-1.0,I4,-1);
7999 VARIMP(BOOL,VARIANT_TRUE,DATE,0,I4,0);
8000 VARIMP(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,-1);
8001 VARIMP(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,0);
8002 VARIMP(BOOL,VARIANT_TRUE,I1,0,I4,0);
8003 VARIMP(BOOL,VARIANT_TRUE,UI1,1,I2,1);
8004 VARIMP(BOOL,VARIANT_TRUE,UI2,1,I4,1);
8005 VARIMP(BOOL,VARIANT_TRUE,UI4,1,I4,1);
8006 VARIMP(BOOL,VARIANT_TRUE,I8,1,I8,1);
8007 VARIMP(BOOL,VARIANT_TRUE,UI8,1,I4,1);
8008 VARIMP(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
8009 VARIMP(BOOL,VARIANT_TRUE,UINT,1,I4,1);
8010 VARIMP(I1,-1,EMPTY,0,I4,0);
8011 VARIMP(I1,-1,NULL,0,NULL,0);
8012 VARIMP(I1,-1,I2,-1,I4,-1);
8013 VARIMP(I1,-1,I4,-1,I4,-1);
8014 VARIMP(I1,-1,R4,0.0,I4,0);
8015 VARIMP(I1,-1,R8,-1.0,I4,-1);
8016 VARIMP(I1,-1,DATE,0,I4,0);
8017 VARIMP(I1,-1,BSTR,true_str,I4,-1);
8018 VARIMP(I1,-1,BOOL,VARIANT_FALSE,I4,0);
8019 VARIMP(I1,-1,I1,0,I4,0);
8020 VARIMP(I1,-1,UI1,1,I4,1);
8021 VARIMP(I1,-1,UI2,1,I4,1);
8022 VARIMP(I1,-1,UI4,1,I4,1);
8023 VARIMP(I1,-1,I8,1,I8,1);
8024 VARIMP(I1,-1,UI8,1,I4,1);
8025 VARIMP(I1,-1,INT,-1,I4,-1);
8026 VARIMP(I1,-1,UINT,1,I4,1);
8027 VARIMP(UI1,0,EMPTY,0,I2,-1);
8028 VARIMP(UI1,0,NULL,0,UI1,255);
8029 VARIMP(UI1,0,I2,-1,I2,-1);
8030 VARIMP(UI1,0,I4,-1,I4,-1);
8031 VARIMP(UI1,0,R4,0.0,I4,-1);
8032 VARIMP(UI1,0,R8,-1.0,I4,-1);
8033 VARIMP(UI1,0,DATE,0,I4,-1);
8034 VARIMP(UI1,0,BSTR,true_str,I2,-1);
8035 VARIMP(UI1,0,BOOL,VARIANT_FALSE,I2,-1);
8036 VARIMP(UI1,0,I1,0,I4,-1);
8037 VARIMP(UI1,0,UI1,1,UI1,255);
8038 VARIMP(UI1,0,UI2,1,I4,-1);
8039 VARIMP(UI1,0,UI4,1,I4,-1);
8040 VARIMP(UI1,0,I8,1,I8,-1);
8041 VARIMP(UI1,0,UI8,1,I4,-1);
8042 VARIMP(UI1,0,INT,-1,I4,-1);
8043 VARIMP(UI1,0,UINT,1,I4,-1);
8044 VARIMP(UI2,0,EMPTY,0,I4,-1);
8045 VARIMP(UI2,0,NULL,0,I4,-1);
8046 VARIMP(UI2,0,I2,-1,I4,-1);
8047 VARIMP(UI2,0,I4,-1,I4,-1);
8048 VARIMP(UI2,0,R4,0.0,I4,-1);
8049 VARIMP(UI2,0,R8,-1.0,I4,-1);
8050 VARIMP(UI2,0,DATE,0,I4,-1);
8051 VARIMP(UI2,0,BSTR,true_str,I4,-1);
8052 VARIMP(UI2,0,BOOL,VARIANT_FALSE,I4,-1);
8053 VARIMP(UI2,0,I1,0,I4,-1);
8054 VARIMP(UI2,0,UI1,1,I4,-1);
8055 VARIMP(UI2,0,UI2,1,I4,-1);
8056 VARIMP(UI2,0,UI4,1,I4,-1);
8057 VARIMP(UI2,0,I8,1,I8,-1);
8058 VARIMP(UI2,0,UI8,1,I4,-1);
8059 VARIMP(UI2,0,INT,-1,I4,-1);
8060 VARIMP(UI2,0,UINT,1,I4,-1);
8061 VARIMP(UI4,0,EMPTY,0,I4,-1);
8062 VARIMP(UI4,0,NULL,0,I4,-1);
8063 VARIMP(UI4,0,I2,-1,I4,-1);
8064 VARIMP(UI4,0,I4,-1,I4,-1);
8065 VARIMP(UI4,0,R4,0.0,I4,-1);
8066 VARIMP(UI4,0,R8,-1.0,I4,-1);
8067 VARIMP(UI4,0,DATE,0,I4,-1);
8068 VARIMP(UI4,0,BSTR,true_str,I4,-1);
8069 VARIMP(UI4,0,BOOL,VARIANT_FALSE,I4,-1);
8070 VARIMP(UI4,0,I1,0,I4,-1);
8071 VARIMP(UI4,0,UI1,1,I4,-1);
8072 VARIMP(UI4,0,UI2,1,I4,-1);
8073 VARIMP(UI4,0,UI4,1,I4,-1);
8074 VARIMP(UI4,0,I8,1,I8,-1);
8075 VARIMP(UI4,0,UI8,1,I4,-1);
8076 VARIMP(UI4,0,INT,-1,I4,-1);
8077 VARIMP(UI4,0,UINT,1,I4,-1);
8078 VARIMP(I8,-1,EMPTY,0,I8,0);
8079 VARIMP(I8,-1,NULL,0,NULL,0);
8080 VARIMP(I8,-1,I2,-1,I8,-1);
8081 VARIMP(I8,-1,I4,-1,I8,-1);
8082 VARIMP(I8,-1,R4,0.0,I8,0);
8083 VARIMP(I8,-1,R8,-1.0,I8,-1);
8084 VARIMP(I8,-1,DATE,0,I8,0);
8085 VARIMP(I8,-1,BSTR,true_str,I8,-1);
8086 VARIMP(I8,-1,BOOL,VARIANT_FALSE,I8,0);
8087 VARIMP(I8,-1,I1,0,I8,0);
8088 VARIMP(I8,-1,UI1,1,I8,1);
8089 VARIMP(I8,-1,UI2,1,I8,1);
8090 VARIMP(I8,-1,UI4,1,I8,1);
8091 VARIMP(I8,-1,I8,1,I8,1);
8092 VARIMP(I8,-1,UI8,1,I8,1);
8093 VARIMP(I8,-1,UINT,1,I8,1);
8094 VARIMP(UI8,0,EMPTY,0,I4,-1);
8095 VARIMP(UI8,0,NULL,0,I4,-1);
8096 VARIMP(UI8,0,I2,-1,I4,-1);
8097 VARIMP(UI8,0,I4,-1,I4,-1);
8098 VARIMP(UI8,0,R4,0.0,I4,-1);
8099 VARIMP(UI8,0,R8,-1.0,I4,-1);
8100 VARIMP(UI8,0,DATE,0,I4,-1);
8101 VARIMP(UI8,0,BSTR,true_str,I4,-1);
8102 VARIMP(UI8,0,BOOL,VARIANT_FALSE,I4,-1);
8103 VARIMP(UI8,0,I1,0,I4,-1);
8104 VARIMP(UI8,0,UI1,1,I4,-1);
8105 VARIMP(UI8,0,UI2,1,I4,-1);
8106 VARIMP(UI8,0,UI4,1,I4,-1);
8107 VARIMP(UI8,0,I8,1,I8,-1);
8108 VARIMP(UI8,0,UI8,1,I4,-1);
8109 VARIMP(UI8,0,INT,-1,I4,-1);
8110 VARIMP(UI8,0,UINT,1,I4,-1);
8111 VARIMP(INT,-1,EMPTY,0,I4,0);
8112 VARIMP(INT,-1,NULL,0,NULL,0);
8113 VARIMP(INT,-1,I2,-1,I4,-1);
8114 VARIMP(INT,-1,I4,-1,I4,-1);
8115 VARIMP(INT,-1,R4,0.0,I4,0);
8116 VARIMP(INT,-1,R8,-1.0,I4,-1);
8117 VARIMP(INT,-1,DATE,0,I4,0);
8118 VARIMP(INT,-1,BSTR,true_str,I4,-1);
8119 VARIMP(INT,-1,BOOL,VARIANT_FALSE,I4,0);
8120 VARIMP(INT,-1,I1,0,I4,0);
8121 VARIMP(INT,-1,UI1,1,I4,1);
8122 VARIMP(INT,-1,UI2,1,I4,1);
8123 VARIMP(INT,-1,UI4,1,I4,1);
8124 VARIMP(INT,-1,I8,1,I8,1);
8125 VARIMP(INT,-1,UI8,1,I4,1);
8126 VARIMP(INT,-1,INT,-1,I4,-1);
8127 VARIMP(INT,-1,UINT,1,I4,1);
8128 VARIMP(UINT,1,EMPTY,0,I4,-2);
8129 VARIMP(UINT,1,NULL,0,I4,-2);
8130 VARIMP(UINT,1,I2,-1,I4,-1);
8131 VARIMP(UINT,1,I4,-1,I4,-1);
8132 VARIMP(UINT,1,R4,0.0,I4,-2);
8133 VARIMP(UINT,1,R8,-1.0,I4,-1);
8134 VARIMP(UINT,1,DATE,0,I4,-2);
8135 VARIMP(UINT,1,BSTR,true_str,I4,-1);
8136 VARIMP(UINT,1,BOOL,VARIANT_FALSE,I4,-2);
8137 VARIMP(UINT,1,I1,0,I4,-2);
8138 VARIMP(UINT,1,UI1,1,I4,-1);
8139 VARIMP(UINT,1,UI2,1,I4,-1);
8140 VARIMP(UINT,1,UI4,1,I4,-1);
8141 VARIMP(UINT,1,I8,1,I8,-1);
8142 VARIMP(UINT,1,UI8,1,I4,-1);
8143 VARIMP(UINT,1,INT,-1,I4,-1);
8144 VARIMP(UINT,1,UINT,1,I4,-1);
8146 /* Manually test some VT_CY, VT_DECIMAL variants */
8148 hres = VarCyFromI4(1, &V_CY(&cy));
8149 ok(hres == S_OK, "VarCyFromI4 failed!\n");
8150 V_VT(&dec) = VT_DECIMAL;
8151 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
8152 ok(hres == S_OK, "VarDecFromR4 failed!\n");
8153 memset(&left, 0, sizeof(left));
8154 memset(&right, 0, sizeof(right));
8155 V_VT(&left) = VT_I4;
8157 V_VT(&right) = VT_I8;
8160 hres = pVarImp(&cy, &cy, &result);
8161 ok(hres == S_OK && V_VT(&result) == VT_I4,
8162 "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8163 S_OK, hres, vtstr(V_VT(&result)));
8164 ok(hres == S_OK && V_I4(&result) == -1,
8165 "VARIMP: CY value %d, expected %d\n", V_I4(&result), -1);
8167 hres = pVarImp(&cy, &right, &result);
8168 ok(hres == S_OK && V_VT(&result) == VT_I8,
8169 "VARIMP: expected coerced hres 0x%X type VT_I8, got hres 0x%X type %s!\n",
8170 S_OK, hres, vtstr(V_VT(&result)));
8171 ok(hres == S_OK && V_I8(&result) == -2,
8172 "VARIMP: CY value %x%08x, expected %d\n",
8173 (DWORD)((V_I8(&result)) >> 32), (DWORD)(V_I8(&result)), -2);
8175 hres = pVarImp(&left, &cy, &result);
8176 ok(hres == S_OK && V_VT(&result) == VT_I4,
8177 "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8178 S_OK, hres, vtstr(V_VT(&result)));
8179 ok(hres == S_OK && V_I4(&result) == -1,
8180 "VARIMP: CY value %d, expected %d\n", V_I4(&result), -1);
8182 hres = pVarImp(&left, &dec, &result);
8183 ok(hres == S_OK && V_VT(&result) == VT_I4,
8184 "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8185 S_OK, hres, vtstr(V_VT(&result)));
8186 ok(hres == S_OK && V_I4(&result) == -1,
8187 "VARIMP: DECIMAL value %d, expected %d\n", V_I4(&result), -1);
8189 hres = pVarImp(&dec, &dec, &result);
8190 ok(hres == S_OK && V_VT(&result) == VT_I4,
8191 "VARIMP: expected coerced hres 0x%X type VT_I4, got hres 0x%X type %s!\n",
8192 S_OK, hres, vtstr(V_VT(&result)));
8193 ok(hres == S_OK && V_I4(&result) == -1,
8194 "VARIMP: DECIMAL value %d, expected %d\n", V_I4(&result), -1);
8196 hres = pVarImp(&dec, &right, &result);
8197 ok(hres == S_OK && V_VT(&result) == VT_I8,
8198 "VARIMP: expected coerced hres 0x%X type VT_I8, got hres 0x%X type%s!\n",
8199 S_OK, hres, vtstr(V_VT(&result)));
8200 ok(hres == S_OK && V_I8(&result) == -3,
8201 "VARIMP: DECIMAL value 0x%x%08x, expected %d\n",
8202 (DWORD)(V_I8(&result) >>32), (DWORD)V_I8(&result), -3);
8204 SysFreeString(false_str);
8205 SysFreeString(true_str);
8210 hOleaut32 = LoadLibraryA("oleaut32.dll");
8213 test_VariantClear();
8215 test_VariantCopyInd();
8216 test_VarParseNumFromStr();
8217 test_VarNumFromParseNum();
8218 test_VarUdateFromDate();
8219 test_VarDateFromUdate();
8220 test_SystemTimeToVariantTime();
8221 test_VariantTimeToSystemTime();
8222 test_DosDateTimeToVariantTime();
8223 test_VariantTimeToDosDateTime();