ReactOS 0.4.17-dev-357-ga8f14ff
vartest.c
Go to the documentation of this file.
1/*
2 * VARIANT test program
3 *
4 * Copyright 1998 Jean-Claude Cote
5 * Copyright 2006 Google (Benjamin Arai)
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include <stdarg.h>
23#include <stdio.h>
24#include <math.h>
25#include <float.h>
26
27#define COBJMACROS
28#define CONST_VTABLE
29
30#include "windef.h"
31#include "winbase.h"
32#include "winsock2.h"
33#include "winuser.h"
34#include "wingdi.h"
35#include "winnls.h"
36#include "winerror.h"
37#include "winnt.h"
38
39#include "wtypes.h"
40#include "oleauto.h"
41
42#include "wine/test.h"
43
44#ifdef __REACTOS__
45/* FIXME: Removing these hacks requires fixing our incompatible wine/test.h and wine/debug.h. */
46static inline const char* wine_dbg_sprintf(const char* format, ...)
47{
48 static char buffer[256];
51 vsnprintf(buffer, sizeof(buffer), format, args);
52 va_end(args);
53 return buffer;
54}
55
56#if defined(__oaidl_h__) && defined(V_VT)
57static inline const char *wine_dbgstr_vt( VARTYPE vt )
58{
59 static const char *const variant_types[] =
60 {
61 "VT_EMPTY","VT_NULL","VT_I2","VT_I4","VT_R4","VT_R8","VT_CY","VT_DATE",
62 "VT_BSTR","VT_DISPATCH","VT_ERROR","VT_BOOL","VT_VARIANT","VT_UNKNOWN",
63 "VT_DECIMAL","15","VT_I1","VT_UI1","VT_UI2","VT_UI4","VT_I8","VT_UI8",
64 "VT_INT","VT_UINT","VT_VOID","VT_HRESULT","VT_PTR","VT_SAFEARRAY",
65 "VT_CARRAY","VT_USERDEFINED","VT_LPSTR","VT_LPWSTR","32","33","34","35",
66 "VT_RECORD","VT_INT_PTR","VT_UINT_PTR","39","40","41","42","43","44","45",
67 "46","47","48","49","50","51","52","53","54","55","56","57","58","59","60",
68 "61","62","63","VT_FILETIME","VT_BLOB","VT_STREAM","VT_STORAGE",
69 "VT_STREAMED_OBJECT","VT_STORED_OBJECT","VT_BLOB_OBJECT","VT_CF","VT_CLSID",
70 "VT_VERSIONED_STREAM"
71 };
72
73 static const char *const variant_flags[16] =
74 {
75 "",
76 "|VT_VECTOR",
77 "|VT_ARRAY",
78 "|VT_VECTOR|VT_ARRAY",
79 "|VT_BYREF",
80 "|VT_VECTOR|VT_BYREF",
81 "|VT_ARRAY|VT_BYREF",
82 "|VT_VECTOR|VT_ARRAY|VT_BYREF",
83 "|VT_RESERVED",
84 "|VT_VECTOR|VT_RESERVED",
85 "|VT_ARRAY|VT_RESERVED",
86 "|VT_VECTOR|VT_ARRAY|VT_RESERVED",
87 "|VT_BYREF|VT_RESERVED",
88 "|VT_VECTOR|VT_BYREF|VT_RESERVED",
89 "|VT_ARRAY|VT_BYREF|VT_RESERVED",
90 "|VT_VECTOR|VT_ARRAY|VT_BYREF|VT_RESERVED",
91 };
92
93 if (vt & ~VT_TYPEMASK)
94 return wine_dbg_sprintf( "%s%s", wine_dbgstr_vt(vt&VT_TYPEMASK), variant_flags[vt>>12] );
95
96 if (vt < sizeof(variant_types)/sizeof(*variant_types))
97 return variant_types[vt];
98
99 if (vt == VT_BSTR_BLOB)
100 return "VT_BSTR_BLOB";
101
102 return wine_dbg_sprintf( "vt(invalid %x)", vt );
103}
104#endif /* defined(__oaidl_h__) && defined(V_VT) */
105#endif /* __REACTOS__ */
106
108
109static const WCHAR sz12[] = {'1','2','\0'};
110/* the strings are localized */
111static WCHAR sz12_false[32];
112static WCHAR sz12_true[32];
113
114/* Get a conversion function ptr, return if function not available */
115#define CHECKPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func); \
116 if (!p##func) { win_skip("function " # func " not available, not testing it\n"); return; }
117
118/* Has I8/UI8 data type? */
120
121/* When comparing floating point values we cannot expect an exact match
122 * because the rounding errors depend on the exact algorithm.
123 */
124#define EQ_DOUBLE(a,b) (fabs((a)-(b)) / (1.0+fabs(a)+fabs(b)) < 1e-14)
125#define EQ_FLOAT(a,b) (fabs((a)-(b)) / (1.0+fabs(a)+fabs(b)) < 1e-7)
126
127#define SKIPTESTS(a) if((a > VT_CLSID+10) && (a < VT_BSTR_BLOB-10)) continue
128
129/* Allow our test macros to work for VT_NULL and VT_EMPTY too */
130#define V_EMPTY(v) V_I4(v)
131#define V_NULL(v) V_I4(v)
132
133/* Size constraints for overflow tests */
134#define I1_MAX 0x7f
135#define I1_MIN ((-I1_MAX)-1)
136#define UI1_MAX 0xff
137#define UI1_MIN 0
138#define I2_MAX 0x7fff
139#define I2_MIN ((-I2_MAX)-1)
140#define UI2_MAX 0xffff
141#define UI2_MIN 0
142#define I4_MAX 0x7fffffff
143#define I4_MIN ((-I4_MAX)-1)
144#define UI4_MAX 0xffffffff
145#define UI4_MIN 0
146#define I8_MAX (((LONGLONG)I4_MAX << 32) | UI4_MAX)
147#define I8_MIN ((-I8_MAX)-1)
148#define UI8_MAX (((ULONGLONG)UI4_MAX << 32) | UI4_MAX)
149#define UI8_MIN 0
150#define DATE_MAX 2958465
151#define DATE_MIN -657434
152#define R4_MAX FLT_MAX
153#define R4_MIN FLT_MIN
154#define R8_MAX DBL_MAX
155#define R8_MIN DBL_MIN
156
157#define DEFINE_EXPECT(func) \
158 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
159
160#define SET_EXPECT(func) \
161 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
162
163#define CHECK_EXPECT2(func) \
164 do { \
165 ok(expect_ ##func, "unexpected call " #func "\n"); \
166 called_ ## func = TRUE; \
167 }while(0)
168
169#define CHECK_EXPECT(func) \
170 do { \
171 CHECK_EXPECT2(func); \
172 expect_ ## func = FALSE; \
173 }while(0)
174
175#define CHECK_CALLED(func) \
176 do { \
177 ok(called_ ## func, "expected " #func "\n"); \
178 expect_ ## func = called_ ## func = FALSE; \
179 }while(0)
180
181DEFINE_EXPECT(dispatch_invoke);
182
183typedef struct
184{
189
191{
192 return CONTAINING_RECORD(iface, DummyDispatch, IDispatch_iface);
193}
194
196{
197 return 2;
198}
199
201{
202 return 1;
203}
204
206 REFIID riid,
207 void** ppvObject)
208{
209 *ppvObject = NULL;
210
213 {
214 *ppvObject = iface;
215 IDispatch_AddRef(iface);
216 }
217
218 return *ppvObject ? S_OK : E_NOINTERFACE;
219}
220
222{
223 ok(0, "Unexpected call\n");
224 return E_NOTIMPL;
225}
226
228{
229 ok(0, "Unexpected call\n");
230 return E_NOTIMPL;
231}
232
234 UINT cnames, LCID lcid, DISPID *dispid)
235{
236 ok(0, "Unexpected call\n");
237 return E_NOTIMPL;
238}
239
241 DISPID dispid, REFIID riid,
243 DISPPARAMS *params,
244 VARIANT *res,
245 EXCEPINFO *ei,
246 UINT *arg_err)
247{
249
250 CHECK_EXPECT(dispatch_invoke);
251
252 ok(dispid == DISPID_VALUE, "got dispid %ld\n", dispid);
253 ok(IsEqualIID(riid, &IID_NULL), "go riid %s\n", wine_dbgstr_guid(riid));
254 ok(wFlags == DISPATCH_PROPERTYGET, "Flags wrong\n");
255
256 ok(params->rgvarg == NULL, "got %p\n", params->rgvarg);
257 ok(params->rgdispidNamedArgs == NULL, "got %p\n", params->rgdispidNamedArgs);
258 ok(params->cArgs == 0, "got %d\n", params->cArgs);
259 ok(params->cNamedArgs == 0, "got %d\n", params->cNamedArgs);
260
261 ok(res != NULL, "got %p\n", res);
262 ok(V_VT(res) == VT_EMPTY, "got %d\n", V_VT(res));
263 ok(ei == NULL, "got %p\n", ei);
264 ok(arg_err == NULL, "got %p\n", arg_err);
265
266 if (FAILED(This->result))
267 return This->result;
268
269 V_VT(res) = This->vt;
270 if (This->vt == VT_UI1)
271 V_UI1(res) = 34;
272 else if (This->vt == VT_NULL)
273 {
274 V_VT(res) = VT_NULL;
275 V_BSTR(res) = NULL;
276 }
277 else
278 memset(res, 0, sizeof(*res));
279
280 return S_OK;
281}
282
283static const IDispatchVtbl DummyDispatch_VTable =
284{
292};
293
295{
296 dispatch->IDispatch_iface.lpVtbl = &DummyDispatch_VTable;
297 dispatch->vt = vt;
298 dispatch->result = S_OK;
299}
300
301typedef struct IRecordInfoImpl
302{
304 LONG ref;
305 unsigned int recordclear;
306 unsigned int getsize;
307 unsigned int recordcopy;
310
312{
313 return CONTAINING_RECORD(iface, IRecordInfoImpl, IRecordInfo_iface);
314}
315
317{
318 *obj = NULL;
319
321 IsEqualIID(riid, &IID_IRecordInfo))
322 {
323 *obj = iface;
324 IRecordInfo_AddRef(iface);
325 return S_OK;
326 }
327
328 return E_NOINTERFACE;
329}
330
332{
334 return InterlockedIncrement(&This->ref);
335}
336
338{
341
342 if (!ref)
344
345 return ref;
346}
347
349{
350 ok(0, "unexpected call\n");
351 return E_NOTIMPL;
352}
353
355{
357 This->recordclear++;
358 V_RECORD(This->v) = NULL;
359 return S_OK;
360}
361
363{
365 This->recordcopy++;
366 ok(src == (void*)0xdeadbeef, "wrong src pointer %p\n", src);
367 return S_OK;
368}
369
371{
372 ok(0, "unexpected call\n");
373 return E_NOTIMPL;
374}
375
377{
378 ok(0, "unexpected call\n");
379 return E_NOTIMPL;
380}
381
383{
385 This->getsize++;
386 *size = 0;
387 return S_OK;
388}
389
391{
392 ok(0, "unexpected call\n");
393 return E_NOTIMPL;
394}
395
397 LPCOLESTR szFieldName, VARIANT *pvarField)
398{
399 ok(0, "unexpected call\n");
400 return E_NOTIMPL;
401}
402
404 LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
405{
406 ok(0, "unexpected call\n");
407 return E_NOTIMPL;
408}
409
411 LPCOLESTR szFieldName, VARIANT *pvarField)
412{
413 ok(0, "unexpected call\n");
414 return E_NOTIMPL;
415}
416
418 PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
419{
420 ok(0, "unexpected call\n");
421 return E_NOTIMPL;
422}
423
425 BSTR *rgBstrNames)
426{
427 ok(0, "unexpected call\n");
428 return E_NOTIMPL;
429}
430
432{
433 ok(0, "unexpected call\n");
434 return FALSE;
435}
436
438{
439 ok(0, "unexpected call\n");
440 return NULL;
441}
442
444 PVOID *ppvDest)
445{
446 ok(0, "unexpected call\n");
447 return E_NOTIMPL;
448}
449
451{
452 ok(0, "unexpected call\n");
453 return E_NOTIMPL;
454}
455
456static const IRecordInfoVtbl RecordInfoVtbl =
457{
477};
478
480{
481 IRecordInfoImpl *rec;
482
483 rec = HeapAlloc(GetProcessHeap(), 0, sizeof(IRecordInfoImpl));
484 rec->IRecordInfo_iface.lpVtbl = &RecordInfoVtbl;
485 rec->ref = 1;
486 rec->recordclear = 0;
487 rec->getsize = 0;
488 rec->recordcopy = 0;
489
490 return rec;
491}
492
493static void init(void)
494{
495 BSTR bstr;
496 HRESULT res;
497
498 res = VarBstrFromBool(VARIANT_TRUE, LANG_USER_DEFAULT, VAR_LOCALBOOL, &bstr);
499 ok(res == S_OK && bstr[0], "Expected localized string for 'True'\n");
500 /* lstrcpyW / lstrcatW do not work on win95 */
501 memcpy(sz12_true, sz12, sizeof(sz12));
502 if (bstr) memcpy(&sz12_true[2], bstr, SysStringByteLen(bstr) + sizeof(WCHAR));
503 SysFreeString(bstr);
504
505 res = VarBstrFromBool(VARIANT_FALSE, LANG_USER_DEFAULT, VAR_LOCALBOOL, &bstr);
506 ok(res == S_OK && bstr[0], "Expected localized string for 'False'\n");
507 memcpy(sz12_false, sz12, sizeof(sz12));
508 if (bstr) memcpy(&sz12_false[2], bstr, SysStringByteLen(bstr) + sizeof(WCHAR));
509 SysFreeString(bstr);
510
511 hOleaut32 = GetModuleHandleA("oleaut32.dll");
512 has_i8 = GetProcAddress(hOleaut32, "VarI8FromI1") != NULL;
513 if (!has_i8)
514 skip("No support for I8 and UI8 data types\n");
515}
516
517/* Functions to set a DECIMAL */
518static void setdec(DECIMAL* dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG64 lo64)
519{
520 dec->scale = scl;
521 dec->sign = sgn;
522 dec->Hi32 = hi32;
523 dec->Lo64 = lo64;
524}
525
526static void setdec64(DECIMAL* dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG mid32, ULONG lo32)
527{
528 dec->scale = scl;
529 dec->sign = sgn;
530 dec->Hi32 = hi32;
531 dec->Mid32 = mid32;
532 dec->Lo32 = lo32;
533}
534
536{
537 if (V_VT(result) != V_VT(expected)) return FALSE;
538 switch(V_VT(expected))
539 {
540 case VT_EMPTY:
541 case VT_NULL:
542 return TRUE;
543
544#define CASE(vt) case VT_##vt: return (V_##vt(result) == V_##vt(expected))
545 CASE(BOOL);
546 CASE(I1);
547 CASE(UI1);
548 CASE(I2);
549 CASE(UI2);
550 CASE(I4);
551 CASE(UI4);
552 CASE(I8);
553 CASE(UI8);
554 CASE(INT);
555 CASE(UINT);
556#undef CASE
557
558 case VT_DATE:
560 case VT_R4:
561 return EQ_FLOAT(V_R4(result), V_R4(expected));
562 case VT_R8:
563 return EQ_FLOAT(V_R8(result), V_R8(expected));
564 case VT_CY:
565 return (V_CY(result).int64 == V_CY(expected).int64);
566 case VT_BSTR:
567 return !lstrcmpW( V_BSTR(result), V_BSTR(expected) );
568 case VT_DECIMAL:
569 return !memcmp( &V_DECIMAL(result), &V_DECIMAL(expected), sizeof(DECIMAL) );
570 default:
571 ok(0, "unhandled variant type %s\n",wine_dbgstr_vt(V_VT(expected)));
572 return FALSE;
573 }
574}
575
578{
579 VARIANT old_arg = *arg;
582
583 memset( &result, 0, sizeof(result) );
584 hres = func( arg, &result );
585 ok_(__FILE__,line)( hres == S_OK, "wrong result %lx\n", hres );
586 if (hres == S_OK)
588 "got %s expected %s\n", wine_dbgstr_variant(&result), wine_dbgstr_variant(expected) );
589 ok_(__FILE__,line)( is_expected_variant( arg, &old_arg ), "Modified argument %s / %s\n",
590 wine_dbgstr_variant(&old_arg), wine_dbgstr_variant(arg));
592}
593
596{
597 VARIANT old_left = *left, old_right = *right;
600
601 memset( &result, 0, sizeof(result) );
602 hres = func( left, right, &result );
603 ok_(__FILE__,line)( hres == S_OK, "wrong result %lx\n", hres );
604 if (hres == S_OK)
606 "got %s expected %s\n", wine_dbgstr_variant(&result), wine_dbgstr_variant(expected) );
607 ok_(__FILE__,line)( is_expected_variant( left, &old_left ), "Modified left argument %s / %s\n",
608 wine_dbgstr_variant(&old_left), wine_dbgstr_variant(left));
609 ok_(__FILE__,line)( is_expected_variant( right, &old_right ), "Modified right argument %s / %s\n",
610 wine_dbgstr_variant(&old_right), wine_dbgstr_variant(right));
612}
613
614#define test_bstr_var(a,b) _test_bstr_var(__LINE__,a,b)
615static void _test_bstr_var(unsigned line, const VARIANT *v, const WCHAR *str)
616{
617 ok_(__FILE__,line)(V_VT(v) == VT_BSTR, "unexpected vt=%d\n", V_VT(v));
618 if(V_VT(v) == VT_BSTR)
619 ok(!lstrcmpW(V_BSTR(v), str), "v=%s, expected %s\n", wine_dbgstr_w(V_BSTR(v)),
621}
622
623static void test_VariantInit(void)
624{
625 VARIANT v, v2, v3;
626
627 memset(&v, -1, sizeof(v));
628 memset(&v2, 0, sizeof(v2));
629 memset(&v3, -1, sizeof(v3));
630 V_VT(&v3) = VT_EMPTY;
631
632 VariantInit(&v);
633 ok(!memcmp(&v, &v2, sizeof(v)) ||
634 broken(!memcmp(&v, &v3, sizeof(v3)) /* pre Win8 */), "Unexpected contents.\n");
635}
636
637/* All possible combinations of extra V_VT() flags */
638static const VARTYPE ExtraFlags[16] =
639{
640 0,
641 VT_VECTOR,
642 VT_ARRAY,
643 VT_BYREF,
656};
657
658/* Determine if a vt is valid for VariantClear() */
660{
661 BOOL ret = FALSE;
662
663 /* Only the following flags/types are valid */
664 if ((vt <= VT_LPWSTR || vt == VT_RECORD || vt == VT_CLSID) &&
665 vt != (VARTYPE)15 &&
666 (vt < (VARTYPE)24 || vt > (VARTYPE)31) &&
667 (!(extraFlags & (VT_BYREF|VT_ARRAY)) || vt > VT_NULL) &&
668 (extraFlags == 0 || extraFlags == VT_BYREF || extraFlags == VT_ARRAY ||
669 extraFlags == (VT_ARRAY|VT_BYREF)))
670 ret = TRUE; /* ok */
671
672 if (!has_i8 && (vt == VT_I8 || vt == VT_UI8))
673 ret = FALSE; /* Old versions of oleaut32 */
674 return ret;
675}
676
677typedef struct
678{
683
685{
686 return CONTAINING_RECORD(iface, test_VariantClearImpl, IUnknown_iface);
687}
688
690{
692 This->events |= 0x1;
693 return E_NOINTERFACE;
694}
695
698 This->events |= 0x2;
699 return InterlockedIncrement(&This->ref);
700}
701
704 /* static class, won't be freed */
705 This->events |= 0x4;
706 return InterlockedDecrement(&This->ref);
707}
708
709static const IUnknownVtbl test_VariantClear_vtbl = {
711 VC_AddRef,
713};
714
716
717static void test_VariantClear(void)
718{
719 IRecordInfoImpl *recinfo;
722 VARIANT v2;
723 size_t i;
724 LONG i4;
725 IUnknown *punk;
726
727 /* Crashes: Native does not test input for NULL, so neither does Wine */
728 if (0)
730
731 /* Only the type field is set, to VT_EMPTY */
732 V_VT(&v) = VT_UI4;
733 V_UI4(&v) = ~0u;
734 hres = VariantClear(&v);
735 ok((hres == S_OK && V_VT(&v) == VT_EMPTY),
736 "VariantClear: Type set to %d, res %08lx\n", V_VT(&v), hres);
737 ok(V_UI4(&v) == ~0u, "VariantClear: Overwrote value\n");
738
739 /* Test all possible V_VT values.
740 * Also demonstrates that null pointers in 'v' are not dereferenced.
741 * Individual variant tests should test VariantClear() with non-NULL values.
742 */
743 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
744 {
745 VARTYPE vt;
746
747 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
748 {
749 HRESULT hExpected = DISP_E_BADVARTYPE;
750
751 SKIPTESTS(vt);
752
753 memset(&v, 0, sizeof(v));
754 V_VT(&v) = vt | ExtraFlags[i];
755
756 hres = VariantClear(&v);
757
759 hExpected = S_OK;
760
761 ok(hres == hExpected, "VariantClear: expected 0x%lX, got 0x%lX for vt %d | 0x%X\n",
762 hExpected, hres, vt, ExtraFlags[i]);
763 }
764 }
765
766 /* Some BYREF tests with non-NULL ptrs */
767
768 /* VARIANT BYREF */
769 V_VT(&v2) = VT_I4;
770 V_I4(&v2) = 0x1234;
772 V_VARIANTREF(&v) = &v2;
773
774 hres = VariantClear(&v);
775 ok(hres == S_OK, "ret %08lx\n", hres);
776 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
777 ok(V_VARIANTREF(&v) == &v2, "variant ref %p\n", V_VARIANTREF(&v2));
778 ok(V_VT(&v2) == VT_I4, "vt %04x\n", V_VT(&v2));
779 ok(V_I4(&v2) == 0x1234, "i4 %04lx\n", V_I4(&v2));
780
781 /* I4 BYREF */
782 i4 = 0x4321;
783 V_VT(&v) = VT_I4 | VT_BYREF;
784 V_I4REF(&v) = &i4;
785
786 hres = VariantClear(&v);
787 ok(hres == S_OK, "ret %08lx\n", hres);
788 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
789 ok(V_I4REF(&v) == &i4, "i4 ref %p\n", V_I4REF(&v2));
790 ok(i4 == 0x4321, "i4 changed %08lx\n", i4);
791
792
793 /* UNKNOWN */
794 V_VT(&v) = VT_UNKNOWN;
797 hres = VariantClear(&v);
798 ok(hres == S_OK, "ret %08lx\n", hres);
799 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
801 /* Check that Release got called, but nothing else */
802 ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
803
804 /* UNKNOWN BYREF */
807 V_UNKNOWNREF(&v) = &punk;
809 hres = VariantClear(&v);
810 ok(hres == S_OK, "ret %08lx\n", hres);
811 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
812 ok(V_UNKNOWNREF(&v) == &punk, "unknown ref %p\n", V_UNKNOWNREF(&v));
813 /* Check that nothing got called */
814 ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
815
816 /* DISPATCH */
817 V_VT(&v) = VT_DISPATCH;
820 hres = VariantClear(&v);
821 ok(hres == S_OK, "ret %08lx\n", hres);
822 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
824 "dispatch %p\n", V_DISPATCH(&v));
825 /* Check that Release got called, but nothing else */
826 ok(test_myVariantClearImpl.events == 0x4, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
827
828 /* DISPATCH BYREF */
833 hres = VariantClear(&v);
834 ok(hres == S_OK, "ret %08lx\n", hres);
835 ok(V_VT(&v) == 0, "vt %04x\n", V_VT(&v));
836 ok(V_DISPATCHREF(&v) == (IDispatch**)&punk, "dispatch ref %p\n", V_DISPATCHREF(&v));
837 /* Check that nothing got called */
838 ok(test_myVariantClearImpl.events == 0, "Unexpected call. events %08lx\n", test_myVariantClearImpl.events);
839
840 /* RECORD */
841 recinfo = get_test_recordinfo();
842 V_VT(&v) = VT_RECORD;
843 V_RECORDINFO(&v) = &recinfo->IRecordInfo_iface;
844 V_RECORD(&v) = (void*)0xdeadbeef;
845 recinfo->recordclear = 0;
846 recinfo->ref = 2;
847 recinfo->v = &v;
848 hres = VariantClear(&v);
849 ok(hres == S_OK, "ret %08lx\n", hres);
850 ok(V_RECORD(&v) == NULL, "got %p\n", V_RECORD(&v));
851 ok(recinfo->recordclear == 1, "got %d\n", recinfo->recordclear);
852 ok(recinfo->ref == 1, "got %ld\n", recinfo->ref);
853 IRecordInfo_Release(&recinfo->IRecordInfo_iface);
854}
855
856static void test_VariantCopy(void)
857{
858 IRecordInfoImpl *recinfo;
859 VARIANTARG vSrc, vDst;
860 VARTYPE vt;
861 size_t i;
862 HRESULT hres, hExpected;
863
864 /* Establish that the failure/other cases are dealt with. Individual tests
865 * for each type should verify that data is copied correctly, references
866 * are updated, etc.
867 */
868
869 /* vSrc == vDst */
870 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
871 {
872 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
873 {
874 SKIPTESTS(vt);
875
876 memset(&vSrc, 0, sizeof(vSrc));
877 V_VT(&vSrc) = vt | ExtraFlags[i];
878
879 hExpected = DISP_E_BADVARTYPE;
880 /* src is allowed to be a VT_CLSID */
882 hExpected = S_OK;
883
884 hres = VariantCopy(&vSrc, &vSrc);
885
886 ok(hres == hExpected,
887 "Copy(src==dst): expected 0x%lX, got 0x%lX for src==dest vt %d|0x%X\n",
888 hExpected, hres, vt, ExtraFlags[i]);
889 }
890 }
891
892 /* Test that if VariantClear() fails on dest, the function fails. This also
893 * shows that dest is in fact cleared and not just overwritten
894 */
895 memset(&vSrc, 0, sizeof(vSrc));
896 V_VT(&vSrc) = VT_UI1;
897
898 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
899 {
900 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
901 {
902 SKIPTESTS(vt);
903
904 hExpected = DISP_E_BADVARTYPE;
905
906 memset(&vDst, 0, sizeof(vDst));
907 V_VT(&vDst) = vt | ExtraFlags[i];
908
910 hExpected = S_OK;
911
912 hres = VariantCopy(&vDst, &vSrc);
913
914 ok(hres == hExpected,
915 "Copy(bad dst): expected 0x%lX, got 0x%lX for dest vt %d|0x%X\n",
916 hExpected, hres, vt, ExtraFlags[i]);
917 if (hres == S_OK)
918 ok(V_VT(&vDst) == VT_UI1,
919 "Copy(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
920 }
921 }
922
923 /* Test that VariantClear() checks vSrc for validity before copying */
924 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
925 {
926 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
927 {
928 SKIPTESTS(vt);
929
930 hExpected = DISP_E_BADVARTYPE;
931
932 memset(&vDst, 0, sizeof(vDst));
933 V_VT(&vDst) = VT_EMPTY;
934
935 memset(&vSrc, 0, sizeof(vSrc));
936 V_VT(&vSrc) = vt | ExtraFlags[i];
937
938 /* src is allowed to be a VT_CLSID */
940 hExpected = S_OK;
941
942 hres = VariantCopy(&vDst, &vSrc);
943
944 ok(hres == hExpected,
945 "Copy(bad src): expected 0x%lX, got 0x%lX for src vt %d|0x%X\n",
946 hExpected, hres, vt, ExtraFlags[i]);
947 if (hres == S_OK)
948 {
949 ok(V_VT(&vDst) == (vt|ExtraFlags[i]),
950 "Copy(bad src): expected vt = %d, got %d\n",
951 vt | ExtraFlags[i], V_VT(&vDst));
952 VariantClear(&vDst);
953 }
954 }
955 }
956
957 /* Test that copying a NULL BSTR results in an empty BSTR */
958 memset(&vDst, 0, sizeof(vDst));
959 V_VT(&vDst) = VT_EMPTY;
960 memset(&vSrc, 0, sizeof(vSrc));
961 V_VT(&vSrc) = VT_BSTR;
962 hres = VariantCopy(&vDst, &vSrc);
963 ok(hres == S_OK, "Copy(NULL BSTR): Failed to copy a NULL BSTR\n");
964 if (hres == S_OK)
965 {
966 ok((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst),
967 "Copy(NULL BSTR): should have non-NULL result\n");
968 if ((V_VT(&vDst) == VT_BSTR) && V_BSTR(&vDst))
969 {
970 ok(*V_BSTR(&vDst) == 0, "Copy(NULL BSTR): result not empty\n");
971 }
972 VariantClear(&vDst);
973 }
974
975 /* copy RECORD */
976 recinfo = get_test_recordinfo();
977
978 memset(&vDst, 0, sizeof(vDst));
979 V_VT(&vDst) = VT_EMPTY;
980
981 V_VT(&vSrc) = VT_RECORD;
982 V_RECORDINFO(&vSrc) = &recinfo->IRecordInfo_iface;
983 V_RECORD(&vSrc) = (void*)0xdeadbeef;
984
985 recinfo->recordclear = 0;
986 recinfo->recordcopy = 0;
987 recinfo->getsize = 0;
988 recinfo->v = &vSrc;
989 hres = VariantCopy(&vDst, &vSrc);
990 ok(hres == S_OK, "ret %08lx\n", hres);
991
992 ok(V_RECORD(&vDst) != (void*)0xdeadbeef && V_RECORD(&vDst) != NULL, "got %p\n", V_RECORD(&vDst));
993 ok(V_RECORDINFO(&vDst) == &recinfo->IRecordInfo_iface, "got %p\n", V_RECORDINFO(&vDst));
994 ok(recinfo->getsize == 1, "got %d\n", recinfo->recordclear);
995 ok(recinfo->recordcopy == 1, "got %d\n", recinfo->recordclear);
996
997 VariantClear(&vDst);
998 VariantClear(&vSrc);
999}
1000
1001/* Determine if a vt is valid for VariantCopyInd() */
1003{
1004 BOOL ret = FALSE;
1005
1006 if ((extraFlags & VT_ARRAY) ||
1007 (vt > VT_NULL && vt != (VARTYPE)15 && vt < VT_VOID &&
1008 !(extraFlags & (VT_VECTOR|VT_RESERVED))))
1009 {
1010 ret = TRUE; /* ok */
1011 }
1012 return ret;
1013}
1014
1015static void test_VariantCopyInd(void)
1016{
1017 VARIANTARG vSrc, vDst, vRef, vRef2;
1018 VARTYPE vt;
1019 size_t i;
1020 BYTE buffer[64];
1021 HRESULT hres, hExpected;
1022
1023 memset(buffer, 0, sizeof(buffer));
1024
1025 /* vSrc == vDst */
1026 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
1027 {
1028 if (ExtraFlags[i] & VT_ARRAY)
1029 continue; /* Native crashes on NULL safearray */
1030
1031 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1032 {
1033 SKIPTESTS(vt);
1034
1035 memset(&vSrc, 0, sizeof(vSrc));
1036 V_VT(&vSrc) = vt | ExtraFlags[i];
1037
1038 hExpected = DISP_E_BADVARTYPE;
1039 if (!(ExtraFlags[i] & VT_BYREF))
1040 {
1041 /* if src is not by-reference, acts as VariantCopy() */
1043 hExpected = S_OK;
1044 }
1045 else
1046 {
1047 if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
1048 vt == VT_DISPATCH || vt == VT_RECORD)
1049 continue; /* Need valid ptrs for deep copies */
1050
1051 V_BYREF(&vSrc) = &buffer;
1052 hExpected = E_INVALIDARG;
1053
1054 if ((vt == VT_I8 || vt == VT_UI8) &&
1055 ExtraFlags[i] == VT_BYREF)
1056 {
1057 if (has_i8)
1058 hExpected = S_OK; /* Only valid if I8 is a known type */
1059 }
1061 hExpected = S_OK;
1062 }
1063
1064 hres = VariantCopyInd(&vSrc, &vSrc);
1065
1066 ok(hres == hExpected,
1067 "CopyInd(src==dst): expected 0x%lX, got 0x%lX for src==dst vt %d|0x%X\n",
1068 hExpected, hres, vt, ExtraFlags[i]);
1069 }
1070 }
1071
1072 /* Bad dest */
1073 memset(&vSrc, 0, sizeof(vSrc));
1074 V_VT(&vSrc) = VT_UI1|VT_BYREF;
1075 V_BYREF(&vSrc) = &buffer;
1076
1077 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
1078 {
1079 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1080 {
1081 SKIPTESTS(vt);
1082
1083 memset(&vDst, 0, sizeof(vDst));
1084 V_VT(&vDst) = vt | ExtraFlags[i];
1085
1086 hExpected = DISP_E_BADVARTYPE;
1087
1089 hExpected = S_OK;
1090
1091 hres = VariantCopyInd(&vDst, &vSrc);
1092
1093 ok(hres == hExpected,
1094 "CopyInd(bad dst): expected 0x%lX, got 0x%lX for dst vt %d|0x%X\n",
1095 hExpected, hres, vt, ExtraFlags[i]);
1096 if (hres == S_OK)
1097 ok(V_VT(&vDst) == VT_UI1,
1098 "CopyInd(bad dst): expected vt = VT_UI1, got %d\n", V_VT(&vDst));
1099 }
1100 }
1101
1102 /* bad src */
1103 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
1104 {
1105 if (ExtraFlags[i] & VT_ARRAY)
1106 continue; /* Native crashes on NULL safearray */
1107
1108 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
1109 {
1110 SKIPTESTS(vt);
1111
1112 memset(&vDst, 0, sizeof(vDst));
1113 V_VT(&vDst) = VT_EMPTY;
1114
1115 memset(&vSrc, 0, sizeof(vSrc));
1116 V_VT(&vSrc) = vt | ExtraFlags[i];
1117
1118 hExpected = DISP_E_BADVARTYPE;
1119 if (!(ExtraFlags[i] & VT_BYREF))
1120 {
1121 /* if src is not by-reference, acts as VariantCopy() */
1123 hExpected = S_OK;
1124 }
1125 else
1126 {
1127 if (vt == VT_SAFEARRAY || vt == VT_BSTR || vt == VT_UNKNOWN ||
1128 vt == VT_DISPATCH || vt == VT_RECORD)
1129 continue; /* Need valid ptrs for deep copies, see vartype.c */
1130
1131 V_BYREF(&vSrc) = &buffer;
1132
1133 hExpected = E_INVALIDARG;
1134
1135 if ((vt == VT_I8 || vt == VT_UI8) &&
1136 ExtraFlags[i] == VT_BYREF)
1137 {
1138 if (has_i8)
1139 hExpected = S_OK; /* Only valid if I8 is a known type */
1140 }
1142 hExpected = S_OK;
1143 }
1144
1145 hres = VariantCopyInd(&vDst, &vSrc);
1146
1147 ok(hres == hExpected,
1148 "CopyInd(bad src): expected 0x%lX, got 0x%lX for src vt %d|0x%X\n",
1149 hExpected, hres, vt, ExtraFlags[i]);
1150 if (hres == S_OK)
1151 {
1152 if (vt == VT_VARIANT && ExtraFlags[i] == VT_BYREF)
1153 {
1154 /* Type of vDst should be the type of the referenced variant.
1155 * Since we set the buffer to all zeros, its type should be
1156 * VT_EMPTY.
1157 */
1158 ok(V_VT(&vDst) == VT_EMPTY,
1159 "CopyInd(bad src): expected dst vt = VT_EMPTY, got %d|0x%X\n",
1160 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
1161 }
1162 else
1163 {
1164 ok(V_VT(&vDst) == (vt|(ExtraFlags[i] & ~VT_BYREF)),
1165 "CopyInd(bad src): expected dst vt = %d|0x%X, got %d|0x%X\n",
1166 vt, ExtraFlags[i] & ~VT_BYREF,
1167 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK);
1168 }
1169 VariantClear(&vDst);
1170 }
1171 }
1172 }
1173
1174 /* By-reference variants are dereferenced */
1175 V_VT(&vRef) = VT_UI1;
1176 V_UI1(&vRef) = 0x77;
1177 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
1178 V_VARIANTREF(&vSrc) = &vRef;
1179 VariantInit(&vDst);
1180
1181 hres = VariantCopyInd(&vDst, &vSrc);
1182 ok(hres == S_OK, "VariantCopyInd failed: 0x%08lx\n", hres);
1183 ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x77,
1184 "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
1185 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
1186
1187 /* By-reference variant to a by-reference type succeeds */
1188 V_VT(&vRef) = VT_UI1|VT_BYREF;
1189 V_UI1REF(&vRef) = buffer; buffer[0] = 0x88;
1190 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
1191 V_VARIANTREF(&vSrc) = &vRef;
1192 VariantInit(&vDst);
1193
1194 hres = VariantCopyInd(&vDst, &vSrc);
1195 ok(hres == S_OK, "VariantCopyInd failed: 0x%08lx\n", hres);
1196 ok(V_VT(&vDst) == VT_UI1 && V_UI1(&vDst) == 0x88,
1197 "CopyInd(deref): expected dst vt = VT_UI1, val 0x77, got %d|0x%X, 0x%2X\n",
1198 V_VT(&vDst) & VT_TYPEMASK, V_VT(&vDst) & ~VT_TYPEMASK, V_UI1(&vDst));
1199
1200 /* But a by-reference variant to a by-reference variant fails */
1201 V_VT(&vRef2) = VT_UI1;
1202 V_UI1(&vRef2) = 0x77;
1203 V_VT(&vRef) = VT_VARIANT|VT_BYREF;
1204 V_VARIANTREF(&vRef) = &vRef2;
1205 V_VT(&vSrc) = VT_VARIANT|VT_BYREF;
1206 V_VARIANTREF(&vSrc) = &vRef;
1207 VariantInit(&vDst);
1208
1209 hres = VariantCopyInd(&vDst, &vSrc);
1210 ok(hres == E_INVALIDARG,
1211 "CopyInd(ref->ref): expected E_INVALIDARG, got 0x%08lx\n", hres);
1212}
1213
1214/* Macros for converting and testing the result of VarParseNumFromStr */
1215#define FAILDIG 255
1216
1217static HRESULT wconvert_str( const OLECHAR *str, INT dig, ULONG npflags,
1218 NUMPARSE *np, BYTE rgb[128], LCID lcid, ULONG flags)
1219{
1220 memset( rgb, FAILDIG, 128 );
1221 memset( np, 255, sizeof(*np) );
1222 np->cDig = dig;
1223 np->dwInFlags = npflags;
1224 return VarParseNumFromStr( str, lcid, flags, np, rgb);
1225}
1226
1227static HRESULT convert_str( const char *str, INT dig, ULONG flags,
1228 NUMPARSE *np, BYTE rgb[128], LCID lcid )
1229{
1230 OLECHAR buff[128];
1232 return wconvert_str(buff, dig, flags, np, rgb, lcid, LOCALE_NOUSEROVERRIDE);
1233}
1234
1236 INT d, INT e, INT f )
1237{
1238 ok_(__FILE__,line)(hres == S_OK, "returned %08lx\n", hres);
1239 if (hres == S_OK)
1240 {
1241 ok_(__FILE__,line)(np->cDig == a, "Expected cDig = %d, got %d\n", a, np->cDig);
1242 ok_(__FILE__,line)(np->dwInFlags == b, "Expected dwInFlags = 0x%lx, got 0x%lx\n", b, np->dwInFlags);
1243 ok_(__FILE__,line)(np->dwOutFlags == c, "Expected dwOutFlags = 0x%lx, got 0x%lx\n", c, np->dwOutFlags);
1244 ok_(__FILE__,line)(np->cchUsed == d, "Expected cchUsed = %d, got %d\n", d, np->cchUsed);
1245 ok_(__FILE__,line)(np->nBaseShift == e, "Expected nBaseShift = %d, got %d\n", e, np->nBaseShift);
1246 ok_(__FILE__,line)(np->nPwr10 == f, "Expected nPwr10 = %d, got %d\n", f, np->nPwr10);
1247 }
1248}
1249
1250#define WCONVERTN(str,dig,flags) hres = wconvert_str( str, dig, flags, &np, rgb, lcid, LOCALE_NOUSEROVERRIDE )
1251#define WCONVERT(str,flags) WCONVERTN(str,sizeof(rgb),flags)
1252#define CONVERTN(str,dig,flags) hres = convert_str( str, dig, flags, &np, rgb, lcid )
1253#define CONVERT(str,flags) CONVERTN(str,sizeof(rgb),flags)
1254#define EXPECT(a,b,c,d,e,f) expect_NumFromStr( __LINE__, hres, &np, a, b, c, d, e, f )
1255#define EXPECTRGB(a,b) ok(rgb[a] == b, "Digit[%d], expected %d, got %d\n", a, b, rgb[a])
1256#define EXPECTFAIL ok(hres == DISP_E_TYPEMISMATCH, "Call succeeded, hres = %08lx\n", hres)
1257#define EXPECT2(a,b) EXPECTRGB(0,a); EXPECTRGB(1,b)
1258
1260{
1261 HRESULT hres;
1262 /* Ensure all tests are using the same locale characters for '$', ',' etc */
1264 NUMPARSE np;
1265 BYTE rgb[128];
1266 OLECHAR wstr[128];
1267 OLECHAR spaces[] = L" \xa0\f\n\r\t\v"; /* man isspace() */
1268 int i;
1269
1272 /* Consume an empty string */
1273 CONVERT("", 0);
1274 EXPECTFAIL;
1275
1276 /* Consume a single digit */
1277 CONVERT("7", 0);
1278 EXPECT(1,0,0,1,0,0);
1279 EXPECT2(7,FAILDIG);
1280
1281 /* cDig is not literal digits - zeros are suppressed and nPwr10 is increased */
1282 CONVERT("10", 0);
1283 EXPECT(1,0,0,2,0,1);
1284 /* Note: Win32 writes the trailing zeros if they are within cDig's limits,
1285 * but then excludes them from the returned cDig count.
1286 * In our implementation we don't bother writing them at all.
1287 */
1288 EXPECTRGB(0, 1);
1289
1290 /* if cDig is too small and numbers follow, sets INEXACT */
1291 CONVERTN("11",1, 0);
1292 EXPECT(1,0,NUMPRS_INEXACT,2,0,1);
1293 EXPECT2(1,FAILDIG);
1294
1295 /* Strips leading zeros */
1296 CONVERT("01", 0);
1297 EXPECT(1,0,0,2,0,0);
1298 EXPECT2(1,FAILDIG);
1299
1300 /* Strips leading zeros */
1301 CONVERTN("01",1, 0);
1302 EXPECT(1,0,0,2,0,0);
1303 EXPECT2(1,FAILDIG);
1304
1305
1306 /* Fails on non digits */
1307 CONVERT("a", 0);
1308 EXPECTFAIL;
1309 EXPECTRGB(0,FAILDIG);
1310
1313 /* Without flag, fails on whitespace */
1314 CONVERT(" 0", 0);
1315 EXPECTFAIL;
1316 EXPECTRGB(0,FAILDIG);
1317
1318
1319 /* With flag, consumes any type of space */
1320 for (i = 0; i < ARRAY_SIZE(spaces)-1; i++)
1321 {
1322 winetest_push_context("%d", i);
1323
1324 wsprintfW(wstr, L"%c0", spaces[i]);
1327 EXPECT2(0,FAILDIG);
1328
1330 }
1331
1332 /* Doesn't pick up trailing whitespace without flag */
1333 CONVERT("0 ", 0);
1334 EXPECT(1,0,0,1,0,0);
1335 EXPECT2(0,FAILDIG);
1336
1337 /* With flag, consumes trailing whitespace */
1340 EXPECT2(0,FAILDIG);
1341
1342 /* Leading flag only consumes leading */
1345 EXPECT2(0,FAILDIG);
1346
1347 /* Both flags consumes both */
1350 EXPECT2(0,FAILDIG);
1351
1354 /* Without flag, fails on + */
1355 CONVERT("+0", 0);
1356 EXPECTFAIL;
1357 EXPECTRGB(0,FAILDIG);
1358
1359 /* With flag, consumes + */
1362 EXPECT2(0,FAILDIG);
1363
1364 /* Without flag, doesn't consume trailing + */
1365 CONVERT("0+", 0);
1366 EXPECT(1,0,0,1,0,0);
1367 EXPECT2(0,FAILDIG);
1368
1369 /* With flag, consumes trailing + */
1372 EXPECT2(0,FAILDIG);
1373
1374 /* With leading flag, doesn't consume trailing + */
1377 EXPECT2(0,FAILDIG);
1378
1379 /* Trailing + doesn't get consumed if we specify both (unlike whitespace) */
1382 EXPECT2(0,FAILDIG);
1383
1386 /* Without flag, fails on - */
1387 CONVERT("-0", 0);
1388 EXPECTFAIL;
1389 EXPECTRGB(0,FAILDIG);
1390
1391 /* With flag, consumes - */
1394 EXPECT2(0,FAILDIG);
1395
1396 /* Without flag, doesn't consume trailing - */
1397 CONVERT("0-", 0);
1398 EXPECT(1,0,0,1,0,0);
1399 EXPECT2(0,FAILDIG);
1400
1401 /* With flag, consumes trailing - */
1404 EXPECT2(0,FAILDIG);
1405
1406 /* With leading flag, doesn't consume trailing - */
1409 EXPECT2(0,FAILDIG);
1410
1411 /* Trailing - doesn't get consumed if we specify both (unlike whitespace) */
1414 EXPECT2(0,FAILDIG);
1415
1418 /* Could be hex, octal or decimal - With flag reads as decimal */
1419 CONVERT("0", NUMPRS_HEX_OCT);
1420 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1421 EXPECT2(0,FAILDIG);
1422
1423 /* Doesn't recognise hex in .asm syntax */
1424 CONVERT("0h", NUMPRS_HEX_OCT);
1425 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1426 EXPECT2(0,FAILDIG);
1427
1428 /* Doesn't fail with valid leading string but no digits */
1429 CONVERT("0x", NUMPRS_HEX_OCT);
1430 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1431 EXPECT2(0,FAILDIG);
1432
1433 /* Doesn't recognise hex format numbers at all! */
1434 CONVERT("0x0", NUMPRS_HEX_OCT);
1435 EXPECT(1,NUMPRS_HEX_OCT,0,1,0,0);
1436 EXPECT2(0,FAILDIG);
1437
1438 /* Doesn't recognise plain hex digits either */
1439 CONVERT("FE", NUMPRS_HEX_OCT);
1440 EXPECTFAIL;
1441 EXPECTRGB(0,FAILDIG);
1442
1443 /* A leading 0 does not an octal number make */
1444 CONVERT("0100", NUMPRS_HEX_OCT);
1445 EXPECT(1,NUMPRS_HEX_OCT,0,4,0,2);
1446 EXPECTRGB(0,1);
1447 EXPECTRGB(1,0);
1448 EXPECTRGB(2,0);
1449 EXPECTRGB(3,FAILDIG);
1450
1451 /* VB hex */
1452 CONVERT("&HF800", NUMPRS_HEX_OCT);
1454 EXPECTRGB(0,15);
1455 EXPECTRGB(1,8);
1456 EXPECTRGB(2,0);
1457 EXPECTRGB(3,0);
1458 EXPECTRGB(4,FAILDIG);
1459
1460 /* VB hex lower case and leading zero */
1461 CONVERT("&h0abcdef", NUMPRS_HEX_OCT);
1463 EXPECTRGB(0,10);
1464 EXPECTRGB(1,11);
1465 EXPECTRGB(2,12);
1466 EXPECTRGB(3,13);
1467 EXPECTRGB(4,14);
1468 EXPECTRGB(5,15);
1469 EXPECTRGB(6,FAILDIG);
1470
1471 /* VB oct */
1472 CONVERT("&O300", NUMPRS_HEX_OCT);
1474 EXPECTRGB(0,3);
1475 EXPECTRGB(1,0);
1476 EXPECTRGB(2,0);
1477 EXPECTRGB(3,FAILDIG);
1478
1479 /* VB oct lower case and leading zero */
1480 CONVERT("&o0777", NUMPRS_HEX_OCT);
1482 EXPECTRGB(0,7);
1483 EXPECTRGB(1,7);
1484 EXPECTRGB(2,7);
1485 EXPECTRGB(3,FAILDIG);
1486
1487 /* VB oct char bigger than 7 */
1488 CONVERT("&o128", NUMPRS_HEX_OCT);
1490 EXPECTRGB(0,1);
1491 EXPECTRGB(1,2);
1492 EXPECTRGB(3,FAILDIG);
1493
1494 /* Only integers are allowed when using an alternative radix */
1497 EXPECT2(10,FAILDIG);
1498
1499 /* Except if it looks like a plain decimal number */
1502 EXPECT2(1,2);
1503 EXPECTRGB(3,FAILDIG);
1504
1507 /* Empty parens = error */
1508 CONVERT("()", NUMPRS_PARENS);
1509 EXPECTFAIL;
1510 EXPECTRGB(0,FAILDIG);
1511
1512 /* With flag, trailing parens not consumed */
1513 CONVERT("0()", NUMPRS_PARENS);
1514 EXPECT(1,NUMPRS_PARENS,0,1,0,0);
1515 EXPECT2(0,FAILDIG);
1516
1517 /* With flag, Number in parens made negative and parens consumed */
1518 CONVERT("(0)", NUMPRS_PARENS);
1520 EXPECT2(0,FAILDIG);
1521
1524 /* With flag, thousands sep. not needed */
1526 EXPECT(1,NUMPRS_THOUSANDS,0,1,0,0);
1527 EXPECT2(0,FAILDIG);
1528
1529 /* Without flag stop at thousands separator */
1530 CONVERT("1,000", 0);
1531 EXPECT(1,0,0,1,0,0);
1532 EXPECT2(1,FAILDIG);
1533
1534 /* With flag, thousands sep. and following digits consumed */
1535 CONVERT("1,000", NUMPRS_THOUSANDS);
1537 EXPECTRGB(0,1);
1538 /* VarParseNumFromStr() may have added more digits to rgb but they are not
1539 * part of the returned value. So consider that an implementation detail.
1540 */
1541 EXPECTRGB(4,FAILDIG);
1542
1543 /* With flag, thousands sep. and following digits consumed */
1546 EXPECTRGB(1,FAILDIG);
1547
1548 /* With flag and decimal point, thousands sep. but not decimals consumed */
1549 CONVERT("1,001.0", NUMPRS_THOUSANDS);
1551 EXPECT2(1,0);
1552 EXPECTRGB(2,0);
1553 EXPECTRGB(3,1);
1554 EXPECTRGB(4,FAILDIG);
1555
1556 /* With flag, consecutive thousands separators are allowed */
1557 CONVERT("1,,000", NUMPRS_THOUSANDS);
1559 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
1560 EXPECTRGB(4,FAILDIG);
1561
1562 /* With flag, thousands separators can be sprinkled at random */
1563 CONVERT("1,00,0,,", NUMPRS_THOUSANDS);
1565 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
1566 EXPECTRGB(4,FAILDIG);
1567
1568 /* With flag, but leading thousands separators are not allowed */
1569 CONVERT(",1,000", NUMPRS_THOUSANDS);
1570 EXPECTFAIL;
1571
1572 /* With flag, thousands separator not needed but still reported */
1575 EXPECT2(1,FAILDIG);
1576
1579 /* Without flag, chokes on currency sign */
1580 CONVERT("$11", 0);
1581 EXPECTFAIL;
1582 EXPECTRGB(0,FAILDIG);
1583
1584 /* With flag, allows having no currency sign */
1585 CONVERT("11", NUMPRS_CURRENCY);
1586 EXPECT(2,NUMPRS_CURRENCY,0,2,0,0);
1587 EXPECT2(1,1);
1588 EXPECTRGB(2,FAILDIG);
1589
1590 /* With flag, does not allow a lone currency sign */
1592 EXPECTFAIL;
1593
1594 /* With flag, consumes currency sign */
1595 CONVERT("$11", NUMPRS_CURRENCY);
1597 EXPECT2(1,1);
1598 EXPECTRGB(2,FAILDIG);
1599
1600 /* With flag, currency amounts cannot be in hexadecimal */
1602 EXPECTFAIL;
1603
1606 EXPECTRGB(0,10);
1607 EXPECTRGB(1,FAILDIG);
1608
1609 /* With flag, the sign cannot be repeated before the amount */
1610 CONVERT("$$11", NUMPRS_CURRENCY);
1611 EXPECTFAIL;
1612
1613 /* With flag, but is allowed after the amount and can even be repeated! */
1616 EXPECT2(1,1);
1617 EXPECTRGB(2,FAILDIG);
1618
1619 /* With flag, the British Pound is not allowed "1L" */
1621 EXPECTFAIL;
1622
1623 /* With flag, minus can go after the currency sign */
1626 EXPECT2(1,1);
1627 EXPECTRGB(2,FAILDIG);
1628
1629 /* With flag, or before */
1632 EXPECT2(1,1);
1633 EXPECTRGB(2,FAILDIG);
1634
1635 for (i = 0; i < ARRAY_SIZE(spaces)-1; i++)
1636 {
1637 winetest_push_context("%d", i);
1638
1639 /* With flag, no space is allowed after the currency sign */
1640 wsprintfW(wstr, L"$%c11", spaces[i]);
1642 EXPECTFAIL;
1643
1644 /* With flag, unless explicitly allowed before the digits */
1647 EXPECT2(1,1);
1648 EXPECTRGB(2,FAILDIG);
1649
1650 /* With flag, no space is allowed before the trailing currency sign */
1651 wsprintfW(wstr, L"11%c$", spaces[i]);
1653 EXPECTFAIL;
1654
1655 /* With flag, even with thousands flag (see the French situation) */
1657 EXPECTFAIL;
1658
1659 /* With flag, unless explicitly allowed */
1662 EXPECT2(1,1);
1663 EXPECTRGB(2,FAILDIG);
1664
1666 }
1667
1668 /* With flag only, doesn't consume decimal point */
1669 CONVERT("$11.1", NUMPRS_CURRENCY);
1671 EXPECT2(1,1);
1672 EXPECTRGB(2,FAILDIG);
1673
1674 /* With flag and decimal flag, consumes decimal point and following digits */
1677 EXPECT2(1,1);
1678 EXPECTRGB(2,1);
1679 EXPECTRGB(3,FAILDIG);
1680
1681 /* With flag, the currency cannot replace the decimal sign (see comment about
1682 * the Cape Verdean escudo).
1683 */
1686 EXPECT2(1,FAILDIG);
1687
1688 /* Thousands flag can also be used with currency */
1691 EXPECT2(1,2);
1692 EXPECTRGB(2,3);
1693 EXPECTRGB(3,4);
1694 EXPECTRGB(4,FAILDIG);
1695
1696 /* Thousands flag can also be used with currency and decimal numbers */
1699 EXPECT2(1,2);
1700 EXPECTRGB(2,3);
1701 EXPECTRGB(3,4);
1702 EXPECTRGB(4,5);
1703 EXPECTRGB(5,FAILDIG);
1704
1707 /* With flag, consumes decimal point */
1708 CONVERT("1.1", NUMPRS_DECIMAL);
1710 EXPECT2(1,1);
1711 EXPECTRGB(2,FAILDIG);
1712
1713 /* With flag, consumes decimal point. Skipping the decimal part is not an error */
1714 CONVERT("1.", NUMPRS_DECIMAL);
1716 EXPECT2(1,FAILDIG);
1717
1718 /* Skipping the integer part is not an error */
1719 CONVERT(".2", NUMPRS_DECIMAL);
1721 EXPECT2(2,FAILDIG);
1722
1723 /* Even zero gets an exponent (it sort of indicates 'precision') */
1724 CONVERT(".0", NUMPRS_DECIMAL);
1726 EXPECT2(0,FAILDIG);
1727
1728 CONVERT(".000", NUMPRS_DECIMAL);
1730 EXPECTRGB(0,0);
1731 EXPECTRGB(3,FAILDIG);
1732
1735 EXPECT2(2,FAILDIG);
1736
1737 CONVERT(".001", NUMPRS_DECIMAL);
1739 EXPECT2(1,FAILDIG);
1740
1741 CONVERT(".101", NUMPRS_DECIMAL);
1743 EXPECT2(1,0);
1744 EXPECTRGB(2,1);
1745 EXPECTRGB(3,FAILDIG);
1746
1747 CONVERT(".30", NUMPRS_DECIMAL);
1749 /* See the NUMPRS_THOUSANDS comment about trailing zeroes */
1750 EXPECTRGB(0,3);
1751 EXPECTRGB(2,FAILDIG);
1752
1753 /* But skipping both the integer and decimal part is not allowed */
1754 CONVERT(".", NUMPRS_DECIMAL);
1755 EXPECTFAIL;
1756
1757 /* Consumes only one decimal point */
1758 CONVERT("1.1.", NUMPRS_DECIMAL);
1760 EXPECT2(1,1);
1761 EXPECTRGB(2,FAILDIG);
1762
1763 /* With flag, including if they are consecutive */
1764 CONVERT("1..1", NUMPRS_DECIMAL);
1766 EXPECT2(1,FAILDIG);
1767
1770 /* Without flag, doesn't consume exponent */
1771 CONVERT("1e1", 0);
1772 EXPECT(1,0,0,1,0,0);
1773 EXPECT2(1,FAILDIG);
1774
1775 /* With flag, consumes exponent */
1776 CONVERT("1e1", NUMPRS_EXPONENT);
1778 EXPECT2(1,FAILDIG);
1779
1780 /* Spaces are not allowed before the exponent */
1783 EXPECT2(1,FAILDIG);
1784
1785 /* With flag, incompatible with NUMPRS_HEX_OCT */
1788 EXPECT2(1,FAILDIG);
1789
1790 /* With flag, even if it sort of looks like an exponent */
1793 EXPECT2(1,0xe);
1794 EXPECTRGB(2,2);
1795 EXPECTRGB(3,FAILDIG);
1796
1797 /* Negative exponents are accepted without flags */
1798 CONVERT("1e-1", NUMPRS_EXPONENT);
1800 EXPECT2(1,FAILDIG);
1801
1802 /* As are positive exponents and leading exponent 0s */
1803 CONVERT("1e+01", NUMPRS_EXPONENT);
1805 EXPECT2(1,FAILDIG);
1806
1807 /* The same for zero exponents */
1808 CONVERT("1e0", NUMPRS_EXPONENT);
1810 EXPECT2(1,FAILDIG);
1811
1812 /* Sign on a zero exponent doesn't matter */
1813 CONVERT("1e+0", NUMPRS_EXPONENT);
1815 EXPECT2(1,FAILDIG);
1816
1817 CONVERT("1e-0", NUMPRS_EXPONENT);
1819 EXPECT2(1,FAILDIG);
1820
1821 /* Doesn't consume a real number exponent */
1822 CONVERT("1e1.", NUMPRS_EXPONENT);
1824 EXPECT2(1,FAILDIG);
1825
1826 /* Powers of 10 are calculated from the position of any decimal point */
1829 EXPECT2(1,5);
1830
1833 EXPECT2(1,5);
1834
1837 /* Flag expects all digits */
1838 CONVERT("0", NUMPRS_USE_ALL);
1839 EXPECT(1,NUMPRS_USE_ALL,0,1,0,0);
1840 EXPECT2(0,FAILDIG);
1841
1842 /* Rejects anything trailing */
1843 CONVERT("0 ", NUMPRS_USE_ALL);
1844 EXPECTFAIL;
1845 EXPECT2(0,FAILDIG);
1846
1847 /* Unless consumed by trailing flag */
1850 EXPECT2(0,FAILDIG);
1851
1854 /* Leading whitespace and plus, doesn't consume trailing whitespace */
1857 EXPECT2(0,FAILDIG);
1858
1859 /* Order of whitespace and plus is unimportant */
1862 EXPECT2(0,FAILDIG);
1863
1864 /* Leading whitespace can be repeated */
1867 EXPECT2(0,FAILDIG);
1868
1869 /* But plus/minus etc. cannot */
1871 EXPECTFAIL;
1872 EXPECTRGB(0,FAILDIG);
1873
1874 /* Inexact is not set if trailing zeros are removed */
1875 CONVERTN("10", 1, 0);
1876 EXPECT(1,0,0,2,0,1);
1877 EXPECT2(1,FAILDIG);
1878
1879 /* Make sure a leading 0 is stripped but decimals after it get read */
1880 CONVERT("-0.51", NUMPRS_STD);
1882 EXPECT2(5,1);
1883
1884 /* Keep trailing zeros on whole number part of a decimal */
1885 CONVERT("10.1", NUMPRS_STD);
1887 EXPECT2(1,0);
1888 EXPECTRGB(2,1);
1889
1890 /* Zeros after decimal sign */
1891 CONVERT("0.01", NUMPRS_STD);
1893 EXPECT2(1,FAILDIG);
1894
1895 /* Trailing zeros after decimal part */
1896 CONVERT("0.10", NUMPRS_STD);
1898 EXPECT2(1,0);
1899
1900 /* Arabic numerals are not allowed "0" */
1901 WCONVERT(L"\x660", NUMPRS_STD);
1902 EXPECTFAIL;
1903}
1904
1906{
1907 HRESULT hres;
1908 /* Test some aspects that are different in a non-English locale */
1910 NUMPARSE np;
1911 BYTE rgb[128];
1912 OLECHAR wstr[128];
1913 OLECHAR spaces[] = L" \xa0\f\n\r\t\v"; /* man isspace() */
1914 int i;
1915
1918 for (i = 0; i < ARRAY_SIZE(spaces)-1; i++)
1919 {
1920 winetest_push_context("%d", i);
1921
1922 /* Leading spaces must be explicitly allowed */
1923 wsprintfW(wstr, L"%c2", spaces[i]);
1924 WCONVERT(wstr, NUMPRS_USE_ALL);
1925 EXPECTFAIL;
1926
1929 EXPECT2(2,FAILDIG);
1930
1931 /* But trailing spaces... */
1932 wsprintfW(wstr, L"3%c", spaces[i]);
1934 if (spaces[i] == ' ' || spaces[i] == 0xa0 /* non-breaking space */)
1935 {
1936 /* Spaces aliased to the thousands separator are never allowed! */
1937 EXPECTFAIL;
1938 }
1939 else
1940 {
1941 /* The others behave normally */
1943 EXPECT2(3,FAILDIG);
1944 }
1945
1947 if (spaces[i] == ' ' || spaces[i] == 0xa0 /* non-breaking space */)
1948 {
1949 /* Trailing thousands separators are allowed as usual */
1951 EXPECT2(3,FAILDIG);
1952 }
1953 else
1954 {
1955 /* But not other spaces */
1956 EXPECTFAIL;
1957 }
1958
1959 /* No space of any type is allowed before the exponent... */
1960 wsprintfW(wstr, L"1%ce1", spaces[i]);
1962 EXPECTFAIL;
1963
1965 }
1966
1967
1970 /* With flag, Number in parens made negative and parens consumed */
1971 CONVERT("(0)", NUMPRS_PARENS);
1973 EXPECT2(0,FAILDIG);
1974
1977 for (i = 0; i < ARRAY_SIZE(spaces)-1; i++)
1978 {
1979 winetest_push_context("%d", i);
1980
1981 /* With flag, thousands separator and following digits consumed */
1982 wsprintfW(wstr, L"1%c000", spaces[i]);
1984 if (spaces[i] == ' ' || spaces[i] == 0xa0 /* non-breaking space */)
1985 {
1986 /* Non-breaking space and regular spaces work */
1988 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
1989 EXPECTRGB(4,FAILDIG);
1990 }
1991 else
1992 {
1993 /* But not other spaces */
1994 EXPECTFAIL;
1995 }
1996
1998 }
1999
2000 /* With flag and decimal point, thousands sep. but not decimals consumed */
2001 CONVERT("1 001,0", NUMPRS_THOUSANDS);
2003 EXPECT2(1,0);
2004 EXPECTRGB(2,0);
2005 EXPECTRGB(3,1);
2006 EXPECTRGB(4,FAILDIG);
2007
2008 /* With flag, consecutive thousands separators are allowed */
2011 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2012 EXPECTRGB(4,FAILDIG);
2013
2014 /* With flag, thousands separators can be sprinkled at random */
2017 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2018 EXPECTRGB(4,FAILDIG);
2019
2020 /* With flag, but leading thousands separators are not allowed */
2021 CONVERT(" 1 000", NUMPRS_THOUSANDS);
2022 EXPECTFAIL;
2023
2024 /* With flag, thousands separator not needed but still reported */
2027 EXPECT2(1,FAILDIG);
2028
2029
2032 /* With flag, consumes currency sign "E12" */
2033 WCONVERT(L"\x20ac\x31\x32", NUMPRS_CURRENCY);
2035 EXPECT2(1,2);
2036 EXPECTRGB(2,FAILDIG);
2037
2038 /* With flag, consumes all currency signs! "E12EE" */
2039 WCONVERT(L"\x20ac\x31\x32\x20ac\x20ac", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
2041 EXPECT2(1,2);
2042 EXPECTRGB(2,FAILDIG);
2043
2044 /* The presence of a trailing currency sign changes nothing for spaces */
2045 for (i = 0; i < ARRAY_SIZE(spaces)-1; i++)
2046 {
2047 winetest_push_context("%d", i);
2048
2049 /* With flag, no space is allowed before the currency sign "12 E" */
2050 wsprintfW(wstr, L"12%c\x20ac", spaces[i]);
2052 EXPECTFAIL;
2053
2054 /* With flag, even if explicitly allowed "12 E" */
2056 if (spaces[i] == ' ' || spaces[i] == 0xa0 /* non-breaking space */)
2057 {
2058 /* Spaces aliased to thousands separator are never allowed! */
2059 EXPECTFAIL;
2060 }
2061 else
2062 {
2063 /* The others behave normally */
2065 EXPECT2(1,2);
2066 EXPECTRGB(2,FAILDIG);
2067 }
2068
2070 if (spaces[i] == ' ' || spaces[i] == 0xa0 /* non-breaking space */)
2071 {
2072 /* Spaces aliased to thousands separator are never allowed! */
2074 EXPECT2(1,2);
2075 EXPECTRGB(2,FAILDIG);
2076 }
2077 else
2078 {
2079 /* The others behave normally */
2080 EXPECTFAIL;
2081 }
2082
2084 }
2085
2086 /* With flag only, doesn't consume decimal point */
2087 WCONVERT(L"12,1\x20ac", NUMPRS_CURRENCY);
2088 EXPECT(2,NUMPRS_CURRENCY,0,2,0,0);
2089 EXPECT2(1,2);
2090 EXPECTRGB(2,FAILDIG);
2091
2092 /* The three-letter Euro abbreviation is not allowed */
2093 WCONVERT(L"12EUR", NUMPRS_CURRENCY);
2094 EXPECT(2,NUMPRS_CURRENCY,0,2,0,0);
2095 EXPECT2(1,2);
2096 EXPECTRGB(2,FAILDIG);
2097
2098 /* With flag and decimal flag, consumes decimal point and following digits */
2101 EXPECT2(1,2);
2102 EXPECTRGB(2,1);
2103 EXPECTRGB(3,FAILDIG);
2104
2105 /* Thousands flag can also be used with currency */
2108 EXPECT2(1,2);
2109 EXPECTRGB(2,3);
2110 EXPECTRGB(3,4);
2111 EXPECTRGB(4,5);
2112 EXPECTRGB(5,FAILDIG);
2113
2114
2117 /* With flag, consumes decimal point */
2118 CONVERT("1,2", NUMPRS_DECIMAL);
2120 EXPECT2(1,2);
2121 EXPECTRGB(2,FAILDIG);
2122
2123 /* With flag, but not regular point */
2124 CONVERT("1.2", NUMPRS_DECIMAL);
2125 EXPECT(1,NUMPRS_DECIMAL,0,1,0,0);
2126 EXPECT2(1,FAILDIG);
2127
2128 /* The integer part can still be omitted */
2129 CONVERT(",2", NUMPRS_DECIMAL);
2131 EXPECT2(2,FAILDIG);
2132
2133 CONVERT(".2", NUMPRS_DECIMAL);
2134 EXPECTFAIL;
2135}
2136
2138{
2139 HRESULT hres;
2140 LCID lcid;
2141 NUMPARSE np;
2142 BYTE rgb[128];
2143 OLECHAR currency[8], t1000[8], mont1000[8], dec[8], mondec[8];
2144
2145 /* Customize the regional settings to perform extra tests */
2146
2152 {
2153 /* Start from a known configuration */
2159
2160 /* SCURRENCY defaults to '$' */
2164 EXPECT2(1,FAILDIG);
2166
2167 /* STHOUSAND has no default */
2171 EXPECTFAIL;
2173
2174 /* But SMONTHOUSANDSEP defaults to ','! */
2178 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2179 EXPECTRGB(4,FAILDIG);
2182
2183 /* SDECIMAL defaults to '.' */
2188 EXPECT2(4,2);
2189 EXPECTRGB(2,FAILDIG);
2191
2192 /* But SMONDECIMALSEP has no default! */
2195 EXPECTFAIL;
2198
2199 /* Non-breaking spaces are not allowed if sThousand is a regular space */
2201
2204 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2205 EXPECTRGB(4,FAILDIG);
2206
2208 EXPECTFAIL;
2209
2210
2211 /* Show that NUMPRS_THOUSANDS activates sThousand and that
2212 * NUMPRS_THOUSANDS+NUMPRS_CURRENCY activates sMonThousandSep
2213 * whether a currency sign is present or not. Also the presence of
2214 * sMonThousandSep flags the value as being a currency.
2215 */
2218
2221 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2222 EXPECTRGB(4,FAILDIG);
2223
2225 EXPECTFAIL;
2226
2229 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2230 EXPECTRGB(4,FAILDIG);
2231
2234 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2235 EXPECTRGB(4,FAILDIG);
2236
2237
2238 /* Leading sMonThousandSep are not allowed (same as sThousand) */
2240 EXPECTFAIL;
2241
2242 /* But trailing ones are allowed (same as sThousand) */
2245 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2246 EXPECTRGB(4,FAILDIG);
2247
2248 /* And they break NUMPRS_TRAILING_WHITE (same as sThousand) */
2250 EXPECTFAIL;
2251
2252
2253 /* NUMPRS_CURRENCY is not enough for sMonThousandSep */
2255 EXPECTFAIL;
2256
2257
2258 /* Even with a currency sign, the regular thousands separator works */
2260 /* Make sure SMONDECIMALSEP is not the currency sign (see the
2261 * Cape Verdean escudo comment).
2262 */
2266 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2267 EXPECTRGB(4,FAILDIG);
2268
2269 /* Mixing both thousands separators is allowed */
2272 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2273 EXPECTRGB(7,FAILDIG);
2274
2275
2276 /* SMONTHOUSANDSEP does not consider regular spaces to be equivalent to
2277 * non-breaking spaces!
2278 */
2281 EXPECTFAIL;
2282
2286 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2287 EXPECTRGB(4,FAILDIG);
2288
2289
2290 /* Regular thousands separators also have precedence over the currency ones */
2293 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2294 EXPECTRGB(4,FAILDIG);
2295
2296
2297 /* Show that the decimal separator masks the thousands one in all
2298 * positions, sometimes even without NUMPRS_DECIMAL.
2299 */
2304
2307 EXPECT2(1,FAILDIG);
2308
2310 EXPECTFAIL;
2311
2314 EXPECT2(1,FAILDIG);
2315
2316 /* But not for their monetary equivalents */
2319 EXPECT2(1,FAILDIG);
2320
2323 EXPECT2(1,FAILDIG);
2324
2325
2326 /* Only the first sThousand character is used (sigh of relief) */
2329
2332 EXPECTRGB(0,1); /* Don't test extra digits, see "1,000" test */
2333 EXPECTRGB(4,FAILDIG);
2334
2336 EXPECTFAIL;
2337
2339 EXPECTFAIL;
2340
2341
2342 /* Show that the currency decimal separator is active even without
2343 * NUMPRS_CURRENCY.
2344 */
2347
2350 EXPECT2(1,2);
2351 EXPECTRGB(2,FAILDIG);
2352
2355 EXPECT2(1,2);
2356 EXPECTRGB(2,FAILDIG);
2357
2360 EXPECT2(1,2);
2361 EXPECTRGB(2,FAILDIG);
2362
2365 EXPECT2(1,2);
2366 EXPECTRGB(2,FAILDIG);
2367
2370 EXPECT2(1,2);
2371 EXPECTRGB(2,FAILDIG);
2372
2375 EXPECT2(1,2);
2376 EXPECTRGB(2,FAILDIG);
2377
2378
2379 /* In some locales the decimal separator is the currency sign.
2380 * For instance the Cape Verdean escudo.
2381 */
2385 EXPECT2(1,9);
2386 EXPECTRGB(2,9);
2387 EXPECTRGB(3,FAILDIG);
2388
2389
2390 /* Restore all the settings */
2391 ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, currency), "Restoring SCURRENCY failed\n");
2392 ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, t1000), "Restoring STHOUSAND failed\n");
2393 ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, mont1000), "Restoring SMONTHOUSANDSEP failed\n");
2394 ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, dec), "Restoring SDECIMAL failed\n");
2395 ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, mondec), "Restoring SMONDECIMALSEP failed\n");
2396 }
2397
2398
2399 /* Test currencies of various lengths */
2400
2401 /* 2 Polish zloty */
2405 EXPECT2(2,FAILDIG);
2406
2407 /* Multi-character currencies can be repeated too "zl2zlzl" */
2408 WCONVERT(L"z\x142\x32z\x142z\x142", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
2410 EXPECT2(2,FAILDIG);
2411
2414 /* Windows <= 8.1 uses an old currency symbol: "fr. 5" */
2415 ok(hres == S_OK || broken(hres == DISP_E_TYPEMISMATCH), "returned %08lx\n", hres);
2416 if (hres == S_OK)
2417 {
2419 EXPECT2(3,FAILDIG);
2420 }
2421
2422 /* 5 Moroccan dirham */
2424 WCONVERT(L"5\x62f.\x645.\x200f", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
2425 /* Windows 8.1 incorrectly doubles the right-to-left mark:
2426 * "\x62f.\x645.\x200f\x200f 5"
2427 */
2428 ok(hres == S_OK || broken(hres == DISP_E_TYPEMISMATCH), "returned %08lx\n", hres);
2429 if (hres == S_OK)
2430 {
2432 EXPECT2(5,FAILDIG);
2433 }
2434
2435
2436 /* Test Arabic numerals in an Arabic locale */
2437
2439 WCONVERT(L"\x660", NUMPRS_STD);
2440 EXPECTFAIL;
2441}
2442
2443/* Macros for converting and testing the result of VarNumFromParseNum */
2444#define SETRGB(indx,val) if (!indx) memset(rgb, FAILDIG, sizeof(rgb)); rgb[indx] = val
2445#undef CONVERT
2446#define CONVERT(a,b,c,d,e,f,bits) \
2447 np.cDig = (a); np.dwInFlags = (b); np.dwOutFlags = (c); np.cchUsed = (d); \
2448 np.nBaseShift = (e); np.nPwr10 = (f); hres = VarNumFromParseNum(&np, rgb, bits, &vOut)
2449static const char *szFailOverflow = "Expected overflow, hres = %08x\n";
2450#define EXPECT_OVERFLOW ok(hres == DISP_E_OVERFLOW, szFailOverflow, hres)
2451static const char *szFailOk = "Call failed, hres = %08x\n";
2452#define EXPECT_OK ok(hres == S_OK, szFailOk, hres); \
2453 if (hres == S_OK)
2454#define EXPECT_TYPE(typ) ok(V_VT(&vOut) == typ,"Expected Type = " #typ ", got %d\n", V_VT(&vOut))
2455#define EXPECT_I1(val) EXPECT_OK { EXPECT_TYPE(VT_I1); \
2456 ok(V_I1(&vOut) == val, "Expected i1 = %d, got %d\n", (signed char)val, V_I1(&vOut)); }
2457#define EXPECT_UI1(val) EXPECT_OK { EXPECT_TYPE(VT_UI1); \
2458 ok(V_UI1(&vOut) == val, "Expected ui1 = %d, got %d\n", (BYTE)val, V_UI1(&vOut)); }
2459#define EXPECT_I2(val) EXPECT_OK { EXPECT_TYPE(VT_I2); \
2460 ok(V_I2(&vOut) == val, "Expected i2 = %d, got %d\n", (SHORT)val, V_I2(&vOut)); }
2461#define EXPECT_UI2(val) EXPECT_OK { EXPECT_TYPE(VT_UI2); \
2462 ok(V_UI2(&vOut) == val, "Expected ui2 = %d, got %d\n", (USHORT)val, V_UI2(&vOut)); }
2463#define EXPECT_I4(val) EXPECT_OK { EXPECT_TYPE(VT_I4); \
2464 ok(V_I4(&vOut) == val, "Expected i4 = %ld, got %ld\n", (LONG)val, V_I4(&vOut)); }
2465#define EXPECT_UI4(val) EXPECT_OK { EXPECT_TYPE(VT_UI4); \
2466 ok(V_UI4(&vOut) == val, "Expected ui4 = %d, got %d\n", (ULONG)val, V_UI4(&vOut)); }
2467#define EXPECT_I8(val) EXPECT_OK { EXPECT_TYPE(VT_I8); \
2468 ok(V_I8(&vOut) == val, "Expected i8 = %#I64x, got %#I64x\n", (LONG64)val, V_I8(&vOut)); }
2469#define EXPECT_UI8(val) EXPECT_OK { EXPECT_TYPE(VT_UI8); \
2470 ok(V_UI8(&vOut) == val, "Expected ui8 = %#I64x, got %#I64x\n", (ULONG64)val, V_UI8(&vOut); }
2471#define EXPECT_R4(val) EXPECT_OK { EXPECT_TYPE(VT_R4); \
2472 ok(V_R4(&vOut) == val, "Expected r4 = %f, got %f\n", val, V_R4(&vOut)); }
2473#define EXPECT_R8(val) EXPECT_OK { EXPECT_TYPE(VT_R8); \
2474 ok(V_R8(&vOut) == val, "Expected r8 = %g, got %g\n", val, V_R8(&vOut)); }
2475#define CY_MULTIPLIER 10000
2476#define EXPECT_CY(val) EXPECT_OK { EXPECT_TYPE(VT_CY); \
2477 ok(V_CY(&vOut).int64 == (LONG64)(val * CY_MULTIPLIER), "Expected r8 = %#I64x, got %#I64x\n", \
2478 (LONG64)val, V_CY(&vOut).int64); }
2479#define EXPECT_DECIMAL(valHi, valMid, valLo) EXPECT_OK { EXPECT_TYPE(VT_DECIMAL); \
2480 ok(V_DECIMAL(&vOut).Hi32 == valHi && V_DECIMAL(&vOut).Mid32 == valMid && \
2481 V_DECIMAL(&vOut).Lo32 == valLo, \
2482 "Expected decimal = %x/0x%x%08x, got %lx/0x%lx%08lx\n", valHi, valMid, valLo, \
2483 V_DECIMAL(&vOut).Hi32, V_DECIMAL(&vOut).Mid32, V_DECIMAL(&vOut).Lo32); }
2484
2486{
2487 HRESULT hres;
2488 NUMPARSE np;
2489 BYTE rgb[128];
2490 VARIANT vOut;
2491
2492 /* Convert the number 1 to different types */
2493 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1); EXPECT_I1(1);
2494 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_UI1); EXPECT_UI1(1);
2495 /* Prefers a signed type to unsigned of the same size */
2496 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I1|VTBIT_UI1); EXPECT_I1(1);
2497 /* But takes the smaller size if possible */
2498 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_I2|VTBIT_UI1); EXPECT_UI1(1);
2499
2500 /* Try different integer sizes */
2501#define INTEGER_VTBITS (VTBIT_I1|VTBIT_UI1|VTBIT_I2|VTBIT_UI2|VTBIT_I4|VTBIT_UI4|VTBIT_I8|VTBIT_UI8)
2502
2503 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, INTEGER_VTBITS); EXPECT_I1(1);
2504 /* 127 */
2505 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 7);
2506 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I1(127);
2507 /* 128 */
2508 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
2509 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(128);
2510 /* 255 */
2511 SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 5);
2512 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_UI1(255);
2513 /* 256 */
2514 SETRGB(0, 2); SETRGB(1, 5); SETRGB(2, 6);
2515 CONVERT(3,0,0,3,0,0, INTEGER_VTBITS); EXPECT_I2(256);
2516 /* 32767 */
2517 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 7);
2518 CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_I2(32767);
2519 /* 32768 */
2520 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
2521 CONVERT(5,0,0,5,0,0, INTEGER_VTBITS); EXPECT_UI2(32768);
2522
2523 /* Assume the above pattern holds for remaining positive integers; test negative */
2524
2525 /* -128 */
2526 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 8);
2527 CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I1(-128);
2528 /* -129 */
2529 SETRGB(0, 1); SETRGB(1, 2); SETRGB(2, 9);
2530 CONVERT(3,0,NUMPRS_NEG,3,0,0, INTEGER_VTBITS); EXPECT_I2(-129);
2531 /* -32768 */
2532 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 8);
2533 CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I2(-32768);
2534 /* -32768 */
2535 SETRGB(0, 3); SETRGB(1, 2); SETRGB(2, 7); SETRGB(3, 6); SETRGB(4, 9);
2536 CONVERT(5,0,NUMPRS_NEG,5,0,0, INTEGER_VTBITS); EXPECT_I4(-32769);
2537
2538 /* Assume the above pattern holds for remaining negative integers */
2539
2540 /* Test hexadecimal conversions */
2541 SETRGB(0, 1); CONVERT(1,0,0,1,4,0, INTEGER_VTBITS); EXPECT_I1(0x01);
2542 /* 0x7f */
2543 SETRGB(0, 7); SETRGB(1, 0xf);
2544 CONVERT(2,0,0,2,4,0, INTEGER_VTBITS); EXPECT_I1(0x7f);
2545 SETRGB(0, 7); SETRGB(1, 0xf);
2546 CONVERT(2,0,0,2,4,0, VTBIT_DECIMAL); EXPECT_DECIMAL(0,0,0x7f);
2547 /* 0x7fff */
2548 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
2549 CONVERT(4,0,0,4,4,0, INTEGER_VTBITS); EXPECT_I2(0x7fff);
2550 /* 0x7fffffff */
2551 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
2552 SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
2553 CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x7fffffffL);
2554 /* 0x7fffffffffffffff (64 bits) */
2555 SETRGB(0, 7); SETRGB(1, 0xf); SETRGB(2, 0xf); SETRGB(3, 0xf);
2556 SETRGB(4, 0xf); SETRGB(5, 0xf); SETRGB(6, 0xf); SETRGB(7, 0xf);
2557 SETRGB(8, 0xf); SETRGB(9, 0xf); SETRGB(10, 0xf); SETRGB(11, 0xf);
2558 SETRGB(12, 0xf); SETRGB(13, 0xf); SETRGB(14, 0xf); SETRGB(15, 0xf);
2559 if (has_i8)
2560 {
2561 /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
2562 truncate the number to the smallest integer size requested:
2563 CONVERT(16,0,0,16,4,0, INTEGER_VTBITS); EXPECT_I1((signed char)0xff); */
2564 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x7fffffffffffffffull);
2565 }
2566
2567 /* Assume the above pattern holds for numbers without hi-bit set, test (preservation of) hi-bit */
2568 /* 0x82 */
2569 SETRGB(0, 8); SETRGB(1, 2);
2570 CONVERT(2,0,0,2,4,0, INTEGER_VTBITS);
2571 EXPECT_I1((signed char)0x82);
2572 /* 0x8002 */
2573 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
2574 CONVERT(4,0,0,4,4,0, INTEGER_VTBITS);
2575 EXPECT_I2((signed short)0x8002);
2576 /* 0x80000002 */
2577 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
2578 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
2579 CONVERT(8,0,0,8,4,0, INTEGER_VTBITS); EXPECT_I4(0x80000002);
2580 /* 0x8000000000000002 (64 bits) */
2581 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
2582 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
2583 SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
2584 SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
2585 if (has_i8)
2586 {
2587 /* We cannot use INTEGER_VTBITS as WinXP and Win2003 are broken(?). They
2588 truncate the number to the smallest integer size requested:
2589 CONVERT(16,0,0,16,4,0, INTEGER_VTBITS & ~VTBIT_I1);
2590 EXPECT_I2((signed short)0x0002); */
2591 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x8000000000000002ull);
2592 }
2593
2594 /* Test (preservation of) hi-bit with STRICT type requesting */
2595 /* 0x82 */
2596 SETRGB(0, 8); SETRGB(1, 2);
2597 CONVERT(2,0,0,2,4,0, VTBIT_I1);
2598 EXPECT_I1((signed char)0x82);
2599 /* 0x8002 */
2600 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 2);
2601 CONVERT(4,0,0,4,4,0, VTBIT_I2);
2602 EXPECT_I2((signed short)0x8002);
2603 /* 0x80000002 */
2604 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
2605 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 2);
2606 CONVERT(8,0,0,8,4,0, VTBIT_I4); EXPECT_I4(0x80000002);
2607 /* 0x8000000000000002 (64 bits) */
2608 SETRGB(0, 8); SETRGB(1, 0); SETRGB(2, 0); SETRGB(3, 0);
2609 SETRGB(4, 0); SETRGB(5, 0); SETRGB(6, 0); SETRGB(7, 0);
2610 SETRGB(8, 0); SETRGB(9, 0); SETRGB(10, 0); SETRGB(11, 0);
2611 SETRGB(12, 0); SETRGB(13, 0); SETRGB(14, 0); SETRGB(15, 2);
2612 if (has_i8)
2613 {
2614 CONVERT(16,0,0,16,4,0, VTBIT_I8); EXPECT_I8(0x8000000000000002ull);
2615 }
2616 /* Assume the above pattern holds for numbers with hi-bit set */
2617
2618 /* Negative numbers overflow if we have only unsigned outputs */
2619 /* -1 */
2621 /* -0.6 */
2622 SETRGB(0, 6); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_OVERFLOW;
2623
2624 /* Except that rounding is done first, so -0.5 to 0 are accepted as 0 */
2625 /* -0.5 */
2626 SETRGB(0, 5); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_UI1(0);
2627
2628 /* Floating point zero is OK */
2629 /* 0.00000000E0 */
2631 EXPECT_R8(0.0);
2632
2633 /* Float is acceptable for an integer input value */
2634 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4); EXPECT_R4(1.0f);
2635 /* As is double */
2636 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8); EXPECT_R8(1.0);
2637 /* As is currency */
2638 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY); EXPECT_CY(1);
2639
2640 /* Float is preferred over double */
2641 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4|VTBIT_R8); EXPECT_R4(1.0f);
2642
2643 /* Double is preferred over currency */
2644 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R8|VTBIT_CY); EXPECT_R8(1.0);
2645
2646 /* Currency is preferred over decimal */
2647 SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY|VTBIT_DECIMAL); EXPECT_CY(1);
2648
2649 /* Underflow test */
2650 SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R4); EXPECT_R4(0.0);
2651 SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R8); EXPECT_R8(0.0);
2652 SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_CY); EXPECT_CY(0);
2653}
2654
2655
2657 WORD h, WORD mn, WORD s, WORD ms, WORD dw, WORD dy)
2658{
2659 UDATE ud;
2660 HRESULT res;
2661
2662 memset(&ud, 0, sizeof(ud));
2663 res = VarUdateFromDate(dt, flags, &ud);
2664 ok_(__FILE__,line)(r == res && (res != S_OK || (ud.st.wYear == y && ud.st.wMonth == m && ud.st.wDay == d &&
2665 ud.st.wHour == h && ud.st.wMinute == mn && ud.st.wSecond == s &&
2666 ud.st.wMilliseconds == ms && ud.st.wDayOfWeek == dw && ud.wDayOfYear == dy)),
2667 "%.16g expected res(%lx) %d,%d,%d,%d,%d,%d,%d %d %d, got res(%lx) %d,%d,%d,%d,%d,%d,%d %d %d\n",
2668 dt, r, d, m, y, h, mn, s, ms, dw, dy,
2669 res, ud.st.wDay, ud.st.wMonth, ud.st.wYear, ud.st.wHour, ud.st.wMinute,
2671}
2672#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)
2673
2674static void test_VarUdateFromDate(void)
2675{
2676 DT2UD(29221.0,0,S_OK,1,1,1980,0,0,0,0,2,1); /* 1 Jan 1980 */
2677 DT2UD(29222.0,0,S_OK,2,1,1980,0,0,0,0,3,2); /* 2 Jan 1980 */
2678 DT2UD(33238.0,0,S_OK,31,12,1990,0,0,0,0,1,365); /* 31 Dec 1990 */
2679 DT2UD(0.0,0,S_OK,30,12,1899,0,0,0,0,6,364); /* 30 Dec 1899 - VT_DATE 0.0 */
2680 DT2UD(-657434.0,0,S_OK,1,1,100,0,0,0,0,5,1); /* 1 Jan 100 - Min */
2681 DT2UD(-657435.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* < 1 Jan 100 => err */
2682 DT2UD(2958465.0,0,S_OK,31,12,9999,0,0,0,0,5,365); /* 31 Dec 9999 - Max */
2683 DT2UD(2958466.0,0,E_INVALIDARG,0,0,0,0,0,0,0,0,0); /* > 31 Dec 9999 => err */
2684
2685 /* VAR_VALIDDATE doesn't prevent upper and lower bounds being checked */
2686 DT2UD(-657435.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
2687 DT2UD(2958466.0,VAR_VALIDDATE,E_INVALIDARG,0,0,0,0,0,0,0,0,0);
2688
2689 /* Times */
2690 DT2UD(29221.25,0,S_OK,1,1,1980,6,0,0,0,2,1); /* 6 AM */
2691 DT2UD(29221.33333333,0,S_OK,1,1,1980,8,0,0,0,2,1); /* 8 AM */
2692 DT2UD(29221.5,0,S_OK,1,1,1980,12,0,0,0,2,1); /* 12 AM */
2693 DT2UD(29221.9888884444,0,S_OK,1,1,1980,23,44,0,0,2,1); /* 11:44 PM */
2694 DT2UD(29221.7508765432,0,S_OK,1,1,1980,18,1,16,0,2,1); /* 6:18:02 PM */
2695
2696 /* Test handling of times on dates prior to the epoch */
2697 DT2UD(-5.25,0,S_OK,25,12,1899,6,0,0,0,1,359);
2698 DT2UD(-5.9999884259259,0,S_OK,25,12,1899,23,59,59,0,1,359);
2699 /* This just demonstrates the non-linear nature of values prior to the epoch */
2700 DT2UD(-4.0,0,S_OK,26,12,1899,0,0,0,0,2,360);
2701 /* Numerical oddity: for 0.0 < x < 1.0, x and -x represent the same datetime */
2702 DT2UD(-0.25,0,S_OK,30,12,1899,6,0,0,0,6,364);
2703 DT2UD(0.25,0,S_OK,30,12,1899,6,0,0,0,6,364);
2704}
2705
2706
2707static void test_DateFromUDate( int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms,
2708 WORD dw, WORD dy, ULONG flags, HRESULT r, DATE dt )
2709{
2710 UDATE ud;
2711 double out;
2712 HRESULT res;
2713
2714 ud.st.wYear = y;
2715 ud.st.wMonth = m;
2716 ud.st.wDay = d;
2717 ud.st.wHour = h;
2718 ud.st.wMinute = mn;
2719 ud.st.wSecond = s;
2720 ud.st.wMilliseconds = ms;
2721 ud.st.wDayOfWeek = dw;
2722 ud.wDayOfYear = dy;
2723 res = VarDateFromUdate(&ud, flags, &out);
2724 ok_(__FILE__,line)(r == res && (r != S_OK || EQ_DOUBLE(out, dt)),
2725 "expected %lx, %.16g, got %lx, %.16g\n", r, dt, res, out);
2726}
2727#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)
2728
2729static void test_VarDateFromUdate(void)
2730{
2731 UD2T(1,1,1980,0,0,0,0,2,1,0,S_OK,29221.0); /* 1 Jan 1980 */
2732 UD2T(2,1,1980,0,0,0,0,3,2,0,S_OK,29222.0); /* 2 Jan 1980 */
2733 UD2T(2,1,1980,0,0,0,0,4,5,0,S_OK,29222.0); /* 2 Jan 1980 */
2734 UD2T(31,12,1990,0,0,0,0,0,0,0,S_OK,33238.0); /* 31 Dec 1990 */
2735 UD2T(31,12,90,0,0,0,0,0,0,0,S_OK,33238.0); /* year < 100 is 1900+year! */
2736 UD2T(30,12,1899,0,0,0,0,6,364,0,S_OK,0.0); /* 30 Dec 1899 - VT_DATE 0.0 */
2737 UD2T(1,1,100,0,0,0,0,0,0,0,S_OK,-657434.0); /* 1 Jan 100 - Min */
2738 UD2T(31,12,9999,0,0,0,0,0,0,0,S_OK,2958465.0); /* 31 Dec 9999 - Max */
2739 UD2T(1,1,10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0); /* > 31 Dec 9999 => err */
2740 UD2T(1,1,-10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0);/* < -9999 => err */
2741
2742 UD2T(30,12,1899,0,0,0,0,0,0,0,S_OK,0.0); /* 30 Dec 1899 0:00:00 */
2743 UD2T(30,12,1899,0,0,0,999,0,0,0,S_OK,0.0); /* Ignore milliseconds */
2744
2745 UD2T(1,1,1980,18,1,16,0,2,1,0,S_OK,29221.75087962963); /* 6:18:02 PM */
2746 UD2T(1,300,1980,18,1,16,0,2,1,0,S_OK,38322.75087962963); /* Test fwdrolled month */
2747 UD2T(300,1,1980,18,1,16,0,2,1,0,S_OK,29520.75087962963); /* Test fwdrolled days */
2748 UD2T(0,1,1980,42,1,16,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled hours */
2749 UD2T(1,1,1980,17,61,16,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled minutes */
2750 UD2T(1,1,1980,18,0,76,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled seconds */
2751 UD2T(1,-300,1980,18,1,16,0,2,1,0,S_OK,20059.75087962963); /* Test backrolled month */
2752 UD2T(-300,1,1980,18,1,16,0,2,1,0,S_OK,28920.75087962963); /* Test backrolled days */
2753 UD2T(3,1,1980,-30,1,16,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled hours */
2754 UD2T(1,1,1980,20,-119,16,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled minutes */
2755 UD2T(1,1,1980,18,3,-104,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled seconds */
2756 UD2T(1,12001,-1020,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test rolled year and month */
2757 UD2T(1,-23,1982,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test backrolled month */
2758 UD2T(-59,3,1980,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test backrolled days */
2759 UD2T(1,1,0,0,0,0,0,0,0,0,S_OK,36526); /* Test zero year */
2760 UD2T(0,0,1980,0,0,0,0,0,0,0,S_OK,29189); /* Test zero day and month */
2761 UD2T(0,1,1980,0,0,0,0,2,1,0,S_OK,29220.0); /* Test zero day = LastDayOfMonth */
2762 UD2T(-1,1,1980,18,1,16,0,0,0,0,S_OK,29219.75087962963); /* Test day -1 = LastDayOfMonth - 1 */
2763 UD2T(1,1,-1,18,1,16,0,0,0,0,S_OK,36161.75087962963); /* Test year -1 = 1999 */
2764 UD2T(1,-1,1980,18,1,16,0,0,0,0,S_OK,29160.7508796296); /* Test month -1 = 11 */
2765 UD2T(1,13,1980,0,0,0,0,2,1,0,S_OK,29587.0); /* Rolls fwd to 1/1/1981 */
2766
2767 /* Test handling of times on dates prior to the epoch */
2768 UD2T(25,12,1899,6,0,0,0,1,359,0,S_OK,-5.25);
2769 UD2T(25,12,1899,23,59,59,0,1,359,0,S_OK,-5.9999884259259);
2770 /* This just demonstrates the non-linear nature of values prior to the epoch */
2771 UD2T(26,12,1899,0,0,0,0,2,360,0,S_OK,-4.0);
2772 /* for DATE values 0.0 < x < 1.0, x and -x represent the same datetime */
2773 /* but when converting to DATE, prefer the positive versions */
2774 UD2T(30,12,1899,6,0,0,0,6,364,0,S_OK,0.25);
2775
2776 UD2T(1,1,1980,18,1,16,0,2,1,VAR_TIMEVALUEONLY,S_OK,0.7508796296296296);
2777 UD2T(1,1,1980,18,1,16,0,2,1,VAR_DATEVALUEONLY,S_OK,29221.0);
2778 UD2T(25,12,1899,6,0,0,0,1,359,VAR_TIMEVALUEONLY,S_OK,0.25);
2779 UD2T(25,12,1899,6,0,0,0,1,359,VAR_DATEVALUEONLY,S_OK,-5.0);
2780 UD2T(1,-1,1980,18,1,16,0,0,0,VAR_TIMEVALUEONLY|VAR_DATEVALUEONLY,S_OK,0.7508796296296296);
2781}
2782
2783static void test_st2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn,
2784 WORD s, WORD ms, INT r, double dt, double dt2)
2785{
2786 SYSTEMTIME st;
2787 double out;
2788 INT res;
2789
2790 st.wYear = y;
2791 st.wMonth = m;
2792 st.wDay = d;
2793 st.wHour = h;
2794 st.wMinute = mn;
2795 st.wSecond = s;
2796 st.wMilliseconds = ms;
2797 st.wDayOfWeek = 0;
2799 ok_(__FILE__,line)(r == res, "expected %d, got %d\n", r, res);
2800 if (r && res)
2801 ok_(__FILE__,line)(EQ_DOUBLE(out, dt) || (dt2 && broken(EQ_DOUBLE(out, dt2))),
2802 "expected %.16g or %.16g, got %.16g\n", dt, dt2, out);
2803}
2804#define ST2DT(d,m,y,h,mn,s,ms,r,dt,dt2) test_st2dt(__LINE__,d,m,y,h,mn,s,ms,r,dt,dt2)
2805
2807{
2808 ST2DT(1,1,1980,0,0,0,0,TRUE,29221.0,0.0);
2809 ST2DT(2,1,1980,0,0,0,0,TRUE,29222.0,0.0);
2810 ST2DT(0,1,1980,0,0,0,0,TRUE,29220.0,0.0); /* Rolls back to 31 Dec 1899 */
2811 ST2DT(1,13,1980,0,0,0,0,FALSE,0.0,0.0); /* Fails on invalid month */
2812 ST2DT(32,1,1980,0,0,0,0,FALSE,0.0,0.0); /* Fails on invalid day */
2813 ST2DT(1,1,-1,0,0,0,0,FALSE,0.0,0.0); /* Fails on invalid year */
2814 ST2DT(1,1,10000,0,0,0,0,FALSE,0.0,0.0); /* Fails on invalid year */
2815 ST2DT(1,1,9999,0,0,0,0,TRUE,2958101.0,0.0); /* 9999 is last valid year */
2816
2817 /* Old Windows versions use 29 as the Y2K cutoff:
2818 * years 00-29 map to 2000-2029 while years 30-99 map to 1930-1999
2819 */
2820 ST2DT(1,1,0,0,0,0,0,TRUE,36526.0,0.0);
2821 ST2DT(1,1,29,0,0,0,0,TRUE,47119.0,0.0);
2822 ST2DT(1,1,30,0,0,0,0,TRUE,47484.0,10959.0);
2823 /* But Windows 1903+ uses 49 as the Y2K cutoff */
2824 ST2DT(1,1,49,0,0,0,0,TRUE,54424.0,17899.0);
2825 ST2DT(1,1,50,0,0,0,0,TRUE,18264.0,0.0);
2826 ST2DT(31,12,99,0,0,0,0,TRUE,36525.0,0.0);
2827}
2828
2829static void test_dt2st(int line, double dt, INT r, WORD d, WORD m, WORD y,
2830 WORD h, WORD mn, WORD s, WORD ms)
2831{
2832 SYSTEMTIME st;
2833 INT res;
2834
2835 memset(&st, 0, sizeof(st));
2836 res = VariantTimeToSystemTime(dt, &st);
2837 ok_(__FILE__,line)(r == res &&
2838 (!r || (st.wYear == y && st.wMonth == m && st.wDay == d &&
2839 st.wHour == h && st.wMinute == mn &&
2840 st.wSecond == s && st.wMilliseconds == ms)),
2841 "%.16g expected %d, %d,%d,%d,%d,%d,%d,%d, got %d, %d,%d,%d,%d,%d,%d,%d\n",
2842 dt, r, d, m, y, h, mn, s, ms, res, st.wDay, st.wMonth,
2843 st.wYear, st.wHour, st.wMinute, st.wSecond,
2844 st.wMilliseconds);
2845}
2846#define DT2ST(dt,r,d,m,y,h,mn,s,ms) test_dt2st(__LINE__,dt,r,d,m,y,h,mn,s,ms)
2847
2849{
2850 DT2ST(29221.0,1,1,1,1980,0,0,0,0);
2851 DT2ST(29222.0,1,2,1,1980,0,0,0,0);
2852}
2853
2854#define MKDOSDATE(d,m,y) ((d & 0x1f) | ((m & 0xf) << 5) | (((y-1980) & 0x7f) << 9))
2855#define MKDOSTIME(h,m,s) (((s>>1) & 0x1f) | ((m & 0x3f) << 5) | ((h & 0x1f) << 11))
2856
2857static void test_dos2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn,
2858 WORD s, INT r, double dt)
2859{
2860 unsigned short dosDate, dosTime;
2861 double out;
2862 INT res;
2863
2864 out = 0.0;
2865 dosDate = MKDOSDATE(d, m, y);
2866 dosTime = MKDOSTIME(h, mn, s);
2867 res = DosDateTimeToVariantTime(dosDate, dosTime, &out);
2868 ok_(__FILE__,line)(r == res && (!r || EQ_DOUBLE(out, dt)),
2869 "expected %d, %.16g, got %d, %.16g\n", r, dt, res, out);
2870}
2871#define DOS2DT(d,m,y,h,mn,s,r,dt) test_dos2dt(__LINE__,d,m,y,h,mn,s,r,dt)
2872
2874{
2875 /* Date */
2876 DOS2DT(1,1,1980,0,0,0,1,29221.0); /* 1/1/1980 */
2877 DOS2DT(31,12,2099,0,0,0,1,73050.0); /* 31/12/2099 */
2878 /* Dates are limited to the dos date max of 31/12/2099 */
2879 DOS2DT(31,12,2100,0,0,0,0,0.0); /* 31/12/2100 */
2880 /* Days and months of 0 cause date to roll back 1 day or month */
2881 DOS2DT(0,1,1980,0,0,0,1,29220.0); /* 0 Day => 31/12/1979 */
2882 DOS2DT(1,0,1980,0,0,0,1,29190.0); /* 0 Mth => 1/12/1979 */
2883 DOS2DT(0,0,1980,0,0,0,1,29189.0); /* 0 D/M => 30/11/1979 */
2884 /* Days > days in the month cause date to roll forward 1 month */
2885 DOS2DT(29,2,1981,0,0,0,1,29646.0); /* 29/2/1981 -> 3/1/1980 */
2886 DOS2DT(30,2,1981,0,0,0,1,29647.0); /* 30/2/1981 -> 4/1/1980 */
2887 /* Takes leap years into account when rolling forward */
2888 DOS2DT(29,2,1980,0,0,0,1,29280.0); /* 2/29/1980 */
2889 /* Months > 12 cause an error */
2890 DOS2DT(2,13,1980,0,0,0,0,0.0);
2891
2892 /* Time */
2893 DOS2DT(1,1,1980,0,0,29,1,29221.00032407407); /* 1/1/1980 12:00:28 AM */
2894 DOS2DT(1,1,1980,0,0,31,1,29221.00034722222); /* 1/1/1980 12:00:30 AM */
2895 DOS2DT(1,1,1980,0,59,0,1,29221.04097222222); /* 1/1/1980 12:59:00 AM */
2896 DOS2DT(1,1,1980,0,60,0,0,0.0); /* Invalid minutes */
2897 DOS2DT(1,1,1980,0,0,60,0,0.0); /* Invalid seconds */
2898 DOS2DT(1,1,1980,23,0,0,1,29221.95833333333); /* 1/1/1980 11:00:00 PM */
2899 DOS2DT(1,1,1980,24,0,0,0,0.0); /* Invalid hours */
2900
2901 DOS2DT(1,1,1980,0,0,1,1,29221.0);
2902 DOS2DT(2,1,1980,0,0,0,1,29222.0);
2903 DOS2DT(2,1,1980,0,0,0,1,29222.0);
2904 DOS2DT(31,12,1990,0,0,0,1,33238.0);
2905 DOS2DT(31,12,90,0,0,0,1,40543.0);
2906 DOS2DT(30,12,1899,0,0,0,1,46751.0);
2907 DOS2DT(1,1,100,0,0,0,1,43831.0);
2908 DOS2DT(31,12,9999,0,0,0,1,59901.0);
2909 DOS2DT(1,1,10000,0,0,0,1,59902.0);
2910 DOS2DT(1,1,-10000,0,0,0,1,48214.0);
2911
2912 DOS2DT(30,12,1899,0,0,0,1,46751.0);
2913 DOS2DT(30,12,1899,0,0,1,1,46751.0);
2914
2915 DOS2DT(1,1,1980,18,1,16,1,29221.75087962963);
2916 DOS2DT(1,300,1980,18,1,16,1,29556.75087962963);
2917 DOS2DT(300,1,1980,18,1,16,1,29232.75087962963);
2918 DOS2DT(0,1,1980,42,1,16,1,29220.4175462963);
2919 DOS2DT(1,1,1980,17,61,16,0,0.0);
2920 DOS2DT(1,1,1980,18,0,76,1,29221.75013888889);
2921 DOS2DT(1,-300,1980,18,1,16,1,29312.75087962963);
2922 DOS2DT(-300,1,1980,18,1,16,1,29240.75087962963);
2923 DOS2DT(3,1,1980,-30,1,16,1,29223.08421296296);
2924 DOS2DT(1,1,1980,20,-119,16,1,29221.83976851852);
2925 DOS2DT(1,1,1980,18,3,-104,1,29221.75236111111);
2926 DOS2DT(1,12001,-1020,18,1,16,1,55519.75087962963);
2927 DOS2DT(1,-23,1982,18,1,16,1,30195.75087962963);
2928 DOS2DT(-59,3,1980,18,1,16,1,29285.75087962963);
2929 DOS2DT(1,1,0,0,0,0,1,54058.0);
2930 DOS2DT(0,0,1980,0,0,0,1,29189.0);
2931 DOS2DT(0,1,1980,0,0,0,1,29220.0);
2932 DOS2DT(-1,1,1980,18,1,16,1,29251.75087962963);
2933 DOS2DT(1,1,-1,18,1,16,1,53693.75087962963);
2934 DOS2DT(1,-1,1980,18,1,16,0,0);
2935}
2936
2937static void test_dt2dos(int line, double dt, INT r, WORD d, WORD m, WORD y,
2938 WORD h, WORD mn, WORD s)
2939{
2940 unsigned short dosDate, dosTime, expDosDate, expDosTime;
2941 INT res;
2942
2943 dosTime = dosDate = 0;
2944 expDosDate = MKDOSDATE(d,m,y);
2945 expDosTime = MKDOSTIME(h,mn,s);
2946 res = VariantTimeToDosDateTime(dt, &dosDate, &dosTime);
2947 ok_(__FILE__,line)(r == res && (!r || (dosTime == expDosTime && dosDate == expDosDate)),
2948 "%g: expected %d,%d(%d/%d/%d),%d(%d:%d:%d) got %d,%d(%d/%d/%d),%d(%d:%d:%d)\n",
2949 dt, r, expDosDate, expDosDate & 0x1f,
2950 (expDosDate >> 5) & 0xf, 1980 + (expDosDate >> 9),
2951 expDosTime, expDosTime >> 11, (expDosTime >> 5) & 0x3f,
2952 (expDosTime & 0x1f),
2953 res, dosDate, dosDate & 0x1f, (dosDate >> 5) & 0xf,
2954 1980 + (dosDate >> 9), dosTime, dosTime >> 11,
2955 (dosTime >> 5) & 0x3f, (dosTime & 0x1f));
2956}
2957#define DT2DOS(dt,r,d,m,y,h,mn,s) test_dt2dos(__LINE__,dt,r,d,m,y,h,mn,s)
2958
2960{
2961 /* Date */
2962 DT2DOS(29221.0,1,1,1,1980,0,0,0); /* 1/1/1980 */
2963 DT2DOS(73050.0,1,31,12,2099,0,0,0); /* 31/12/2099 */
2964 DT2DOS(29220.0,0,0,0,0,0,0,0); /* 31/12/1979 - out of range */
2965 DT2DOS(73415.0,0,0,0,0,0,0,0); /* 31/12/2100 - out of range */
2966
2967 /* Time */
2968 DT2DOS(29221.00032407407,1,1,1,1980,0,0,29); /* 1/1/1980 12:00:28 AM */
2969 DT2DOS(29221.00034722222,1,1,1,1980,0,0,31); /* 1/1/1980 12:00:30 AM */
2970 DT2DOS(29221.04097222222,1,1,1,1980,0,59,0); /* 1/1/1980 12:59:00 AM */
2971 DT2DOS(29221.95833333333,1,1,1,1980,23,0,0); /* 1/1/1980 11:00:00 PM */
2972}
2973
2975
2976#define VARABS(vt,val,rvt,rval) \
2977 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
2978 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
2979 test_var_call1( __LINE__, pVarAbs, &v, &exp )
2980
2981static void test_VarAbs(void)
2982{
2983 static WCHAR szNum[] = {'-','1','.','1','\0' };
2984 char buff[8];
2985 HRESULT hres;
2986 VARIANT v, vDst, exp;
2987 size_t i;
2988
2990
2991 /* Test all possible V_VT values.
2992 */
2993 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
2994 {
2995 VARTYPE vt;
2996
2997 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
2998 {
2999 HRESULT hExpected = DISP_E_BADVARTYPE;
3000
3001 SKIPTESTS(vt);
3002
3003 memset(&v, 0, sizeof(v));
3004 V_VT(&v) = vt | ExtraFlags[i];
3005 V_VT(&vDst) = VT_EMPTY;
3006
3007 hres = pVarAbs(&v,&vDst);
3008 if (ExtraFlags[i] & VT_ARRAY ||
3009 (!ExtraFlags[i] && (vt == VT_UNKNOWN || vt == VT_BSTR ||
3010 vt == VT_DISPATCH || vt == VT_ERROR || vt == VT_RECORD)))
3011 {
3012 hExpected = DISP_E_TYPEMISMATCH;
3013 }
3014 else if (ExtraFlags[i] || vt >= VT_CLSID || vt == VT_VARIANT)
3015 {
3016 hExpected = DISP_E_BADVARTYPE;
3017 }
3019 hExpected = S_OK;
3020
3021 /* Native always fails on some vartypes that should be valid. don't
3022 * check that Wine does the same; these are bugs in native.
3023 */
3024 if (vt == VT_I8 || vt == VT_UI8 || vt == VT_INT || vt == VT_UINT ||
3025 vt == VT_I1 || vt == VT_UI2 || vt == VT_UI4)
3026 continue;
3027 ok(hres == hExpected, "VarAbs: expected 0x%lX, got 0x%lX for vt %d | 0x%X\n",
3028 hExpected, hres, vt, ExtraFlags[i]);
3029 }
3030 }
3031
3032 /* BOOL->I2, BSTR->R8, all others remain the same */
3033 VARABS(BOOL,VARIANT_TRUE,I2,-VARIANT_TRUE);
3034 VARABS(BOOL,VARIANT_FALSE,I2,VARIANT_FALSE);
3035 VARABS(EMPTY,0,I2,0);
3036 VARABS(EMPTY,1,I2,0);
3037 VARABS(NULL,0,NULL,0);
3038 VARABS(NULL,1,NULL,0);
3039 VARABS(I2,1,I2,1);
3040 VARABS(I2,-1,I2,1);
3041 VARABS(I4,1,I4,1);
3042 VARABS(I4,-1,I4,1);
3043 VARABS(UI1,1,UI1,1);
3044 VARABS(R4,1,R4,1);
3045 VARABS(R4,-1,R4,1);
3046 VARABS(R8,1,R8,1);
3047 VARABS(R8,-1,R8,1);
3048 VARABS(R4,1.40129846432481707e-45,R4,1.40129846432481707e-45);
3049 VARABS(R8,4.94065645841246544e-324,R8,4.94065645841246544e-324);
3050 VARABS(DATE,1,DATE,1);
3051 VARABS(DATE,-1,DATE,1);
3052 V_VT(&v) = VT_CY;
3053 V_CY(&v).int64 = -10000;
3054 memset(&vDst,0,sizeof(vDst));
3055 hres = pVarAbs(&v,&vDst);
3056 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
3057 "VarAbs(CY): expected 0x0 got 0x%lX\n", hres);
3059 if (buff[1])
3060 {
3061 trace("Skipping VarAbs(BSTR) as decimal separator is '%s'\n", buff);
3062 return;
3063 } else {
3064 szNum[2] = buff[0];
3065 }
3066 V_VT(&v) = VT_BSTR;
3067 V_BSTR(&v) = (BSTR)szNum;
3068 memset(&vDst,0,sizeof(vDst));
3069 hres = pVarAbs(&v,&vDst);
3070 ok(hres == S_OK && V_VT(&vDst) == VT_R8 && V_R8(&vDst) == 1.1,
3071 "VarAbs: expected 0x0,%d,%g, got 0x%lX,%d,%g\n", VT_R8, 1.1, hres, V_VT(&vDst), V_R8(&vDst));
3072
3073 V_VT(&v) = VT_BSTR;
3074 V_BSTR(&v) = SysAllocString(L"30000");
3075 memset(&vDst,0,sizeof(vDst));
3076 hres = pVarAbs(&v,&vDst);
3077 ok(hres == S_OK && V_VT(&vDst) == VT_R8 && V_R8(&vDst) == 30000.0,
3078 "VarAbs: expected 0x0,%d,%g, got 0x%lX,%d,%g\n", VT_R8, 30000.0, hres, V_VT(&vDst), V_R8(&vDst));
3080}
3081
3082static HRESULT (WINAPI *pVarNot)(LPVARIANT,LPVARIANT);
3083
3084#define VARNOT(vt,val,rvt,rval) \
3085 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
3086 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3087 test_var_call1( __LINE__, pVarNot, &v, &exp )
3088
3089static void test_VarNot(void)
3090{
3091 static const WCHAR szNum0[] = {'0','\0' };
3092 static const WCHAR szNum1[] = {'1','\0' };
3093 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
3094 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
3095 HRESULT hres;
3096 VARIANT v, exp, vDst;
3097 DECIMAL *pdec = &V_DECIMAL(&v);
3098 CY *pcy = &V_CY(&v);
3099 size_t i;
3100
3102
3103 /* Test all possible V_VT values */
3104 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
3105 {
3106 VARTYPE vt;
3107
3108 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
3109 {
3110 HRESULT hExpected = DISP_E_BADVARTYPE;
3111
3112 SKIPTESTS(vt);
3113
3114 memset(&v, 0, sizeof(v));
3115 V_VT(&v) = vt | ExtraFlags[i];
3116 V_VT(&vDst) = VT_EMPTY;
3117
3118 switch (V_VT(&v))
3119 {
3120 case VT_I1: case VT_UI1: case VT_I2: case VT_UI2:
3121 case VT_INT: case VT_UINT: case VT_I4: case VT_UI4:
3122 case VT_R4: case VT_R8:
3123 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
3124 case VT_DATE: case VT_CY:
3125 hExpected = S_OK;
3126 break;
3127 case VT_I8: case VT_UI8:
3128 if (has_i8)
3129 hExpected = S_OK;
3130 break;
3131 case VT_RECORD:
3132 hExpected = DISP_E_TYPEMISMATCH;
3133 break;
3134 case VT_UNKNOWN: case VT_BSTR: case VT_DISPATCH: case VT_ERROR:
3135 hExpected = DISP_E_TYPEMISMATCH;
3136 break;
3137 default:
3139 hExpected = DISP_E_TYPEMISMATCH;
3140 break;
3141 }
3142
3143 hres = pVarNot(&v,&vDst);
3144 ok(hres == hExpected, "VarNot: expected 0x%lX, got 0x%lX vt %d|0x%X\n",
3145 hExpected, hres, vt, ExtraFlags[i]);
3146 }
3147 }
3148 /* Test the values returned by all cases that can succeed */
3149 VARNOT(EMPTY,0,I2,-1);
3150 VARNOT(EMPTY,1,I2,-1);
3151 VARNOT(NULL,0,NULL,0);
3152 VARNOT(NULL,1,NULL,0);
3153 VARNOT(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
3154 VARNOT(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
3155 VARNOT(I1,-1,I4,0);
3156 VARNOT(I1,0,I4,-1);
3157 VARNOT(I2,-1,I2,0);
3158 VARNOT(I2,0,I2,-1);
3159 VARNOT(I2,1,I2,-2);
3160 VARNOT(I4,1,I4,-2);
3161 VARNOT(I4,0,I4,-1);
3162 VARNOT(UI1,1,UI1,254);
3163 VARNOT(UI1,0,UI1,255);
3164 VARNOT(UI2,0,I4,-1);
3165 VARNOT(UI2,1,I4,-2);
3166 VARNOT(UI4,0,I4,-1);
3167 VARNOT(UI4,1,I4,-2);
3168 VARNOT(INT,0,I4,-1);
3169 VARNOT(INT,1,I4,-2);
3170 VARNOT(UINT,0,I4,-1);
3171 VARNOT(UINT,1,I4,-2);
3172 if (has_i8)
3173 {
3174 VARNOT(I8,1,I8,-2);
3175 VARNOT(I8,0,I8,-1);
3176 VARNOT(UI8,0,I4,-1);
3177 VARNOT(UI8,1,I4,-2);
3178 }
3179 VARNOT(R4,1,I4,-2);
3180 VARNOT(R4,0,I4,-1);
3181 VARNOT(R8,1,I4,-2);
3182 VARNOT(R8,0,I4,-1);
3183 VARNOT(DATE,1,I4,-2);
3184 VARNOT(DATE,0,I4,-1);
3185 VARNOT(BSTR,(BSTR)szNum0,I4,-1);
3186 ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum0, "VarNot(0): changed input\n");
3187 VARNOT(BSTR,(BSTR)szNum1,I4,-2);
3188 ok(V_VT(&v) == VT_BSTR && V_BSTR(&v) == szNum1, "VarNot(1): changed input\n");
3189 VARNOT(BSTR, (BSTR)szTrue, BOOL, VARIANT_FALSE);
3190 VARNOT(BSTR, (BSTR)szFalse, BOOL, VARIANT_TRUE);
3191
3192 pdec->sign = DECIMAL_NEG;
3193 pdec->scale = 0;
3194 pdec->Hi32 = 0;
3195 pdec->Mid32 = 0;
3196 pdec->Lo32 = 1;
3197 VARNOT(DECIMAL,*pdec,I4,0);
3198
3199 pcy->int64 = 10000;
3200 VARNOT(CY,*pcy,I4,-2);
3201
3202 pcy->int64 = 0;
3203 VARNOT(CY,*pcy,I4,-1);
3204
3205 pcy->int64 = -1;
3206 VARNOT(CY,*pcy,I4,-1);
3207}
3208
3209static HRESULT (WINAPI *pVarSub)(LPVARIANT,LPVARIANT,LPVARIANT);
3210
3211#define VARSUB(vt1,val1,vt2,val2,rvt,rval) \
3212 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3213 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3214 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3215 test_var_call2( __LINE__, pVarSub, &left, &right, &exp )
3216
3217static void test_VarSub(void)
3218{
3220 VARTYPE i;
3221 BSTR lbstr, rbstr;
3222 HRESULT hres, expectedhres;
3223 double r;
3224
3226
3227 lbstr = SysAllocString(L"12");
3228 rbstr = SysAllocString(L"12");
3229
3230 VariantInit(&left);
3233
3234 /* Test all possible flag/vt combinations & the resulting vt type */
3235 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
3236 {
3237
3238 VARTYPE leftvt, rightvt, resvt;
3239
3240 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
3241 {
3242
3243 SKIPTESTS(leftvt);
3244
3245 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
3246 {
3247
3248 SKIPTESTS(rightvt);
3249 expectedhres = S_OK;
3250
3251 memset(&left, 0, sizeof(left));
3252 memset(&right, 0, sizeof(right));
3253 V_VT(&left) = leftvt | ExtraFlags[i];
3254 if (leftvt == VT_BSTR)
3255 V_BSTR(&left) = lbstr;
3256 V_VT(&right) = rightvt | ExtraFlags[i];
3257 if (rightvt == VT_BSTR)
3258 V_BSTR(&right) = rbstr;
3259 V_VT(&result) = VT_EMPTY;
3260
3261 /* All extra flags produce errors */
3266 ExtraFlags[i] == VT_VECTOR ||
3267 ExtraFlags[i] == VT_BYREF ||
3269 {
3270 expectedhres = DISP_E_BADVARTYPE;
3271 resvt = VT_EMPTY;
3272 }
3273 else if (ExtraFlags[i] >= VT_ARRAY)
3274 {
3275 expectedhres = DISP_E_TYPEMISMATCH;
3276 resvt = VT_EMPTY;
3277 }
3278 /* Native VarSub cannot handle: VT_I1, VT_UI2, VT_UI4,
3279 VT_INT, VT_UINT and VT_UI8. Tested with WinXP */
3280 else if (!IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
3281 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
3282 leftvt == VT_CLSID || rightvt == VT_CLSID ||
3283 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
3284 leftvt == VT_I1 || rightvt == VT_I1 ||
3285 leftvt == VT_UI2 || rightvt == VT_UI2 ||
3286 leftvt == VT_UI4 || rightvt == VT_UI4 ||
3287 leftvt == VT_UI8 || rightvt == VT_UI8 ||
3288 leftvt == VT_INT || rightvt == VT_INT ||
3289 leftvt == VT_UINT || rightvt == VT_UINT ||
3290 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
3291 leftvt == VT_RECORD || rightvt == VT_RECORD)
3292 {
3293 if (leftvt == VT_RECORD && rightvt == VT_I8)
3294 {
3295 if (has_i8)
3296 expectedhres = DISP_E_TYPEMISMATCH;
3297 else
3298 expectedhres = DISP_E_BADVARTYPE;
3299 }
3300 else if (leftvt < VT_UI1 && rightvt == VT_RECORD)
3301 expectedhres = DISP_E_TYPEMISMATCH;
3302 else if (leftvt >= VT_UI1 && rightvt == VT_RECORD)
3303 expectedhres = DISP_E_TYPEMISMATCH;
3304 else if (leftvt == VT_RECORD && rightvt <= VT_UI1)
3305 expectedhres = DISP_E_TYPEMISMATCH;
3306 else if (leftvt == VT_RECORD && rightvt > VT_UI1)
3307 expectedhres = DISP_E_BADVARTYPE;
3308 else
3309 expectedhres = DISP_E_BADVARTYPE;
3310 resvt = VT_EMPTY;
3311 }
3312 else if ((leftvt == VT_NULL && rightvt == VT_DISPATCH) ||
3313 (leftvt == VT_DISPATCH && rightvt == VT_NULL))
3314 resvt = VT_NULL;
3315 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
3316 leftvt == VT_ERROR || rightvt == VT_ERROR)
3317 {
3318 resvt = VT_EMPTY;
3319 expectedhres = DISP_E_TYPEMISMATCH;
3320 }
3321 else if (leftvt == VT_NULL || rightvt == VT_NULL)
3322 resvt = VT_NULL;
3323 else if ((leftvt == VT_EMPTY && rightvt == VT_BSTR) ||
3324 (leftvt == VT_DATE && rightvt == VT_DATE) ||
3325 (leftvt == VT_BSTR && rightvt == VT_EMPTY) ||
3326 (leftvt == VT_BSTR && rightvt == VT_BSTR))
3327 resvt = VT_R8;
3328 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
3329 resvt = VT_DECIMAL;
3330 else if (leftvt == VT_DATE || rightvt == VT_DATE)
3331 resvt = VT_DATE;
3332 else if (leftvt == VT_CY || rightvt == VT_CY)
3333 resvt = VT_CY;
3334 else if (leftvt == VT_R8 || rightvt == VT_R8)
3335 resvt = VT_R8;
3336 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
3337 resvt = VT_R8;
3338 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
3339 if (leftvt == VT_I4 || rightvt == VT_I4 ||
3340 leftvt == VT_I8 || rightvt == VT_I8)
3341 resvt = VT_R8;
3342 else
3343 resvt = VT_R4;
3344 }
3345 else if (leftvt == VT_I8 || rightvt == VT_I8)
3346 resvt = VT_I8;
3347 else if (leftvt == VT_I4 || rightvt == VT_I4)
3348 resvt = VT_I4;
3349 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
3350 leftvt == VT_BOOL || rightvt == VT_BOOL ||
3351 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
3352 resvt = VT_I2;
3353 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
3354 resvt = VT_UI1;
3355 else
3356 {
3357 resvt = VT_EMPTY;
3358 expectedhres = DISP_E_TYPEMISMATCH;
3359 }
3360
3361 hres = pVarSub(&left, &right, &result);
3362
3363 ok(hres == expectedhres && V_VT(&result) == resvt,
3364 "VarSub: %d|0x%X, %d|0x%X: Expected failure 0x%lX, "
3365 "got 0x%lX, expected vt %d got vt %d\n",
3366 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i],
3367 expectedhres, hres, resvt, V_VT(&result));
3368 }
3369 }
3370 }
3371
3372 /* Test returned values */
3373 VARSUB(I4,4,I4,2,I4,2);
3374 VARSUB(I2,4,I2,2,I2,2);
3375 VARSUB(I2,-13,I4,5,I4,-18);
3376 VARSUB(I4,-13,I4,5,I4,-18);
3377 VARSUB(I2,7,R4,0.5f,R4,6.5f);
3378 VARSUB(R4,0.5f,I4,5,R8,-4.5);
3379 VARSUB(R8,7.1,BOOL,0,R8,7.1);
3380 VARSUB(BSTR,lbstr,I2,4,R8,8);
3381 VARSUB(BSTR,lbstr,BOOL,1,R8,11);
3382 VARSUB(BSTR,lbstr,R4,0.1f,R8,11.9);
3383 VARSUB(R4,0.2f,BSTR,rbstr,R8,-11.8);
3384 VARSUB(DATE,2.25,I4,7,DATE,-4.75);
3385 VARSUB(DATE,1.25,R4,-1.7f,DATE,2.95);
3386
3387 VARSUB(UI1, UI1_MAX, UI1, UI1_MAX, UI1, 0);
3388 VARSUB(I2, I2_MAX, I2, I2_MAX, I2, 0);
3389 VARSUB(I2, I2_MIN, I2, I2_MIN, I2, 0);
3390 VARSUB(I4, I4_MAX, I4, I4_MAX, I4, 0);
3391 VARSUB(I4, I4_MIN, I4, I4_MIN, I4, 0);
3392 VARSUB(R4, R4_MAX, R4, R4_MAX, R4, 0.0f);
3394 VARSUB(R4, R4_MIN, R4, R4_MIN, R4, 0.0f);
3396 VARSUB(R8, R8_MIN, R8, R8_MIN, R8, 0.0);
3397
3398 /* Manually test BSTR + BSTR */
3399 V_VT(&left) = VT_BSTR;
3400 V_BSTR(&left) = lbstr;
3401 V_VT(&right) = VT_BSTR;
3402 V_BSTR(&right) = rbstr;
3403 hres = pVarSub(&left, &right, &result);
3404 ok(hres == S_OK && V_VT(&result) == VT_R8,
3405 "VarSub: expected coerced type VT_R8, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
3406 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0.0),
3407 "VarSub: BSTR + BSTR, expected %f got %f\n", 0.0, V_R8(&result));
3408
3409 /* Manually test some VT_CY and VT_DECIMAL variants */
3410 V_VT(&cy) = VT_CY;
3411 hres = VarCyFromI4(4711, &V_CY(&cy));
3412 ok(hres == S_OK, "VarCyFromI4 failed!\n");
3413 V_VT(&dec) = VT_DECIMAL;
3414 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
3415 ok(hres == S_OK, "VarDecFromR4 failed!\n");
3416 memset(&left, 0, sizeof(left));
3417 memset(&right, 0, sizeof(right));
3418 V_VT(&left) = VT_I4;
3419 V_I4(&left) = -11;
3420 V_VT(&right) = VT_UI1;
3421 V_UI1(&right) = 9;
3422
3423 hres = pVarSub(&cy, &right, &result);
3424 ok(hres == S_OK && V_VT(&result) == VT_CY,
3425 "VarSub: expected coerced type VT_CY, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
3426 hres = VarR8FromCy(V_CY(&result), &r);
3427 ok(hres == S_OK && EQ_DOUBLE(r, 4702.0), "VarSub: CY value %f, expected %f\n", r, 4720.0);
3428
3429 hres = pVarSub(&left, &dec, &result);
3430 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
3431 "VarSub: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
3433 ok(hres == S_OK && EQ_DOUBLE(r, -6.8), "VarSub: DECIMAL value %f, expected %f\n", r, -6.8);
3434
3435 SysFreeString(lbstr);
3436 SysFreeString(rbstr);
3437}
3438
3439static HRESULT (WINAPI *pVarMod)(LPVARIANT,LPVARIANT,LPVARIANT);
3440
3442{
3444 HRESULT hres;
3445
3446 V_VT(&result) = 15;
3447 V_I4(&result) = 0x12345;
3448 hres = pVarMod( left, right, &result );
3449 ok_(__FILE__,line)( hres == expres, "wrong result %lx/%lx\n", hres, expres );
3450 if (hres == S_OK)
3451 {
3452 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
3453 "got %s expected %s\n", wine_dbgstr_variant(&result), wine_dbgstr_variant(expected) );
3454 }
3455 else
3456 {
3457 ok_(__FILE__,line)( V_VT(&result) == VT_EMPTY, "Unexpected type %d.\n", V_VT(&result) );
3458 ok_(__FILE__,line)( V_I4(&result) == 0x12345, "Unexpected value %ld.\n", V_I4(&result) );
3459 }
3460}
3461
3462#define VARMOD(vt1,vt2,val1,val2,rvt,rval) \
3463 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
3464 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
3465 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3466 test_var_call2( __LINE__, pVarMod, &left, &right, &exp )
3467
3468#define VARMOD2(vt1,vt2,val1,val2,rvt,rval,hexpected) \
3469 V_VT(&left) = VT_##vt1; V_I4(&left) = val1; \
3470 V_VT(&right) = VT_##vt2; V_I4(&right) = val2; \
3471 V_VT(&exp) = VT_##rvt; V_I4(&exp) = rval; \
3472 test_Mod( __LINE__, &left, &right, &exp, hexpected )
3473
3474static void test_VarMod(void)
3475{
3476 VARIANT v1, v2, vDst, left, right, exp;
3477 HRESULT hres;
3478 HRESULT hexpected = 0;
3479 int l, r;
3480 BOOL lFound, rFound;
3481 BOOL lValid;
3482 BSTR strNum0, strNum1;
3483
3485
3486 VARMOD(I1,BOOL,100,10,I4,0);
3487 VARMOD(I1,I1,100,10,I4,0);
3488 VARMOD(I1,UI1,100,10,I4,0);
3489 VARMOD(I1,I2,100,10,I4,0);
3490 VARMOD(I1,UI2,100,10,I4,0);
3491 VARMOD(I1,I4,100,10,I4,0);
3492 VARMOD(I1,UI4,100,10,I4,0);
3493 VARMOD(I1,R4,100,10,I4,0);
3494 VARMOD(I1,R8,100,10,I4,0);
3495
3496 VARMOD(UI1,BOOL,100,10,I2,0);
3497 VARMOD(UI1,I1,100,10,I4,0);
3498 VARMOD(UI1,UI1,100,10,UI1,0);
3499 VARMOD(UI1,I2,100,10,I2,0);
3500 VARMOD(UI1,UI2,100,10,I4,0);
3501 VARMOD(UI1,I4,100,10,I4,0);
3502 VARMOD(UI1,UI4,100,10,I4,0);
3503 VARMOD(UI1,R4,100,10,I4,0);
3504 VARMOD(UI1,R8,100,10,I4,0);
3505
3506 VARMOD(I2,BOOL,100,10,I2,0);
3507 VARMOD(I2,I1,100,10,I4,0);
3508 VARMOD(I2,UI1,100,10,I2,0);
3509 VARMOD(I2,I2,100,10,I2,0);
3510 VARMOD(I2,UI2,100,10,I4,0);
3511 VARMOD(I2,I4,100,10,I4,0);
3512 VARMOD(I2,UI4,100,10,I4,0);
3513 VARMOD(I2,R4,100,10,I4,0);
3514 VARMOD(I2,R8,100,10,I4,0);
3515
3516 VARMOD(I4,BOOL,100,10,I4,0);
3517 VARMOD(I4,I1,100,10,I4,0);
3518 VARMOD(I4,UI1,100,10,I4,0);
3519 VARMOD(I4,I2,100,10,I4,0);
3520 VARMOD(I4,UI2,100,10,I4,0);
3521 VARMOD(I4,I4,100,10,I4,0);
3522 VARMOD(I4,UI4,100,10,I4,0);
3523 VARMOD(I4,R4,100,10,I4,0);
3524 VARMOD(I4,R8,100,10,I4,0);
3525 VARMOD(UI4,BOOL,100,10,I4,0);
3526 VARMOD(UI4,I1,100,10,I4,0);
3527 VARMOD(UI4,UI1,100,10,I4,0);
3528 VARMOD(UI4,I2,100,10,I4,0);
3529 VARMOD(UI4,UI2,100,10,I4,0);
3530 VARMOD(UI4,I4,100,10,I4,0);
3531 VARMOD(UI4,UI4,100,10,I4,0);
3532 VARMOD(UI4,R4,100,10,I4,0);
3533 VARMOD(UI4,R8,100,10,I4,0);
3534 VARMOD(R4,BOOL,100,10,I4,0);
3535 VARMOD(R4,I1,100,10,I4,0);
3536 VARMOD(R4,UI1,100,10,I4,0);
3537 VARMOD(R4,I2,100,10,I4,0);
3538 VARMOD(R4,UI2,100,10,I4,0);
3539 VARMOD(R4,I4,100,10,I4,0);
3540 VARMOD(R4,UI4,100,10,I4,0);
3541 VARMOD(R4,R4,100,10,I4,0);
3542 VARMOD(R4,R8,100,10,I4,0);
3543 VARMOD(R8,BOOL,100,10,I4,0);
3544 VARMOD(R8,I1,100,10,I4,0);
3545 VARMOD(R8,UI1,100,10,I4,0);
3546 VARMOD(R8,I2,100,10,I4,0);
3547 VARMOD(R8,UI2,100,10,I4,0);
3548 VARMOD(R8,I4,100,10,I4,0);
3549 VARMOD(R8,UI4,100,10,I4,0);
3550 VARMOD(R8,R4,100,10,I4,0);
3551 VARMOD(R8,R8,100,10,I4,0);
3552
3553 VARMOD(INT,INT,100,10,I4,0);
3554 VARMOD(INT,UINT,100,10,I4,0);
3555
3556 VARMOD(BOOL,BOOL,100,10,I2,0);
3557 VARMOD(BOOL,I1,100,10,I4,0);
3558 VARMOD(BOOL,UI1,100,10,I2,0);
3559 VARMOD(BOOL,I2,100,10,I2,0);
3560 VARMOD(BOOL,UI2,100,10,I4,0);
3561 VARMOD(BOOL,I4,100,10,I4,0);
3562 VARMOD(BOOL,UI4,100,10,I4,0);
3563 VARMOD(BOOL,R4,100,10,I4,0);
3564 VARMOD(BOOL,R8,100,10,I4,0);
3565 VARMOD(BOOL,DATE,100,10,I4,0);
3566
3567 VARMOD(DATE,BOOL,100,10,I4,0);
3568 VARMOD(DATE,I1,100,10,I4,0);
3569 VARMOD(DATE,UI1,100,10,I4,0);
3570 VARMOD(DATE,I2,100,10,I4,0);
3571 VARMOD(DATE,UI2,100,10,I4,0);
3572 VARMOD(DATE,I4,100,10,I4,0);
3573 VARMOD(DATE,UI4,100,10,I4,0);
3574 VARMOD(DATE,R4,100,10,I4,0);
3575 VARMOD(DATE,R8,100,10,I4,0);
3576 VARMOD(DATE,DATE,100,10,I4,0);
3577
3578 strNum0 = SysAllocString(L"125");
3579 strNum1 = SysAllocString(L"10");
3580 VARMOD(BSTR,BSTR,strNum0,strNum1,I4,5);
3581 VARMOD(BSTR,I1,strNum0,10,I4,5);
3582 VARMOD(BSTR,I2,strNum0,10,I4,5);
3583 VARMOD(BSTR,I4,strNum0,10,I4,5);
3584 VARMOD(BSTR,R4,strNum0,10,I4,5);
3585 VARMOD(BSTR,R8,strNum0,10,I4,5);
3586 VARMOD(I4,BSTR,125,strNum1,I4,5);
3587
3588 if (has_i8)
3589 {
3590 VARMOD(BOOL,I8,100,10,I8,0);
3591 VARMOD(I1,I8,100,10,I8,0);
3592 VARMOD(UI1,I8,100,10,I8,0);
3593 VARMOD(I2,I8,100,10,I8,0);
3594 VARMOD(I4,I8,100,10,I8,0);
3595 VARMOD(UI4,I8,100,10,I8,0);
3596 VARMOD(R4,I8,100,10,I8,0);
3597 VARMOD(R8,I8,100,10,I8,0);
3598 VARMOD(DATE,I8,100,10,I8,0);
3599
3600 VARMOD(I8,BOOL,100,10,I8,0);
3601 VARMOD(I8,I1,100,10,I8,0);
3602 VARMOD(I8,UI1,100,10,I8,0);
3603 VARMOD(I8,I2,100,10,I8,0);
3604 VARMOD(I8,UI2,100,10,I8,0);
3605 VARMOD(I8,I4,100,10,I8,0);
3606 VARMOD(I8,UI4,100,10,I8,0);
3607 VARMOD(I8,R4,100,10,I8,0);
3608 VARMOD(I8,R8,100,10,I8,0);
3609 VARMOD(I8,I8,100,10,I8,0);
3610
3611 VARMOD(BSTR,I8,strNum0,10,I8,5);
3612 }
3613
3614 /* test all combinations of types */
3615 for(l = 0; l < VT_BSTR_BLOB; l++)
3616 {
3617 SKIPTESTS(l);
3618
3619 for(r = 0; r < VT_BSTR_BLOB; r++)
3620 {
3621 SKIPTESTS(r);
3622
3623 if(l == VT_BSTR) continue;
3624 if(l == VT_DISPATCH) continue;
3625 if(r == VT_BSTR) continue;
3626 if(r == VT_DISPATCH) continue;
3627
3628 lFound = TRUE;
3629 lValid = TRUE;
3630 switch(l)
3631 {
3632 case VT_EMPTY:
3633 case VT_NULL:
3634 case VT_I1:
3635 case VT_UI1:
3636 case VT_I2:
3637 case VT_UI2:
3638 case VT_I4:
3639 case VT_I8:
3640 case VT_UI4:
3641 case VT_UI8:
3642 case VT_INT:
3643 case VT_UINT:
3644 case VT_R4:
3645 case VT_R8:
3646 case VT_BOOL:
3647 case VT_DATE:
3648 case VT_CY:
3649 case VT_DECIMAL:
3650 hexpected = S_OK;
3651 break;
3652 case VT_ERROR:
3653 case VT_VARIANT:
3654 case VT_UNKNOWN:
3655 case VT_RECORD:
3656 lValid = FALSE;
3657 break;
3658 default:
3659 lFound = FALSE;
3660 hexpected = DISP_E_BADVARTYPE;
3661 break;
3662 }
3663
3664 rFound = TRUE;
3665 switch(r)
3666 {
3667 case VT_EMPTY:
3668 case VT_NULL:
3669 case VT_I1:
3670 case VT_UI1:
3671 case VT_I2:
3672 case VT_UI2:
3673 case VT_I4:
3674 case VT_I8:
3675 case VT_UI4:
3676 case VT_UI8:
3677 case VT_INT:
3678 case VT_UINT:
3679 case VT_R4:
3680 case VT_R8:
3681 case VT_BOOL:
3682 case VT_DATE:
3683 case VT_DECIMAL:
3684 case VT_CY:
3685 hexpected = S_OK;
3686 break;
3687 case VT_ERROR:
3688 case VT_VARIANT:
3689 case VT_UNKNOWN:
3690 case VT_RECORD:
3691 break;
3692 default:
3693 rFound = FALSE;
3694 break;
3695 }
3696
3697 if(((l == VT_I8) && (r == VT_INT)) || ((l == VT_INT) && (r == VT_I8)))
3698 {
3699 hexpected = DISP_E_TYPEMISMATCH;
3700 } else if((l == VT_EMPTY) && (r == VT_NULL))
3701 {
3702 hexpected = S_OK;
3703 } else if((l == VT_NULL) && (r == VT_EMPTY))
3704 {
3705 hexpected = S_OK;
3706 } else if((l == VT_EMPTY) && (r == VT_CY))
3707 {
3708 hexpected = S_OK;
3709 } else if((l == VT_EMPTY) && (r == VT_RECORD))
3710 {
3711 hexpected = DISP_E_TYPEMISMATCH;
3712 } else if((r == VT_EMPTY) && lFound && lValid)
3713 {
3714 hexpected = DISP_E_DIVBYZERO;
3715 } else if((l == VT_ERROR) || ((r == VT_ERROR) && lFound && lValid))
3716 {
3717 hexpected = DISP_E_TYPEMISMATCH;
3718 } else if((l == VT_NULL) && (r == VT_NULL))
3719 {
3720 hexpected = S_OK;
3721 } else if((l == VT_VARIANT) || ((r == VT_VARIANT) && lFound && lValid))
3722 {
3723 hexpected = DISP_E_TYPEMISMATCH;
3724 } else if((l == VT_NULL) && (r == VT_RECORD))
3725 {
3726 hexpected = DISP_E_TYPEMISMATCH;
3727 } else if((l == VT_I8) && (r == VT_DECIMAL))
3728 {
3729 hexpected = S_OK;
3730 } else if((l == VT_DECIMAL) && (r == VT_I8))
3731 {
3732 hexpected = S_OK;
3733 } else if((l == VT_UNKNOWN) || ((r == VT_UNKNOWN) && lFound && lValid))
3734 {
3735 hexpected = DISP_E_TYPEMISMATCH;
3736 } else if((l == VT_NULL) && rFound)
3737 {
3738 hexpected = S_OK;
3739 } else if(l == VT_RECORD)
3740 {
3741 hexpected = DISP_E_TYPEMISMATCH;
3742 } else if((r == VT_RECORD) && lValid && lFound)
3743 {
3744 hexpected = DISP_E_TYPEMISMATCH;
3745 } else if((l == VT_EMPTY) && (r == VT_EMPTY))
3746 {
3747 hexpected = DISP_E_DIVBYZERO;
3748 } else if((l == VT_CY) && !rFound)
3749 {
3750 hexpected = DISP_E_BADVARTYPE;
3751 } else if(lFound && !rFound)
3752 {
3753 hexpected = DISP_E_BADVARTYPE;
3754 } else if(!lFound && rFound)
3755 {
3756 hexpected = DISP_E_BADVARTYPE;
3757 } else if((r == VT_NULL) && lFound && lValid)
3758 {
3759 hexpected = S_OK;
3760 } else if((l == VT_NULL) || (r == VT_NULL))
3761 {
3762 hexpected = DISP_E_BADVARTYPE;
3763 } else if((l == VT_VARIANT) || (r == VT_VARIANT))
3764 {
3765 hexpected = DISP_E_BADVARTYPE;
3766 } else if(!lFound && !rFound)
3767 {
3768 hexpected = DISP_E_BADVARTYPE;
3769 }
3770
3771 V_VT(&v1) = l;
3772 V_VT(&v2) = r;
3773
3774 if(l == VT_CY)
3775 V_CY(&v1).int64 = 1000000;
3776 else if(l == VT_R4)
3777 V_R4(&v1) = 100;
3778 else if(l == VT_R8)
3779 V_R8(&v1) = 100;
3780 else if(l == VT_UI8)
3781 V_UI8(&v1) = 100;
3782 else if(l == VT_I8)
3783 V_I8(&v1) = 100;
3784 else if(l == VT_DATE)
3785 V_DATE(&v1) = 1000;
3786 else if (l == VT_DECIMAL)
3787 {
3788 V_DECIMAL(&v1).Hi32 = 0;
3789 V_DECIMAL(&v1).Lo64 = 100;
3790 V_DECIMAL(&v1).sign = 0;
3791 V_DECIMAL(&v1).scale = 0;
3792 }
3793 else
3794 V_I4(&v1) = 10000;
3795
3796 if(r == VT_CY)
3797 V_CY(&v2).int64 = 10000;
3798 else if(r == VT_R4)
3799 V_R4(&v2) = 100;
3800 else if(r == VT_R8)
3801 V_R8(&v2) = 100;
3802 else if(r == VT_UI8)
3803 V_UI8(&v2) = 100;
3804 else if(r == VT_I8)
3805 V_I8(&v2) = 100;
3806 else if(r == VT_DATE)
3807 V_DATE(&v2) = 1000;
3808 else if (r == VT_DECIMAL)
3809 {
3810 V_DECIMAL(&v2).Hi32 = 0;
3811 V_DECIMAL(&v2).Lo64 = 100;
3812 V_DECIMAL(&v2).sign = 0;
3813 V_DECIMAL(&v2).scale = 0;
3814 }
3815 else
3816 V_I4(&v2) = 10000;
3817
3818 if ((l != VT_I8 && l != VT_UI8 && r != VT_I8 && r != VT_UI8) || has_i8)
3819 {
3820 hres = pVarMod(&v1,&v2,&vDst);
3821 ok(hres == hexpected,
3822 "VarMod: expected 0x%lx, got 0x%lX for l type of %d, r type of %d,\n", hexpected, hres, l, r);
3823 }
3824 }
3825 }
3826
3827
3828 /****************************/
3829 /* test some bad parameters */
3830 VARMOD(I4,I4,-1,-1,I4,0);
3831
3832 /* test modulus with zero */
3833 VARMOD2(I4,I4,100,0,EMPTY,0,DISP_E_DIVBYZERO);
3834
3835 VARMOD(I4,I4,0,10,I4,0); /* test 0 mod 10 */
3836
3837 /* right parameter is type empty */
3838 VARMOD2(I4,EMPTY,100,10,EMPTY,0,DISP_E_DIVBYZERO);
3839
3840 /* left parameter is type empty */
3841 VARMOD2(EMPTY,I4,100,10,I4,0,S_OK);
3842
3843 /* mod with a null left value */
3844 VARMOD2(NULL,I4,125,10,NULL,0,S_OK);
3845
3846 /* mod with a null right value */
3847 VARMOD2(I4,NULL,100,10,NULL,0,S_OK);
3848
3849 /* void left value */
3850 VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3851
3852 /* void right value */
3853 VARMOD2(I4,VOID,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3854
3855 /* null left value, void right value */
3857
3858 /* void left value, null right value */
3860
3861 /* some currencies */
3862 V_VT(&v1) = VT_CY;
3863 V_VT(&v2) = VT_CY;
3864 V_CY(&v1).int64 = 100000;
3865 V_CY(&v2).int64 = 100000;
3866 hres = pVarMod(&v1,&v2,&vDst);
3867 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
3868 "VarMod: expected 0x%lx,%d,%d, got 0x%lX,%d,%ld\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
3869
3870 V_VT(&v1) = VT_I4;
3871 V_VT(&v2) = VT_CY;
3872 V_I4(&v1) = 100;
3873 V_CY(&v2).int64 = 100000;
3874 hres = pVarMod(&v1,&v2,&vDst);
3875 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
3876 "VarMod: expected 0x%lx,%d,%d, got 0x%lX,%d,%ld\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
3877
3878 /* some decimals */
3879 V_VT(&v1) = VT_DECIMAL;
3880 V_VT(&v2) = VT_DECIMAL;
3881 VarDecFromI4(100, &V_DECIMAL(&v1));
3882 VarDecFromI4(10, &V_DECIMAL(&v2));
3883 hres = pVarMod(&v1,&v2,&vDst);
3884 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
3885 "VarMod: expected 0x%lx,%d,%d, got 0x%lX,%d,%ld\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
3886
3887 V_VT(&v1) = VT_I4;
3888 V_VT(&v2) = VT_DECIMAL;
3889 V_I4(&v1) = 100;
3890 VarDecFromI4(10, &V_DECIMAL(&v2));
3891 hres = pVarMod(&v1,&v2,&vDst);
3892 ok(hres == S_OK && V_VT(&vDst) == VT_I4 && V_I4(&vDst) == 0,
3893 "VarMod: expected 0x%lx,%d,%d, got 0x%lX,%d,%ld\n", S_OK, VT_I4, 0, hres, V_VT(&vDst), V_I4(&vDst));
3894
3895 VARMOD2(UINT,I4,100,10,I4,0,S_OK);
3896
3897 /* test that an error results in the type of the result changing but not its value */
3898 V_VT(&v1) = VT_UNKNOWN;
3899 V_VT(&v2) = VT_EMPTY;
3900 V_I4(&v1) = 100;
3901 V_CY(&v2).int64 = 100000;
3902 V_VT(&vDst) = VT_I4;
3903 V_I4(&vDst) = 1231;
3904 hres = pVarMod(&v1,&v2,&vDst);
3905 ok(hres == DISP_E_TYPEMISMATCH && V_VT(&vDst) == VT_EMPTY && V_I4(&vDst) == 1231,
3906 "VarMod: expected 0x%lx,%d,%d, got 0x%lX,%d,%ld\n", DISP_E_TYPEMISMATCH, VT_EMPTY, 1231, hres, V_VT(&vDst), V_I4(&vDst));
3907
3908
3909 /* test some invalid types */
3910 /*TODO: not testing VT_DISPATCH */
3911 if (has_i8)
3912 {
3913 VARMOD2(I8,INT,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
3914 }
3918 VARMOD2(VOID,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3920 VARMOD2(PTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3922 VARMOD2(CARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3923 VARMOD2(USERDEFINED,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3924 VARMOD2(LPSTR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3926 VARMOD2(RECORD,I4,100,10,EMPTY,0,DISP_E_TYPEMISMATCH);
3928 VARMOD2(BLOB,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3931 VARMOD2(STREAMED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3932 VARMOD2(STORED_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3933 VARMOD2(BLOB_OBJECT,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3934 VARMOD2(CF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3936 VARMOD2(VECTOR,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3937 VARMOD2(ARRAY,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3938 VARMOD2(BYREF,I4,100,10,EMPTY,0,DISP_E_BADVARTYPE);
3939
3940 /* test some more invalid types */
3941 V_VT(&v1) = 456;
3942 V_VT(&v2) = 234;
3943 V_I4(&v1) = 100;
3944 V_I4(&v2)= 10;
3945 hres = pVarMod(&v1,&v2,&vDst);
3946 ok(hres == DISP_E_BADVARTYPE && V_VT(&vDst) == VT_EMPTY,
3947 "VarMod: expected 0x%lx,%d, got 0x%lX,%d\n", DISP_E_BADVARTYPE, VT_EMPTY, hres, V_VT(&vDst));
3948
3949 SysFreeString(strNum0);
3950 SysFreeString(strNum1);
3951}
3952
3953static HRESULT (WINAPI *pVarFix)(LPVARIANT,LPVARIANT);
3954
3955#define VARFIX(vt,val,rvt,rval) \
3956 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
3957 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
3958 test_var_call1( __LINE__, pVarFix, &v, &exp )
3959
3960static void test_VarFix(void)
3961{
3962 HRESULT hres;
3963 VARIANT v, exp, vDst;
3964 DECIMAL *pdec = &V_DECIMAL(&v);
3965 CY *pcy = &V_CY(&v);
3966 size_t i;
3967
3969
3970 /* Test all possible V_VT values */
3971 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
3972 {
3973 VARTYPE vt;
3974
3975 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
3976 {
3977 BOOL bFail = TRUE;
3978
3979 SKIPTESTS(vt);
3980
3981 memset(&v, 0, sizeof(v));
3982 V_VT(&v) = vt | ExtraFlags[i];
3983 V_VT(&vDst) = VT_EMPTY;
3984
3985 switch (V_VT(&v))
3986 {
3987 case VT_UI1: case VT_I2: case VT_I4: case VT_R4: case VT_R8:
3988 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
3989 case VT_DATE: case VT_CY:
3990 bFail = FALSE;
3991 break;
3992 case VT_I8:
3993 if (has_i8)
3994 bFail = FALSE;
3995 break;
3996 }
3997
3998 hres = pVarFix(&v,&vDst);
3999 if (bFail)
4001 "VarFix: expected failure, got 0x%lX vt %d|0x%X\n",
4002 hres, vt, ExtraFlags[i]);
4003 else
4004 ok(hres == S_OK, "VarFix: expected S_OK, got 0x%lX vt %d|0x%X\n",
4005 hres, vt, ExtraFlags[i]);
4006 }
4007 }
4008
4009 VARFIX(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
4010 VARFIX(BOOL,VARIANT_FALSE,I2,0);
4011 VARFIX(BOOL,1,I2,1);
4012 VARFIX(UI1,1,UI1,1);
4013 VARFIX(I2,-1,I2,-1);
4014 VARFIX(I4,-1,I4,-1);
4015 if (has_i8)
4016 {
4017 VARFIX(I8,-1,I8,-1);
4018 }
4019 VARFIX(R4,1.4f,R4,1);
4020 VARFIX(R4,1.5f,R4,1);
4021 VARFIX(R4,1.6f,R4,1);
4022 VARFIX(R4,-1.4f,R4,-1);
4023 VARFIX(R4,-1.5f,R4,-1);
4024 VARFIX(R4,-1.6f,R4,-1);
4025 /* DATE & R8 round as for R4 */
4026 VARFIX(DATE,-1,DATE,-1);
4027 VARFIX(R8,-1,R8,-1);
4028 VARFIX(BSTR,(BSTR)L"-1",R8,-1);
4029
4030 V_VT(&v) = VT_EMPTY;
4031 hres = pVarFix(&v,&vDst);
4032 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
4033 "VarFix: expected 0x0,%d,0 got 0x%lX,%d,%d\n", VT_EMPTY,
4034 hres, V_VT(&vDst), V_I2(&vDst));
4035
4036 V_VT(&v) = VT_NULL;
4037 hres = pVarFix(&v,&vDst);
4038 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
4039 "VarFix: expected 0x0,%d got 0x%lX,%d\n", VT_NULL, hres, V_VT(&vDst));
4040
4041 V_VT(&v) = VT_DECIMAL;
4042 pdec->sign = DECIMAL_NEG;
4043 pdec->scale = 0;
4044 pdec->Hi32 = 0;
4045 pdec->Mid32 = 0;
4046 pdec->Lo32 = 1;
4047 hres = pVarFix(&v,&vDst);
4048 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&V_DECIMAL(&v), &V_DECIMAL(&vDst), sizeof(DECIMAL)),
4049 "VarFix: expected 0x0,%d,identical, got 0x%lX,%d\n", VT_DECIMAL,
4050 hres, V_VT(&vDst));
4051
4052 /* FIXME: Test some fractional decimals when VarDecFix is implemented */
4053
4054 V_VT(&v) = VT_CY;
4055 pcy->int64 = -10000;
4056 hres = pVarFix(&v,&vDst);
4057 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
4058 "VarFix: VT_CY wrong, hres=0x%lX\n", hres);
4059
4060 V_VT(&v) = VT_CY;
4061 pcy->int64 = -16000;
4062 hres = pVarFix(&v,&vDst);
4063 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
4064 "VarFix: VT_CY wrong, hres=0x%lX\n", hres);
4065}
4066
4067static HRESULT (WINAPI *pVarInt)(LPVARIANT,LPVARIANT);
4068
4069#define VARINT(vt,val,rvt,rval) \
4070 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
4071 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4072 test_var_call1( __LINE__, pVarInt, &v, &exp )
4073
4074static void test_VarInt(void)
4075{
4076 HRESULT hres;
4077 VARIANT v, exp, vDst;
4078 DECIMAL *pdec = &V_DECIMAL(&v);
4079 CY *pcy = &V_CY(&v);
4080 size_t i;
4081
4083
4084 /* Test all possible V_VT values */
4085 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
4086 {
4087 VARTYPE vt;
4088
4089 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
4090 {
4091 BOOL bFail = TRUE;
4092
4093 SKIPTESTS(vt);
4094
4095 memset(&v, 0, sizeof(v));
4096 V_VT(&v) = vt | ExtraFlags[i];
4097 V_VT(&vDst) = VT_EMPTY;
4098
4099 switch (V_VT(&v))
4100 {
4101 case VT_UI1: case VT_I2: case VT_I4: case VT_R4: case VT_R8:
4102 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
4103 case VT_DATE: case VT_CY:
4104 bFail = FALSE;
4105 break;
4106 case VT_I8:
4107 if (has_i8)
4108 bFail = FALSE;
4109 break;
4110 }
4111
4112 hres = pVarInt(&v,&vDst);
4113 if (bFail)
4115 "VarInt: expected failure, got 0x%lX vt %d|0x%X\n",
4116 hres, vt, ExtraFlags[i]);
4117 else
4118 ok(hres == S_OK, "VarInt: expected S_OK, got 0x%lX vt %d|0x%X\n",
4119 hres, vt, ExtraFlags[i]);
4120 }
4121 }
4122
4123 VARINT(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE);
4124 VARINT(BOOL,VARIANT_FALSE,I2,0);
4125 VARINT(BOOL,1,I2,1);
4126 VARINT(UI1,1,UI1,1);
4127 VARINT(I2,-1,I2,-1);
4128 VARINT(I4,-1,I4,-1);
4129 if (has_i8)
4130 {
4131 VARINT(I8,-1,I8,-1);
4132 }
4133 VARINT(R4,1.4f,R4,1);
4134 VARINT(R4,1.5f,R4,1);
4135 VARINT(R4,1.6f,R4,1);
4136 VARINT(R4,-1.4f,R4,-2); /* Note these 3 are different from VarFix */
4137 VARINT(R4,-1.5f,R4,-2);
4138 VARINT(R4,-1.6f,R4,-2);
4139 /* DATE & R8 round as for R4 */
4140 VARINT(DATE,-1,DATE,-1);
4141 VARINT(R8,-1,R8,-1);
4142 VARINT(BSTR,(BSTR)L"-1",R8,-1);
4143
4144 V_VT(&v) = VT_EMPTY;
4145 hres = pVarInt(&v,&vDst);
4146 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
4147 "VarInt: expected 0x0,%d,0 got 0x%lX,%d,%d\n", VT_EMPTY,
4148 hres, V_VT(&vDst), V_I2(&vDst));
4149
4150 V_VT(&v) = VT_NULL;
4151 hres = pVarInt(&v,&vDst);
4152 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
4153 "VarInt: expected 0x0,%d got 0x%lX,%d\n", VT_NULL, hres, V_VT(&vDst));
4154
4155 V_VT(&v) = VT_DECIMAL;
4156 pdec->sign = DECIMAL_NEG;
4157 pdec->scale = 0;
4158 pdec->Hi32 = 0;
4159 pdec->Mid32 = 0;
4160 pdec->Lo32 = 1;
4161 hres = pVarInt(&v,&vDst);
4162 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && !memcmp(&V_DECIMAL(&v), &V_DECIMAL(&vDst), sizeof(DECIMAL)),
4163 "VarInt: expected 0x0,%d,identical, got 0x%lX,%d\n", VT_DECIMAL,
4164 hres, V_VT(&vDst));
4165
4166 /* FIXME: Test some fractional decimals when VarDecInt is implemented */
4167
4168 V_VT(&v) = VT_CY;
4169 pcy->int64 = -10000;
4170 hres = pVarInt(&v,&vDst);
4171 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -10000,
4172 "VarInt: VT_CY wrong, hres=0x%lX\n", hres);
4173
4174 V_VT(&v) = VT_CY;
4175 pcy->int64 = -11000;
4176 hres = pVarInt(&v,&vDst);
4177 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == -20000,
4178 "VarInt: VT_CY wrong, hres=%#lX %#I64x\n",
4179 hres, V_CY(&vDst).int64);
4180}
4181
4182static HRESULT (WINAPI *pVarNeg)(LPVARIANT,LPVARIANT);
4183
4184#define VARNEG(vt,val,rvt,rval) \
4185 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
4186 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4187 test_var_call1( __LINE__, pVarNeg, &v, &exp )
4188
4189static void test_VarNeg(void)
4190{
4191 HRESULT hres;
4192 VARIANT v, exp, vDst;
4193 DECIMAL *pdec = &V_DECIMAL(&v);
4194 CY *pcy = &V_CY(&v);
4195 size_t i;
4196
4198
4199 /* Test all possible V_VT values. But don't test the exact return values
4200 * except for success/failure, since M$ made a hash of them in the
4201 * native version. This at least ensures (as with all tests here) that
4202 * we will notice if/when new vtypes/flags are added in native.
4203 */
4204 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
4205 {
4206 VARTYPE vt;
4207
4208 for (vt = 0; vt <= VT_BSTR_BLOB; vt++)
4209 {
4210 BOOL bFail = TRUE;
4211
4212 SKIPTESTS(vt);
4213
4214 memset(&v, 0, sizeof(v));
4215 V_VT(&v) = vt | ExtraFlags[i];
4216 V_VT(&vDst) = VT_EMPTY;
4217
4218 switch (V_VT(&v))
4219 {
4220 case VT_UI1: case VT_I2: case VT_I4:
4221 case VT_R4: case VT_R8:
4222 case VT_DECIMAL: case VT_BOOL: case VT_NULL: case VT_EMPTY:
4223 case VT_DATE: case VT_CY:
4224 bFail = FALSE;
4225 break;
4226 case VT_I8:
4227 if (has_i8)
4228 bFail = FALSE;
4229 }
4230
4231 hres = pVarNeg(&v,&vDst);
4232 if (bFail)
4234 "VarNeg: expected failure, got 0x%lX vt %d|0x%X\n",
4235 hres, vt, ExtraFlags[i]);
4236 else
4237 ok(hres == S_OK, "VarNeg: expected S_OK, got 0x%lX vt %d|0x%X\n",
4238 hres, vt, ExtraFlags[i]);
4239 }
4240 }
4241
4242 VARNEG(BOOL,VARIANT_TRUE,I2,1);
4243 VARNEG(BOOL,VARIANT_FALSE,I2,0);
4244 VARNEG(BOOL,1,I2,-1);
4245 VARNEG(UI1,1,I2,-1);
4246 VARNEG(UI1,254,I2,-254);
4247 VARNEG(I2,-32768,I4,32768);
4248 VARNEG(I2,-1,I2,1);
4249 VARNEG(I2,1,I2,-1);
4250 VARNEG(I4,-((int)(~0u >> 1)) - 1,R8,-2147483648u);
4251 VARNEG(I4,-1,I4,1);
4252 VARNEG(I4,1,I4,-1);
4253 if (has_i8)
4254 {
4255 VARNEG(I8,1,I8,-1);
4256 VARNEG(I8,-1,I8,1);
4257 }
4258 VARNEG(R4,1,R4,-1);
4259 VARNEG(R4,-1,R4,1);
4260 VARNEG(DATE,1,DATE,-1);
4261 VARNEG(DATE,-1,DATE,1);
4262 VARNEG(R8,1,R8,-1);
4263 VARNEG(R8,-1,R8,1);
4264 VARNEG(BSTR,(BSTR)L"-1",R8,1);
4265 VARNEG(BSTR,(BSTR)L"1",R8,-1);
4266
4267 V_VT(&v) = VT_EMPTY;
4268 hres = pVarNeg(&v,&vDst);
4269 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
4270 "VarNeg: expected 0x0,%d,0 got 0x%lX,%d,%d\n", VT_EMPTY,
4271 hres, V_VT(&vDst), V_I2(&vDst));
4272
4273 V_VT(&v) = VT_NULL;
4274 hres = pVarNeg(&v,&vDst);
4275 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
4276 "VarNeg: expected 0x0,%d got 0x%lX,%d\n", VT_NULL, hres, V_VT(&vDst));
4277
4278 V_VT(&v) = VT_DECIMAL;
4279 pdec->sign = DECIMAL_NEG;
4280 pdec->scale = 0;
4281 pdec->Hi32 = 0;
4282 pdec->Mid32 = 0;
4283 pdec->Lo32 = 1;
4284 hres = pVarNeg(&v,&vDst);
4285 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
4286 V_DECIMAL(&vDst).sign == 0,
4287 "VarNeg: expected 0x0,%d,0x00, got 0x%lX,%d,%02x\n", VT_DECIMAL,
4288 hres, V_VT(&vDst), V_DECIMAL(&vDst).sign);
4289
4290 pdec->sign = 0;
4291 hres = pVarNeg(&v,&vDst);
4292 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL &&
4293 V_DECIMAL(&vDst).sign == DECIMAL_NEG,
4294 "VarNeg: expected 0x0,%d,0x7f, got 0x%lX,%d,%02x\n", VT_DECIMAL,
4295 hres, V_VT(&vDst), V_DECIMAL(&vDst).sign);
4296
4297 V_VT(&v) = VT_CY;
4298 pcy->int64 = -10000;
4299 hres = pVarNeg(&v,&vDst);
4300 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
4301 "VarNeg: VT_CY wrong, hres=0x%lX\n", hres);
4302}
4303
4304static void test_Round( int line, VARIANT *arg, int deci, VARIANT *expected )
4305{
4307 HRESULT hres;
4308
4309 memset( &result, 0, sizeof(result) );
4310 hres = VarRound( arg, deci, &result );
4311 ok_(__FILE__,line)( hres == S_OK, "wrong result %lx\n", hres );
4312 if (hres == S_OK)
4313 ok_(__FILE__,line)( is_expected_variant( &result, expected ),
4314 "got %s expected %s\n", wine_dbgstr_variant(&result), wine_dbgstr_variant(expected) );
4315}
4316#define VARROUND(vt,val,deci,rvt,rval) \
4317 V_VT(&v) = VT_##vt; V_##vt(&v) = val; \
4318 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4319 test_Round( __LINE__, &v, deci, &exp )
4320
4327};
4328
4332 int dec;
4333};
4334
4335static const struct decimal_round_t decimal_round_data[] = {
4336 {{ 0, DECIMAL_NEG, 0, 0, 1 }, { 0, DECIMAL_NEG, 0, 0, 1 }, 0},
4337 {{ 0, 0, 0, 0, 1 }, { 0, 0, 0, 0, 1 }, 0},
4338 {{ 2, 0, 0, 0, 155 }, { 0, 0, 0, 0, 16 }, 1},
4339 {{ 2, 0, 0, 0, 155 }, { 1, 0, 0, 0, 2 }, 0},
4340 {{ 2, 0, 0, 0, 199 }, { 1, 0, 0, 0, 20 }, 1},
4341 {{ 2, 0, 0, 0, 199 }, { 2, 0, 0, 0, 199 }, 2},
4342 {{ 2, DECIMAL_NEG, 0, 0, 199 }, { 2, DECIMAL_NEG, 0, 0, 199 }, 2},
4343 {{ 2, DECIMAL_NEG, 0, 0, 55 }, { 2, DECIMAL_NEG, 0, 0, 6 }, 1},
4344 {{ 2, 0, 0, 0, 55 }, { 2, 0, 0, 0, 6 }, 1},
4345 {{ 2, 0, 0, 0, 1999 }, { 1, 0, 0, 0, 200 }, 1},
4346};
4347
4348static void test_VarRound(void)
4349{
4350 static WCHAR szNumMin[] = {'-','1','.','4','4','9','\0' };
4351 static WCHAR szNum[] = {'1','.','4','5','1','\0' };
4352 HRESULT hres;
4353 VARIANT v, exp, vDst;
4354 CY *pcy = &V_CY(&v);
4355 char buff[8];
4356 int i;
4357
4358 /* first check valid integer types */
4359 VARROUND(BOOL,VARIANT_TRUE,0,I2,-1);
4360 VARROUND(BOOL,VARIANT_FALSE,0,I2,0);
4361 VARROUND(BOOL,1,0,I2,1);
4362 VARROUND(UI1,1,0,UI1,1);
4363 VARROUND(UI1,254,0,UI1,254);
4364 VARROUND(I2,-32768,0,I2,-32768);
4365 VARROUND(I2,-1,0,I2,-1);
4366 VARROUND(I2,1,0,I2,1);
4367 VARROUND(I4,-((int)(~0u >> 1)) - 1,0,I4,-((int)(~0u >> 1)) - 1);
4368 VARROUND(I4,-1,0,I4,-1);
4369 VARROUND(I4,1,0,I4,1);
4370
4371
4372 /* MSDN states that rounding of R4/R8 is dependent on the underlying
4373 * bit pattern of the number and so is architecture dependent. In this
4374 * case Wine returns .2 (which is more correct) and Native returns .3
4375 */
4376
4377 VARROUND(R4,1.0f,0,R4,1.0f);
4378 VARROUND(R4,-1.0f,0,R4,-1.0f);
4379 VARROUND(R8,1.0,0,R8,1.0);
4380 VARROUND(R8,-1.0,0,R8,-1.0);
4381
4382 /* floating point numbers aren't exactly equal and we can't just
4383 * compare the first few digits. */
4384 VARROUND(DATE,1.451,1,DATE,1.5);
4385 VARROUND(DATE,-1.449,1,DATE,-1.4);
4386
4387 /* replace the decimal separator */
4389 if (!buff[1]) {
4390 szNumMin[2] = buff[0];
4391 szNum[1] = buff[0];
4392 VARROUND(BSTR,(BSTR)szNumMin,1,R8,-1.40);
4393 VARROUND(BSTR,(BSTR)szNum,1,R8,1.50);
4394 } else {
4395 skip("Skipping VarRound(BSTR) as decimal separator is '%s'\n", buff);
4396 }
4397
4398 VARROUND(R4,1.23456f,0,R4,1.0f);
4399 VARROUND(R4,1.23456f,1,R4,1.2f);
4400 VARROUND(R4,1.23456f,2,R4,1.23f);
4401 VARROUND(R4,1.23456f,3,R4,1.235f);
4402 VARROUND(R4,1.23456f,4,R4,1.2346f);
4403 VARROUND(R4,-1.23456f,0,R4,-1.0f);
4404 VARROUND(R4,-1.23456f,1,R4,-1.2f);
4405 VARROUND(R4,-1.23456f,2,R4,-1.23f);
4406 VARROUND(R4,-1.23456f,3,R4,-1.235f);
4407 VARROUND(R4,-1.23456f,4,R4,-1.2346f);
4408
4409 VARROUND(R8,1.23456,0,R8,1.0);
4410 VARROUND(R8,1.23456,1,R8,1.2);
4411 VARROUND(R8,1.23456,2,R8,1.23);
4412 VARROUND(R8,1.23456,3,R8,1.235);
4413 VARROUND(R8,1.23456,4,R8,1.2346);
4414 VARROUND(R8,-1.23456,0,R8,-1.0);
4415 VARROUND(R8,-1.23456,1,R8,-1.2);
4416 VARROUND(R8,-1.23456,2,R8,-1.23);
4417 VARROUND(R8,-1.23456,3,R8,-1.235);
4418 VARROUND(R8,-1.23456,4,R8,-1.2346);
4419
4420 V_VT(&v) = VT_EMPTY;
4421 hres = VarRound(&v,0,&vDst);
4422 ok(hres == S_OK && V_VT(&vDst) == VT_I2 && V_I2(&vDst) == 0,
4423 "VarRound: expected 0x0,%d,0 got 0x%lX,%d,%d\n", VT_EMPTY,
4424 hres, V_VT(&vDst), V_I2(&vDst));
4425
4426 V_VT(&v) = VT_NULL;
4427 hres = VarRound(&v,0,&vDst);
4428 ok(hres == S_OK && V_VT(&vDst) == VT_NULL,
4429 "VarRound: expected 0x0,%d got 0x%lX,%d\n", VT_NULL, hres, V_VT(&vDst));
4430
4431 /* VT_DECIMAL */
4432 for (i = 0; i < ARRAY_SIZE(decimal_round_data); i++)
4433 {
4434 const struct decimal_round_t *ptr = &decimal_round_data[i];
4435 DECIMAL *pdec;
4436
4437 pdec = &V_DECIMAL(&v);
4438 V_VT(&v) = VT_DECIMAL;
4439 pdec->sign = ptr->source.sign;
4440 pdec->scale = ptr->source.scale;
4441 pdec->Hi32 = ptr->source.Hi32;
4442 pdec->Mid32 = ptr->source.Mid32;
4443 pdec->Lo32 = ptr->source.Lo32;
4444 VariantInit(&vDst);
4445 hres = VarRound(&v, ptr->dec, &vDst);
4446 ok(hres == S_OK, "%d: got 0x%08lx\n", i, hres);
4447 if (hres == S_OK)
4448 {
4449 ok(V_VT(&vDst) == VT_DECIMAL, "%d: got VT %d, expected VT_DECIMAL\n", i, V_VT(&vDst));
4450 ok(V_DECIMAL(&vDst).sign == ptr->ret.sign, "%d: got sign 0x%02x, expected 0x%02x\n",
4451 i, V_DECIMAL(&vDst).sign, ptr->ret.sign);
4452 ok(V_DECIMAL(&vDst).Hi32 == ptr->ret.Hi32, "%d: got Hi32 %ld, expected %ld\n",
4453 i, V_DECIMAL(&vDst).Hi32, ptr->ret.Hi32);
4454 ok(V_DECIMAL(&vDst).Mid32 == ptr->ret.Mid32, "%d: got Mid32 %ld, expected %ld\n",
4455 i, V_DECIMAL(&vDst).Mid32, ptr->ret.Mid32);
4456 ok(V_DECIMAL(&vDst).Lo32 == ptr->ret.Lo32, "%d: got Lo32 %ld, expected %ld\n",
4457 i, V_DECIMAL(&vDst).Lo32, ptr->ret.Lo32);
4458 }
4459 }
4460
4461 /* VT_CY */
4462 V_VT(&v) = VT_CY;
4463 pcy->int64 = 10000;
4464 hres = VarRound(&v,0,&vDst);
4465 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == 10000,
4466 "VarRound: VT_CY wrong, hres=0x%lX\n", hres);
4467}
4468
4469static HRESULT (WINAPI *pVarXor)(LPVARIANT,LPVARIANT,LPVARIANT);
4470
4471#define VARXOR(vt1,val1,vt2,val2,rvt,rval) \
4472 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
4473 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
4474 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4475 test_var_call2( __LINE__, pVarXor, &left, &right, &exp )
4476
4477#define VARXORCY(vt1,val1,val2,rvt,rval) \
4478 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
4479 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
4480 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
4481 test_var_call2( __LINE__, pVarXor, &left, &right, &exp )
4482
4483static void test_VarXor(void)
4484{
4485 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
4486 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
4488 BSTR lbstr, rbstr;
4489 VARTYPE i;
4490 HRESULT hres;
4491
4493
4494 /* Test all possible flag/vt combinations & the resulting vt type */
4495 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
4496 {
4497 VARTYPE leftvt, rightvt, resvt;
4498
4499 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
4500 {
4501
4502 SKIPTESTS(leftvt);
4503
4504 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
4505 {
4506 BOOL bFail = FALSE;
4507
4508 SKIPTESTS(rightvt);
4509
4510 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
4511 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
4512 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
4513 continue;
4514
4515 memset(&left, 0, sizeof(left));
4516 memset(&right, 0, sizeof(right));
4517 V_VT(&left) = leftvt | ExtraFlags[i];
4518 V_VT(&right) = rightvt | ExtraFlags[i];
4519 V_VT(&result) = VT_EMPTY;
4520 resvt = VT_I4;
4521
4522 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
4523 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
4524 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
4525 leftvt == VT_CLSID || rightvt == VT_CLSID ||
4526 leftvt == VT_RECORD || rightvt == VT_RECORD ||
4527 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
4528 leftvt == VT_ERROR || rightvt == VT_ERROR)
4529 {
4530 bFail = TRUE;
4531 }
4532 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
4533 {
4534 if (leftvt == rightvt ||
4535 leftvt == VT_I2 || rightvt == VT_I2 ||
4536 leftvt == VT_UI1 || rightvt == VT_UI1 ||
4537 leftvt == VT_BOOL || rightvt == VT_BOOL)
4538 resvt = VT_I2;
4539 else if (leftvt == VT_NULL || rightvt == VT_NULL)
4540 resvt = VT_NULL;
4541 else if (leftvt == VT_I8 || rightvt == VT_I8)
4542 resvt = VT_I8;
4543 }
4544 else if (leftvt == VT_NULL || rightvt == VT_NULL)
4545 {
4546 resvt = VT_NULL;
4547 }
4548 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
4549 {
4550 if (leftvt == rightvt)
4551 resvt = VT_UI1;
4552 else if (leftvt == rightvt ||
4553 leftvt == VT_I2 || rightvt == VT_I2 ||
4554 leftvt == VT_BOOL || rightvt == VT_BOOL)
4555 {
4556 resvt = VT_I2;
4557 }
4558 else if (leftvt == VT_I8 || rightvt == VT_I8)
4559 resvt = VT_I8;
4560 }
4561 else if (leftvt == VT_I2 || rightvt == VT_I2)
4562 {
4563 if (leftvt == rightvt ||
4564 leftvt == VT_BOOL || rightvt == VT_BOOL)
4565 resvt = VT_I2;
4566 else if (leftvt == VT_I8 || rightvt == VT_I8)
4567 resvt = VT_I8;
4568 }
4569 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
4570 {
4571 resvt = VT_BOOL;
4572 }
4573 else if (leftvt == VT_I8 || rightvt == VT_I8)
4574 {
4575 if (leftvt == VT_INT || rightvt == VT_INT)
4576 bFail = TRUE;
4577 else
4578 resvt = VT_I8;
4579 }
4580 hres = pVarXor(&left, &right, &result);
4581 if (bFail)
4583 "VarXor: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX vt %d\n",
4584 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
4585 V_VT(&result));
4586 else
4587 ok(hres == S_OK && V_VT(&result) == resvt,
4588 "VarXor: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%lX vt %d\n",
4589 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
4590 V_VT(&result));
4591 }
4592 }
4593 }
4594
4595 /* Test returned values
4596 * FIXME: Test VT_DECIMAL/VT_DISPATCH
4597 */
4598 VARXOR(EMPTY,0,EMPTY,0,I2,0);
4599 VARXOR(EMPTY,1,EMPTY,0,I2,0);
4600 VARXOR(EMPTY,0,NULL,0,NULL,0);
4601 VARXOR(EMPTY,0,I1,0,I4,0);
4602 VARXOR(EMPTY,0,I1,1,I4,1);
4603 VARXOR(EMPTY,0,UI1,0,I2,0);
4604 VARXOR(EMPTY,0,UI1,1,I2,1);
4605 VARXOR(EMPTY,0,I2,0,I2,0);
4606 VARXOR(EMPTY,0,I2,1,I2,1);
4607 VARXOR(EMPTY,0,UI2,0,I4,0);
4608 VARXOR(EMPTY,0,UI2,1,I4,1);
4609 VARXOR(EMPTY,0,I4,0,I4,0);
4610 VARXOR(EMPTY,0,I4,1,I4,1);
4611 VARXOR(EMPTY,0,UI4,0,I4,0);
4612 VARXOR(EMPTY,0,UI4,1,I4,1);
4613 if (has_i8)
4614 {
4615 VARXOR(EMPTY,0,I8,0,I8,0);
4616 VARXOR(EMPTY,0,I8,1,I8,1);
4617 VARXOR(EMPTY,0,UI8,0,I4,0);
4618 VARXOR(EMPTY,0,UI8,1,I4,1);
4619 }
4620 VARXOR(EMPTY,0,INT,0,I4,0);
4621 VARXOR(EMPTY,0,INT,1,I4,1);
4622 VARXOR(EMPTY,0,UINT,0,I4,0);
4623 VARXOR(EMPTY,0,UINT,1,I4,1);
4624 VARXOR(EMPTY,0,BOOL,0,I2,0);
4625 VARXOR(EMPTY,0,BOOL,1,I2,1);
4626 VARXOR(EMPTY,0,R4,0,I4,0);
4627 VARXOR(EMPTY,0,R4,1,I4,1);
4628 VARXOR(EMPTY,0,R8,0,I4,0);
4629 VARXOR(EMPTY,0,R8,1,I4,1);
4630 rbstr = SysAllocString(szFalse);
4631 VARXOR(EMPTY,0,BSTR,rbstr,I2,0);
4632 SysFreeString(rbstr);
4633 rbstr = SysAllocString(szTrue);
4634 VARXOR(EMPTY,0,BSTR,rbstr,I2,-1);
4635 VARXORCY(EMPTY,0,10000,I4,1);
4636 SysFreeString(rbstr);
4637
4638 /* NULL OR 0 = NULL. NULL OR n = n */
4639 VARXOR(NULL,0,NULL,0,NULL,0);
4640 VARXOR(NULL,1,NULL,0,NULL,0);
4641 VARXOR(NULL,0,I1,0,NULL,0);
4642 VARXOR(NULL,0,I1,1,NULL,0);
4643 VARXOR(NULL,0,UI1,0,NULL,0);
4644 VARXOR(NULL,0,UI1,1,NULL,0);
4645 VARXOR(NULL,0,I2,0,NULL,0);
4646 VARXOR(NULL,0,I2,1,NULL,0);
4647 VARXOR(NULL,0,UI2,0,NULL,0);
4648 VARXOR(NULL,0,UI2,1,NULL,0);
4649 VARXOR(NULL,0,I4,0,NULL,0);
4650 VARXOR(NULL,0,I4,1,NULL,0);
4651 VARXOR(NULL,0,UI4,0,NULL,0);
4652 VARXOR(NULL,0,UI4,1,NULL,0);
4653 if (has_i8)
4654 {
4655 VARXOR(NULL,0,I8,0,NULL,0);
4656 VARXOR(NULL,0,I8,1,NULL,0);
4657 VARXOR(NULL,0,UI8,0,NULL,0);
4658 VARXOR(NULL,0,UI8,1,NULL,0);
4659 }
4660 VARXOR(NULL,0,INT,0,NULL,0);
4661 VARXOR(NULL,0,INT,1,NULL,0);
4662 VARXOR(NULL,0,UINT,0,NULL,0);
4663 VARXOR(NULL,0,UINT,1,NULL,0);
4664 VARXOR(NULL,0,BOOL,0,NULL,0);
4665 VARXOR(NULL,0,BOOL,1,NULL,0);
4666 VARXOR(NULL,0,R4,0,NULL,0);
4667 VARXOR(NULL,0,R4,1,NULL,0);
4668 VARXOR(NULL,0,R8,0,NULL,0);
4669 VARXOR(NULL,0,R8,1,NULL,0);
4670 rbstr = SysAllocString(szFalse);
4671 VARXOR(NULL,0,BSTR,rbstr,NULL,0);
4672 SysFreeString(rbstr);
4673 rbstr = SysAllocString(szTrue);
4674 VARXOR(NULL,0,BSTR,rbstr,NULL,0);
4675 SysFreeString(rbstr);
4676 VARXORCY(NULL,0,10000,NULL,0);
4677 VARXORCY(NULL,0,0,NULL,0);
4678
4679 VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
4680 VARXOR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
4681 VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
4682 VARXOR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
4683 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
4684 VARXOR(BOOL,VARIANT_TRUE,I1,-1,I4,0);
4685 VARXOR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
4686 VARXOR(BOOL,VARIANT_FALSE,I1,0,I4,0);
4687 VARXOR(BOOL,VARIANT_TRUE,UI1,255,I2,-256);
4688 VARXOR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
4689 VARXOR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
4690 VARXOR(BOOL,VARIANT_TRUE,I2,-1,I2,0);
4691 VARXOR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
4692 VARXOR(BOOL,VARIANT_FALSE,I2,0,I2,0);
4693 VARXOR(BOOL,VARIANT_TRUE,UI2,65535,I4,-65536);
4694 VARXOR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
4695 VARXOR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
4696 VARXOR(BOOL,VARIANT_TRUE,I4,-1,I4,0);
4697 VARXOR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
4698 VARXOR(BOOL,VARIANT_FALSE,I4,0,I4,0);
4699 VARXOR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,0);
4700 VARXOR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
4701 VARXOR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
4702 VARXOR(BOOL,VARIANT_TRUE,R4,-1,I4,0);
4703 VARXOR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
4704 VARXOR(BOOL,VARIANT_FALSE,R4,0,I4,0);
4705 VARXOR(BOOL,VARIANT_TRUE,R8,-1,I4,0);
4706 VARXOR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
4707 VARXOR(BOOL,VARIANT_FALSE,R8,0,I4,0);
4708 VARXOR(BOOL,VARIANT_TRUE,DATE,-1,I4,0);
4709 VARXOR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
4710 VARXOR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
4711 if (has_i8)
4712 {
4713 VARXOR(BOOL,VARIANT_TRUE,I8,-1,I8,0);
4714 VARXOR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
4715 VARXOR(BOOL,VARIANT_FALSE,I8,0,I8,0);
4716 /* This returns DISP_E_OVERFLOW which indicates that a conversion
4717 * to I4 is performed.
4718 */
4719 /* VARXOR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
4720 VARXOR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
4721 VARXOR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
4722 }
4723 VARXOR(BOOL,VARIANT_TRUE,INT,-1,I4,0);
4724 VARXOR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
4725 VARXOR(BOOL,VARIANT_FALSE,INT,0,I4,0);
4726 VARXOR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,0);
4727 VARXOR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
4728 VARXOR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
4729 rbstr = SysAllocString(szFalse);
4730 VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
4731 VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4732 SysFreeString(rbstr);
4733 rbstr = SysAllocString(szTrue);
4734 VARXOR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
4735 VARXOR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_FALSE);
4736 SysFreeString(rbstr);
4737 VARXORCY(BOOL,VARIANT_TRUE,10000,I4,-2);
4738 VARXORCY(BOOL,VARIANT_TRUE,0,I4,-1);
4739 VARXORCY(BOOL,VARIANT_FALSE,0,I4,0);
4740
4741 VARXOR(I1,-1,I1,-1,I4,0);
4742 VARXOR(I1,-1,I1,0,I4,-1);
4743 VARXOR(I1,0,I1,0,I4,0);
4744 VARXOR(I1,-1,UI1,255,I4,-256);
4745 VARXOR(I1,-1,UI1,0,I4,-1);
4746 VARXOR(I1,0,UI1,0,I4,0);
4747 VARXOR(I1,-1,I2,-1,I4,0);
4748 VARXOR(I1,-1,I2,0,I4,-1);
4749 VARXOR(I1,0,I2,0,I4,0);
4750 VARXOR(I1,-1,UI2,65535,I4,-65536);
4751 VARXOR(I1,-1,UI2,0,I4,-1);
4752 VARXOR(I1,0,UI2,0,I4,0);
4753 VARXOR(I1,-1,I4,-1,I4,0);
4754 VARXOR(I1,-1,I4,0,I4,-1);
4755 VARXOR(I1,0,I4,0,I4,0);
4756 VARXOR(I1,-1,UI4,0xffffffff,I4,0);
4757 VARXOR(I1,-1,UI4,0,I4,-1);
4758 VARXOR(I1,0,UI4,0,I4,0);
4759 VARXOR(I1,-1,R4,-1,I4,0);
4760 VARXOR(I1,-1,R4,0,I4,-1);
4761 VARXOR(I1,0,R4,0,I4,0);
4762 VARXOR(I1,-1,R8,-1,I4,0);
4763 VARXOR(I1,-1,R8,0,I4,-1);
4764 VARXOR(I1,0,R8,0,I4,0);
4765 VARXOR(I1,-1,DATE,-1,I4,0);
4766 VARXOR(I1,-1,DATE,0,I4,-1);
4767 VARXOR(I1,0,DATE,0,I4,0);
4768 if (has_i8)
4769 {
4770 VARXOR(I1,-1,I8,-1,I8,0);
4771 VARXOR(I1,-1,I8,0,I8,-1);
4772 VARXOR(I1,0,I8,0,I8,0);
4773 VARXOR(I1,-1,UI8,0,I4,-1);
4774 VARXOR(I1,0,UI8,0,I4,0);
4775 }
4776 VARXOR(I1,-1,INT,-1,I4,0);
4777 VARXOR(I1,-1,INT,0,I4,-1);
4778 VARXOR(I1,0,INT,0,I4,0);
4779 VARXOR(I1,-1,UINT,0xffffffff,I4,0);
4780 VARXOR(I1,-1,UINT,0,I4,-1);
4781 VARXOR(I1,0,UINT,0,I4,0);
4782 rbstr = SysAllocString(szFalse);
4783 VARXOR(I1,0,BSTR,rbstr,I4,0);
4784 VARXOR(I1,-1,BSTR,rbstr,I4,-1);
4785 SysFreeString(rbstr);
4786 rbstr = SysAllocString(szTrue);
4787 VARXOR(I1,0,BSTR,rbstr,I4,-1);
4788 VARXOR(I1,-1,BSTR,rbstr,I4,0);
4789 SysFreeString(rbstr);
4790 VARXORCY(I1,-1,10000,I4,-2);
4791 VARXORCY(I1,-1,0,I4,-1);
4792 VARXORCY(I1,0,0,I4,0);
4793
4794 VARXOR(UI1,255,UI1,255,UI1,0);
4795 VARXOR(UI1,255,UI1,0,UI1,255);
4796 VARXOR(UI1,0,UI1,0,UI1,0);
4797 VARXOR(UI1,255,I2,-1,I2,-256);
4798 VARXOR(UI1,255,I2,0,I2,255);
4799 VARXOR(UI1,0,I2,0,I2,0);
4800 VARXOR(UI1,255,UI2,65535,I4,65280);
4801 VARXOR(UI1,255,UI2,0,I4,255);
4802 VARXOR(UI1,0,UI2,0,I4,0);
4803 VARXOR(UI1,255,I4,-1,I4,-256);
4804 VARXOR(UI1,255,I4,0,I4,255);
4805 VARXOR(UI1,0,I4,0,I4,0);
4806 VARXOR(UI1,255,UI4,0xffffffff,I4,-256);
4807 VARXOR(UI1,255,UI4,0,I4,255);
4808 VARXOR(UI1,0,UI4,0,I4,0);
4809 VARXOR(UI1,255,R4,-1,I4,-256);
4810 VARXOR(UI1,255,R4,0,I4,255);
4811 VARXOR(UI1,0,R4,0,I4,0);
4812 VARXOR(UI1,255,R8,-1,I4,-256);
4813 VARXOR(UI1,255,R8,0,I4,255);
4814 VARXOR(UI1,0,R8,0,I4,0);
4815 VARXOR(UI1,255,DATE,-1,I4,-256);
4816 VARXOR(UI1,255,DATE,0,I4,255);
4817 VARXOR(UI1,0,DATE,0,I4,0);
4818 if (has_i8)
4819 {
4820 VARXOR(UI1,255,I8,-1,I8,-256);
4821 VARXOR(UI1,255,I8,0,I8,255);
4822 VARXOR(UI1,0,I8,0,I8,0);
4823 VARXOR(UI1,255,UI8,0,I4,255);
4824 VARXOR(UI1,0,UI8,0,I4,0);
4825 }
4826 VARXOR(UI1,255,INT,-1,I4,-256);
4827 VARXOR(UI1,255,INT,0,I4,255);
4828 VARXOR(UI1,0,INT,0,I4,0);
4829 VARXOR(UI1,255,UINT,0xffffffff,I4,-256);
4830 VARXOR(UI1,255,UINT,0,I4,255);
4831 VARXOR(UI1,0,UINT,0,I4,0);
4832 rbstr = SysAllocString(szFalse);
4833 VARXOR(UI1,0,BSTR,rbstr,I2,0);
4834 VARXOR(UI1,255,BSTR,rbstr,I2,255);
4835 SysFreeString(rbstr);
4836 rbstr = SysAllocString(szTrue);
4837 VARXOR(UI1,0,BSTR,rbstr,I2,-1);
4838 VARXOR(UI1,255,BSTR,rbstr,I2,-256);
4839 SysFreeString(rbstr);
4840 VARXORCY(UI1,255,10000,I4,254);
4841 VARXORCY(UI1,255,0,I4,255);
4842 VARXORCY(UI1,0,0,I4,0);
4843
4844 VARXOR(I2,-1,I2,-1,I2,0);
4845 VARXOR(I2,-1,I2,0,I2,-1);
4846 VARXOR(I2,0,I2,0,I2,0);
4847 VARXOR(I2,-1,UI2,65535,I4,-65536);
4848 VARXOR(I2,-1,UI2,0,I4,-1);
4849 VARXOR(I2,0,UI2,0,I4,0);
4850 VARXOR(I2,-1,I4,-1,I4,0);
4851 VARXOR(I2,-1,I4,0,I4,-1);
4852 VARXOR(I2,0,I4,0,I4,0);
4853 VARXOR(I2,-1,UI4,0xffffffff,I4,0);
4854 VARXOR(I2,-1,UI4,0,I4,-1);
4855 VARXOR(I2,0,UI4,0,I4,0);
4856 VARXOR(I2,-1,R4,-1,I4,0);
4857 VARXOR(I2,-1,R4,0,I4,-1);
4858 VARXOR(I2,0,R4,0,I4,0);
4859 VARXOR(I2,-1,R8,-1,I4,0);
4860 VARXOR(I2,-1,R8,0,I4,-1);
4861 VARXOR(I2,0,R8,0,I4,0);
4862 VARXOR(I2,-1,DATE,-1,I4,0);
4863 VARXOR(I2,-1,DATE,0,I4,-1);
4864 VARXOR(I2,0,DATE,0,I4,0);
4865 if (has_i8)
4866 {
4867 VARXOR(I2,-1,I8,-1,I8,0);
4868 VARXOR(I2,-1,I8,0,I8,-1);
4869 VARXOR(I2,0,I8,0,I8,0);
4870 VARXOR(I2,-1,UI8,0,I4,-1);
4871 VARXOR(I2,0,UI8,0,I4,0);
4872 }
4873 VARXOR(I2,-1,INT,-1,I4,0);
4874 VARXOR(I2,-1,INT,0,I4,-1);
4875 VARXOR(I2,0,INT,0,I4,0);
4876 VARXOR(I2,-1,UINT,0xffffffff,I4,0);
4877 VARXOR(I2,-1,UINT,0,I4,-1);
4878 VARXOR(I2,0,UINT,0,I4,0);
4879 rbstr = SysAllocString(szFalse);
4880 VARXOR(I2,0,BSTR,rbstr,I2,0);
4881 VARXOR(I2,-1,BSTR,rbstr,I2,-1);
4882 SysFreeString(rbstr);
4883 rbstr = SysAllocString(szTrue);
4884 VARXOR(I2,0,BSTR,rbstr,I2,-1);
4885 VARXOR(I2,-1,BSTR,rbstr,I2,0);
4886 SysFreeString(rbstr);
4887 VARXORCY(I2,-1,10000,I4,-2);
4888 VARXORCY(I2,-1,0,I4,-1);
4889 VARXORCY(I2,0,0,I4,0);
4890
4891 VARXOR(UI2,65535,UI2,65535,I4,0);
4892 VARXOR(UI2,65535,UI2,0,I4,65535);
4893 VARXOR(UI2,0,UI2,0,I4,0);
4894 VARXOR(UI2,65535,I4,-1,I4,-65536);
4895 VARXOR(UI2,65535,I4,0,I4,65535);
4896 VARXOR(UI2,0,I4,0,I4,0);
4897 VARXOR(UI2,65535,UI4,0xffffffff,I4,-65536);
4898 VARXOR(UI2,65535,UI4,0,I4,65535);
4899 VARXOR(UI2,0,UI4,0,I4,0);
4900 VARXOR(UI2,65535,R4,-1,I4,-65536);
4901 VARXOR(UI2,65535,R4,0,I4,65535);
4902 VARXOR(UI2,0,R4,0,I4,0);
4903 VARXOR(UI2,65535,R8,-1,I4,-65536);
4904 VARXOR(UI2,65535,R8,0,I4,65535);
4905 VARXOR(UI2,0,R8,0,I4,0);
4906 VARXOR(UI2,65535,DATE,-1,I4,-65536);
4907 VARXOR(UI2,65535,DATE,0,I4,65535);
4908 VARXOR(UI2,0,DATE,0,I4,0);
4909 if (has_i8)
4910 {
4911 VARXOR(UI2,65535,I8,-1,I8,-65536);
4912 VARXOR(UI2,65535,I8,0,I8,65535);
4913 VARXOR(UI2,0,I8,0,I8,0);
4914 VARXOR(UI2,65535,UI8,0,I4,65535);
4915 VARXOR(UI2,0,UI8,0,I4,0);
4916 }
4917 VARXOR(UI2,65535,INT,-1,I4,-65536);
4918 VARXOR(UI2,65535,INT,0,I4,65535);
4919 VARXOR(UI2,0,INT,0,I4,0);
4920 VARXOR(UI2,65535,UINT,0xffffffff,I4,-65536);
4921 VARXOR(UI2,65535,UINT,0,I4,65535);
4922 VARXOR(UI2,0,UINT,0,I4,0);
4923 rbstr = SysAllocString(szFalse);
4924 VARXOR(UI2,0,BSTR,rbstr,I4,0);
4925 VARXOR(UI2,65535,BSTR,rbstr,I4,65535);
4926 SysFreeString(rbstr);
4927 rbstr = SysAllocString(szTrue);
4928 VARXOR(UI2,0,BSTR,rbstr,I4,-1);
4929 VARXOR(UI2,65535,BSTR,rbstr,I4,-65536);
4930 SysFreeString(rbstr);
4931 VARXORCY(UI2,65535,10000,I4,65534);
4932 VARXORCY(UI2,65535,0,I4,65535);
4933 VARXORCY(UI2,0,0,I4,0);
4934
4935 VARXOR(I4,-1,I4,-1,I4,0);
4936 VARXOR(I4,-1,I4,0,I4,-1);
4937 VARXOR(I4,0,I4,0,I4,0);
4938 VARXOR(I4,-1,UI4,0xffffffff,I4,0);
4939 VARXOR(I4,-1,UI4,0,I4,-1);
4940 VARXOR(I4,0,UI4,0,I4,0);
4941 VARXOR(I4,-1,R4,-1,I4,0);
4942 VARXOR(I4,-1,R4,0,I4,-1);
4943 VARXOR(I4,0,R4,0,I4,0);
4944 VARXOR(I4,-1,R8,-1,I4,0);
4945 VARXOR(I4,-1,R8,0,I4,-1);
4946 VARXOR(I4,0,R8,0,I4,0);
4947 VARXOR(I4,-1,DATE,-1,I4,0);
4948 VARXOR(I4,-1,DATE,0,I4,-1);
4949 VARXOR(I4,0,DATE,0,I4,0);
4950 if (has_i8)
4951 {
4952 VARXOR(I4,-1,I8,-1,I8,0);
4953 VARXOR(I4,-1,I8,0,I8,-1);
4954 VARXOR(I4,0,I8,0,I8,0);
4955 VARXOR(I4,-1,UI8,0,I4,-1);
4956 VARXOR(I4,0,UI8,0,I4,0);
4957 }
4958 VARXOR(I4,-1,INT,-1,I4,0);
4959 VARXOR(I4,-1,INT,0,I4,-1);
4960 VARXOR(I4,0,INT,0,I4,0);
4961 VARXOR(I4,-1,UINT,0xffffffff,I4,0);
4962 VARXOR(I4,-1,UINT,0,I4,-1);
4963 VARXOR(I4,0,UINT,0,I4,0);
4964 rbstr = SysAllocString(szFalse);
4965 VARXOR(I4,0,BSTR,rbstr,I4,0);
4966 VARXOR(I4,-1,BSTR,rbstr,I4,-1);
4967 SysFreeString(rbstr);
4968 rbstr = SysAllocString(szTrue);
4969 VARXOR(I4,0,BSTR,rbstr,I4,-1);
4970 VARXOR(I4,-1,BSTR,rbstr,I4,0);
4971 SysFreeString(rbstr);
4972 VARXORCY(I4,-1,10000,I4,-2);
4973 VARXORCY(I4,-1,0,I4,-1);
4974 VARXORCY(I4,0,0,I4,0);
4975
4976 VARXOR(UI4,0xffffffff,UI4,0xffffffff,I4,0);
4977 VARXOR(UI4,0xffffffff,UI4,0,I4,-1);
4978 VARXOR(UI4,0,UI4,0,I4,0);
4979 VARXOR(UI4,0xffffffff,R4,-1,I4,0);
4980 VARXOR(UI4,0xffffffff,R4,0,I4,-1);
4981 VARXOR(UI4,0,R4,0,I4,0);
4982 VARXOR(UI4,0xffffffff,R8,-1,I4,0);
4983 VARXOR(UI4,0xffffffff,R8,0,I4,-1);
4984 VARXOR(UI4,0,R8,0,I4,0);
4985 VARXOR(UI4,0xffffffff,DATE,-1,I4,0);
4986 VARXOR(UI4,0xffffffff,DATE,0,I4,-1);
4987 VARXOR(UI4,0,DATE,0,I4,0);
4988 if (has_i8)
4989 {
4990 VARXOR(UI4,0xffffffff,I8,0,I8,0xffffffff);
4991 VARXOR(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,0);
4992 VARXOR(UI4,0,I8,0,I8,0);
4993 VARXOR(UI4,0xffffffff,UI8,0,I4,-1);
4994 VARXOR(UI4,0,UI8,0,I4,0);
4995 }
4996 VARXOR(UI4,0xffffffff,INT,-1,I4,0);
4997 VARXOR(UI4,0xffffffff,INT,0,I4,-1);
4998 VARXOR(UI4,0,INT,0,I4,0);
4999 VARXOR(UI4,0xffffffff,UINT,0xffffffff,I4,0);
5000 VARXOR(UI4,0xffffffff,UINT,0,I4,-1);
5001 VARXOR(UI4,0,UINT,0,I4,0);
5002 rbstr = SysAllocString(szFalse);
5003 VARXOR(UI4,0,BSTR,rbstr,I4,0);
5004 VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
5005 SysFreeString(rbstr);
5006 rbstr = SysAllocString(szTrue);
5007 VARXOR(UI4,0,BSTR,rbstr,I4,-1);
5008 VARXOR(UI4,0xffffffff,BSTR,rbstr,I4,0);
5009 SysFreeString(rbstr);
5010 VARXORCY(UI4,0xffffffff,10000,I4,-2);
5011 VARXORCY(UI4,0xffffffff,0,I4,-1);
5012 VARXORCY(UI4,0,0,I4,0);
5013
5014 VARXOR(R4,-1,R4,-1,I4,0);
5015 VARXOR(R4,-1,R4,0,I4,-1);
5016 VARXOR(R4,0,R4,0,I4,0);
5017 VARXOR(R4,-1,R8,-1,I4,0);
5018 VARXOR(R4,-1,R8,0,I4,-1);
5019 VARXOR(R4,0,R8,0,I4,0);
5020 VARXOR(R4,-1,DATE,-1,I4,0);
5021 VARXOR(R4,-1,DATE,0,I4,-1);
5022 VARXOR(R4,0,DATE,0,I4,0);
5023 if (has_i8)
5024 {
5025 VARXOR(R4,-1,I8,-1,I8,0);
5026 VARXOR(R4,-1,I8,0,I8,-1);
5027 VARXOR(R4,0,I8,0,I8,0);
5028 VARXOR(R4,-1,UI8,0,I4,-1);
5029 VARXOR(R4,0,UI8,0,I4,0);
5030 }
5031 VARXOR(R4,-1,INT,-1,I4,0);
5032 VARXOR(R4,-1,INT,0,I4,-1);
5033 VARXOR(R4,0,INT,0,I4,0);
5034 VARXOR(R4,-1,UINT,0xffffffff,I4,0);
5035 VARXOR(R4,-1,UINT,0,I4,-1);
5036 VARXOR(R4,0,UINT,0,I4,0);
5037 rbstr = SysAllocString(szFalse);
5038 VARXOR(R4,0,BSTR,rbstr,I4,0);
5039 VARXOR(R4,-1,BSTR,rbstr,I4,-1);
5040 SysFreeString(rbstr);
5041 rbstr = SysAllocString(szTrue);
5042 VARXOR(R4,0,BSTR,rbstr,I4,-1);
5043 VARXOR(R4,-1,BSTR,rbstr,I4,0);
5044 SysFreeString(rbstr);
5045 VARXORCY(R4,-1,10000,I4,-2);
5046 VARXORCY(R4,-1,0,I4,-1);
5047 VARXORCY(R4,0,0,I4,0);
5048
5049 VARXOR(R8,-1,R8,-1,I4,0);
5050 VARXOR(R8,-1,R8,0,I4,-1);
5051 VARXOR(R8,0,R8,0,I4,0);
5052 VARXOR(R8,-1,DATE,-1,I4,0);
5053 VARXOR(R8,-1,DATE,0,I4,-1);
5054 VARXOR(R8,0,DATE,0,I4,0);
5055 if (has_i8)
5056 {
5057 VARXOR(R8,-1,I8,-1,I8,0);
5058 VARXOR(R8,-1,I8,0,I8,-1);
5059 VARXOR(R8,0,I8,0,I8,0);
5060 VARXOR(R8,-1,UI8,0,I4,-1);
5061 VARXOR(R8,0,UI8,0,I4,0);
5062 }
5063 VARXOR(R8,-1,INT,-1,I4,0);
5064 VARXOR(R8,-1,INT,0,I4,-1);
5065 VARXOR(R8,0,INT,0,I4,0);
5066 VARXOR(R8,-1,UINT,0xffffffff,I4,0);
5067 VARXOR(R8,-1,UINT,0,I4,-1);
5068 VARXOR(R8,0,UINT,0,I4,0);
5069 rbstr = SysAllocString(szFalse);
5070 VARXOR(R8,0,BSTR,rbstr,I4,0);
5071 VARXOR(R8,-1,BSTR,rbstr,I4,-1);
5072 SysFreeString(rbstr);
5073 rbstr = SysAllocString(szTrue);
5074 VARXOR(R8,0,BSTR,rbstr,I4,-1);
5075 VARXOR(R8,-1,BSTR,rbstr,I4,0);
5076 SysFreeString(rbstr);
5077 VARXORCY(R8,-1,10000,I4,-2);
5078 VARXORCY(R8,-1,0,I4,-1);
5079 VARXORCY(R8,0,0,I4,0);
5080
5081 VARXOR(DATE,-1,DATE,-1,I4,0);
5082 VARXOR(DATE,-1,DATE,0,I4,-1);
5083 VARXOR(DATE,0,DATE,0,I4,0);
5084 if (has_i8)
5085 {
5086 VARXOR(DATE,-1,I8,-1,I8,0);
5087 VARXOR(DATE,-1,I8,0,I8,-1);
5088 VARXOR(DATE,0,I8,0,I8,0);
5089 VARXOR(DATE,-1,UI8,0,I4,-1);
5090 VARXOR(DATE,0,UI8,0,I4,0);
5091 }
5092 VARXOR(DATE,-1,INT,-1,I4,0);
5093 VARXOR(DATE,-1,INT,0,I4,-1);
5094 VARXOR(DATE,0,INT,0,I4,0);
5095 VARXOR(DATE,-1,UINT,0xffffffff,I4,0);
5096 VARXOR(DATE,-1,UINT,0,I4,-1);
5097 VARXOR(DATE,0,UINT,0,I4,0);
5098 rbstr = SysAllocString(szFalse);
5099 VARXOR(DATE,0,BSTR,rbstr,I4,0);
5100 VARXOR(DATE,-1,BSTR,rbstr,I4,-1);
5101 SysFreeString(rbstr);
5102 rbstr = SysAllocString(szTrue);
5103 VARXOR(DATE,0,BSTR,rbstr,I4,-1);
5104 VARXOR(DATE,-1,BSTR,rbstr,I4,0);
5105 SysFreeString(rbstr);
5106 VARXORCY(DATE,-1,10000,I4,-2);
5107 VARXORCY(DATE,-1,0,I4,-1);
5108 VARXORCY(DATE,0,0,I4,0);
5109
5110 if (has_i8)
5111 {
5112 VARXOR(I8,-1,I8,-1,I8,0);
5113 VARXOR(I8,-1,I8,0,I8,-1);
5114 VARXOR(I8,0,I8,0,I8,0);
5115 VARXOR(I8,-1,UI8,0,I8,-1);
5116 VARXOR(I8,0,UI8,0,I8,0);
5117 VARXOR(I8,-1,UINT,0,I8,-1);
5118 VARXOR(I8,0,UINT,0,I8,0);
5119 rbstr = SysAllocString(szFalse);
5120 VARXOR(I8,0,BSTR,rbstr,I8,0);
5121 VARXOR(I8,-1,BSTR,rbstr,I8,-1);
5122 SysFreeString(rbstr);
5123 rbstr = SysAllocString(szTrue);
5124 VARXOR(I8,0,BSTR,rbstr,I8,-1);
5125 VARXOR(I8,-1,BSTR,rbstr,I8,0);
5126 SysFreeString(rbstr);
5127 VARXORCY(I8,-1,10000,I8,-2);
5128 VARXORCY(I8,-1,0,I8,-1);
5129 VARXORCY(I8,0,0,I8,0);
5130
5131 VARXOR(UI8,0xffff,UI8,0xffff,I4,0);
5132 VARXOR(UI8,0xffff,UI8,0,I4,0xffff);
5133 VARXOR(UI8,0,UI8,0,I4,0);
5134 VARXOR(UI8,0xffff,INT,-1,I4,-65536);
5135 VARXOR(UI8,0xffff,INT,0,I4,0xffff);
5136 VARXOR(UI8,0,INT,0,I4,0);
5137 VARXOR(UI8,0xffff,UINT,0xffff,I4,0);
5138 VARXOR(UI8,0xffff,UINT,0,I4,0xffff);
5139 VARXOR(UI8,0,UINT,0,I4,0);
5140 rbstr = SysAllocString(szFalse);
5141 VARXOR(UI8,0,BSTR,rbstr,I4,0);
5142 VARXOR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
5143 SysFreeString(rbstr);
5144 rbstr = SysAllocString(szTrue);
5145 VARXOR(UI8,0,BSTR,rbstr,I4,-1);
5146 VARXOR(UI8,0xffff,BSTR,rbstr,I4,-65536);
5147 SysFreeString(rbstr);
5148 VARXORCY(UI8,0xffff,10000,I4,65534);
5149 VARXORCY(UI8,0xffff,0,I4,0xffff);
5150 VARXORCY(UI8,0,0,I4,0);
5151 }
5152
5153 VARXOR(INT,-1,INT,-1,I4,0);
5154 VARXOR(INT,-1,INT,0,I4,-1);
5155 VARXOR(INT,0,INT,0,I4,0);
5156 VARXOR(INT,-1,UINT,0xffff,I4,-65536);
5157 VARXOR(INT,-1,UINT,0,I4,-1);
5158 VARXOR(INT,0,UINT,0,I4,0);
5159 rbstr = SysAllocString(szFalse);
5160 VARXOR(INT,0,BSTR,rbstr,I4,0);
5161 VARXOR(INT,-1,BSTR,rbstr,I4,-1);
5162 SysFreeString(rbstr);
5163 rbstr = SysAllocString(szTrue);
5164 VARXOR(INT,0,BSTR,rbstr,I4,-1);
5165 VARXOR(INT,-1,BSTR,rbstr,I4,0);
5166 SysFreeString(rbstr);
5167 VARXORCY(INT,-1,10000,I4,-2);
5168 VARXORCY(INT,-1,0,I4,-1);
5169 VARXORCY(INT,0,0,I4,0);
5170
5171 VARXOR(UINT,0xffff,UINT,0xffff,I4,0);
5172 VARXOR(UINT,0xffff,UINT,0,I4,0xffff);
5173 VARXOR(UINT,0,UINT,0,I4,0);
5174 rbstr = SysAllocString(szFalse);
5175 VARXOR(UINT,0,BSTR,rbstr,I4,0);
5176 VARXOR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
5177 SysFreeString(rbstr);
5178 rbstr = SysAllocString(szTrue);
5179 VARXOR(UINT,0,BSTR,rbstr,I4,-1);
5180 VARXOR(UINT,0xffff,BSTR,rbstr,I4,-65536);
5181 SysFreeString(rbstr);
5182 VARXORCY(UINT,0xffff,10000,I4,65534);
5183 VARXORCY(UINT,0xffff,0,I4,0xffff);
5184 VARXORCY(UINT,0,0,I4,0);
5185
5186 lbstr = SysAllocString(szFalse);
5187 rbstr = SysAllocString(szFalse);
5188 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
5189 SysFreeString(rbstr);
5190 rbstr = SysAllocString(szTrue);
5191 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
5192 SysFreeString(lbstr);
5193 lbstr = SysAllocString(szTrue);
5194 VARXOR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_FALSE);
5195 VARXORCY(BSTR,lbstr,10000,I4,-2);
5196 SysFreeString(lbstr);
5197 lbstr = SysAllocString(szFalse);
5198 VARXORCY(BSTR,lbstr,10000,I4,1);
5199 SysFreeString(lbstr);
5200 SysFreeString(rbstr);
5201}
5202
5203static HRESULT (WINAPI *pVarOr)(LPVARIANT,LPVARIANT,LPVARIANT);
5204
5205#define VAROR(vt1,val1,vt2,val2,rvt,rval) \
5206 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
5207 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
5208 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
5209 test_var_call2( __LINE__, pVarOr, &left, &right, &exp )
5210
5211#define VARORCY(vt1,val1,val2,rvt,rval) \
5212 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
5213 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
5214 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
5215 test_var_call2( __LINE__, pVarOr, &left, &right, &exp )
5216
5217static void test_VarOr(void)
5218{
5219 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
5220 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
5222 BSTR lbstr, rbstr;
5223 VARTYPE i;
5224 HRESULT hres;
5225
5226 CHECKPTR(VarOr);
5227
5228 /* Test all possible flag/vt combinations & the resulting vt type */
5229 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
5230 {
5231 VARTYPE leftvt, rightvt, resvt;
5232
5233 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5234 {
5235
5236 SKIPTESTS(leftvt);
5237
5238 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5239 {
5240 BOOL bFail = FALSE;
5241
5242 SKIPTESTS(rightvt);
5243
5244 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
5245 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
5246 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
5247 continue;
5248
5249 memset(&left, 0, sizeof(left));
5250 memset(&right, 0, sizeof(right));
5251 V_VT(&left) = leftvt | ExtraFlags[i];
5252 V_VT(&right) = rightvt | ExtraFlags[i];
5253 V_VT(&result) = VT_EMPTY;
5254 resvt = VT_I4;
5255
5256 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
5257 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
5258 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
5259 leftvt == VT_CLSID || rightvt == VT_CLSID ||
5260 leftvt == VT_RECORD || rightvt == VT_RECORD ||
5261 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
5262 leftvt == VT_ERROR || rightvt == VT_ERROR)
5263 {
5264 bFail = TRUE;
5265 }
5266 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5267 {
5268 if (leftvt == rightvt ||
5269 leftvt == VT_I2 || rightvt == VT_I2 ||
5270 leftvt == VT_UI1 || rightvt == VT_UI1 ||
5271 leftvt == VT_BOOL || rightvt == VT_BOOL)
5272 resvt = VT_I2;
5273 else if (leftvt == VT_NULL || rightvt == VT_NULL)
5274 resvt = VT_NULL;
5275 else if (leftvt == VT_I8 || rightvt == VT_I8)
5276 resvt = VT_I8;
5277 }
5278 else if (leftvt == VT_NULL || rightvt == VT_NULL)
5279 {
5280 resvt = VT_NULL;
5281 }
5282 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
5283 {
5284 if (leftvt == rightvt)
5285 resvt = VT_UI1;
5286 else if (leftvt == rightvt ||
5287 leftvt == VT_I2 || rightvt == VT_I2 ||
5288 leftvt == VT_BOOL || rightvt == VT_BOOL)
5289 {
5290 resvt = VT_I2;
5291 }
5292 else if (leftvt == VT_I8 || rightvt == VT_I8)
5293 resvt = VT_I8;
5294 }
5295 else if (leftvt == VT_I2 || rightvt == VT_I2)
5296 {
5297 if (leftvt == rightvt ||
5298 leftvt == VT_BOOL || rightvt == VT_BOOL)
5299 resvt = VT_I2;
5300 else if (leftvt == VT_I8 || rightvt == VT_I8)
5301 resvt = VT_I8;
5302 }
5303 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
5304 {
5305 resvt = VT_BOOL;
5306 }
5307 else if (leftvt == VT_I8 || rightvt == VT_I8)
5308 {
5309 if (leftvt == VT_INT || rightvt == VT_INT)
5310 bFail = TRUE;
5311 else
5312 resvt = VT_I8;
5313 }
5314 hres = pVarOr(&left, &right, &result);
5315 if (bFail)
5317 "VarOr: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX vt %d\n",
5318 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
5319 V_VT(&result));
5320 else
5321 ok(hres == S_OK && V_VT(&result) == resvt,
5322 "VarOr: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%lX vt %d\n",
5323 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
5324 V_VT(&result));
5325 }
5326 }
5327 }
5328
5329 /* Test returned values. Since we know the returned type is correct
5330 * and that we handle all combinations of invalid types, just check
5331 * that good type combinations produce the desired value.
5332 * FIXME: Test VT_DECIMAL/VT_DISPATCH
5333 */
5334 VAROR(EMPTY,0,EMPTY,0,I2,0);
5335 VAROR(EMPTY,1,EMPTY,0,I2,0);
5336 VAROR(EMPTY,0,NULL,0,NULL,0);
5337 VAROR(EMPTY,0,I1,0,I4,0);
5338 VAROR(EMPTY,0,I1,1,I4,1);
5339 VAROR(EMPTY,0,UI1,0,I2,0);
5340 VAROR(EMPTY,0,UI1,1,I2,1);
5341 VAROR(EMPTY,0,I2,0,I2,0);
5342 VAROR(EMPTY,0,I2,1,I2,1);
5343 VAROR(EMPTY,0,UI2,0,I4,0);
5344 VAROR(EMPTY,0,UI2,1,I4,1);
5345 VAROR(EMPTY,0,I4,0,I4,0);
5346 VAROR(EMPTY,0,I4,1,I4,1);
5347 VAROR(EMPTY,0,UI4,0,I4,0);
5348 VAROR(EMPTY,0,UI4,1,I4,1);
5349 if (has_i8)
5350 {
5351 VAROR(EMPTY,0,I8,0,I8,0);
5352 VAROR(EMPTY,0,I8,1,I8,1);
5353 VAROR(EMPTY,0,UI8,0,I4,0);
5354 VAROR(EMPTY,0,UI8,1,I4,1);
5355 }
5356 VAROR(EMPTY,0,INT,0,I4,0);
5357 VAROR(EMPTY,0,INT,1,I4,1);
5358 VAROR(EMPTY,0,UINT,0,I4,0);
5359 VAROR(EMPTY,0,UINT,1,I4,1);
5360 VAROR(EMPTY,0,BOOL,0,I2,0);
5361 VAROR(EMPTY,0,BOOL,1,I2,1);
5362 VAROR(EMPTY,0,R4,0,I4,0);
5363 VAROR(EMPTY,0,R4,1,I4,1);
5364 VAROR(EMPTY,0,R8,0,I4,0);
5365 VAROR(EMPTY,0,R8,1,I4,1);
5366 rbstr = SysAllocString(szFalse);
5367 VAROR(EMPTY,0,BSTR,rbstr,I2,0);
5368 SysFreeString(rbstr);
5369 rbstr = SysAllocString(szTrue);
5370 VAROR(EMPTY,0,BSTR,rbstr,I2,-1);
5371 SysFreeString(rbstr);
5372 VARORCY(EMPTY,0,10000,I4,1);
5373
5374 /* NULL OR 0 = NULL. NULL OR n = n */
5375 VAROR(NULL,0,NULL,0,NULL,0);
5376 VAROR(NULL,1,NULL,0,NULL,0);
5377 VAROR(NULL,0,I1,0,NULL,0);
5378 VAROR(NULL,0,I1,1,I4,1);
5379 VAROR(NULL,0,UI1,0,NULL,0);
5380 VAROR(NULL,0,UI1,1,UI1,1);
5381 VAROR(NULL,0,I2,0,NULL,0);
5382 VAROR(NULL,0,I2,1,I2,1);
5383 VAROR(NULL,0,UI2,0,NULL,0);
5384 VAROR(NULL,0,UI2,1,I4,1);
5385 VAROR(NULL,0,I4,0,NULL,0);
5386 VAROR(NULL,0,I4,1,I4,1);
5387 VAROR(NULL,0,UI4,0,NULL,0);
5388 VAROR(NULL,0,UI4,1,I4,1);
5389 if (has_i8)
5390 {
5391 VAROR(NULL,0,I8,0,NULL,0);
5392 VAROR(NULL,0,I8,1,I8,1);
5393 VAROR(NULL,0,UI8,0,NULL,0);
5394 VAROR(NULL,0,UI8,1,I4,1);
5395 }
5396 VAROR(NULL,0,INT,0,NULL,0);
5397 VAROR(NULL,0,INT,1,I4,1);
5398 VAROR(NULL,0,UINT,0,NULL,0);
5399 VAROR(NULL,0,UINT,1,I4,1);
5400 VAROR(NULL,0,BOOL,0,NULL,0);
5401 VAROR(NULL,0,BOOL,1,BOOL,1);
5402 VAROR(NULL,0,R4,0,NULL,0);
5403 VAROR(NULL,0,R4,1,I4,1);
5404 VAROR(NULL,0,R8,0,NULL,0);
5405 VAROR(NULL,0,R8,1,I4,1);
5406 rbstr = SysAllocString(szFalse);
5407 VAROR(NULL,0,BSTR,rbstr,NULL,0);
5408 SysFreeString(rbstr);
5409 rbstr = SysAllocString(szTrue);
5410 VAROR(NULL,0,BSTR,rbstr,BOOL,VARIANT_TRUE);
5411 SysFreeString(rbstr);
5412 VARORCY(NULL,0,10000,I4,1);
5413 VARORCY(NULL,0,0,NULL,0);
5414
5415 VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
5416 VAROR(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE);
5417 VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
5418 VAROR(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
5419 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
5420 VAROR(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
5421 VAROR(BOOL,VARIANT_TRUE,I1,0,I4,-1);
5422 VAROR(BOOL,VARIANT_FALSE,I1,0,I4,0);
5423 VAROR(BOOL,VARIANT_TRUE,UI1,255,I2,-1);
5424 VAROR(BOOL,VARIANT_TRUE,UI1,0,I2,-1);
5425 VAROR(BOOL,VARIANT_FALSE,UI1,0,I2,0);
5426 VAROR(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
5427 VAROR(BOOL,VARIANT_TRUE,I2,0,I2,-1);
5428 VAROR(BOOL,VARIANT_FALSE,I2,0,I2,0);
5429 VAROR(BOOL,VARIANT_TRUE,UI2,65535,I4,-1);
5430 VAROR(BOOL,VARIANT_TRUE,UI2,0,I4,-1);
5431 VAROR(BOOL,VARIANT_FALSE,UI2,0,I4,0);
5432 VAROR(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
5433 VAROR(BOOL,VARIANT_TRUE,I4,0,I4,-1);
5434 VAROR(BOOL,VARIANT_FALSE,I4,0,I4,0);
5435 VAROR(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
5436 VAROR(BOOL,VARIANT_TRUE,UI4,0,I4,-1);
5437 VAROR(BOOL,VARIANT_FALSE,UI4,0,I4,0);
5438 VAROR(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
5439 VAROR(BOOL,VARIANT_TRUE,R4,0,I4,-1);
5440 VAROR(BOOL,VARIANT_FALSE,R4,0,I4,0);
5441 VAROR(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
5442 VAROR(BOOL,VARIANT_TRUE,R8,0,I4,-1);
5443 VAROR(BOOL,VARIANT_FALSE,R8,0,I4,0);
5444 VAROR(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
5445 VAROR(BOOL,VARIANT_TRUE,DATE,0,I4,-1);
5446 VAROR(BOOL,VARIANT_FALSE,DATE,0,I4,0);
5447 if (has_i8)
5448 {
5449 VAROR(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
5450 VAROR(BOOL,VARIANT_TRUE,I8,0,I8,-1);
5451 VAROR(BOOL,VARIANT_FALSE,I8,0,I8,0);
5452 /* This returns DISP_E_OVERFLOW which indicates that a conversion
5453 * to I4 is performed.
5454 */
5455 /* VAROR(BOOL,VARIANT_TRUE,UI8,-1,I4,-1); */
5456 VAROR(BOOL,VARIANT_TRUE,UI8,0,I4,-1);
5457 VAROR(BOOL,VARIANT_FALSE,UI8,0,I4,0);
5458 }
5459 VAROR(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
5460 VAROR(BOOL,VARIANT_TRUE,INT,0,I4,-1);
5461 VAROR(BOOL,VARIANT_FALSE,INT,0,I4,0);
5462 VAROR(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
5463 VAROR(BOOL,VARIANT_TRUE,UINT,0,I4,-1);
5464 VAROR(BOOL,VARIANT_FALSE,UINT,0,I4,0);
5465 rbstr = SysAllocString(szFalse);
5466 VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_FALSE);
5467 VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
5468 SysFreeString(rbstr);
5469 rbstr = SysAllocString(szTrue);
5470 VAROR(BOOL,VARIANT_FALSE,BSTR,rbstr,BOOL,VARIANT_TRUE);
5471 VAROR(BOOL,VARIANT_TRUE,BSTR,rbstr,BOOL,VARIANT_TRUE);
5472 SysFreeString(rbstr);
5473 VARORCY(BOOL,VARIANT_TRUE,10000,I4,-1);
5474 VARORCY(BOOL,VARIANT_TRUE,0,I4,-1);
5475 VARORCY(BOOL,VARIANT_FALSE,0,I4,0);
5476
5477 VAROR(I1,-1,I1,-1,I4,-1);
5478 VAROR(I1,-1,I1,0,I4,-1);
5479 VAROR(I1,0,I1,0,I4,0);
5480 VAROR(I1,-1,UI1,255,I4,-1);
5481 VAROR(I1,-1,UI1,0,I4,-1);
5482 VAROR(I1,0,UI1,0,I4,0);
5483 VAROR(I1,-1,I2,-1,I4,-1);
5484 VAROR(I1,-1,I2,0,I4,-1);
5485 VAROR(I1,0,I2,0,I4,0);
5486 VAROR(I1,-1,UI2,65535,I4,-1);
5487 VAROR(I1,-1,UI2,0,I4,-1);
5488 VAROR(I1,0,UI2,0,I4,0);
5489 VAROR(I1,-1,I4,-1,I4,-1);
5490 VAROR(I1,-1,I4,0,I4,-1);
5491 VAROR(I1,0,I4,0,I4,0);
5492 VAROR(I1,-1,UI4,0xffffffff,I4,-1);
5493 VAROR(I1,-1,UI4,0,I4,-1);
5494 VAROR(I1,0,UI4,0,I4,0);
5495 VAROR(I1,-1,R4,-1,I4,-1);
5496 VAROR(I1,-1,R4,0,I4,-1);
5497 VAROR(I1,0,R4,0,I4,0);
5498 VAROR(I1,-1,R8,-1,I4,-1);
5499 VAROR(I1,-1,R8,0,I4,-1);
5500 VAROR(I1,0,R8,0,I4,0);
5501 VAROR(I1,-1,DATE,-1,I4,-1);
5502 VAROR(I1,-1,DATE,0,I4,-1);
5503 VAROR(I1,0,DATE,0,I4,0);
5504 if (has_i8)
5505 {
5506 VAROR(I1,-1,I8,-1,I8,-1);
5507 VAROR(I1,-1,I8,0,I8,-1);
5508 VAROR(I1,0,I8,0,I8,0);
5509 VAROR(I1,-1,UI8,0,I4,-1);
5510 VAROR(I1,0,UI8,0,I4,0);
5511 }
5512 VAROR(I1,-1,INT,-1,I4,-1);
5513 VAROR(I1,-1,INT,0,I4,-1);
5514 VAROR(I1,0,INT,0,I4,0);
5515 VAROR(I1,-1,UINT,0xffffffff,I4,-1);
5516 VAROR(I1,-1,UINT,0,I4,-1);
5517 VAROR(I1,0,UINT,0,I4,0);
5518 rbstr = SysAllocString(szFalse);
5519 VAROR(I1,0,BSTR,rbstr,I4,0);
5520 VAROR(I1,-1,BSTR,rbstr,I4,-1);
5521 SysFreeString(rbstr);
5522 rbstr = SysAllocString(szTrue);
5523 VAROR(I1,0,BSTR,rbstr,I4,-1);
5524 VAROR(I1,-1,BSTR,rbstr,I4,-1);
5525 SysFreeString(rbstr);
5526 VARORCY(I1,-1,10000,I4,-1);
5527 VARORCY(I1,-1,0,I4,-1);
5528 VARORCY(I1,0,0,I4,0);
5529
5530 VAROR(UI1,255,UI1,255,UI1,255);
5531 VAROR(UI1,255,UI1,0,UI1,255);
5532 VAROR(UI1,0,UI1,0,UI1,0);
5533 VAROR(UI1,255,I2,-1,I2,-1);
5534 VAROR(UI1,255,I2,0,I2,255);
5535 VAROR(UI1,0,I2,0,I2,0);
5536 VAROR(UI1,255,UI2,65535,I4,65535);
5537 VAROR(UI1,255,UI2,0,I4,255);
5538 VAROR(UI1,0,UI2,0,I4,0);
5539 VAROR(UI1,255,I4,-1,I4,-1);
5540 VAROR(UI1,255,I4,0,I4,255);
5541 VAROR(UI1,0,I4,0,I4,0);
5542 VAROR(UI1,255,UI4,0xffffffff,I4,-1);
5543 VAROR(UI1,255,UI4,0,I4,255);
5544 VAROR(UI1,0,UI4,0,I4,0);
5545 VAROR(UI1,255,R4,-1,I4,-1);
5546 VAROR(UI1,255,R4,0,I4,255);
5547 VAROR(UI1,0,R4,0,I4,0);
5548 VAROR(UI1,255,R8,-1,I4,-1);
5549 VAROR(UI1,255,R8,0,I4,255);
5550 VAROR(UI1,0,R8,0,I4,0);
5551 VAROR(UI1,255,DATE,-1,I4,-1);
5552 VAROR(UI1,255,DATE,0,I4,255);
5553 VAROR(UI1,0,DATE,0,I4,0);
5554 if (has_i8)
5555 {
5556 VAROR(UI1,255,I8,-1,I8,-1);
5557 VAROR(UI1,255,I8,0,I8,255);
5558 VAROR(UI1,0,I8,0,I8,0);
5559 VAROR(UI1,255,UI8,0,I4,255);
5560 VAROR(UI1,0,UI8,0,I4,0);
5561 }
5562 VAROR(UI1,255,INT,-1,I4,-1);
5563 VAROR(UI1,255,INT,0,I4,255);
5564 VAROR(UI1,0,INT,0,I4,0);
5565 VAROR(UI1,255,UINT,0xffffffff,I4,-1);
5566 VAROR(UI1,255,UINT,0,I4,255);
5567 VAROR(UI1,0,UINT,0,I4,0);
5568 rbstr = SysAllocString(szFalse);
5569 VAROR(UI1,0,BSTR,rbstr,I2,0);
5570 VAROR(UI1,255,BSTR,rbstr,I2,255);
5571 SysFreeString(rbstr);
5572 rbstr = SysAllocString(szTrue);
5573 VAROR(UI1,0,BSTR,rbstr,I2,-1);
5574 VAROR(UI1,255,BSTR,rbstr,I2,-1);
5575 SysFreeString(rbstr);
5576 VARORCY(UI1,255,10000,I4,255);
5577 VARORCY(UI1,255,0,I4,255);
5578 VARORCY(UI1,0,0,I4,0);
5579
5580 VAROR(I2,-1,I2,-1,I2,-1);
5581 VAROR(I2,-1,I2,0,I2,-1);
5582 VAROR(I2,0,I2,0,I2,0);
5583 VAROR(I2,-1,UI2,65535,I4,-1);
5584 VAROR(I2,-1,UI2,0,I4,-1);
5585 VAROR(I2,0,UI2,0,I4,0);
5586 VAROR(I2,-1,I4,-1,I4,-1);
5587 VAROR(I2,-1,I4,0,I4,-1);
5588 VAROR(I2,0,I4,0,I4,0);
5589 VAROR(I2,-1,UI4,0xffffffff,I4,-1);
5590 VAROR(I2,-1,UI4,0,I4,-1);
5591 VAROR(I2,0,UI4,0,I4,0);
5592 VAROR(I2,-1,R4,-1,I4,-1);
5593 VAROR(I2,-1,R4,0,I4,-1);
5594 VAROR(I2,0,R4,0,I4,0);
5595 VAROR(I2,-1,R8,-1,I4,-1);
5596 VAROR(I2,-1,R8,0,I4,-1);
5597 VAROR(I2,0,R8,0,I4,0);
5598 VAROR(I2,-1,DATE,-1,I4,-1);
5599 VAROR(I2,-1,DATE,0,I4,-1);
5600 VAROR(I2,0,DATE,0,I4,0);
5601 if (has_i8)
5602 {
5603 VAROR(I2,-1,I8,-1,I8,-1);
5604 VAROR(I2,-1,I8,0,I8,-1);
5605 VAROR(I2,0,I8,0,I8,0);
5606 VAROR(I2,-1,UI8,0,I4,-1);
5607 VAROR(I2,0,UI8,0,I4,0);
5608 }
5609 VAROR(I2,-1,INT,-1,I4,-1);
5610 VAROR(I2,-1,INT,0,I4,-1);
5611 VAROR(I2,0,INT,0,I4,0);
5612 VAROR(I2,-1,UINT,0xffffffff,I4,-1);
5613 VAROR(I2,-1,UINT,0,I4,-1);
5614 VAROR(I2,0,UINT,0,I4,0);
5615 rbstr = SysAllocString(szFalse);
5616 VAROR(I2,0,BSTR,rbstr,I2,0);
5617 VAROR(I2,-1,BSTR,rbstr,I2,-1);
5618 SysFreeString(rbstr);
5619 rbstr = SysAllocString(szTrue);
5620 VAROR(I2,0,BSTR,rbstr,I2,-1);
5621 VAROR(I2,-1,BSTR,rbstr,I2,-1);
5622 SysFreeString(rbstr);
5623 VARORCY(I2,-1,10000,I4,-1);
5624 VARORCY(I2,-1,0,I4,-1);
5625 VARORCY(I2,0,0,I4,0);
5626
5627 VAROR(UI2,65535,UI2,65535,I4,65535);
5628 VAROR(UI2,65535,UI2,0,I4,65535);
5629 VAROR(UI2,0,UI2,0,I4,0);
5630 VAROR(UI2,65535,I4,-1,I4,-1);
5631 VAROR(UI2,65535,I4,0,I4,65535);
5632 VAROR(UI2,0,I4,0,I4,0);
5633 VAROR(UI2,65535,UI4,0xffffffff,I4,-1);
5634 VAROR(UI2,65535,UI4,0,I4,65535);
5635 VAROR(UI2,0,UI4,0,I4,0);
5636 VAROR(UI2,65535,R4,-1,I4,-1);
5637 VAROR(UI2,65535,R4,0,I4,65535);
5638 VAROR(UI2,0,R4,0,I4,0);
5639 VAROR(UI2,65535,R8,-1,I4,-1);
5640 VAROR(UI2,65535,R8,0,I4,65535);
5641 VAROR(UI2,0,R8,0,I4,0);
5642 VAROR(UI2,65535,DATE,-1,I4,-1);
5643 VAROR(UI2,65535,DATE,0,I4,65535);
5644 VAROR(UI2,0,DATE,0,I4,0);
5645 if (has_i8)
5646 {
5647 VAROR(UI2,65535,I8,-1,I8,-1);
5648 VAROR(UI2,65535,I8,0,I8,65535);
5649 VAROR(UI2,0,I8,0,I8,0);
5650 VAROR(UI2,65535,UI8,0,I4,65535);
5651 VAROR(UI2,0,UI8,0,I4,0);
5652 }
5653 VAROR(UI2,65535,INT,-1,I4,-1);
5654 VAROR(UI2,65535,INT,0,I4,65535);
5655 VAROR(UI2,0,INT,0,I4,0);
5656 VAROR(UI2,65535,UINT,0xffffffff,I4,-1);
5657 VAROR(UI2,65535,UINT,0,I4,65535);
5658 VAROR(UI2,0,UINT,0,I4,0);
5659 rbstr = SysAllocString(szFalse);
5660 VAROR(UI2,0,BSTR,rbstr,I4,0);
5661 VAROR(UI2,65535,BSTR,rbstr,I4,65535);
5662 SysFreeString(rbstr);
5663 rbstr = SysAllocString(szTrue);
5664 VAROR(UI2,0,BSTR,rbstr,I4,-1);
5665 VAROR(UI2,65535,BSTR,rbstr,I4,-1);
5666 SysFreeString(rbstr);
5667 VARORCY(UI2,65535,10000,I4,65535);
5668 VARORCY(UI2,65535,0,I4,65535);
5669 VARORCY(UI2,0,0,I4,0);
5670
5671 VAROR(I4,-1,I4,-1,I4,-1);
5672 VAROR(I4,-1,I4,0,I4,-1);
5673 VAROR(I4,0,I4,0,I4,0);
5674 VAROR(I4,-1,UI4,0xffffffff,I4,-1);
5675 VAROR(I4,-1,UI4,0,I4,-1);
5676 VAROR(I4,0,UI4,0,I4,0);
5677 VAROR(I4,-1,R4,-1,I4,-1);
5678 VAROR(I4,-1,R4,0,I4,-1);
5679 VAROR(I4,0,R4,0,I4,0);
5680 VAROR(I4,-1,R8,-1,I4,-1);
5681 VAROR(I4,-1,R8,0,I4,-1);
5682 VAROR(I4,0,R8,0,I4,0);
5683 VAROR(I4,-1,DATE,-1,I4,-1);
5684 VAROR(I4,-1,DATE,0,I4,-1);
5685 VAROR(I4,0,DATE,0,I4,0);
5686 if (has_i8)
5687 {
5688 VAROR(I4,-1,I8,-1,I8,-1);
5689 VAROR(I4,-1,I8,0,I8,-1);
5690 VAROR(I4,0,I8,0,I8,0);
5691 VAROR(I4,-1,UI8,0,I4,-1);
5692 VAROR(I4,0,UI8,0,I4,0);
5693 }
5694 VAROR(I4,-1,INT,-1,I4,-1);
5695 VAROR(I4,-1,INT,0,I4,-1);
5696 VAROR(I4,0,INT,0,I4,0);
5697 VAROR(I4,-1,UINT,0xffffffff,I4,-1);
5698 VAROR(I4,-1,UINT,0,I4,-1);
5699 VAROR(I4,0,UINT,0,I4,0);
5700 rbstr = SysAllocString(szFalse);
5701 VAROR(I4,0,BSTR,rbstr,I4,0);
5702 VAROR(I4,-1,BSTR,rbstr,I4,-1);
5703 SysFreeString(rbstr);
5704 rbstr = SysAllocString(szTrue);
5705 VAROR(I4,0,BSTR,rbstr,I4,-1);
5706 VAROR(I4,-1,BSTR,rbstr,I4,-1);
5707 SysFreeString(rbstr);
5708 VARORCY(I4,-1,10000,I4,-1);
5709 VARORCY(I4,-1,0,I4,-1);
5710 VARORCY(I4,0,0,I4,0);
5711
5712 VAROR(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
5713 VAROR(UI4,0xffffffff,UI4,0,I4,-1);
5714 VAROR(UI4,0,UI4,0,I4,0);
5715 VAROR(UI4,0xffffffff,R4,-1,I4,-1);
5716 VAROR(UI4,0xffffffff,R4,0,I4,-1);
5717 VAROR(UI4,0,R4,0,I4,0);
5718 VAROR(UI4,0xffffffff,R8,-1,I4,-1);
5719 VAROR(UI4,0xffffffff,R8,0,I4,-1);
5720 VAROR(UI4,0,R8,0,I4,0);
5721 VAROR(UI4,0xffffffff,DATE,-1,I4,-1);
5722 VAROR(UI4,0xffffffff,DATE,0,I4,-1);
5723 VAROR(UI4,0,DATE,0,I4,0);
5724 if (has_i8)
5725 {
5726 VAROR(UI4,0xffffffff,I8,-1,I8,-1);
5727 VAROR(UI4,0xffffffff,I8,0,I8,0xffffffff);
5728 VAROR(UI4,0,I8,0,I8,0);
5729 VAROR(UI4,0xffffffff,UI8,0,I4,-1);
5730 VAROR(UI4,0,UI8,0,I4,0);
5731 }
5732 VAROR(UI4,0xffffffff,INT,-1,I4,-1);
5733 VAROR(UI4,0xffffffff,INT,0,I4,-1);
5734 VAROR(UI4,0,INT,0,I4,0);
5735 VAROR(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
5736 VAROR(UI4,0xffffffff,UINT,0,I4,-1);
5737 VAROR(UI4,0,UINT,0,I4,0);
5738 rbstr = SysAllocString(szFalse);
5739 VAROR(UI4,0,BSTR,rbstr,I4,0);
5740 VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
5741 SysFreeString(rbstr);
5742 rbstr = SysAllocString(szTrue);
5743 VAROR(UI4,0,BSTR,rbstr,I4,-1);
5744 VAROR(UI4,0xffffffff,BSTR,rbstr,I4,-1);
5745 SysFreeString(rbstr);
5746 VARORCY(UI4,0xffffffff,10000,I4,-1);
5747 VARORCY(UI4,0xffffffff,0,I4,-1);
5748 VARORCY(UI4,0,0,I4,0);
5749
5750 VAROR(R4,-1,R4,-1,I4,-1);
5751 VAROR(R4,-1,R4,0,I4,-1);
5752 VAROR(R4,0,R4,0,I4,0);
5753 VAROR(R4,-1,R8,-1,I4,-1);
5754 VAROR(R4,-1,R8,0,I4,-1);
5755 VAROR(R4,0,R8,0,I4,0);
5756 VAROR(R4,-1,DATE,-1,I4,-1);
5757 VAROR(R4,-1,DATE,0,I4,-1);
5758 VAROR(R4,0,DATE,0,I4,0);
5759 if (has_i8)
5760 {
5761 VAROR(R4,-1,I8,-1,I8,-1);
5762 VAROR(R4,-1,I8,0,I8,-1);
5763 VAROR(R4,0,I8,0,I8,0);
5764 VAROR(R4,-1,UI8,0,I4,-1);
5765 VAROR(R4,0,UI8,0,I4,0);
5766 }
5767 VAROR(R4,-1,INT,-1,I4,-1);
5768 VAROR(R4,-1,INT,0,I4,-1);
5769 VAROR(R4,0,INT,0,I4,0);
5770 VAROR(R4,-1,UINT,0xffffffff,I4,-1);
5771 VAROR(R4,-1,UINT,0,I4,-1);
5772 VAROR(R4,0,UINT,0,I4,0);
5773 rbstr = SysAllocString(szFalse);
5774 VAROR(R4,0,BSTR,rbstr,I4,0);
5775 VAROR(R4,-1,BSTR,rbstr,I4,-1);
5776 SysFreeString(rbstr);
5777 rbstr = SysAllocString(szTrue);
5778 VAROR(R4,0,BSTR,rbstr,I4,-1);
5779 VAROR(R4,-1,BSTR,rbstr,I4,-1);
5780 SysFreeString(rbstr);
5781 VARORCY(R4,-1,10000,I4,-1);
5782 VARORCY(R4,-1,0,I4,-1);
5783 VARORCY(R4,0,0,I4,0);
5784
5785 VAROR(R8,-1,R8,-1,I4,-1);
5786 VAROR(R8,-1,R8,0,I4,-1);
5787 VAROR(R8,0,R8,0,I4,0);
5788 VAROR(R8,-1,DATE,-1,I4,-1);
5789 VAROR(R8,-1,DATE,0,I4,-1);
5790 VAROR(R8,0,DATE,0,I4,0);
5791 if (has_i8)
5792 {
5793 VAROR(R8,-1,I8,-1,I8,-1);
5794 VAROR(R8,-1,I8,0,I8,-1);
5795 VAROR(R8,0,I8,0,I8,0);
5796 VAROR(R8,-1,UI8,0,I4,-1);
5797 VAROR(R8,0,UI8,0,I4,0);
5798 }
5799 VAROR(R8,-1,INT,-1,I4,-1);
5800 VAROR(R8,-1,INT,0,I4,-1);
5801 VAROR(R8,0,INT,0,I4,0);
5802 VAROR(R8,-1,UINT,0xffffffff,I4,-1);
5803 VAROR(R8,-1,UINT,0,I4,-1);
5804 VAROR(R8,0,UINT,0,I4,0);
5805 rbstr = SysAllocString(szFalse);
5806 VAROR(R8,0,BSTR,rbstr,I4,0);
5807 VAROR(R8,-1,BSTR,rbstr,I4,-1);
5808 SysFreeString(rbstr);
5809 rbstr = SysAllocString(szTrue);
5810 VAROR(R8,0,BSTR,rbstr,I4,-1);
5811 VAROR(R8,-1,BSTR,rbstr,I4,-1);
5812 SysFreeString(rbstr);
5813 VARORCY(R8,-1,10000,I4,-1);
5814 VARORCY(R8,-1,0,I4,-1);
5815 VARORCY(R8,0,0,I4,0);
5816
5817 VAROR(DATE,-1,DATE,-1,I4,-1);
5818 VAROR(DATE,-1,DATE,0,I4,-1);
5819 VAROR(DATE,0,DATE,0,I4,0);
5820 if (has_i8)
5821 {
5822 VAROR(DATE,-1,I8,-1,I8,-1);
5823 VAROR(DATE,-1,I8,0,I8,-1);
5824 VAROR(DATE,0,I8,0,I8,0);
5825 VAROR(DATE,-1,UI8,0,I4,-1);
5826 VAROR(DATE,0,UI8,0,I4,0);
5827 }
5828 VAROR(DATE,-1,INT,-1,I4,-1);
5829 VAROR(DATE,-1,INT,0,I4,-1);
5830 VAROR(DATE,0,INT,0,I4,0);
5831 VAROR(DATE,-1,UINT,0xffffffff,I4,-1);
5832 VAROR(DATE,-1,UINT,0,I4,-1);
5833 VAROR(DATE,0,UINT,0,I4,0);
5834 rbstr = SysAllocString(szFalse);
5835 VAROR(DATE,0,BSTR,rbstr,I4,0);
5836 VAROR(DATE,-1,BSTR,rbstr,I4,-1);
5837 SysFreeString(rbstr);
5838 rbstr = SysAllocString(szTrue);
5839 VAROR(DATE,0,BSTR,rbstr,I4,-1);
5840 VAROR(DATE,-1,BSTR,rbstr,I4,-1);
5841 SysFreeString(rbstr);
5842 VARORCY(DATE,-1,10000,I4,-1);
5843 VARORCY(DATE,-1,0,I4,-1);
5844 VARORCY(DATE,0,0,I4,0);
5845
5846 if (has_i8)
5847 {
5848 VAROR(I8,-1,I8,-1,I8,-1);
5849 VAROR(I8,-1,I8,0,I8,-1);
5850 VAROR(I8,0,I8,0,I8,0);
5851 VAROR(I8,-1,UI8,0,I8,-1);
5852 VAROR(I8,0,UI8,0,I8,0);
5853 /* These overflow under native and Wine
5854 VAROR(I8,-1,INT,-1,I4,-1);
5855 VAROR(I8,-1,INT,0,I4,-1);
5856 VAROR(I8,0,INT,0,I4,0); */
5857 VAROR(I8,-1,UINT,0xffffffff,I8,-1);
5858 VAROR(I8,-1,UINT,0,I8,-1);
5859 VAROR(I8,0,UINT,0,I8,0);
5860 rbstr = SysAllocString(szFalse);
5861 VAROR(I8,0,BSTR,rbstr,I8,0);
5862 VAROR(I8,-1,BSTR,rbstr,I8,-1);
5863 SysFreeString(rbstr);
5864 rbstr = SysAllocString(szTrue);
5865 VAROR(I8,0,BSTR,rbstr,I8,-1);
5866 VAROR(I8,-1,BSTR,rbstr,I8,-1);
5867 SysFreeString(rbstr);
5868 VARORCY(I8,-1,10000,I8,-1);
5869 VARORCY(I8,-1,0,I8,-1);
5870 VARORCY(I8,0,0,I8,0);
5871
5872 VAROR(UI8,0xffff,UI8,0xffff,I4,0xffff);
5873 VAROR(UI8,0xffff,UI8,0,I4,0xffff);
5874 VAROR(UI8,0,UI8,0,I4,0);
5875 VAROR(UI8,0xffff,INT,-1,I4,-1);
5876 VAROR(UI8,0xffff,INT,0,I4,0xffff);
5877 VAROR(UI8,0,INT,0,I4,0);
5878 VAROR(UI8,0xffff,UINT,0xffff,I4,0xffff);
5879 VAROR(UI8,0xffff,UINT,0,I4,0xffff);
5880 VAROR(UI8,0,UINT,0,I4,0);
5881 rbstr = SysAllocString(szFalse);
5882 VAROR(UI8,0,BSTR,rbstr,I4,0);
5883 VAROR(UI8,0xffff,BSTR,rbstr,I4,0xffff);
5884 SysFreeString(rbstr);
5885 rbstr = SysAllocString(szTrue);
5886 VAROR(UI8,0,BSTR,rbstr,I4,-1);
5887 VAROR(UI8,0xffff,BSTR,rbstr,I4,-1);
5888 SysFreeString(rbstr);
5889 VARORCY(UI8,0xffff,10000,I4,0xffff);
5890 VARORCY(UI8,0xffff,0,I4,0xffff);
5891 VARORCY(UI8,0,0,I4,0);
5892 }
5893
5894 VAROR(INT,-1,INT,-1,I4,-1);
5895 VAROR(INT,-1,INT,0,I4,-1);
5896 VAROR(INT,0,INT,0,I4,0);
5897 VAROR(INT,-1,UINT,0xffff,I4,-1);
5898 VAROR(INT,-1,UINT,0,I4,-1);
5899 VAROR(INT,0,UINT,0,I4,0);
5900 rbstr = SysAllocString(szFalse);
5901 VAROR(INT,0,BSTR,rbstr,I4,0);
5902 VAROR(INT,-1,BSTR,rbstr,I4,-1);
5903 SysFreeString(rbstr);
5904 rbstr = SysAllocString(szTrue);
5905 VAROR(INT,0,BSTR,rbstr,I4,-1);
5906 VAROR(INT,-1,BSTR,rbstr,I4,-1);
5907 SysFreeString(rbstr);
5908 VARORCY(INT,-1,10000,I4,-1);
5909 VARORCY(INT,-1,0,I4,-1);
5910 VARORCY(INT,0,0,I4,0);
5911
5912 VAROR(UINT,0xffff,UINT,0xffff,I4,0xffff);
5913 VAROR(UINT,0xffff,UINT,0,I4,0xffff);
5914 VAROR(UINT,0,UINT,0,I4,0);
5915 rbstr = SysAllocString(szFalse);
5916 VAROR(UINT,0,BSTR,rbstr,I4,0);
5917 VAROR(UINT,0xffff,BSTR,rbstr,I4,0xffff);
5918 SysFreeString(rbstr);
5919 rbstr = SysAllocString(szTrue);
5920 VAROR(UINT,0,BSTR,rbstr,I4,-1);
5921 VAROR(UINT,0xffff,BSTR,rbstr,I4,-1);
5922 SysFreeString(rbstr);
5923 VARORCY(UINT,0xffff,10000,I4,0xffff);
5924 VARORCY(UINT,0xffff,0,I4,0xffff);
5925 VARORCY(UINT,0,0,I4,0);
5926
5927 lbstr = SysAllocString(szFalse);
5928 rbstr = SysAllocString(szFalse);
5929 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,0);
5930 SysFreeString(rbstr);
5931 rbstr = SysAllocString(szTrue);
5932 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
5933 SysFreeString(lbstr);
5934 lbstr = SysAllocString(szTrue);
5935 VAROR(BSTR,lbstr,BSTR,rbstr,BOOL,VARIANT_TRUE);
5936 VARORCY(BSTR,lbstr,10000,I4,-1);
5937 SysFreeString(lbstr);
5938 lbstr = SysAllocString(szFalse);
5939 VARORCY(BSTR,lbstr,10000,I4,1);
5940 SysFreeString(lbstr);
5941 SysFreeString(rbstr);
5942}
5943
5944static HRESULT (WINAPI *pVarEqv)(LPVARIANT,LPVARIANT,LPVARIANT);
5945
5946#define VAREQV(vt1,val1,vt2,val2,rvt,rval) \
5947 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
5948 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
5949 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
5950 test_var_call2( __LINE__, pVarEqv, &left, &right, &exp )
5951
5952static void test_VarEqv(void)
5953{
5955 VARTYPE i;
5956 HRESULT hres;
5957
5959
5960 /* Test all possible flag/vt combinations & the resulting vt type */
5961 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
5962 {
5963 VARTYPE leftvt, rightvt, resvt;
5964
5965 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
5966 {
5967 SKIPTESTS(leftvt);
5968
5969 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
5970 {
5971 BOOL bFail = FALSE;
5972
5973 SKIPTESTS(rightvt);
5974
5975 if (leftvt == VT_BSTR || rightvt == VT_BSTR ||
5976 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
5977 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
5978 continue;
5979
5980 memset(&left, 0, sizeof(left));
5981 memset(&right, 0, sizeof(right));
5982 V_VT(&left) = leftvt | ExtraFlags[i];
5983 V_VT(&right) = rightvt | ExtraFlags[i];
5984 V_VT(&result) = VT_EMPTY;
5985 resvt = VT_I4;
5986
5987 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
5988 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
5989 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
5990 leftvt == VT_CLSID || rightvt == VT_CLSID ||
5991 leftvt == VT_RECORD || rightvt == VT_RECORD ||
5992 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
5993 leftvt == VT_ERROR || rightvt == VT_ERROR)
5994 {
5995 bFail = TRUE;
5996 }
5997 if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
5998 {
5999 if (leftvt == rightvt ||
6000 leftvt == VT_I2 || rightvt == VT_I2 ||
6001 leftvt == VT_UI1 || rightvt == VT_UI1 ||
6002 leftvt == VT_BOOL || rightvt == VT_BOOL)
6003 resvt = VT_I2;
6004 else if (leftvt == VT_NULL || rightvt == VT_NULL)
6005 resvt = VT_NULL;
6006 else if (leftvt == VT_I8 || rightvt == VT_I8)
6007 resvt = VT_I8;
6008 }
6009 else if (leftvt == VT_NULL || rightvt == VT_NULL)
6010 {
6011 resvt = VT_NULL;
6012 }
6013 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
6014 {
6015 if (leftvt == rightvt)
6016 resvt = VT_UI1;
6017 else if (leftvt == rightvt ||
6018 leftvt == VT_I2 || rightvt == VT_I2 ||
6019 leftvt == VT_BOOL || rightvt == VT_BOOL)
6020 {
6021 resvt = VT_I2;
6022 }
6023 else if (leftvt == VT_I8 || rightvt == VT_I8)
6024 resvt = VT_I8;
6025 }
6026 else if (leftvt == VT_I2 || rightvt == VT_I2)
6027 {
6028 if (leftvt == rightvt ||
6029 leftvt == VT_BOOL || rightvt == VT_BOOL)
6030 resvt = VT_I2;
6031 else if (leftvt == VT_I8 || rightvt == VT_I8)
6032 resvt = VT_I8;
6033 }
6034 else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
6035 {
6036 resvt = VT_BOOL;
6037 }
6038 else if (leftvt == VT_I8 || rightvt == VT_I8)
6039 {
6040 if (leftvt == VT_INT || rightvt == VT_INT)
6041 bFail = TRUE;
6042 else
6043 resvt = VT_I8;
6044 }
6045 hres = pVarEqv(&left, &right, &result);
6046 if (bFail)
6048 "VarEqv: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX vt %d\n",
6049 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
6050 V_VT(&result));
6051 else
6052 ok(hres == S_OK && V_VT(&result) == resvt,
6053 "VarEqv: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%lX vt %d\n",
6054 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
6055 V_VT(&result));
6056 }
6057 }
6058 }
6059
6060 /* Test returned values */
6061 VAREQV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
6062 VAREQV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
6063 VAREQV(BOOL,TRUE,BOOL,TRUE,BOOL,VARIANT_TRUE);
6064 VAREQV(BOOL,FALSE,BOOL,FALSE,BOOL,VARIANT_TRUE);
6067 VAREQV(BOOL,6,BOOL,7,BOOL,-2);
6068 VAREQV(BOOL,6,BOOL,6,BOOL,VARIANT_TRUE);
6069 VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_TRUE,I2,VARIANT_TRUE);
6070 VAREQV(BOOL,VARIANT_TRUE,I2,VARIANT_FALSE,I2,VARIANT_FALSE);
6071 VAREQV(BOOL,6,I2,7,I2,-2);
6072 VAREQV(UI1,1,UI1,1,UI1,255);
6073 VAREQV(UI1,1,UI1,0,UI1,254);
6074 VAREQV(UI1,0,UI1,1,UI1,254);
6075 if (has_i8)
6076 {
6077 VAREQV(UI4,VARIANT_FALSE,I8,VARIANT_FALSE,I8,-1);
6078 VAREQV(UI4,5,I8,19,I8,-23);
6079 VAREQV(UI4,VARIANT_FALSE,UI8,VARIANT_FALSE,I4,-1);
6080 }
6081}
6082
6083static HRESULT (WINAPI *pVarMul)(LPVARIANT,LPVARIANT,LPVARIANT);
6084
6085#define VARMUL(vt1,val1,vt2,val2,rvt,rval) \
6086 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6087 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6088 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6089 test_var_call2( __LINE__, pVarMul, &left, &right, &exp )
6090
6091static void test_VarMul(void)
6092{
6094 VARTYPE i;
6095 BSTR lbstr, rbstr;
6096 HRESULT hres;
6097 double r;
6098
6100
6101 lbstr = SysAllocString(L"12");
6102 rbstr = SysAllocString(L"12");
6103
6104 /* Test all possible flag/vt combinations & the resulting vt type */
6105 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
6106 {
6107 VARTYPE leftvt, rightvt, resvt;
6108
6109 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6110 {
6111
6112 SKIPTESTS(leftvt);
6113
6114 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6115 {
6116 BOOL bFail = FALSE;
6117
6118 SKIPTESTS(rightvt);
6119
6120 if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
6121 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
6122 continue;
6123
6124 memset(&left, 0, sizeof(left));
6125 memset(&right, 0, sizeof(right));
6126 V_VT(&left) = leftvt | ExtraFlags[i];
6127 if (leftvt == VT_BSTR)
6128 V_BSTR(&left) = lbstr;
6129 V_VT(&right) = rightvt | ExtraFlags[i];
6130 if (rightvt == VT_BSTR)
6131 V_BSTR(&right) = rbstr;
6132 V_VT(&result) = VT_EMPTY;
6133 resvt = VT_UNKNOWN;
6134
6135 /* Don't ask me why but native VarMul cannot handle:
6136 VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
6137 Tested with DCOM98, Win2k, WinXP */
6138 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
6139 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
6140 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
6141 leftvt == VT_CLSID || rightvt == VT_CLSID ||
6142 leftvt == VT_RECORD || rightvt == VT_RECORD ||
6143 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
6144 leftvt == VT_ERROR || rightvt == VT_ERROR ||
6145 leftvt == VT_I1 || rightvt == VT_I1 ||
6146 leftvt == VT_UI2 || rightvt == VT_UI2 ||
6147 leftvt == VT_UI4 || rightvt == VT_UI4 ||
6148 leftvt == VT_UI8 || rightvt == VT_UI8 ||
6149 leftvt == VT_INT || rightvt == VT_INT ||
6150 leftvt == VT_UINT || rightvt == VT_UINT) {
6151 bFail = TRUE;
6152 }
6153
6154 if (leftvt == VT_NULL || rightvt == VT_NULL)
6155 resvt = VT_NULL;
6156 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
6157 resvt = VT_DECIMAL;
6158 else if (leftvt == VT_R8 || rightvt == VT_R8 ||
6159 leftvt == VT_BSTR || rightvt == VT_BSTR ||
6160 leftvt == VT_DATE || rightvt == VT_DATE)
6161 resvt = VT_R8;
6162 else if (leftvt == VT_R4 || rightvt == VT_R4) {
6163 if (leftvt == VT_I4 || rightvt == VT_I4 ||
6164 leftvt == VT_I8 || rightvt == VT_I8 ||
6165 leftvt == VT_CY || rightvt == VT_CY)
6166 resvt = VT_R8;
6167 else
6168 resvt = VT_R4;
6169 } else if (leftvt == VT_CY || rightvt == VT_CY)
6170 resvt = VT_CY;
6171 else if (leftvt == VT_I8 || rightvt == VT_I8)
6172 resvt = VT_I8;
6173 else if (leftvt == VT_I4 || rightvt == VT_I4)
6174 resvt = VT_I4;
6175 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
6176 leftvt == VT_BOOL || rightvt == VT_BOOL ||
6177 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
6178 resvt = VT_I2;
6179 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
6180 resvt = VT_UI1;
6181
6182 hres = pVarMul(&left, &right, &result);
6183 if (bFail) {
6185 "VarMul: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX vt %d\n",
6186 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
6187 V_VT(&result));
6188 } else {
6189 ok(hres == S_OK && V_VT(&result) == resvt,
6190 "VarMul: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%lX vt %d\n",
6191 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
6192 V_VT(&result));
6193 }
6194 }
6195 }
6196 }
6197
6198 /* Test returned values */
6199 VARMUL(I4,4,I4,2,I4,8);
6200 VARMUL(I2,4,I2,2,I2,8);
6201 VARMUL(I2,-13,I4,5,I4,-65);
6202 VARMUL(I4,-13,I4,5,I4,-65);
6203 VARMUL(I2,7,R4,0.5f,R4,3.5f);
6204 VARMUL(R4,0.5f,I4,5,R8,2.5);
6205 VARMUL(R8,7.1,BOOL,0,R8,0);
6206 VARMUL(BSTR,lbstr,I2,4,R8,48);
6207 VARMUL(BSTR,lbstr,BOOL,1,R8,12);
6208 VARMUL(BSTR,lbstr,R4,0.1f,R8,1.2);
6209 VARMUL(BSTR,lbstr,BSTR,rbstr,R8,144);
6210 VARMUL(R4,0.2f,BSTR,rbstr,R8,2.4);
6211 VARMUL(DATE,2.25,I4,7,R8,15.75);
6212
6213 VARMUL(UI1, UI1_MAX, UI1, UI1_MAX, I4, UI1_MAX * UI1_MAX);
6214 VARMUL(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX * I2_MAX);
6215 VARMUL(I2, I2_MAX, I2, I2_MIN, I4, I2_MAX * I2_MIN);
6216 VARMUL(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN * I2_MIN);
6217 VARMUL(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX * I4_MAX);
6218 VARMUL(I4, I4_MAX, I4, I4_MIN, R8, (double)I4_MAX * I4_MIN);
6219 VARMUL(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN * I4_MIN);
6220 VARMUL(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX * R4_MAX);
6225
6226 /* Manuly test some VT_CY and VT_DECIMAL variants */
6227 V_VT(&cy) = VT_CY;
6228 hres = VarCyFromI4(4711, &V_CY(&cy));
6229 ok(hres == S_OK, "VarCyFromI4 failed!\n");
6230 V_VT(&dec) = VT_DECIMAL;
6231 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
6232 ok(hres == S_OK, "VarDecFromR4 failed!\n");
6233 memset(&left, 0, sizeof(left));
6234 memset(&right, 0, sizeof(right));
6235 V_VT(&left) = VT_I4;
6236 V_I4(&left) = -11;
6237 V_VT(&right) = VT_UI1;
6238 V_UI1(&right) = 9;
6239
6240 hres = pVarMul(&cy, &right, &result);
6241 ok(hres == S_OK && V_VT(&result) == VT_CY, "VarMul: expected coerced type VT_CY, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
6242 hres = VarR8FromCy(V_CY(&result), &r);
6243 ok(hres == S_OK && EQ_DOUBLE(r, 42399.0), "VarMul: CY value %f, expected %f\n", r, 42399.0);
6244
6245 hres = pVarMul(&left, &dec, &result);
6246 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarMul: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
6248 ok(hres == S_OK && EQ_DOUBLE(r, 46.2), "VarMul: DECIMAL value %f, expected %f\n", r, 46.2);
6249
6250 SysFreeString(lbstr);
6251 SysFreeString(rbstr);
6252}
6253
6254static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT);
6255
6256#define VARADD(vt1,val1,vt2,val2,rvt,rval) \
6257 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6258 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6259 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6260 test_var_call2( __LINE__, pVarAdd, &left, &right, &exp )
6261
6262static void test_VarAdd(void)
6263{
6265 VARTYPE i;
6266 BSTR lbstr, rbstr;
6267 HRESULT hres;
6268 double r;
6269
6271
6272 lbstr = SysAllocString(L"12");
6273 rbstr = SysAllocString(L"12");
6274
6275 /* Test all possible flag/vt combinations & the resulting vt type */
6276 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
6277 {
6278 VARTYPE leftvt, rightvt, resvt;
6279
6280 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6281 {
6282
6283 SKIPTESTS(leftvt);
6284
6285 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6286 {
6287 BOOL bFail = FALSE;
6288
6289 SKIPTESTS(rightvt);
6290
6291 if (leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
6292 continue;
6293
6294 memset(&left, 0, sizeof(left));
6295 memset(&right, 0, sizeof(right));
6296 V_VT(&left) = leftvt | ExtraFlags[i];
6297 if (leftvt == VT_BSTR)
6298 V_BSTR(&left) = lbstr;
6299 V_VT(&right) = rightvt | ExtraFlags[i];
6300 if (rightvt == VT_BSTR)
6301 V_BSTR(&right) = rbstr;
6302 V_VT(&result) = VT_EMPTY;
6303 resvt = VT_ERROR;
6304
6305 /* Don't ask me why but native VarAdd cannot handle:
6306 VT_I1, VT_UI2, VT_UI4, VT_INT, VT_UINT and VT_UI8.
6307 Tested with DCOM98, Win2k, WinXP */
6308 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
6309 !IsValidVariantClearVT(leftvt, ExtraFlags[i]) ||
6310 !IsValidVariantClearVT(rightvt, ExtraFlags[i]) ||
6311 leftvt == VT_CLSID || rightvt == VT_CLSID ||
6312 leftvt == VT_RECORD || rightvt == VT_RECORD ||
6313 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
6314 leftvt == VT_ERROR || rightvt == VT_ERROR ||
6315 leftvt == VT_I1 || rightvt == VT_I1 ||
6316 leftvt == VT_UI2 || rightvt == VT_UI2 ||
6317 leftvt == VT_UI4 || rightvt == VT_UI4 ||
6318 leftvt == VT_UI8 || rightvt == VT_UI8 ||
6319 leftvt == VT_INT || rightvt == VT_INT ||
6320 leftvt == VT_UINT || rightvt == VT_UINT) {
6321 bFail = TRUE;
6322 }
6323
6324 if (leftvt == VT_NULL || rightvt == VT_NULL)
6325 resvt = VT_NULL;
6326 else if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH)
6327 bFail = TRUE;
6328 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
6329 resvt = VT_DECIMAL;
6330 else if (leftvt == VT_DATE || rightvt == VT_DATE)
6331 resvt = VT_DATE;
6332 else if (leftvt == VT_CY || rightvt == VT_CY)
6333 resvt = VT_CY;
6334 else if (leftvt == VT_R8 || rightvt == VT_R8)
6335 resvt = VT_R8;
6336 else if (leftvt == VT_BSTR || rightvt == VT_BSTR) {
6337 if ((leftvt == VT_BSTR && rightvt == VT_BSTR) ||
6338 leftvt == VT_EMPTY || rightvt == VT_EMPTY)
6339 resvt = VT_BSTR;
6340 else
6341 resvt = VT_R8;
6342 } else if (leftvt == VT_R4 || rightvt == VT_R4) {
6343 if (leftvt == VT_I4 || rightvt == VT_I4 ||
6344 leftvt == VT_I8 || rightvt == VT_I8)
6345 resvt = VT_R8;
6346 else
6347 resvt = VT_R4;
6348 }
6349 else if (leftvt == VT_I8 || rightvt == VT_I8)
6350 resvt = VT_I8;
6351 else if (leftvt == VT_I4 || rightvt == VT_I4)
6352 resvt = VT_I4;
6353 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
6354 leftvt == VT_BOOL || rightvt == VT_BOOL ||
6355 (leftvt == VT_EMPTY && rightvt == VT_EMPTY))
6356 resvt = VT_I2;
6357 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
6358 resvt = VT_UI1;
6359
6360 hres = pVarAdd(&left, &right, &result);
6361 if (bFail) {
6363 "VarAdd: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX vt %d\n",
6364 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres,
6365 V_VT(&result));
6366 } else {
6367 ok(hres == S_OK && V_VT(&result) == resvt,
6368 "VarAdd: %d|0x%X, %d|0x%X: expected S_OK, vt %d, got 0x%lX vt %d\n",
6369 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], resvt, hres,
6370 V_VT(&result));
6371 }
6372 /* Note, we don't clear left/right deliberately here */
6374 }
6375 }
6376 }
6377
6378 /* Test returned values */
6379 VARADD(I4,4,I4,2,I4,6);
6380 VARADD(I2,4,I2,2,I2,6);
6381 VARADD(I2,-13,I4,5,I4,-8);
6382 VARADD(I4,-13,I4,5,I4,-8);
6383 VARADD(I2,7,R4,0.5f,R4,7.5f);
6384 VARADD(R4,0.5f,I4,5,R8,5.5);
6385 VARADD(R8,7.1,BOOL,0,R8,7.1);
6386 VARADD(BSTR,lbstr,I2,4,R8,16);
6387 VARADD(BSTR,lbstr,BOOL,1,R8,13);
6388 VARADD(BSTR,lbstr,R4,0.1f,R8,12.1);
6389 VARADD(R4,0.2f,BSTR,rbstr,R8,12.2);
6390 VARADD(DATE,2.25,I4,7,DATE,9.25);
6391 VARADD(DATE,1.25,R4,-1.7f,DATE,-0.45);
6392
6393 VARADD(UI1, UI1_MAX, UI1, UI1_MAX, I2, UI1_MAX + UI1_MAX);
6394 VARADD(I2, I2_MAX, I2, I2_MAX, I4, I2_MAX + I2_MAX);
6395 VARADD(I2, I2_MAX, I2, I2_MIN, I2, I2_MAX + I2_MIN);
6396 VARADD(I2, I2_MIN, I2, I2_MIN, I4, I2_MIN + I2_MIN);
6397 VARADD(I4, I4_MAX, I4, I4_MIN, I4, I4_MAX + I4_MIN);
6398 VARADD(I4, I4_MAX, I4, I4_MAX, R8, (double)I4_MAX + I4_MAX);
6399 VARADD(I4, I4_MIN, I4, I4_MIN, R8, (double)I4_MIN + I4_MIN);
6400 VARADD(R4, R4_MAX, R4, R4_MAX, R8, (double)R4_MAX + R4_MAX);
6405
6406 /* Manually test BSTR + BSTR */
6407 V_VT(&left) = VT_BSTR;
6408 V_BSTR(&left) = lbstr;
6409 V_VT(&right) = VT_BSTR;
6410 V_BSTR(&right) = rbstr;
6411 hres = pVarAdd(&left, &right, &result);
6412 ok(hres == S_OK && V_VT(&result) == VT_BSTR, "VarAdd: expected coerced type VT_BSTR, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
6413 hres = VarR8FromStr(V_BSTR(&result), 0, 0, &r);
6414 ok(hres == S_OK && EQ_DOUBLE(r, 1212.0), "VarAdd: BSTR value %f, expected %f\n", r, 1212.0);
6416
6417 /* Manuly test some VT_CY and VT_DECIMAL variants */
6418 V_VT(&cy) = VT_CY;
6419 hres = VarCyFromI4(4711, &V_CY(&cy));
6420 ok(hres == S_OK, "VarCyFromI4 failed!\n");
6421 V_VT(&dec) = VT_DECIMAL;
6422 hres = VarDecFromR8(-4.2, &V_DECIMAL(&dec));
6423 ok(hres == S_OK, "VarDecFromR4 failed!\n");
6424 memset(&left, 0, sizeof(left));
6425 memset(&right, 0, sizeof(right));
6426 V_VT(&left) = VT_I4;
6427 V_I4(&left) = -11;
6428 V_VT(&right) = VT_UI1;
6429 V_UI1(&right) = 9;
6430
6431 hres = pVarAdd(&cy, &right, &result);
6432 ok(hres == S_OK && V_VT(&result) == VT_CY, "VarAdd: expected coerced type VT_CY, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
6433 hres = VarR8FromCy(V_CY(&result), &r);
6434 ok(hres == S_OK && EQ_DOUBLE(r, 4720.0), "VarAdd: CY value %f, expected %f\n", r, 4720.0);
6435
6436 hres = pVarAdd(&left, &dec, &result);
6437 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL, "VarAdd: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
6439 ok(hres == S_OK && EQ_DOUBLE(r, -15.2), "VarAdd: DECIMAL value %f, expected %f\n", r, -15.2);
6441
6442 SysFreeString(lbstr);
6443 SysFreeString(rbstr);
6444}
6445
6446static void test_VarCat(void)
6447{
6448 LCID lcid;
6450 CHAR orig_date_format[128];
6451 VARTYPE leftvt, rightvt, resultvt;
6452 HRESULT hres;
6453 HRESULT expected_error_num;
6454 int cmp;
6456
6457 /* Set date format for testing */
6459 GetLocaleInfoA(lcid,LOCALE_SSHORTDATE,orig_date_format,128);
6461
6462 VariantInit(&left);
6465
6466 /* Check expected types for all combinations */
6467 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6468 {
6469
6470 SKIPTESTS(leftvt);
6471
6472 /* Check if we need/have support for I8 and/or UI8 */
6473 if ((leftvt == VT_I8 || leftvt == VT_UI8) && !has_i8)
6474 continue;
6475
6476 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6477 {
6478
6479 SKIPTESTS(rightvt);
6480 expected_error_num = S_OK;
6481 resultvt = VT_EMPTY;
6482
6483 if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
6484 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
6485 leftvt == VT_RECORD || rightvt == VT_RECORD ||
6486 leftvt == 15 || rightvt == 15 /* Undefined type */)
6487 continue;
6488
6489 /* Check if we need/have support for I8 and/or UI8 */
6490 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !has_i8)
6491 continue;
6492
6493 if (leftvt == VT_NULL && rightvt == VT_NULL)
6494 resultvt = VT_NULL;
6495 else if (leftvt == VT_VARIANT && (rightvt == VT_ERROR ||
6496 rightvt == VT_DATE || rightvt == VT_DECIMAL))
6497 expected_error_num = DISP_E_TYPEMISMATCH;
6498 else if ((leftvt == VT_I2 || leftvt == VT_I4 ||
6499 leftvt == VT_R4 || leftvt == VT_R8 ||
6500 leftvt == VT_CY || leftvt == VT_BOOL ||
6501 leftvt == VT_BSTR || leftvt == VT_I1 ||
6502 leftvt == VT_UI1 || leftvt == VT_UI2 ||
6503 leftvt == VT_UI4 || leftvt == VT_I8 ||
6504 leftvt == VT_UI8 || leftvt == VT_INT ||
6505 leftvt == VT_UINT || leftvt == VT_EMPTY ||
6506 leftvt == VT_NULL || leftvt == VT_DECIMAL ||
6507 leftvt == VT_DATE)
6508 &&
6509 (rightvt == VT_I2 || rightvt == VT_I4 ||
6510 rightvt == VT_R4 || rightvt == VT_R8 ||
6511 rightvt == VT_CY || rightvt == VT_BOOL ||
6512 rightvt == VT_BSTR || rightvt == VT_I1 ||
6513 rightvt == VT_UI1 || rightvt == VT_UI2 ||
6514 rightvt == VT_UI4 || rightvt == VT_I8 ||
6515 rightvt == VT_UI8 || rightvt == VT_INT ||
6516 rightvt == VT_UINT || rightvt == VT_EMPTY ||
6517 rightvt == VT_NULL || rightvt == VT_DECIMAL ||
6518 rightvt == VT_DATE))
6519 resultvt = VT_BSTR;
6520 else if (rightvt == VT_ERROR && leftvt < VT_VOID)
6521 expected_error_num = DISP_E_TYPEMISMATCH;
6522 else if (leftvt == VT_ERROR && (rightvt == VT_DATE ||
6523 rightvt == VT_ERROR || rightvt == VT_DECIMAL))
6524 expected_error_num = DISP_E_TYPEMISMATCH;
6525 else if (rightvt == VT_DATE || rightvt == VT_ERROR ||
6526 rightvt == VT_DECIMAL)
6527 expected_error_num = DISP_E_BADVARTYPE;
6528 else if (leftvt == VT_ERROR || rightvt == VT_ERROR)
6529 expected_error_num = DISP_E_TYPEMISMATCH;
6530 else if (leftvt == VT_VARIANT)
6531 expected_error_num = DISP_E_TYPEMISMATCH;
6532 else if (rightvt == VT_VARIANT && (leftvt == VT_EMPTY ||
6533 leftvt == VT_NULL || leftvt == VT_I2 ||
6534 leftvt == VT_I4 || leftvt == VT_R4 ||
6535 leftvt == VT_R8 || leftvt == VT_CY ||
6536 leftvt == VT_DATE || leftvt == VT_BSTR ||
6537 leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
6538 leftvt == VT_I1 || leftvt == VT_UI1 ||
6539 leftvt == VT_UI2 || leftvt == VT_UI4 ||
6540 leftvt == VT_I8 || leftvt == VT_UI8 ||
6541 leftvt == VT_INT || leftvt == VT_UINT
6542 ))
6543 expected_error_num = DISP_E_TYPEMISMATCH;
6544 else
6545 expected_error_num = DISP_E_BADVARTYPE;
6546
6547 V_VT(&left) = leftvt;
6548 V_VT(&right) = rightvt;
6549
6550 switch (leftvt) {
6551 case VT_BSTR:
6552 V_BSTR(&left) = SysAllocString(L""); break;
6553 case VT_DATE:
6554 V_DATE(&left) = 0.0; break;
6555 case VT_DECIMAL:
6556 VarDecFromR8(0.0, &V_DECIMAL(&left)); break;
6557 default:
6558 V_I8(&left) = 0;
6559 }
6560
6561 switch (rightvt) {
6562 case VT_BSTR:
6563 V_BSTR(&right) = SysAllocString(L""); break;
6564 case VT_DATE:
6565 V_DATE(&right) = 0.0; break;
6566 case VT_DECIMAL:
6567 VarDecFromR8(0.0, &V_DECIMAL(&right)); break;
6568 default:
6569 V_I8(&right) = 0;
6570 }
6571
6572 hres = VarCat(&left, &right, &result);
6573
6574 /* Determine the error code for the vt combination */
6575 ok(hres == expected_error_num,
6576 "VarCat: %d, %d returned error, 0x%lX expected 0x%lX.\n",
6577 leftvt, rightvt, hres, expected_error_num);
6578
6579 /* Check types are correct */
6580 ok(V_VT(&result) == resultvt,
6581 "VarCat: %d, %d: expected vt %d, got vt %d\n",
6582 leftvt, rightvt, resultvt, V_VT(&result));
6583
6587 }
6588 }
6589
6590 /* Running single comparison tests to compare outputs */
6591
6592 /* Test concat strings */
6593 V_VT(&left) = VT_BSTR;
6594 V_VT(&right) = VT_BSTR;
6595 V_BSTR(&left) = SysAllocString(L"12");
6596 V_BSTR(&right) = SysAllocString(L"34");
6597 hres = VarCat(&left,&right,&result);
6598 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6599 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6600 ok(!wcscmp(V_BSTR(&result), L"1234"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6601
6605
6606 /* Test if expression is VT_ERROR */
6607 V_VT(&left) = VT_ERROR;
6608 V_VT(&right) = VT_BSTR;
6609 V_BSTR(&right) = SysAllocString(L"1234");
6610 hres = VarCat(&left,&right,&result);
6611 ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08lx\n", hres);
6612 ok(V_VT(&result) == VT_EMPTY,
6613 "VarCat: VT_ERROR concat with VT_BSTR should have returned VT_EMPTY\n");
6614
6618
6619 V_VT(&left) = VT_BSTR;
6620 V_VT(&right) = VT_ERROR;
6621 V_BSTR(&left) = SysAllocString(L"1234");
6622 hres = VarCat(&left,&right,&result);
6623 ok(hres == DISP_E_TYPEMISMATCH, "VarCat should have returned DISP_E_TYPEMISMATCH instead of 0x%08lx\n", hres);
6624 ok(V_VT(&result) == VT_EMPTY,
6625 "VarCat: VT_BSTR concat with VT_ERROR should have returned VT_EMPTY\n");
6626
6630
6631 /* Test combining boolean with number */
6632 V_VT(&left) = VT_INT;
6633 V_VT(&right) = VT_BOOL;
6634 V_INT(&left) = 12;
6635 V_BOOL(&right) = TRUE;
6636 hres = VarCat(&left,&right,&result);
6637 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6638 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6639 ok(!wcscmp(V_BSTR(&result), sz12_true), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6640
6644
6645 V_VT(&left) = VT_INT;
6646 V_VT(&right) = VT_BOOL;
6647 V_INT(&left) = 12;
6648 V_BOOL(&right) = FALSE;
6649 hres = VarCat(&left,&right,&result);
6650 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6651 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6652 ok(!wcscmp(V_BSTR(&result), sz12_false), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6653
6657
6658 /* Test when both expressions are numeric */
6659 V_VT(&left) = VT_INT;
6660 V_VT(&right) = VT_INT;
6661 V_INT(&left) = 12;
6662 V_INT(&right) = 34;
6663 hres = VarCat(&left,&right,&result);
6664 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6665 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6666 ok(!wcscmp(V_BSTR(&result), L"1234"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6667
6671
6672 /* Test if one expression is numeric and the other is a string */
6673 V_VT(&left) = VT_INT;
6674 V_VT(&right) = VT_BSTR;
6675 V_INT(&left) = 12;
6676 V_BSTR(&right) = SysAllocString(L"34");
6677 hres = VarCat(&left,&right,&result);
6678 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6679 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6680 ok(!wcscmp(V_BSTR(&result), L"1234"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6681
6685
6686 V_VT(&left) = VT_BSTR;
6687 V_VT(&right) = VT_INT;
6688 V_BSTR(&left) = SysAllocString(L"12");
6689 V_INT(&right) = 34;
6690 hres = VarCat(&left,&right,&result);
6691 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6692 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6693 ok(!wcscmp(V_BSTR(&result), L"1234"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6694
6698
6699 /* Test concat dates with strings */
6700 V_VT(&left) = VT_BSTR;
6701 V_VT(&right) = VT_DATE;
6702 V_BSTR(&left) = SysAllocString(L"12");
6703 V_DATE(&right) = 29494.0;
6704 hres = VarCat(&left,&right,&result);
6705 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6706 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6707 ok(!wcscmp(V_BSTR(&result), L"129/30/1980"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6708
6712
6713 V_VT(&left) = VT_DATE;
6714 V_VT(&right) = VT_BSTR;
6715 V_DATE(&left) = 29494.0;
6716 V_BSTR(&right) = SysAllocString(L"12");
6717 hres = VarCat(&left,&right,&result);
6718 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6719 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6720 ok(!wcscmp(V_BSTR(&result), L"9/30/198012"), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6721
6725
6726 /* Test of both expressions are empty */
6727 V_VT(&left) = VT_BSTR;
6728 V_VT(&right) = VT_BSTR;
6729 V_BSTR(&left) = SysAllocString(L"");
6731 hres = VarCat(&left,&right,&result);
6732 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6733 ok(V_VT(&result) == VT_BSTR, "Unexpected return type %d.\n", V_VT(&result));
6734 ok(!wcscmp(V_BSTR(&result), L""), "Unexpected return value %s.\n", wine_dbgstr_w(V_BSTR(&result)));
6735
6736 /* Restore original date format settings */
6737 SetLocaleInfoA(lcid,LOCALE_SSHORTDATE,orig_date_format);
6738
6742
6743 /* Dispatch conversion */
6745 V_VT(&left) = VT_DISPATCH;
6746 V_DISPATCH(&left) = &dispatch.IDispatch_iface;
6747
6748 SET_EXPECT(dispatch_invoke);
6749 hres = VarCat(&left, &right, &result);
6750 ok(hres == S_OK, "got 0x%08lx\n", hres);
6751 ok(V_VT(&result) == VT_BSTR, "got %d\n", V_VT(&result));
6752 ok(SysStringLen(V_BSTR(&result)) == 0, "got %d\n", SysStringLen(V_BSTR(&result)));
6753 CHECK_CALLED(dispatch_invoke);
6754
6758
6761 V_DISPATCH(&right) = &dispatch.IDispatch_iface;
6762
6763 SET_EXPECT(dispatch_invoke);
6764 hres = VarCat(&left, &right, &result);
6765 ok(hres == S_OK, "got 0x%08lx\n", hres);
6766 ok(V_VT(&result) == VT_BSTR, "got %d\n", V_VT(&result));
6767 ok(SysStringLen(V_BSTR(&result)) == 0, "got %d\n", SysStringLen(V_BSTR(&result)));
6768 CHECK_CALLED(dispatch_invoke);
6769
6773
6776 V_DISPATCH(&right) = &dispatch.IDispatch_iface;
6777
6778 V_VT(&left) = VT_BSTR;
6779 V_BSTR(&left) = SysAllocString(L"12");
6780 SET_EXPECT(dispatch_invoke);
6781 hres = VarCat(&left,&right,&result);
6782 ok(hres == S_OK, "VarCat failed with error 0x%08lx\n", hres);
6783 CHECK_CALLED(dispatch_invoke);
6784 ok(!lstrcmpW(V_BSTR(&result), L"1234"), "got %s\n", wine_dbgstr_w(V_BSTR(&result)));
6785
6789
6791 dispatch.result = E_OUTOFMEMORY;
6793 V_DISPATCH(&right) = &dispatch.IDispatch_iface;
6794
6795 SET_EXPECT(dispatch_invoke);
6796 hres = VarCat(&left, &right, &result);
6797 ok(hres == E_OUTOFMEMORY, "got 0x%08lx\n", hres);
6798 CHECK_CALLED(dispatch_invoke);
6799
6803
6807 V_DISPATCH(&right) = &dispatch.IDispatch_iface;
6808
6809 SET_EXPECT(dispatch_invoke);
6810 hres = VarCat(&left, &right, &result);
6811 ok(hres == DISP_E_TYPEMISMATCH, "got 0x%08lx\n", hres);
6812 CHECK_CALLED(dispatch_invoke);
6813
6817
6818 /* Test boolean conversion */
6819 V_VT(&left) = VT_BOOL;
6820 V_BOOL(&left) = VARIANT_TRUE;
6821 V_VT(&right) = VT_BSTR;
6823 hres = VarCat(&left, &right, &result);
6824 ok(hres == S_OK, "VarCat failed: %08lx\n", hres);
6826
6827 cmp = lstrcmpW(V_BSTR(&result), L"True");
6829 if(!cmp) {
6830 V_VT(&right) = VT_BOOL;
6831 V_BOOL(&right) = 100;
6832 hres = VarCat(&left, &right, &result);
6833 ok(hres == S_OK, "VarCat failed: %08lx\n", hres);
6834 test_bstr_var(&result, L"TrueTrue");
6836
6837 V_BOOL(&right) = VARIANT_FALSE;
6838 hres = VarCat(&left, &right, &result);
6839 ok(hres == S_OK, "VarCat failed: %08lx\n", hres);
6840 test_bstr_var(&result, L"TrueFalse");
6842 }else {
6843 skip("Got %s as True, assuming non-English locale\n", wine_dbgstr_w(V_BSTR(&result)));
6844 }
6845}
6846
6847static HRESULT (WINAPI *pVarAnd)(LPVARIANT,LPVARIANT,LPVARIANT);
6848
6849#define VARAND(vt1,val1,vt2,val2,rvt,rval) \
6850 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6851 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
6852 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6853 test_var_call2( __LINE__, pVarAnd, &left, &right, &exp )
6854
6855#define VARANDCY(vt1,val1,val2,rvt,rval) \
6856 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
6857 V_VT(&right) = VT_CY; V_CY(&right).int64 = val2; \
6858 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
6859 test_var_call2( __LINE__, pVarAnd, &left, &right, &exp )
6860
6861/* Skip any type that is not defined or produces an error for every case */
6862#define SKIPTESTAND(a) \
6863 if (a == VT_ERROR || a == VT_VARIANT || \
6864 a == VT_DISPATCH || a == VT_UNKNOWN || \
6865 a > VT_UINT || a == 15 /*not defined*/) \
6866 continue
6867
6868static void test_VarAnd(void)
6869{
6870 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
6871 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
6873 BSTR false_str, true_str;
6874 VARTYPE i;
6875 HRESULT hres;
6876
6878
6879 true_str = SysAllocString(szTrue);
6880 false_str = SysAllocString(szFalse);
6881
6882 /* Test all possible flag/vt combinations & the resulting vt type */
6883 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
6884 {
6885 VARTYPE leftvt, rightvt, resvt;
6886
6887 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
6888 {
6889 SKIPTESTAND(leftvt);
6890
6891 /* Check if we need/have support for I8 and/or UI8 */
6892 if ((leftvt == VT_I8 || leftvt == VT_UI8) && !has_i8)
6893 continue;
6894
6895 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
6896 {
6897 BOOL bFail = FALSE;
6898 SKIPTESTAND(rightvt);
6899
6900 /* Check if we need/have support for I8 and/or UI8 */
6901 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !has_i8)
6902 continue;
6903
6904 memset(&left, 0, sizeof(left));
6905 memset(&right, 0, sizeof(right));
6906 V_VT(&left) = leftvt | ExtraFlags[i];
6907 V_VT(&right) = rightvt | ExtraFlags[i];
6908 V_VT(&result) = VT_EMPTY;
6909 resvt = VT_EMPTY;
6910 if ((leftvt | ExtraFlags[i]) == VT_BSTR)
6911 V_BSTR(&left) = true_str;
6912 if ((rightvt | ExtraFlags[i]) == VT_BSTR)
6913 V_BSTR(&right) = true_str;
6914
6915 /* Native VarAnd always returns an error when using extra
6916 * flags or if the variant combination is I8 and INT.
6917 */
6918 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
6919 (leftvt == VT_INT && rightvt == VT_I8) ||
6920 ExtraFlags[i] != 0)
6921 bFail = TRUE;
6922
6923 /* Determine return type */
6924 else if (leftvt == VT_I8 || rightvt == VT_I8)
6925 resvt = VT_I8;
6926 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
6927 leftvt == VT_UINT || rightvt == VT_UINT ||
6928 leftvt == VT_INT || rightvt == VT_INT ||
6929 leftvt == VT_R4 || rightvt == VT_R4 ||
6930 leftvt == VT_R8 || rightvt == VT_R8 ||
6931 leftvt == VT_CY || rightvt == VT_CY ||
6932 leftvt == VT_DATE || rightvt == VT_DATE ||
6933 leftvt == VT_I1 || rightvt == VT_I1 ||
6934 leftvt == VT_UI2 || rightvt == VT_UI2 ||
6935 leftvt == VT_UI4 || rightvt == VT_UI4 ||
6936 leftvt == VT_UI8 || rightvt == VT_UI8 ||
6937 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
6938 resvt = VT_I4;
6939 else if (leftvt == VT_UI1 || rightvt == VT_UI1 ||
6940 leftvt == VT_I2 || rightvt == VT_I2 ||
6941 leftvt == VT_EMPTY || rightvt == VT_EMPTY)
6942 if ((leftvt == VT_NULL && rightvt == VT_UI1) ||
6943 (leftvt == VT_UI1 && rightvt == VT_NULL) ||
6944 (leftvt == VT_UI1 && rightvt == VT_UI1))
6945 resvt = VT_UI1;
6946 else
6947 resvt = VT_I2;
6948 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
6949 (leftvt == VT_BSTR && rightvt == VT_BSTR))
6950 resvt = VT_BOOL;
6951 else if (leftvt == VT_NULL || rightvt == VT_NULL ||
6952 leftvt == VT_BSTR || rightvt == VT_BSTR)
6953 resvt = VT_NULL;
6954 else
6955 bFail = TRUE;
6956
6957 hres = pVarAnd(&left, &right, &result);
6958
6959 /* Check expected HRESULT and if result variant type is correct */
6960 if (bFail)
6962 "VarAnd: %s|0x%X, %s|0x%X: got vt %s hr 0x%lX\n",
6963 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i],
6964 wine_dbgstr_vt(V_VT(&result)), hres);
6965 else
6966 ok (hres == S_OK && resvt == V_VT(&result),
6967 "VarAnd: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
6968 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i], wine_dbgstr_vt(resvt),
6969 S_OK, wine_dbgstr_vt(V_VT(&result)), hres);
6970 }
6971 }
6972 }
6973
6974 /*
6975 * Test returned values. Since we know the returned type is correct
6976 * and that we handle all combinations of invalid types, just check
6977 * that good type combinations produce the desired value.
6978 * FIXME: Test VT_DECIMAL
6979 */
6980 VARAND(EMPTY,0,EMPTY,0,I2,0);
6981 VARAND(EMPTY,1,EMPTY,0,I2,0);
6982 VARAND(EMPTY,1,EMPTY,1,I2,0);
6983 VARAND(EMPTY,0,NULL,0,I2,0);
6984 VARAND(EMPTY,1,NULL,0,I2,0);
6985 VARAND(EMPTY,1,NULL,1,I2,0);
6986 VARAND(EMPTY,0,I1,0,I4,0);
6987 VARAND(EMPTY,0,I1,1,I4,0);
6988 VARAND(EMPTY,1,I1,1,I4,0);
6989 VARAND(EMPTY,0,UI1,0,I2,0);
6990 VARAND(EMPTY,0,UI1,1,I2,0);
6991 VARAND(EMPTY,1,UI1,1,I2,0);
6992 VARAND(EMPTY,0,I2,0,I2,0);
6993 VARAND(EMPTY,0,I2,1,I2,0);
6994 VARAND(EMPTY,1,I2,1,I2,0);
6995 VARAND(EMPTY,0,UI2,0,I4,0);
6996 VARAND(EMPTY,0,UI2,1,I4,0);
6997 VARAND(EMPTY,1,UI2,1,I4,0);
6998 VARAND(EMPTY,0,I4,0,I4,0);
6999 VARAND(EMPTY,0,I4,1,I4,0);
7000 VARAND(EMPTY,1,I4,1,I4,0);
7001 VARAND(EMPTY,0,UI4,0,I4,0);
7002 VARAND(EMPTY,0,UI4,1,I4,0);
7003 VARAND(EMPTY,1,UI4,1,I4,0);
7004 if (has_i8)
7005 {
7006 VARAND(EMPTY,0,I8,0,I8,0);
7007 VARAND(EMPTY,0,I8,1,I8,0);
7008 VARAND(EMPTY,1,I8,1,I8,0);
7009 VARAND(EMPTY,0,UI8,0,I4,0);
7010 VARAND(EMPTY,0,UI8,1,I4,0);
7011 VARAND(EMPTY,1,UI8,1,I4,0);
7012 }
7013 VARAND(EMPTY,0,INT,0,I4,0);
7014 VARAND(EMPTY,0,INT,1,I4,0);
7015 VARAND(EMPTY,1,INT,1,I4,0);
7016 VARAND(EMPTY,0,UINT,0,I4,0);
7017 VARAND(EMPTY,0,UINT,1,I4,0);
7018 VARAND(EMPTY,1,UINT,1,I4,0);
7019 VARAND(EMPTY,0,BOOL,0,I2,0);
7020 VARAND(EMPTY,0,BOOL,1,I2,0);
7021 VARAND(EMPTY,1,BOOL,1,I2,0);
7022 VARAND(EMPTY,0,R4,0,I4,0);
7023 VARAND(EMPTY,0,R4,1,I4,0);
7024 VARAND(EMPTY,1,R4,1,I4,0);
7025 VARAND(EMPTY,0,R8,0,I4,0);
7026 VARAND(EMPTY,0,R8,1,I4,0);
7027 VARAND(EMPTY,1,R8,1,I4,0);
7028 VARAND(EMPTY,0,BSTR,false_str,I2,0);
7029 VARAND(EMPTY,0,BSTR,true_str,I2,0);
7030 VARANDCY(EMPTY,0,10000,I4,0);
7031
7032 /* NULL OR 0 = NULL. NULL OR n = n */
7033 VARAND(NULL,0,NULL,0,NULL,0);
7034 VARAND(NULL,1,NULL,0,NULL,0);
7035 VARAND(NULL,0,I1,0,I4,0);
7036 VARAND(NULL,0,I1,1,NULL,0);
7037 VARAND(NULL,0,UI1,0,UI1,0);
7038 VARAND(NULL,0,UI1,1,NULL,0);
7039 VARAND(NULL,0,I2,0,I2,0);
7040 VARAND(NULL,0,I2,1,NULL,0);
7041 VARAND(NULL,0,UI2,0,I4,0);
7042 VARAND(NULL,0,UI2,1,NULL,0);
7043 VARAND(NULL,0,I4,0,I4,0);
7044 VARAND(NULL,0,I4,1,NULL,0);
7045 VARAND(NULL,0,UI4,0,I4,0);
7046 VARAND(NULL,0,UI4,1,NULL,0);
7047 if (has_i8)
7048 {
7049 VARAND(NULL,0,I8,0,I8,0);
7050 VARAND(NULL,0,I8,1,NULL,0);
7051 VARAND(NULL,0,UI8,0,I4,0);
7052 VARAND(NULL,0,UI8,1,NULL,0);
7053 }
7054 VARAND(NULL,0,INT,0,I4,0);
7055 VARAND(NULL,0,INT,1,NULL,0);
7056 VARAND(NULL,0,UINT,0,I4,0);
7057 VARAND(NULL,0,UINT,1,NULL,0);
7058 VARAND(NULL,0,BOOL,0,BOOL,0);
7059 VARAND(NULL,0,BOOL,1,NULL,0);
7060 VARAND(NULL,0,R4,0,I4,0);
7061 VARAND(NULL,0,R4,1,NULL,0);
7062 VARAND(NULL,0,R8,0,I4,0);
7063 VARAND(NULL,0,R8,1,NULL,0);
7064 VARAND(NULL,0,BSTR,false_str,BOOL,0);
7065 VARAND(NULL,0,BSTR,true_str,NULL,VARIANT_FALSE);
7066 VARANDCY(NULL,0,10000,NULL,0);
7067 VARANDCY(NULL,0,0,I4,0);
7068 VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE);
7069 VARAND(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
7070 VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE);
7071 VARAND(BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE,BOOL,VARIANT_FALSE);
7072
7073 /* Assume x,y & y,x are the same from now on to reduce the number of tests */
7074 VARAND(BOOL,VARIANT_TRUE,I1,-1,I4,-1);
7075 VARAND(BOOL,VARIANT_TRUE,I1,0,I4,0);
7076 VARAND(BOOL,VARIANT_FALSE,I1,0,I4,0);
7077 VARAND(BOOL,VARIANT_TRUE,UI1,255,I2,255);
7078 VARAND(BOOL,VARIANT_TRUE,UI1,0,I2,0);
7079 VARAND(BOOL,VARIANT_FALSE,UI1,0,I2,0);
7080 VARAND(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
7081 VARAND(BOOL,VARIANT_TRUE,I2,0,I2,0);
7082 VARAND(BOOL,VARIANT_FALSE,I2,0,I2,0);
7083 VARAND(BOOL,VARIANT_TRUE,UI2,65535,I4,65535);
7084 VARAND(BOOL,VARIANT_TRUE,UI2,0,I4,0);
7085 VARAND(BOOL,VARIANT_FALSE,UI2,0,I4,0);
7086 VARAND(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
7087 VARAND(BOOL,VARIANT_TRUE,I4,0,I4,0);
7088 VARAND(BOOL,VARIANT_FALSE,I4,0,I4,0);
7089 VARAND(BOOL,VARIANT_TRUE,UI4,0xffffffff,I4,-1);
7090 VARAND(BOOL,VARIANT_TRUE,UI4,0,I4,0);
7091 VARAND(BOOL,VARIANT_FALSE,UI4,0,I4,0);
7092 VARAND(BOOL,VARIANT_TRUE,R4,-1,I4,-1);
7093 VARAND(BOOL,VARIANT_TRUE,R4,0,I4,0);
7094 VARAND(BOOL,VARIANT_FALSE,R4,0,I4,0);
7095 VARAND(BOOL,VARIANT_TRUE,R8,-1,I4,-1);
7096 VARAND(BOOL,VARIANT_TRUE,R8,0,I4,0);
7097 VARAND(BOOL,VARIANT_FALSE,R8,0,I4,0);
7098 VARAND(BOOL,VARIANT_TRUE,DATE,-1,I4,-1);
7099 VARAND(BOOL,VARIANT_TRUE,DATE,0,I4,0);
7100 VARAND(BOOL,VARIANT_FALSE,DATE,0,I4,0);
7101 if (has_i8)
7102 {
7103 VARAND(BOOL,VARIANT_TRUE,I8,-1,I8,-1);
7104 VARAND(BOOL,VARIANT_TRUE,I8,0,I8,0);
7105 VARAND(BOOL,VARIANT_FALSE,I8,0,I8,0);
7106 VARAND(BOOL,VARIANT_TRUE,UI8,0,I4,0);
7107 VARAND(BOOL,VARIANT_FALSE,UI8,0,I4,0);
7108 }
7109 VARAND(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
7110 VARAND(BOOL,VARIANT_TRUE,INT,0,I4,0);
7111 VARAND(BOOL,VARIANT_FALSE,INT,0,I4,0);
7112 VARAND(BOOL,VARIANT_TRUE,UINT,0xffffffff,I4,-1);
7113 VARAND(BOOL,VARIANT_TRUE,UINT,0,I4,0);
7114 VARAND(BOOL,VARIANT_FALSE,UINT,0,I4,0);
7115 VARAND(BOOL,VARIANT_FALSE,BSTR,false_str,BOOL,VARIANT_FALSE);
7116 VARAND(BOOL,VARIANT_TRUE,BSTR,false_str,BOOL,VARIANT_FALSE);
7117 VARAND(BOOL,VARIANT_FALSE,BSTR,true_str,BOOL,VARIANT_FALSE);
7118 VARAND(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,VARIANT_TRUE);
7119 VARANDCY(BOOL,VARIANT_TRUE,10000,I4,1);
7120 VARANDCY(BOOL,VARIANT_TRUE,0,I4,0);
7121 VARANDCY(BOOL,VARIANT_FALSE,0,I4,0);
7122 VARAND(I1,-1,I1,-1,I4,-1);
7123 VARAND(I1,-1,I1,0,I4,0);
7124 VARAND(I1,0,I1,0,I4,0);
7125 VARAND(I1,-1,UI1,255,I4,255);
7126 VARAND(I1,-1,UI1,0,I4,0);
7127 VARAND(I1,0,UI1,0,I4,0);
7128 VARAND(I1,-1,I2,-1,I4,-1);
7129 VARAND(I1,-1,I2,0,I4,0);
7130 VARAND(I1,0,I2,0,I4,0);
7131 VARAND(I1,-1,UI2,65535,I4,65535);
7132 VARAND(I1,-1,UI2,0,I4,0);
7133 VARAND(I1,0,UI2,0,I4,0);
7134 VARAND(I1,-1,I4,-1,I4,-1);
7135 VARAND(I1,-1,I4,0,I4,0);
7136 VARAND(I1,0,I4,0,I4,0);
7137 VARAND(I1,-1,UI4,0xffffffff,I4,-1);
7138 VARAND(I1,-1,UI4,0,I4,0);
7139 VARAND(I1,0,UI4,0,I4,0);
7140 VARAND(I1,-1,R4,-1,I4,-1);
7141 VARAND(I1,-1,R4,0,I4,0);
7142 VARAND(I1,0,R4,0,I4,0);
7143 VARAND(I1,-1,R8,-1,I4,-1);
7144 VARAND(I1,-1,R8,0,I4,0);
7145 VARAND(I1,0,R8,0,I4,0);
7146 VARAND(I1,-1,DATE,-1,I4,-1);
7147 VARAND(I1,-1,DATE,0,I4,0);
7148 VARAND(I1,0,DATE,0,I4,0);
7149 if (has_i8)
7150 {
7151 VARAND(I1,-1,I8,-1,I8,-1);
7152 VARAND(I1,-1,I8,0,I8,0);
7153 VARAND(I1,0,I8,0,I8,0);
7154 VARAND(I1,-1,UI8,0,I4,0);
7155 VARAND(I1,0,UI8,0,I4,0);
7156 }
7157 VARAND(I1,-1,INT,-1,I4,-1);
7158 VARAND(I1,-1,INT,0,I4,0);
7159 VARAND(I1,0,INT,0,I4,0);
7160 VARAND(I1,-1,UINT,0xffffffff,I4,-1);
7161 VARAND(I1,-1,UINT,0,I4,0);
7162 VARAND(I1,0,UINT,0,I4,0);
7163 VARAND(I1,0,BSTR,false_str,I4,0);
7164 VARAND(I1,-1,BSTR,false_str,I4,0);
7165 VARAND(I1,0,BSTR,true_str,I4,0);
7166 VARAND(I1,-1,BSTR,true_str,I4,-1);
7167 VARANDCY(I1,-1,10000,I4,1);
7168 VARANDCY(I1,-1,0,I4,0);
7169 VARANDCY(I1,0,0,I4,0);
7170
7171 VARAND(UI1,255,UI1,255,UI1,255);
7172 VARAND(UI1,255,UI1,0,UI1,0);
7173 VARAND(UI1,0,UI1,0,UI1,0);
7174 VARAND(UI1,255,I2,-1,I2,255);
7175 VARAND(UI1,255,I2,0,I2,0);
7176 VARAND(UI1,0,I2,0,I2,0);
7177 VARAND(UI1,255,UI2,65535,I4,255);
7178 VARAND(UI1,255,UI2,0,I4,0);
7179 VARAND(UI1,0,UI2,0,I4,0);
7180 VARAND(UI1,255,I4,-1,I4,255);
7181 VARAND(UI1,255,I4,0,I4,0);
7182 VARAND(UI1,0,I4,0,I4,0);
7183 VARAND(UI1,255,UI4,0xffffffff,I4,255);
7184 VARAND(UI1,255,UI4,0,I4,0);
7185 VARAND(UI1,0,UI4,0,I4,0);
7186 VARAND(UI1,255,R4,-1,I4,255);
7187 VARAND(UI1,255,R4,0,I4,0);
7188 VARAND(UI1,0,R4,0,I4,0);
7189 VARAND(UI1,255,R8,-1,I4,255);
7190 VARAND(UI1,255,R8,0,I4,0);
7191 VARAND(UI1,0,R8,0,I4,0);
7192 VARAND(UI1,255,DATE,-1,I4,255);
7193 VARAND(UI1,255,DATE,0,I4,0);
7194 VARAND(UI1,0,DATE,0,I4,0);
7195 if (has_i8)
7196 {
7197 VARAND(UI1,255,I8,-1,I8,255);
7198 VARAND(UI1,255,I8,0,I8,0);
7199 VARAND(UI1,0,I8,0,I8,0);
7200 VARAND(UI1,255,UI8,0,I4,0);
7201 VARAND(UI1,0,UI8,0,I4,0);
7202 }
7203 VARAND(UI1,255,INT,-1,I4,255);
7204 VARAND(UI1,255,INT,0,I4,0);
7205 VARAND(UI1,0,INT,0,I4,0);
7206 VARAND(UI1,255,UINT,0xffffffff,I4,255);
7207 VARAND(UI1,255,UINT,0,I4,0);
7208 VARAND(UI1,0,UINT,0,I4,0);
7209 VARAND(UI1,0,BSTR,false_str,I2,0);
7210 VARAND(UI1,255,BSTR,false_str,I2,0);
7211 VARAND(UI1,0,BSTR,true_str,I2,0);
7212 VARAND(UI1,255,BSTR,true_str,I2,255);
7213 VARANDCY(UI1,255,10000,I4,1);
7214 VARANDCY(UI1,255,0,I4,0);
7215 VARANDCY(UI1,0,0,I4,0);
7216
7217 VARAND(I2,-1,I2,-1,I2,-1);
7218 VARAND(I2,-1,I2,0,I2,0);
7219 VARAND(I2,0,I2,0,I2,0);
7220 VARAND(I2,-1,UI2,65535,I4,65535);
7221 VARAND(I2,-1,UI2,0,I4,0);
7222 VARAND(I2,0,UI2,0,I4,0);
7223 VARAND(I2,-1,I4,-1,I4,-1);
7224 VARAND(I2,-1,I4,0,I4,0);
7225 VARAND(I2,0,I4,0,I4,0);
7226 VARAND(I2,-1,UI4,0xffffffff,I4,-1);
7227 VARAND(I2,-1,UI4,0,I4,0);
7228 VARAND(I2,0,UI4,0,I4,0);
7229 VARAND(I2,-1,R4,-1,I4,-1);
7230 VARAND(I2,-1,R4,0,I4,0);
7231 VARAND(I2,0,R4,0,I4,0);
7232 VARAND(I2,-1,R8,-1,I4,-1);
7233 VARAND(I2,-1,R8,0,I4,0);
7234 VARAND(I2,0,R8,0,I4,0);
7235 VARAND(I2,-1,DATE,-1,I4,-1);
7236 VARAND(I2,-1,DATE,0,I4,0);
7237 VARAND(I2,0,DATE,0,I4,0);
7238 if (has_i8)
7239 {
7240 VARAND(I2,-1,I8,-1,I8,-1);
7241 VARAND(I2,-1,I8,0,I8,0);
7242 VARAND(I2,0,I8,0,I8,0);
7243 VARAND(I2,-1,UI8,0,I4,0);
7244 VARAND(I2,0,UI8,0,I4,0);
7245 }
7246 VARAND(I2,-1,INT,-1,I4,-1);
7247 VARAND(I2,-1,INT,0,I4,0);
7248 VARAND(I2,0,INT,0,I4,0);
7249 VARAND(I2,-1,UINT,0xffffffff,I4,-1);
7250 VARAND(I2,-1,UINT,0,I4,0);
7251 VARAND(I2,0,UINT,0,I4,0);
7252 VARAND(I2,0,BSTR,false_str,I2,0);
7253 VARAND(I2,-1,BSTR,false_str,I2,0);
7254 VARAND(I2,0,BSTR,true_str,I2,0);
7255 VARAND(I2,-1,BSTR,true_str,I2,-1);
7256 VARANDCY(I2,-1,10000,I4,1);
7257 VARANDCY(I2,-1,0,I4,0);
7258 VARANDCY(I2,0,0,I4,0);
7259
7260 VARAND(UI2,65535,UI2,65535,I4,65535);
7261 VARAND(UI2,65535,UI2,0,I4,0);
7262 VARAND(UI2,0,UI2,0,I4,0);
7263 VARAND(UI2,65535,I4,-1,I4,65535);
7264 VARAND(UI2,65535,I4,0,I4,0);
7265 VARAND(UI2,0,I4,0,I4,0);
7266 VARAND(UI2,65535,UI4,0xffffffff,I4,65535);
7267 VARAND(UI2,65535,UI4,0,I4,0);
7268 VARAND(UI2,0,UI4,0,I4,0);
7269 VARAND(UI2,65535,R4,-1,I4,65535);
7270 VARAND(UI2,65535,R4,0,I4,0);
7271 VARAND(UI2,0,R4,0,I4,0);
7272 VARAND(UI2,65535,R8,-1,I4,65535);
7273 VARAND(UI2,65535,R8,0,I4,0);
7274 VARAND(UI2,0,R8,0,I4,0);
7275 VARAND(UI2,65535,DATE,-1,I4,65535);
7276 VARAND(UI2,65535,DATE,0,I4,0);
7277 VARAND(UI2,0,DATE,0,I4,0);
7278 if (has_i8)
7279 {
7280 VARAND(UI2,65535,I8,-1,I8,65535);
7281 VARAND(UI2,65535,I8,0,I8,0);
7282 VARAND(UI2,0,I8,0,I8,0);
7283 VARAND(UI2,65535,UI8,0,I4,0);
7284 VARAND(UI2,0,UI8,0,I4,0);
7285 }
7286 VARAND(UI2,65535,INT,-1,I4,65535);
7287 VARAND(UI2,65535,INT,0,I4,0);
7288 VARAND(UI2,0,INT,0,I4,0);
7289 VARAND(UI2,65535,UINT,0xffffffff,I4,65535);
7290 VARAND(UI2,65535,UINT,0,I4,0);
7291 VARAND(UI2,0,UINT,0,I4,0);
7292 VARAND(UI2,0,BSTR,false_str,I4,0);
7293 VARAND(UI2,65535,BSTR,false_str,I4,0);
7294 VARAND(UI2,0,BSTR,true_str,I4,0);
7295 VARAND(UI2,65535,BSTR,true_str,I4,65535);
7296 VARANDCY(UI2,65535,10000,I4,1);
7297 VARANDCY(UI2,65535,0,I4,0);
7298 VARANDCY(UI2,0,0,I4,0);
7299
7300 VARAND(I4,-1,I4,-1,I4,-1);
7301 VARAND(I4,-1,I4,0,I4,0);
7302 VARAND(I4,0,I4,0,I4,0);
7303 VARAND(I4,-1,UI4,0xffffffff,I4,-1);
7304 VARAND(I4,-1,UI4,0,I4,0);
7305 VARAND(I4,0,UI4,0,I4,0);
7306 VARAND(I4,-1,R4,-1,I4,-1);
7307 VARAND(I4,-1,R4,0,I4,0);
7308 VARAND(I4,0,R4,0,I4,0);
7309 VARAND(I4,-1,R8,-1,I4,-1);
7310 VARAND(I4,-1,R8,0,I4,0);
7311 VARAND(I4,0,R8,0,I4,0);
7312 VARAND(I4,-1,DATE,-1,I4,-1);
7313 VARAND(I4,-1,DATE,0,I4,0);
7314 VARAND(I4,0,DATE,0,I4,0);
7315 if (has_i8)
7316 {
7317 VARAND(I4,-1,I8,-1,I8,-1);
7318 VARAND(I4,-1,I8,0,I8,0);
7319 VARAND(I4,0,I8,0,I8,0);
7320 VARAND(I4,-1,UI8,0,I4,0);
7321 VARAND(I4,0,UI8,0,I4,0);
7322 }
7323 VARAND(I4,-1,INT,-1,I4,-1);
7324 VARAND(I4,-1,INT,0,I4,0);
7325 VARAND(I4,0,INT,0,I4,0);
7326 VARAND(I4,-1,UINT,0xffffffff,I4,-1);
7327 VARAND(I4,-1,UINT,0,I4,0);
7328 VARAND(I4,0,UINT,0,I4,0);
7329 VARAND(I4,0,BSTR,false_str,I4,0);
7330 VARAND(I4,-1,BSTR,false_str,I4,0);
7331 VARAND(I4,0,BSTR,true_str,I4,0);
7332 VARAND(I4,-1,BSTR,true_str,I4,-1);
7333 VARANDCY(I4,-1,10000,I4,1);
7334 VARANDCY(I4,-1,0,I4,0);
7335 VARANDCY(I4,0,0,I4,0);
7336
7337 VARAND(UI4,0xffffffff,UI4,0xffffffff,I4,-1);
7338 VARAND(UI4,0xffffffff,UI4,0,I4,0);
7339 VARAND(UI4,0,UI4,0,I4,0);
7340 VARAND(UI4,0xffffffff,R4,-1,I4,-1);
7341 VARAND(UI4,0xffffffff,R4,0,I4,0);
7342 VARAND(UI4,0,R4,0,I4,0);
7343 VARAND(UI4,0xffffffff,R8,-1,I4,-1);
7344 VARAND(UI4,0xffffffff,R8,0,I4,0);
7345 VARAND(UI4,0,R8,0,I4,0);
7346 VARAND(UI4,0xffffffff,DATE,-1,I4,-1);
7347 VARAND(UI4,0xffffffff,DATE,0,I4,0);
7348 VARAND(UI4,0,DATE,0,I4,0);
7349 if (has_i8)
7350 {
7351 VARAND(UI4,0xffffffff,I8,0,I8,0);
7352 VARAND(UI4,0,I8,0,I8,0);
7353 VARAND(UI4,0xffffffff,UI8,0,I4,0);
7354 VARAND(UI4,0,UI8,0,I4,0);
7355 }
7356 VARAND(UI4,0xffffffff,INT,-1,I4,-1);
7357 VARAND(UI4,0xffffffff,INT,0,I4,0);
7358 VARAND(UI4,0,INT,0,I4,0);
7359 VARAND(UI4,0xffffffff,UINT,0xffffffff,I4,-1);
7360 VARAND(UI4,0xffffffff,UINT,0,I4,0);
7361 VARAND(UI4,0,UINT,0,I4,0);
7362 VARAND(UI4,0,BSTR,false_str,I4,0);
7363 VARAND(UI4,0xffffffff,BSTR,false_str,I4,0);
7364 VARAND(UI4,0,BSTR,true_str,I4,0);
7365 VARAND(UI4,0xffffffff,BSTR,true_str,I4,-1);
7366 VARANDCY(UI4,0xffffffff,10000,I4,1);
7367 VARANDCY(UI4,0xffffffff,0,I4,0);
7368 VARANDCY(UI4,0,0,I4,0);
7369
7370 VARAND(R4,-1,R4,-1,I4,-1);
7371 VARAND(R4,-1,R4,0,I4,0);
7372 VARAND(R4,0,R4,0,I4,0);
7373 VARAND(R4,-1,R8,-1,I4,-1);
7374 VARAND(R4,-1,R8,0,I4,0);
7375 VARAND(R4,0,R8,0,I4,0);
7376 VARAND(R4,-1,DATE,-1,I4,-1);
7377 VARAND(R4,-1,DATE,0,I4,0);
7378 VARAND(R4,0,DATE,0,I4,0);
7379 if (has_i8)
7380 {
7381 VARAND(R4,-1,I8,-1,I8,-1);
7382 VARAND(R4,-1,I8,0,I8,0);
7383 VARAND(R4,0,I8,0,I8,0);
7384 VARAND(R4,-1,UI8,0,I4,0);
7385 VARAND(R4,0,UI8,0,I4,0);
7386 }
7387 VARAND(R4,-1,INT,-1,I4,-1);
7388 VARAND(R4,-1,INT,0,I4,0);
7389 VARAND(R4,0,INT,0,I4,0);
7390 VARAND(R4,-1,UINT,0xffffffff,I4,-1);
7391 VARAND(R4,-1,UINT,0,I4,0);
7392 VARAND(R4,0,UINT,0,I4,0);
7393 VARAND(R4,0,BSTR,false_str,I4,0);
7394 VARAND(R4,-1,BSTR,false_str,I4,0);
7395 VARAND(R4,0,BSTR,true_str,I4,0);
7396 VARAND(R4,-1,BSTR,true_str,I4,-1);
7397 VARANDCY(R4,-1,10000,I4,1);
7398 VARANDCY(R4,-1,0,I4,0);
7399 VARANDCY(R4,0,0,I4,0);
7400
7401 VARAND(R8,-1,R8,-1,I4,-1);
7402 VARAND(R8,-1,R8,0,I4,0);
7403 VARAND(R8,0,R8,0,I4,0);
7404 VARAND(R8,-1,DATE,-1,I4,-1);
7405 VARAND(R8,-1,DATE,0,I4,0);
7406 VARAND(R8,0,DATE,0,I4,0);
7407 if (has_i8)
7408 {
7409 VARAND(R8,-1,I8,-1,I8,-1);
7410 VARAND(R8,-1,I8,0,I8,0);
7411 VARAND(R8,0,I8,0,I8,0);
7412 VARAND(R8,-1,UI8,0,I4,0);
7413 VARAND(R8,0,UI8,0,I4,0);
7414 }
7415 VARAND(R8,-1,INT,-1,I4,-1);
7416 VARAND(R8,-1,INT,0,I4,0);
7417 VARAND(R8,0,INT,0,I4,0);
7418 VARAND(R8,-1,UINT,0xffffffff,I4,-1);
7419 VARAND(R8,-1,UINT,0,I4,0);
7420 VARAND(R8,0,UINT,0,I4,0);
7421 VARAND(R8,0,BSTR,false_str,I4,0);
7422 VARAND(R8,-1,BSTR,false_str,I4,0);
7423 VARAND(R8,0,BSTR,true_str,I4,0);
7424 VARAND(R8,-1,BSTR,true_str,I4,-1);
7425 VARANDCY(R8,-1,10000,I4,1);
7426 VARANDCY(R8,-1,0,I4,0);
7427 VARANDCY(R8,0,0,I4,0);
7428
7429 VARAND(DATE,-1,DATE,-1,I4,-1);
7430 VARAND(DATE,-1,DATE,0,I4,0);
7431 VARAND(DATE,0,DATE,0,I4,0);
7432 if (has_i8)
7433 {
7434 VARAND(DATE,-1,I8,-1,I8,-1);
7435 VARAND(DATE,-1,I8,0,I8,0);
7436 VARAND(DATE,0,I8,0,I8,0);
7437 VARAND(DATE,-1,UI8,0,I4,0);
7438 VARAND(DATE,0,UI8,0,I4,0);
7439 }
7440 VARAND(DATE,-1,INT,-1,I4,-1);
7441 VARAND(DATE,-1,INT,0,I4,0);
7442 VARAND(DATE,0,INT,0,I4,0);
7443 VARAND(DATE,-1,UINT,0xffffffff,I4,-1);
7444 VARAND(DATE,-1,UINT,0,I4,0);
7445 VARAND(DATE,0,UINT,0,I4,0);
7446 VARAND(DATE,0,BSTR,false_str,I4,0);
7447 VARAND(DATE,-1,BSTR,false_str,I4,0);
7448 VARAND(DATE,0,BSTR,true_str,I4,0);
7449 VARAND(DATE,-1,BSTR,true_str,I4,-1);
7450 VARANDCY(DATE,-1,10000,I4,1);
7451 VARANDCY(DATE,-1,0,I4,0);
7452 VARANDCY(DATE,0,0,I4,0);
7453
7454 if (has_i8)
7455 {
7456 VARAND(I8,-1,I8,-1,I8,-1);
7457 VARAND(I8,-1,I8,0,I8,0);
7458 VARAND(I8,0,I8,0,I8,0);
7459 VARAND(I8,-1,UI8,0,I8,0);
7460 VARAND(I8,0,UI8,0,I8,0);
7461 VARAND(I8,-1,UINT,0,I8,0);
7462 VARAND(I8,0,UINT,0,I8,0);
7463 VARAND(I8,0,BSTR,false_str,I8,0);
7464 VARAND(I8,-1,BSTR,false_str,I8,0);
7465 VARAND(I8,0,BSTR,true_str,I8,0);
7466 VARAND(I8,-1,BSTR,true_str,I8,-1);
7467 VARANDCY(I8,-1,10000,I8,1);
7468 VARANDCY(I8,-1,0,I8,0);
7469 VARANDCY(I8,0,0,I8,0);
7470
7471 VARAND(UI8,0xffff,UI8,0xffff,I4,0xffff);
7472 VARAND(UI8,0xffff,UI8,0,I4,0);
7473 VARAND(UI8,0,UI8,0,I4,0);
7474 VARAND(UI8,0xffff,INT,-1,I4,65535);
7475 VARAND(UI8,0xffff,INT,0,I4,0);
7476 VARAND(UI8,0,INT,0,I4,0);
7477 VARAND(UI8,0xffff,UINT,0xffff,I4,0xffff);
7478 VARAND(UI8,0xffff,UINT,0,I4,0);
7479 VARAND(UI8,0,UINT,0,I4,0);
7480 VARAND(UI8,0,BSTR,false_str,I4,0);
7481 VARAND(UI8,0xffff,BSTR,false_str,I4,0);
7482 VARAND(UI8,0,BSTR,true_str,I4,0);
7483 VARAND(UI8,0xffff,BSTR,true_str,I4,65535);
7484 VARANDCY(UI8,0xffff,10000,I4,1);
7485 VARANDCY(UI8,0xffff,0,I4,0);
7486 VARANDCY(UI8,0,0,I4,0);
7487 }
7488
7489 VARAND(INT,-1,INT,-1,I4,-1);
7490 VARAND(INT,-1,INT,0,I4,0);
7491 VARAND(INT,0,INT,0,I4,0);
7492 VARAND(INT,-1,UINT,0xffff,I4,65535);
7493 VARAND(INT,-1,UINT,0,I4,0);
7494 VARAND(INT,0,UINT,0,I4,0);
7495 VARAND(INT,0,BSTR,false_str,I4,0);
7496 VARAND(INT,-1,BSTR,false_str,I4,0);
7497 VARAND(INT,0,BSTR,true_str,I4,0);
7498 VARAND(INT,-1,BSTR,true_str,I4,-1);
7499 VARANDCY(INT,-1,10000,I4,1);
7500 VARANDCY(INT,-1,0,I4,0);
7501 VARANDCY(INT,0,0,I4,0);
7502
7503 VARAND(UINT,0xffff,UINT,0xffff,I4,0xffff);
7504 VARAND(UINT,0xffff,UINT,0,I4,0);
7505 VARAND(UINT,0,UINT,0,I4,0);
7506 VARAND(UINT,0,BSTR,false_str,I4,0);
7507 VARAND(UINT,0xffff,BSTR, false_str,I4,0);
7508 VARAND(UINT,0,BSTR,true_str,I4,0);
7509 VARAND(UINT,0xffff,BSTR,true_str,I4,65535);
7510 VARANDCY(UINT,0xffff,10000,I4,1);
7511 VARANDCY(UINT,0xffff,0,I4,0);
7512 VARANDCY(UINT,0,0,I4,0);
7513
7514 VARAND(BSTR,false_str,BSTR,false_str,BOOL,0);
7515 VARAND(BSTR,true_str,BSTR,false_str,BOOL,VARIANT_FALSE);
7516 VARAND(BSTR,true_str,BSTR,true_str,BOOL,VARIANT_TRUE);
7517 VARANDCY(BSTR,true_str,10000,I4,1);
7518 VARANDCY(BSTR,false_str,10000,I4,0);
7519
7520 SysFreeString(true_str);
7521 SysFreeString(false_str);
7522}
7523
7525{
7526 HRESULT hres;
7527
7529 ok_(__FILE__,line)(hres == result, "VarCmp(%s,%s): expected 0x%lx, got hres=0x%lx\n",
7530 wine_dbgstr_variant(left), wine_dbgstr_variant(right), result, hres );
7531}
7533 HRESULT res1, HRESULT res2, HRESULT res3, HRESULT res4 )
7534{
7535 test_cmp( line, lcid, 0, left, right, res1 );
7536 V_VT(left) |= VT_RESERVED;
7537 test_cmp( line, lcid, 0, left, right, res2 );
7538 V_VT(left) &= ~VT_RESERVED;
7540 test_cmp( line, lcid, 0, left, right, res3 );
7541 V_VT(left) |= VT_RESERVED;
7542 test_cmp( line, lcid, 0, left, right, res4 );
7543 ok_(__FILE__,line)(V_VT(left) & V_VT(right) & VT_RESERVED, "VT_RESERVED filtered out\n");
7544}
7545
7546/* ERROR from wingdi.h is interfering here */
7547#undef ERROR
7548#define _VARCMP(vt1,val1,vtfl1,vt2,val2,vtfl2,lcid,flags,result) \
7549 V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1 | vtfl1; \
7550 V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2 | vtfl2; \
7551 test_cmp( __LINE__, lcid, flags, &left, &right, result )
7552#define VARCMPEX(vt1,val1,vt2,val2,res1,res2,res3,res4) \
7553 V_##vt1(&left) = val1; V_VT(&left) = VT_##vt1; \
7554 V_##vt2(&right) = val2; V_VT(&right) = VT_##vt2; \
7555 test_cmpex( __LINE__, lcid, &left, &right, res1, res2, res3, res4 )
7556#define VARCMP(vt1,val1,vt2,val2,result) \
7557 VARCMPEX(vt1,val1,vt2,val2,result,result,result,result)
7558/* The above macros do not work for VT_NULL as NULL gets expanded first */
7559#define V_NULL_ V_NULL
7560#define VT_NULL_ VT_NULL
7561
7562static void test_VarCmp(void)
7563{
7565 VARTYPE i;
7566 LCID lcid;
7567 HRESULT hres;
7568 DECIMAL dec;
7569 BSTR bstrhuh, bstrempty, bstr0, bstr1, bstr7, bstr42, bstr1neg, bstr666neg;
7570 BSTR bstr2cents, bstr1few;
7571
7573 bstrempty = SysAllocString(L"");
7574 bstrhuh = SysAllocString(L"huh?");
7575 bstr2cents = SysAllocString(L"2cents");
7576 bstr0 = SysAllocString(L"0");
7577 bstr1 = SysAllocString(L"1");
7578 bstr7 = SysAllocString(L"7");
7579 bstr42 = SysAllocString(L"42");
7580 bstr1neg = SysAllocString(L"-1");
7581 bstr666neg = SysAllocString(L"-666");
7582 bstr1few = SysAllocString(L"1.00000001");
7583
7584 /* Test all possible flag/vt combinations & the resulting vt type */
7585 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
7586 {
7587 VARTYPE leftvt, rightvt;
7588
7589 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7590 {
7591
7592 SKIPTESTS(leftvt);
7593
7594 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7595 {
7596 BOOL bFail = FALSE;
7598
7599 SKIPTESTS(rightvt);
7600
7601 memset(&left, 0, sizeof(left));
7602 memset(&right, 0, sizeof(right));
7603 V_VT(&left) = leftvt | ExtraFlags[i];
7604 if (leftvt == VT_BSTR) {
7605 V_BSTR(&left) = bstr1neg;
7606 if (ExtraFlags[i] & VT_RESERVED)
7607 expect = VARCMP_LT;
7608 else
7609 expect = VARCMP_GT;
7610 }
7611 V_VT(&right) = rightvt | ExtraFlags[i];
7612 if (rightvt == VT_BSTR) {
7613 V_BSTR(&right) = bstr1neg;
7614 if (ExtraFlags[i] & VT_RESERVED)
7615 expect = VARCMP_GT;
7616 else
7617 expect = VARCMP_LT;
7618 }
7619
7620 /* Don't ask me why but native VarCmp cannot handle:
7621 VT_I1, VT_UI2, VT_UI4, VT_UINT and VT_UI8.
7622 VT_INT is only supported as left variant. Go figure.
7623 Tested with DCOM98, Win2k, WinXP */
7624 if (ExtraFlags[i] & VT_ARRAY || ExtraFlags[i] & VT_BYREF ||
7627 leftvt == VT_CLSID || rightvt == VT_CLSID ||
7628 leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
7629 leftvt == VT_ERROR || rightvt == VT_ERROR ||
7630 leftvt == VT_RECORD || rightvt == VT_RECORD ||
7631 leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
7632 leftvt == VT_VARIANT || rightvt == VT_VARIANT ||
7633 leftvt == VT_I1 || rightvt == VT_I1 ||
7634 leftvt == VT_UI2 || rightvt == VT_UI2 ||
7635 leftvt == VT_UI4 || rightvt == VT_UI4 ||
7636 leftvt == VT_UI8 || rightvt == VT_UI8 ||
7637 rightvt == VT_INT ||
7638 leftvt == VT_UINT || rightvt == VT_UINT) {
7639 bFail = TRUE;
7640 }
7641
7642 if (leftvt == VT_ERROR && rightvt == VT_ERROR &&
7643 !(ExtraFlags[i] & ~VT_RESERVED)) {
7644 expect = VARCMP_EQ;
7645 bFail = FALSE;
7646 } else if (leftvt == VT_NULL || rightvt == VT_NULL)
7648 else if (leftvt == VT_BSTR && rightvt == VT_BSTR)
7649 expect = VARCMP_EQ;
7650 else if (leftvt == VT_BSTR && rightvt == VT_EMPTY)
7651 expect = VARCMP_GT;
7652 else if (leftvt == VT_EMPTY && rightvt == VT_BSTR)
7653 expect = VARCMP_LT;
7654
7656 if (bFail) {
7658 "VarCmp: %d|0x%X, %d|0x%X: Expected failure, got 0x%lX\n",
7659 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], hres);
7660 } else {
7661 ok(hres == expect,
7662 "VarCmp: %d|0x%X, %d|0x%X: Expected 0x%lX, got 0x%lX\n",
7663 leftvt, ExtraFlags[i], rightvt, ExtraFlags[i], expect,
7664 hres);
7665 }
7666 }
7667 }
7668 }
7669
7670 /* VARCMP{,EX} run each 4 tests with a permutation of all possible
7671 input variants with (1) and without (0) VT_RESERVED set. The order
7672 of the permutations is (0,0); (1,0); (0,1); (1,1) */
7673 VARCMP(INT,4711,I2,4711,VARCMP_EQ);
7674 VARCMP(INT,4711,I2,-4711,VARCMP_GT);
7678 VARCMP(I4,1,R8,1.0,VARCMP_EQ);
7679 VARCMP(EMPTY,19,I2,0,VARCMP_EQ);
7680 ok(V_EMPTY(&left) == 19, "VT_EMPTY modified!\n");
7681 VARCMP(I4,1,UI1,1,VARCMP_EQ);
7682 VARCMP(I2,2,I2,2,VARCMP_EQ);
7683 VARCMP(I2,1,I2,2,VARCMP_LT);
7684 VARCMP(I2,2,I2,1,VARCMP_GT);
7685 VARCMP(I2,2,EMPTY,1,VARCMP_GT);
7686 VARCMP(I2,2,NULL_,1,VARCMP_NULL);
7687
7688 /* BSTR handling, especially in conjunction with VT_RESERVED */
7689 VARCMP(BSTR,bstr0,NULL_,0,VARCMP_NULL);
7690 VARCMP(BSTR,bstr0,BSTR,bstr0,VARCMP_EQ);
7691 VARCMP(BSTR,bstrempty,BSTR,bstr0,VARCMP_LT);
7692 VARCMP(BSTR,bstr7,BSTR,bstr0,VARCMP_GT);
7693 VARCMP(BSTR,bstr7,BSTR,bstr1neg,VARCMP_GT);
7694 VARCMP(BSTR,bstr0,BSTR,NULL,VARCMP_GT);
7696 VARCMP(BSTR,bstrempty,BSTR,NULL,VARCMP_EQ);
7699 VARCMP(EMPTY,0,BSTR,bstrempty,VARCMP_EQ);
7700 VARCMP(EMPTY,1,BSTR,bstrempty,VARCMP_EQ);
7701 VARCMP(BSTR,bstr0,EMPTY,0,VARCMP_GT);
7702 VARCMP(BSTR,bstr42,EMPTY,0,VARCMP_GT);
7708 _VARCMP(BSTR,(BSTR)100,0,I2,100,0,lcid,0,VARCMP_GT);
7711 VARCMP(BSTR,bstrhuh,I4,I4_MAX,VARCMP_GT);
7712 VARCMP(BSTR,bstr2cents,I4,2,VARCMP_GT);
7714 VARCMP(BSTR,bstr2cents,I4,-1,VARCMP_GT);
7715 VARCMPEX(BSTR,bstr2cents,I4,-666,VARCMP_GT,VARCMP_LT,VARCMP_GT,VARCMP_GT);
7719 VARCMP(BSTR,bstr1,I4,0,VARCMP_GT);
7723 VARCMP(BSTR,bstr7,I4,1,VARCMP_GT);
7738 VARCMPEX(BSTR,bstr666neg,I4,-666,VARCMP_GT,VARCMP_EQ,VARCMP_EQ,VARCMP_LT);
7741 VARCMP(BSTR,bstr7,BSTR,bstr7,VARCMP_EQ);
7742 VARCMP(BSTR,bstr7,BSTR,bstr42,VARCMP_GT);
7743 VARCMP(BSTR,bstr42,BSTR,bstr7,VARCMP_LT);
7744
7745 /* DECIMAL handling */
7746 setdec(&dec,0,0,0,0);
7748 setdec64(&dec,0,0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF); /* max DECIMAL */
7749 VARCMP(DECIMAL,dec,R8,R8_MAX,VARCMP_LT); /* R8 has bigger range */
7750 VARCMP(DECIMAL,dec,DATE,R8_MAX,VARCMP_LT); /* DATE has bigger range */
7751 setdec64(&dec,0,0x80,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
7753 setdec64(&dec,20,0,0x5,0x6BC75E2D,0x63100001); /* 1+1e-20 */
7754 VARCMP(DECIMAL,dec,R8,1,VARCMP_GT); /* DECIMAL has higher precision */
7755
7756 /* Show that DATE is handled just as a R8 */
7760 VARCMP(DATE,1,DATE,1+1e-15,VARCMP_LT); /* 1e-15 == 8.64e-11 seconds */
7761 VARCMP(DATE,25570.0,DATE,25570.0,VARCMP_EQ);
7762 VARCMP(DATE,25570.0,DATE,25571.0,VARCMP_LT);
7763 VARCMP(DATE,25571.0,DATE,25570.0,VARCMP_GT);
7764 VARCMP(DATE,25570.0,EMPTY,0,VARCMP_GT);
7765 VARCMP(DATE,25570.0,NULL_,0,VARCMP_NULL);
7766
7767 /* R4 precision handling */
7768 VARCMP(R4,1,R8,1+1e-8,VARCMP_EQ);
7769 VARCMP(R8,1+1e-8,R4,1,VARCMP_EQ);
7770 VARCMP(R8,1+1e-8,R8,1,VARCMP_GT);
7773 VARCMP(R4,1,DATE,1+1e-8,VARCMP_EQ);
7774 VARCMP(R4,1,BSTR,bstr1few,VARCMP_LT); /* bstr1few == 1+1e-8 */
7775 setdec(&dec,8,0,0,0x5F5E101); /* 1+1e-8 */
7777
7778 SysFreeString(bstrhuh);
7779 SysFreeString(bstrempty);
7780 SysFreeString(bstr0);
7781 SysFreeString(bstr1);
7782 SysFreeString(bstr7);
7783 SysFreeString(bstr42);
7784 SysFreeString(bstr1neg);
7785 SysFreeString(bstr666neg);
7786 SysFreeString(bstr2cents);
7787 SysFreeString(bstr1few);
7788}
7789
7790static HRESULT (WINAPI *pVarPow)(LPVARIANT,LPVARIANT,LPVARIANT);
7791
7792#define VARPOW(vt1,val1,vt2,val2,rvt,rval) \
7793 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
7794 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
7795 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
7796 test_var_call2( __LINE__, pVarPow, &left, &right, &exp )
7797
7798/* Skip any type that is not defined or produces an error for every case */
7799#define SKIPTESTPOW(a) \
7800 if (a == VT_ERROR || a == VT_VARIANT || \
7801 a == VT_DISPATCH || a == VT_UNKNOWN || \
7802 a == VT_RECORD || a > VT_UINT || \
7803 a == 15 /*not defined*/) \
7804 continue
7805
7806static void test_VarPow(void)
7807{
7809 BSTR num2_str, num3_str;
7810 VARTYPE i;
7811 HRESULT hres;
7812
7814
7815 num2_str = SysAllocString(L"2");
7816 num3_str = SysAllocString(L"3");
7817
7818 /* Test all possible flag/vt combinations & the resulting vt type */
7819 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
7820 {
7821 VARTYPE leftvt, rightvt, resvt;
7822
7823 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
7824 {
7825 SKIPTESTPOW(leftvt);
7826
7827 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
7828 {
7829 BOOL bFail = FALSE;
7830 SKIPTESTPOW(rightvt);
7831
7832 /* Native crashes with VT_BYREF */
7833 if (ExtraFlags[i] == VT_BYREF)
7834 continue;
7835
7836 memset(&left, 0, sizeof(left));
7837 memset(&right, 0, sizeof(right));
7838 V_VT(&left) = leftvt | ExtraFlags[i];
7839 V_VT(&right) = rightvt | ExtraFlags[i];
7840 V_VT(&result) = VT_EMPTY;
7841 resvt = VT_EMPTY;
7842
7843 if (leftvt == VT_BSTR)
7844 V_BSTR(&left) = num2_str;
7845 if (rightvt == VT_BSTR)
7846 V_BSTR(&right) = num2_str;
7847
7848 /* Native VarPow always returns an error when using extra flags */
7849 if (ExtraFlags[i] != 0)
7850 bFail = TRUE;
7851
7852 /* Determine return type */
7853 else if ((leftvt == VT_NULL || rightvt == VT_NULL) &&
7854 ((leftvt != VT_I8 && leftvt != VT_UI8 &&
7855 rightvt != VT_I8 && rightvt != VT_UI8) || has_i8))
7856 resvt = VT_NULL;
7857 else if ((leftvt == VT_EMPTY || leftvt == VT_I2 ||
7858 leftvt == VT_I4 || leftvt == VT_R4 ||
7859 leftvt == VT_R8 || leftvt == VT_CY ||
7860 leftvt == VT_DATE || leftvt == VT_BSTR ||
7861 leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
7862 (leftvt >= VT_I1 && leftvt <= VT_UI4) ||
7863 (has_i8 && (leftvt == VT_I8 || leftvt == VT_UI8)) ||
7864 leftvt == VT_INT || leftvt == VT_UINT) &&
7865 (rightvt == VT_EMPTY || rightvt == VT_I2 ||
7866 rightvt == VT_I4 || rightvt == VT_R4 ||
7867 rightvt == VT_R8 || rightvt == VT_CY ||
7868 rightvt == VT_DATE || rightvt == VT_BSTR ||
7869 rightvt == VT_BOOL || rightvt == VT_DECIMAL ||
7870 (rightvt >= VT_I1 && rightvt <= VT_UI4) ||
7871 (has_i8 && (rightvt == VT_I8 || rightvt == VT_UI8)) ||
7872 rightvt == VT_INT || rightvt == VT_UINT))
7873 resvt = VT_R8;
7874 else
7875 bFail = TRUE;
7876
7877 hres = pVarPow(&left, &right, &result);
7878
7879 /* Check expected HRESULT and if result variant type is correct */
7880 if (bFail)
7882 "VarPow: %s|0x%X, %s|0x%X: got vt %s hr 0x%lX\n",
7883 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i],
7884 wine_dbgstr_vt(V_VT(&result)), hres);
7885 else
7886 ok (hres == S_OK && resvt == V_VT(&result),
7887 "VarPow: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
7888 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i], wine_dbgstr_vt(resvt),
7889 S_OK, wine_dbgstr_vt(V_VT(&result)), hres);
7890 }
7891 }
7892 }
7893
7894 /* Check return values for valid variant type combinations */
7895 VARPOW(EMPTY,0,EMPTY,0,R8,1.0);
7896 VARPOW(EMPTY,0,NULL,0,NULL,0);
7897 VARPOW(EMPTY,0,I2,3,R8,0.0);
7898 VARPOW(EMPTY,0,I4,3,R8,0.0);
7899 VARPOW(EMPTY,0,R4,3.0f,R8,0.0);
7900 VARPOW(EMPTY,0,R8,3.0,R8,0.0);
7901 VARPOW(EMPTY,0,DATE,3,R8,0.0);
7902 VARPOW(EMPTY,0,BSTR,num3_str,R8,0.0);
7903 VARPOW(EMPTY,0,BOOL,VARIANT_FALSE,R8,1.0);
7904 VARPOW(EMPTY,0,I1,3,R8,0.0);
7905 VARPOW(EMPTY,0,UI1,3,R8,0.0);
7906 VARPOW(EMPTY,0,UI2,3,R8,0.0);
7907 VARPOW(EMPTY,0,UI4,3,R8,0.0);
7908 if (has_i8)
7909 {
7910 VARPOW(EMPTY,0,I8,3,R8,0.0);
7911 VARPOW(EMPTY,0,UI8,3,R8,0.0);
7912 }
7913 VARPOW(EMPTY,0,INT,3,R8,0.0);
7914 VARPOW(EMPTY,0,UINT,3,R8,0.0);
7915 VARPOW(NULL,0,EMPTY,0,NULL,0);
7916 VARPOW(NULL,0,NULL,0,NULL,0);
7917 VARPOW(NULL,0,I2,3,NULL,0);
7918 VARPOW(NULL,0,I4,3,NULL,0);
7919 VARPOW(NULL,0,R4,3.0f,NULL,0);
7920 VARPOW(NULL,0,R8,3.0,NULL,0);
7921 VARPOW(NULL,0,DATE,3,NULL,0);
7922 VARPOW(NULL,0,BSTR,num3_str,NULL,0);
7923 VARPOW(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
7924 VARPOW(NULL,0,I1,3,NULL,0);
7925 VARPOW(NULL,0,UI1,3,NULL,0);
7926 VARPOW(NULL,0,UI2,3,NULL,0);
7927 VARPOW(NULL,0,UI4,3,NULL,0);
7928 if (has_i8)
7929 {
7930 VARPOW(NULL,0,I8,3,NULL,0);
7931 VARPOW(NULL,0,UI8,3,NULL,0);
7932 }
7933 VARPOW(NULL,0,INT,3,NULL,0);
7934 VARPOW(NULL,0,UINT,3,NULL,0);
7935 VARPOW(I2,2,EMPTY,0,R8,1.0);
7936 VARPOW(I2,2,NULL,0,NULL,0);
7937 VARPOW(I2,2,I2,3,R8,8.0);
7938 VARPOW(I2,2,I4,3,R8,8.0);
7939 VARPOW(I2,2,R4,3.0f,R8,8.0);
7940 VARPOW(I2,2,R8,3.0,R8,8.0);
7941 VARPOW(I2,2,DATE,3,R8,8.0);
7942 VARPOW(I2,2,BSTR,num3_str,R8,8.0);
7943 VARPOW(I2,2,BOOL,VARIANT_FALSE,R8,1.0);
7944 VARPOW(I2,2,I1,3,R8,8.0);
7945 VARPOW(I2,2,UI1,3,R8,8.0);
7946 VARPOW(I2,2,UI2,3,R8,8.0);
7947 VARPOW(I2,2,UI4,3,R8,8.0);
7948 if (has_i8)
7949 {
7950 VARPOW(I2,2,I8,3,R8,8.0);
7951 VARPOW(I2,2,UI8,3,R8,8.0);
7952 }
7953 VARPOW(I2,2,INT,3,R8,8.0);
7954 VARPOW(I2,2,UINT,3,R8,8.0);
7955 VARPOW(I4,2,EMPTY,0,R8,1.0);
7956 VARPOW(I4,2,NULL,0,NULL,0);
7957 VARPOW(I4,2,I2,3,R8,8.0);
7958 VARPOW(I4,2,I4,3,R8,8.0);
7959 VARPOW(I4,2,R4,3.0f,R8,8.0);
7960 VARPOW(I4,2,R8,3.0,R8,8.0);
7961 VARPOW(I4,2,DATE,3,R8,8.0);
7962 VARPOW(I4,2,BSTR,num3_str,R8,8.0);
7963 VARPOW(I4,2,BOOL,VARIANT_FALSE,R8,1.0);
7964 VARPOW(I4,2,I1,3,R8,8.0);
7965 VARPOW(I4,2,UI1,3,R8,8.0);
7966 VARPOW(I4,2,UI2,3,R8,8.0);
7967 VARPOW(I4,2,UI4,3,R8,8.0);
7968 if (has_i8)
7969 {
7970 VARPOW(I4,2,I8,3,R8,8.0);
7971 VARPOW(I4,2,UI8,3,R8,8.0);
7972 }
7973 VARPOW(I4,2,INT,3,R8,8.0);
7974 VARPOW(I4,2,UINT,3,R8,8.0);
7975 VARPOW(R4,2,EMPTY,0,R8,1.0);
7976 VARPOW(R4,2,NULL,0,NULL,0);
7977 VARPOW(R4,2,I2,3,R8,8.0);
7978 VARPOW(R4,2,I4,3,R8,8.0);
7979 VARPOW(R4,2,R4,3.0f,R8,8.0);
7980 VARPOW(R4,2,R8,3.0,R8,8.0);
7981 VARPOW(R4,2,DATE,3,R8,8.0);
7982 VARPOW(R4,2,BSTR,num3_str,R8,8.0);
7983 VARPOW(R4,2,BOOL,VARIANT_FALSE,R8,1.0);
7984 VARPOW(R4,2,I1,3,R8,8.0);
7985 VARPOW(R4,2,UI1,3,R8,8.0);
7986 VARPOW(R4,2,UI2,3,R8,8.0);
7987 VARPOW(R4,2,UI4,3,R8,8.0);
7988 if (has_i8)
7989 {
7990 VARPOW(R4,2,I8,3,R8,8.0);
7991 VARPOW(R4,2,UI8,3,R8,8.0);
7992 }
7993 VARPOW(R4,2,INT,3,R8,8.0);
7994 VARPOW(R4,2,UINT,3,R8,8.0);
7995 VARPOW(R8,2,EMPTY,0,R8,1.0);
7996 VARPOW(R8,2,NULL,0,NULL,0);
7997 VARPOW(R8,2,I2,3,R8,8.0);
7998 VARPOW(R8,2,I4,3,R8,8.0);
7999 VARPOW(R8,2,R4,3.0f,R8,8.0);
8000 VARPOW(R8,2,R8,3.0,R8,8.0);
8001 VARPOW(R8,2,DATE,3,R8,8.0);
8002 VARPOW(R8,2,BSTR,num3_str,R8,8.0);
8003 VARPOW(R8,2,BOOL,VARIANT_FALSE,R8,1.0);
8004 VARPOW(R8,2,I1,3,R8,8.0);
8005 VARPOW(R8,2,UI1,3,R8,8.0);
8006 VARPOW(R8,2,UI2,3,R8,8.0);
8007 VARPOW(R8,2,UI4,3,R8,8.0);
8008 if (has_i8)
8009 {
8010 VARPOW(R8,2,I8,3,R8,8.0);
8011 VARPOW(R8,2,UI8,3,R8,8.0);
8012 }
8013 VARPOW(R8,2,INT,3,R8,8.0);
8014 VARPOW(R8,2,UINT,3,R8,8.0);
8015 VARPOW(DATE,2,EMPTY,0,R8,1.0);
8016 VARPOW(DATE,2,NULL,0,NULL,0);
8017 VARPOW(DATE,2,I2,3,R8,8.0);
8018 VARPOW(DATE,2,I4,3,R8,8.0);
8019 VARPOW(DATE,2,R4,3.0f,R8,8.0);
8020 VARPOW(DATE,2,R8,3.0,R8,8.0);
8021 VARPOW(DATE,2,DATE,3,R8,8.0);
8022 VARPOW(DATE,2,BSTR,num3_str,R8,8.0);
8023 VARPOW(DATE,2,BOOL,VARIANT_FALSE,R8,1.0);
8024 VARPOW(DATE,2,I1,3,R8,8.0);
8025 VARPOW(DATE,2,UI1,3,R8,8.0);
8026 VARPOW(DATE,2,UI2,3,R8,8.0);
8027 VARPOW(DATE,2,UI4,3,R8,8.0);
8028 if (has_i8)
8029 {
8030 VARPOW(DATE,2,I8,3,R8,8.0);
8031 VARPOW(DATE,2,UI8,3,R8,8.0);
8032 }
8033 VARPOW(DATE,2,INT,3,R8,8.0);
8034 VARPOW(DATE,2,UINT,3,R8,8.0);
8035 VARPOW(BSTR,num2_str,EMPTY,0,R8,1.0);
8036 VARPOW(BSTR,num2_str,NULL,0,NULL,0);
8037 VARPOW(BSTR,num2_str,I2,3,R8,8.0);
8038 VARPOW(BSTR,num2_str,I4,3,R8,8.0);
8039 VARPOW(BSTR,num2_str,R4,3.0f,R8,8.0);
8040 VARPOW(BSTR,num2_str,R8,3.0,R8,8.0);
8041 VARPOW(BSTR,num2_str,DATE,3,R8,8.0);
8042 VARPOW(BSTR,num2_str,BSTR,num3_str,R8,8.0);
8043 VARPOW(BSTR,num2_str,BOOL,VARIANT_FALSE,R8,1.0);
8044 VARPOW(BSTR,num2_str,I1,3,R8,8.0);
8045 VARPOW(BSTR,num2_str,UI1,3,R8,8.0);
8046 VARPOW(BSTR,num2_str,UI2,3,R8,8.0);
8047 VARPOW(BSTR,num2_str,UI4,3,R8,8.0);
8048 if (has_i8)
8049 {
8050 VARPOW(BSTR,num2_str,I8,3,R8,8.0);
8051 VARPOW(BSTR,num2_str,UI8,3,R8,8.0);
8052 }
8053 VARPOW(BSTR,num2_str,INT,3,R8,8.0);
8054 VARPOW(BSTR,num2_str,UINT,3,R8,8.0);
8055 VARPOW(BOOL,VARIANT_TRUE,EMPTY,0,R8,1.0);
8056 VARPOW(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
8057 VARPOW(BOOL,VARIANT_TRUE,I2,3,R8,-1.0);
8058 VARPOW(BOOL,VARIANT_TRUE,I4,3,R8,-1.0);
8059 VARPOW(BOOL,VARIANT_TRUE,R4,3.0f,R8,-1.0);
8060 VARPOW(BOOL,VARIANT_TRUE,R8,3.0,R8,-1.0);
8061 VARPOW(BOOL,VARIANT_TRUE,DATE,3,R8,-1.0);
8062 VARPOW(BOOL,VARIANT_TRUE,BSTR,num3_str,R8,-1.0);
8063 VARPOW(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,-1.0);
8064 VARPOW(BOOL,VARIANT_TRUE,I1,3,R8,-1.0);
8065 VARPOW(BOOL,VARIANT_TRUE,UI1,3,R8,-1.0);
8066 VARPOW(BOOL,VARIANT_TRUE,UI2,3,R8,-1.0);
8067 VARPOW(BOOL,VARIANT_TRUE,UI4,3,R8,-1.0);
8068 if (has_i8)
8069 {
8070 VARPOW(BOOL,VARIANT_TRUE,I8,3,R8,-1.0);
8071 VARPOW(BOOL,VARIANT_TRUE,UI8,3,R8,-1.0);
8072 }
8073 VARPOW(BOOL,VARIANT_TRUE,INT,3,R8,-1.0);
8074 VARPOW(BOOL,VARIANT_TRUE,UINT,3,R8,-1.0);
8075 VARPOW(I1,2,EMPTY,0,R8,1.0);
8076 VARPOW(I1,2,NULL,0,NULL,0);
8077 VARPOW(I1,2,I2,3,R8,8.0);
8078 VARPOW(I1,2,I4,3,R8,8.0);
8079 VARPOW(I1,2,R4,3.0f,R8,8.0);
8080 VARPOW(I1,2,R8,3.0,R8,8.0);
8081 VARPOW(I1,2,DATE,3,R8,8.0);
8082 VARPOW(I1,2,BSTR,num3_str,R8,8.0);
8083 VARPOW(I1,2,BOOL,VARIANT_FALSE,R8,1.0);
8084 VARPOW(I1,2,I1,3,R8,8.0);
8085 VARPOW(I1,2,UI1,3,R8,8.0);
8086 VARPOW(I1,2,UI2,3,R8,8.0);
8087 VARPOW(I1,2,UI4,3,R8,8.0);
8088 if (has_i8)
8089 {
8090 VARPOW(I1,2,I8,3,R8,8.0);
8091 VARPOW(I1,2,UI8,3,R8,8.0);
8092 }
8093 VARPOW(I1,2,INT,3,R8,8.0);
8094 VARPOW(I1,2,UINT,3,R8,8.0);
8095 VARPOW(UI1,2,EMPTY,0,R8,1.0);
8096 VARPOW(UI1,2,NULL,0,NULL,0);
8097 VARPOW(UI1,2,I2,3,R8,8.0);
8098 VARPOW(UI1,2,I4,3,R8,8.0);
8099 VARPOW(UI1,2,R4,3.0f,R8,8.0);
8100 VARPOW(UI1,2,R8,3.0,R8,8.0);
8101 VARPOW(UI1,2,DATE,3,R8,8.0);
8102 VARPOW(UI1,2,BSTR,num3_str,R8,8.0);
8103 VARPOW(UI1,2,BOOL,VARIANT_FALSE,R8,1.0);
8104 VARPOW(UI1,2,I1,3,R8,8.0);
8105 VARPOW(UI1,2,UI1,3,R8,8.0);
8106 VARPOW(UI1,2,UI2,3,R8,8.0);
8107 VARPOW(UI1,2,UI4,3,R8,8.0);
8108 if (has_i8)
8109 {
8110 VARPOW(UI1,2,I8,3,R8,8.0);
8111 VARPOW(UI1,2,UI8,3,R8,8.0);
8112 }
8113 VARPOW(UI1,2,INT,3,R8,8.0);
8114 VARPOW(UI1,2,UINT,3,R8,8.0);
8115 VARPOW(UI2,2,EMPTY,0,R8,1.0);
8116 VARPOW(UI2,2,NULL,0,NULL,0);
8117 VARPOW(UI2,2,I2,3,R8,8.0);
8118 VARPOW(UI2,2,I4,3,R8,8.0);
8119 VARPOW(UI2,2,R4,3.0f,R8,8.0);
8120 VARPOW(UI2,2,R8,3.0,R8,8.0);
8121 VARPOW(UI2,2,DATE,3,R8,8.0);
8122 VARPOW(UI2,2,BSTR,num3_str,R8,8.0);
8123 VARPOW(UI2,2,BOOL,VARIANT_FALSE,R8,1.0);
8124 VARPOW(UI2,2,I1,3,R8,8.0);
8125 VARPOW(UI2,2,UI1,3,R8,8.0);
8126 VARPOW(UI2,2,UI2,3,R8,8.0);
8127 VARPOW(UI2,2,UI4,3,R8,8.0);
8128 if (has_i8)
8129 {
8130 VARPOW(UI2,2,I8,3,R8,8.0);
8131 VARPOW(UI2,2,UI8,3,R8,8.0);
8132 }
8133 VARPOW(UI2,2,INT,3,R8,8.0);
8134 VARPOW(UI2,2,UINT,3,R8,8.0);
8135 VARPOW(UI4,2,EMPTY,0,R8,1.0);
8136 VARPOW(UI4,2,NULL,0,NULL,0);
8137 VARPOW(UI4,2,I2,3,R8,8.0);
8138 VARPOW(UI4,2,I4,3,R8,8.0);
8139 VARPOW(UI4,2,R4,3.0f,R8,8.0);
8140 VARPOW(UI4,2,R8,3.0,R8,8.0);
8141 VARPOW(UI4,2,DATE,3,R8,8.0);
8142 VARPOW(UI4,2,BSTR,num3_str,R8,8.0);
8143 VARPOW(UI4,2,BOOL,VARIANT_FALSE,R8,1.0);
8144 VARPOW(UI4,2,I1,3,R8,8.0);
8145 VARPOW(UI4,2,UI1,3,R8,8.0);
8146 VARPOW(UI4,2,UI2,3,R8,8.0);
8147 VARPOW(UI4,2,UI4,3,R8,8.0);
8148 if (has_i8)
8149 {
8150 VARPOW(UI4,2,I8,3,R8,8.0);
8151 VARPOW(UI4,2,UI8,3,R8,8.0);
8152 }
8153 VARPOW(UI4,2,INT,3,R8,8.0);
8154 VARPOW(UI4,2,UINT,3,R8,8.0);
8155 if (has_i8)
8156 {
8157 VARPOW(I8,2,EMPTY,0,R8,1.0);
8158 VARPOW(I8,2,NULL,0,NULL,0);
8159 VARPOW(I8,2,I2,3,R8,8.0);
8160 VARPOW(I8,2,I4,3,R8,8.0);
8161 VARPOW(I8,2,R4,3.0f,R8,8.0);
8162 VARPOW(I8,2,R8,3.0,R8,8.0);
8163 VARPOW(I8,2,DATE,3,R8,8.0);
8164 VARPOW(I8,2,BSTR,num3_str,R8,8.0);
8165 VARPOW(I8,2,BOOL,VARIANT_FALSE,R8,1.0);
8166 VARPOW(I8,2,I1,3,R8,8.0);
8167 VARPOW(I8,2,UI1,3,R8,8.0);
8168 VARPOW(I8,2,UI2,3,R8,8.0);
8169 VARPOW(I8,2,UI4,3,R8,8.0);
8170 VARPOW(I8,2,I8,3,R8,8.0);
8171 VARPOW(I8,2,UI8,3,R8,8.0);
8172 VARPOW(I8,2,INT,3,R8,8.0);
8173 VARPOW(I8,2,UINT,3,R8,8.0);
8174 VARPOW(UI8,2,EMPTY,0,R8,1.0);
8175 VARPOW(UI8,2,NULL,0,NULL,0);
8176 VARPOW(UI8,2,I2,3,R8,8.0);
8177 VARPOW(UI8,2,I4,3,R8,8.0);
8178 VARPOW(UI8,2,R4,3.0f,R8,8.0);
8179 VARPOW(UI8,2,R8,3.0,R8,8.0);
8180 VARPOW(UI8,2,DATE,3,R8,8.0);
8181 VARPOW(UI8,2,BSTR,num3_str,R8,8.0);
8182 VARPOW(UI8,2,I1,3,R8,8.0);
8183 VARPOW(UI8,2,UI1,3,R8,8.0);
8184 VARPOW(UI8,2,UI2,3,R8,8.0);
8185 VARPOW(UI8,2,UI4,3,R8,8.0);
8186 VARPOW(UI8,2,I8,3,R8,8.0);
8187 VARPOW(UI8,2,UI8,3,R8,8.0);
8188 VARPOW(UI8,2,INT,3,R8,8.0);
8189 VARPOW(UI8,2,UINT,3,R8,8.0);
8190 }
8191 VARPOW(INT,2,EMPTY,0,R8,1.0);
8192 VARPOW(INT,2,NULL,0,NULL,0);
8193 VARPOW(INT,2,I2,3,R8,8.0);
8194 VARPOW(INT,2,I4,3,R8,8.0);
8195 VARPOW(INT,2,R4,3.0f,R8,8.0);
8196 VARPOW(INT,2,R8,3.0,R8,8.0);
8197 VARPOW(INT,2,DATE,3,R8,8.0);
8198 VARPOW(INT,2,BSTR,num3_str,R8,8.0);
8199 VARPOW(INT,2,BOOL,VARIANT_FALSE,R8,1.0);
8200 VARPOW(INT,2,I1,3,R8,8.0);
8201 VARPOW(INT,2,UI1,3,R8,8.0);
8202 VARPOW(INT,2,UI2,3,R8,8.0);
8203 VARPOW(INT,2,UI4,3,R8,8.0);
8204 if (has_i8)
8205 {
8206 VARPOW(INT,2,I8,3,R8,8.0);
8207 VARPOW(INT,2,UI8,3,R8,8.0);
8208 }
8209 VARPOW(INT,2,INT,3,R8,8.0);
8210 VARPOW(INT,2,UINT,3,R8,8.0);
8211 VARPOW(UINT,2,EMPTY,0,R8,1.0);
8212 VARPOW(UINT,2,NULL,0,NULL,0);
8213 VARPOW(UINT,2,I2,3,R8,8.0);
8214 VARPOW(UINT,2,I4,3,R8,8.0);
8215 VARPOW(UINT,2,R4,3.0f,R8,8.0);
8216 VARPOW(UINT,2,R8,3.0,R8,8.0);
8217 VARPOW(UINT,2,DATE,3,R8,8.0);
8218 VARPOW(UINT,2,BSTR,num3_str,R8,8.0);
8219 VARPOW(UINT,2,BOOL,VARIANT_FALSE,R8,1.0);
8220 VARPOW(UINT,2,I1,3,R8,8.0);
8221 VARPOW(UINT,2,UI1,3,R8,8.0);
8222 VARPOW(UINT,2,UI2,3,R8,8.0);
8223 VARPOW(UINT,2,UI4,3,R8,8.0);
8224 if (has_i8)
8225 {
8226 VARPOW(UINT,2,I8,3,R8,8.0);
8227 VARPOW(UINT,2,UI8,3,R8,8.0);
8228 }
8229 VARPOW(UINT,2,INT,3,R8,8.0);
8230 VARPOW(UINT,2,UINT,3,R8,8.0);
8231
8232 /* Manually test some VT_CY, VT_DECIMAL variants */
8233 V_VT(&cy) = VT_CY;
8234 hres = VarCyFromI4(2, &V_CY(&cy));
8235 ok(hres == S_OK, "VarCyFromI4 failed!\n");
8236 V_VT(&dec) = VT_DECIMAL;
8237 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
8238 ok(hres == S_OK, "VarDecFromR4 failed!\n");
8239 memset(&left, 0, sizeof(left));
8240 memset(&right, 0, sizeof(right));
8241 V_VT(&left) = VT_I4;
8242 V_I4(&left) = 100;
8243 V_VT(&right) = VT_I8;
8244 V_UI1(&right) = 2;
8245
8246 hres = pVarPow(&cy, &cy, &result);
8247 ok(hres == S_OK && V_VT(&result) == VT_R8,
8248 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8249 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8250 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
8251 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
8252
8253 hres = pVarPow(&cy, &right, &result);
8254 if (hres == S_OK)
8255 {
8256 ok(V_VT(&result) == VT_R8,
8257 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8258 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8259 ok(EQ_DOUBLE(V_R8(&result), 4.0),
8260 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 4.0);
8261 }
8262 else
8263 {
8265 "VARPOW: expected coerced hres 0x%lX type VT_EMPTY, got hres 0x%lX type %s!\n",
8266 DISP_E_BADVARTYPE, hres, wine_dbgstr_vt(V_VT(&result)));
8267 }
8268
8269 hres = pVarPow(&left, &cy, &result);
8270 ok(hres == S_OK && V_VT(&result) == VT_R8,
8271 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8272 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8273 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 10000.0),
8274 "VARPOW: CY value %f, expected %f\n", V_R8(&result), 10000.0);
8275
8276 hres = pVarPow(&left, &dec, &result);
8277 ok(hres == S_OK && V_VT(&result) == VT_R8,
8278 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8279 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8280 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result),10000.0),
8281 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 10000.0);
8282
8283 hres = pVarPow(&dec, &dec, &result);
8284 ok(hres == S_OK && V_VT(&result) == VT_R8,
8285 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8286 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8287 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 4.0),
8288 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
8289
8290 hres = pVarPow(&dec, &right, &result);
8291 if (hres == S_OK)
8292 {
8293 ok(V_VT(&result) == VT_R8,
8294 "VARPOW: expected coerced hres 0x%lX type VT_R8, got hres 0x%lX type %s!\n",
8295 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
8296 ok(EQ_DOUBLE(V_R8(&result), 4.0),
8297 "VARPOW: DECIMAL value %f, expected %f\n", V_R8(&result), 4.0);
8298 }
8299 else
8300 {
8302 "VARPOW: expected coerced hres 0x%lX type VT_EMPTY, got hres 0x%lX type %s!\n",
8303 DISP_E_BADVARTYPE, hres, wine_dbgstr_vt(V_VT(&result)));
8304 }
8305
8306 SysFreeString(num2_str);
8307 SysFreeString(num3_str);
8308}
8309
8310static HRESULT (WINAPI *pVarDiv)(LPVARIANT,LPVARIANT,LPVARIANT);
8311
8312#define VARDIV(vt1,val1,vt2,val2,rvt,rval) \
8313 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
8314 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
8315 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
8316 test_var_call2( __LINE__, pVarDiv, &left, &right, &exp )
8317
8318/* Skip any type that is not defined or produces an error for every case */
8319#define SKIPTESTDIV(a) \
8320 if (a == VT_ERROR || a == VT_VARIANT || \
8321 a == VT_DISPATCH || a == VT_UNKNOWN || \
8322 a == VT_RECORD || a > VT_UINT || \
8323 a == VT_I1 || a == VT_UI8 || \
8324 a == VT_INT || a == VT_UINT || \
8325 a == VT_UI2 || a == VT_UI4 || \
8326 a == 15 /*not defined*/) \
8327 continue
8328
8329static void test_VarDiv(void)
8330{
8331 static const WCHAR str1[] = { '1','\0' };
8332 static const WCHAR str2[] = { '2','\0' };
8334 BSTR num1_str, num2_str;
8335 VARTYPE i;
8336 HRESULT hres;
8337 double r;
8338
8340
8341 num1_str = SysAllocString(str1);
8342 num2_str = SysAllocString(str2);
8343
8344 /* Test all possible flag/vt combinations & the resulting vt type */
8345 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
8346 {
8347 VARTYPE leftvt, rightvt, resvt;
8348
8349 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
8350 {
8351 SKIPTESTDIV(leftvt);
8352
8353 /* Check if we need/have support for I8 */
8354 if (leftvt == VT_I8 && !has_i8)
8355 continue;
8356
8357 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
8358 {
8359 BOOL bFail = FALSE;
8360 SKIPTESTDIV(rightvt);
8361
8362 /* Check if we need/have support for I8 */
8363 if (rightvt == VT_I8 && !has_i8)
8364 continue;
8365
8366 /* Native crashes with VT_BYREF */
8367 if (ExtraFlags[i] == VT_BYREF)
8368 continue;
8369
8370 memset(&left, 0, sizeof(left));
8371 memset(&right, 0, sizeof(right));
8372 V_VT(&left) = leftvt | ExtraFlags[i];
8373 V_VT(&right) = rightvt | ExtraFlags[i];
8374 V_VT(&result) = VT_EMPTY;
8375 resvt = VT_EMPTY;
8376
8377 if (leftvt == VT_BSTR)
8378 V_BSTR(&left) = num2_str;
8379 else if (leftvt == VT_DECIMAL)
8380 {
8381 VarDecFromR8(2.0, &V_DECIMAL(&left));
8382 V_VT(&left) = leftvt | ExtraFlags[i];
8383 }
8384
8385 /* Division by 0 is undefined */
8386 switch(rightvt)
8387 {
8388 case VT_BSTR:
8389 V_BSTR(&right) = num2_str;
8390 break;
8391 case VT_DECIMAL:
8392 VarDecFromR8(2.0, &V_DECIMAL(&right));
8393 V_VT(&right) = rightvt | ExtraFlags[i];
8394 break;
8395 case VT_BOOL:
8396 V_BOOL(&right) = VARIANT_TRUE;
8397 break;
8398 case VT_I2: V_I2(&right) = 2; break;
8399 case VT_I4: V_I4(&right) = 2; break;
8400 case VT_R4: V_R4(&right) = 2.0f; break;
8401 case VT_R8: V_R8(&right) = 2.0; break;
8402 case VT_CY: V_CY(&right).int64 = 2; break;
8403 case VT_DATE: V_DATE(&right) = 2; break;
8404 case VT_UI1: V_UI1(&right) = 2; break;
8405 case VT_I8: V_I8(&right) = 2; break;
8406 default: break;
8407 }
8408
8409 /* Determine return type */
8410 if (rightvt != VT_EMPTY)
8411 {
8412 if (leftvt == VT_NULL || rightvt == VT_NULL)
8413 resvt = VT_NULL;
8414 else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL)
8415 resvt = VT_DECIMAL;
8416 else if (leftvt == VT_I8 || rightvt == VT_I8 ||
8417 leftvt == VT_CY || rightvt == VT_CY ||
8418 leftvt == VT_DATE || rightvt == VT_DATE ||
8419 leftvt == VT_I4 || rightvt == VT_I4 ||
8420 leftvt == VT_BSTR || rightvt == VT_BSTR ||
8421 leftvt == VT_I2 || rightvt == VT_I2 ||
8422 leftvt == VT_BOOL || rightvt == VT_BOOL ||
8423 leftvt == VT_R8 || rightvt == VT_R8 ||
8424 leftvt == VT_UI1 || rightvt == VT_UI1)
8425 {
8426 if ((leftvt == VT_UI1 && rightvt == VT_R4) ||
8427 (leftvt == VT_R4 && rightvt == VT_UI1))
8428 resvt = VT_R4;
8429 else if ((leftvt == VT_R4 && (rightvt == VT_BOOL ||
8430 rightvt == VT_I2)) || (rightvt == VT_R4 &&
8431 (leftvt == VT_BOOL || leftvt == VT_I2)))
8432 resvt = VT_R4;
8433 else
8434 resvt = VT_R8;
8435 }
8436 else if (leftvt == VT_R4 || rightvt == VT_R4)
8437 resvt = VT_R4;
8438 }
8439 else if (leftvt == VT_NULL)
8440 resvt = VT_NULL;
8441 else
8442 bFail = TRUE;
8443
8444 /* Native VarDiv always returns an error when using extra flags */
8445 if (ExtraFlags[i] != 0)
8446 bFail = TRUE;
8447
8448 hres = pVarDiv(&left, &right, &result);
8449
8450 /* Check expected HRESULT and if result variant type is correct */
8451 if (bFail)
8454 "VarDiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%lX\n",
8455 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i],
8456 wine_dbgstr_vt(V_VT(&result)), hres);
8457 else
8458 ok (hres == S_OK && resvt == V_VT(&result),
8459 "VarDiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
8460 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i], wine_dbgstr_vt(resvt),
8461 S_OK, wine_dbgstr_vt(V_VT(&result)), hres);
8462 }
8463 }
8464 }
8465
8466 /* Test return values for all the good cases */
8467 VARDIV(EMPTY,0,NULL,0,NULL,0);
8468 VARDIV(EMPTY,0,I2,2,R8,0.0);
8469 VARDIV(EMPTY,0,I4,2,R8,0.0);
8470 VARDIV(EMPTY,0,R4,2.0f,R4,0.0f);
8471 VARDIV(EMPTY,0,R8,2.0,R8,0.0);
8472 VARDIV(EMPTY,0,DATE,2.0,R8,0.0);
8473 VARDIV(EMPTY,0,BSTR,num2_str,R8,0.0);
8474 VARDIV(EMPTY,0,BOOL,VARIANT_TRUE,R8,0.0);
8475 VARDIV(EMPTY,0,UI1,2,R8,0.0);
8476 if (has_i8)
8477 {
8478 VARDIV(EMPTY,0,I8,2,R8,0.0);
8479 }
8480 VARDIV(NULL,0,EMPTY,0,NULL,0);
8481 VARDIV(NULL,0,NULL,0,NULL,0);
8482 VARDIV(NULL,0,I2,2,NULL,0);
8483 VARDIV(NULL,0,I4,2,NULL,0);
8484 VARDIV(NULL,0,R4,2.0f,NULL,0);
8485 VARDIV(NULL,0,R8,2.0,NULL,0);
8486 VARDIV(NULL,0,DATE,2,NULL,0);
8487 VARDIV(NULL,0,BSTR,num2_str,NULL,0);
8488 VARDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
8489 VARDIV(NULL,0,UI1,2,NULL,0);
8490 if (has_i8)
8491 {
8492 VARDIV(NULL,0,I8,2,NULL,0);
8493 }
8494 VARDIV(I2,2,NULL,0,NULL,0);
8495 VARDIV(I2,1,I2,2,R8,0.5);
8496 VARDIV(I2,1,I4,2,R8,0.5);
8497 VARDIV(I2,1,R4,2,R4,0.5f);
8498 VARDIV(I2,1,R8,2.0,R8,0.5);
8499 VARDIV(I2,1,DATE,2,R8,0.5);
8500 VARDIV(I2,1,BOOL,VARIANT_TRUE,R8,-1.0);
8501 VARDIV(I2,1,UI1,2,R8,0.5);
8502 if (has_i8)
8503 {
8504 VARDIV(I2,1,I8,2,R8,0.5);
8505 }
8506 VARDIV(I4,1,NULL,0,NULL,0);
8507 VARDIV(I4,1,I2,2,R8,0.5);
8508 VARDIV(I4,1,I4,2,R8,0.5);
8509 VARDIV(I4,1,R4,2.0f,R8,0.5);
8510 VARDIV(I4,1,R8,2.0,R8,0.5);
8511 VARDIV(I4,1,DATE,2,R8,0.5);
8512 VARDIV(I4,1,BSTR,num2_str,R8,0.5);
8513 VARDIV(I4,1,BOOL,VARIANT_TRUE,R8,-1.0);
8514 VARDIV(I4,1,UI1,2,R8,0.5);
8515 if (has_i8)
8516 {
8517 VARDIV(I4,1,I8,2,R8,0.5);
8518 }
8519 VARDIV(R4,1.0f,NULL,0,NULL,0);
8520 VARDIV(R4,1.0f,I2,2,R4,0.5f);
8521 VARDIV(R4,1.0f,I4,2,R8,0.5);
8522 VARDIV(R4,1.0f,R4,2.0f,R4,0.5f);
8523 VARDIV(R4,1.0f,R8,2.0,R8,0.5);
8524 VARDIV(R4,1.0f,DATE,2,R8,0.5);
8525 VARDIV(R4,1.0f,BSTR,num2_str,R8,0.5);
8526 VARDIV(R4,1.0f,BOOL,VARIANT_TRUE,R4,-1);
8527 VARDIV(R4,1.0f,UI1,2,R4,0.5f);
8528 if (has_i8)
8529 {
8530 VARDIV(R4,1.0f,I8,2,R8,0.5);
8531 }
8532 VARDIV(R8,1.0,NULL,0,NULL,0);
8533 VARDIV(R8,1.0,I2,2,R8,0.5);
8534 VARDIV(R8,1.0,I4,2,R8,0.5);
8535 VARDIV(R8,1.0,R4,2.0f,R8,0.5);
8536 VARDIV(R8,1.0,R8,2.0,R8,0.5);
8537 VARDIV(R8,1.0,DATE,2,R8,0.5);
8538 VARDIV(R8,1.0,BSTR,num2_str,R8,0.5);
8539 VARDIV(R8,1.0,BOOL,VARIANT_TRUE,R8,-1.0);
8540 VARDIV(R8,1.0,UI1,2,R8,0.5);
8541 if (has_i8)
8542 {
8543 VARDIV(R8,1.0,I8,2,R8,0.5);
8544 }
8545 VARDIV(DATE,1,NULL,0,NULL,0);
8546 VARDIV(DATE,1,I2,2,R8,0.5);
8547 VARDIV(DATE,1,I4,2,R8,0.5);
8548 VARDIV(DATE,1,R4,2.0f,R8,0.5);
8549 VARDIV(DATE,1,R8,2.0,R8,0.5);
8550 VARDIV(DATE,1,DATE,2,R8,0.5);
8551 VARDIV(DATE,1,BSTR,num2_str,R8,0.5);
8552 VARDIV(DATE,1,BOOL,VARIANT_TRUE,R8,-1.0);
8553 VARDIV(DATE,1,UI1,2,R8,0.5);
8554 if (has_i8)
8555 {
8556 VARDIV(DATE,1,I8,2,R8,0.5);
8557 }
8558 VARDIV(BSTR,num1_str,NULL,0,NULL,0);
8559 VARDIV(BSTR,num1_str,I2,2,R8,0.5);
8560 VARDIV(BSTR,num1_str,I4,2,R8,0.5);
8561 VARDIV(BSTR,num1_str,R4,2.0f,R8,0.5);
8562 VARDIV(BSTR,num1_str,R8,2.0,R8,0.5);
8563 VARDIV(BSTR,num1_str,DATE,2,R8,0.5);
8564 VARDIV(BSTR,num1_str,BSTR,num2_str,R8,0.5);
8565 VARDIV(BSTR,num1_str,BOOL,VARIANT_TRUE,R8,-1);
8566 VARDIV(BSTR,num1_str,UI1,2,R8,0.5);
8567 if (has_i8)
8568 {
8569 VARDIV(BSTR,num1_str,I8,2,R8,0.5);
8570 }
8571 VARDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
8572 VARDIV(BOOL,VARIANT_TRUE,I2,1,R8,-1.0);
8573 VARDIV(BOOL,VARIANT_FALSE,I2,1,R8,0.0);
8574 VARDIV(BOOL,VARIANT_TRUE,I4,1,R8,-1.0);
8575 VARDIV(BOOL,VARIANT_FALSE,I4,1,R8,0.0);
8576 VARDIV(BOOL,VARIANT_TRUE,R4,1,R4,-1.0f);
8577 VARDIV(BOOL,VARIANT_FALSE,R4,1,R4,0.0f);
8578 VARDIV(BOOL,VARIANT_TRUE,R8,1.0,R8,-1.0);
8579 VARDIV(BOOL,VARIANT_FALSE,R8,1.0,R8,0.0);
8580 VARDIV(BOOL,VARIANT_FALSE,DATE,2,R8,0.0);
8581 VARDIV(BOOL,VARIANT_FALSE,BSTR,num2_str,R8,0.0);
8582 VARDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,R8,1.0);
8583 VARDIV(BOOL,VARIANT_FALSE,BOOL,VARIANT_TRUE,R8,0.0);
8584 VARDIV(BOOL,VARIANT_TRUE,UI1,1,R8,-1.0);
8585 if (has_i8)
8586 {
8587 VARDIV(BOOL,VARIANT_TRUE,I8,1,R8,-1.0);
8588 }
8589 VARDIV(UI1,1,NULL,0,NULL,0);
8590 VARDIV(UI1,1,I2,2,R8,0.5);
8591 VARDIV(UI1,1,I4,2,R8,0.5);
8592 VARDIV(UI1,1,R4,2.0f,R4,0.5f);
8593 VARDIV(UI1,1,R8,2.0,R8,0.5);
8594 VARDIV(UI1,1,DATE,2,R8,0.5);
8595 VARDIV(UI1,1,BSTR,num2_str,R8,0.5);
8596 VARDIV(UI1,1,BOOL,VARIANT_TRUE,R8,-1);
8597 VARDIV(UI1,1,UI1,2,R8,0.5);
8598 if (has_i8)
8599 {
8600 VARDIV(UI1,1,I8,2,R8,0.5);
8601 VARDIV(I8,1,NULL,0,NULL,0);
8602 VARDIV(I8,1,I2,2,R8,0.5);
8603 VARDIV(I8,1,I4,2,R8,0.5);
8604 VARDIV(I8,1,R4,2.0f,R8,0.5);
8605 VARDIV(I8,1,R8,2.0,R8,0.5);
8606 VARDIV(I8,1,DATE,2,R8,0.5);
8607 VARDIV(I8,1,BSTR,num2_str,R8,0.5);
8608 VARDIV(I8,1,BOOL,VARIANT_TRUE,R8,-1);
8609 VARDIV(I8,1,UI1,2,R8,0.5);
8610 VARDIV(I8,1,I8,2,R8,0.5);
8611 }
8612
8613 /* Manually test some VT_CY, VT_DECIMAL variants */
8614 V_VT(&cy) = VT_CY;
8615 hres = VarCyFromI4(10000, &V_CY(&cy));
8616 ok(hres == S_OK, "VarCyFromI4 failed!\n");
8617 V_VT(&dec) = VT_DECIMAL;
8618 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
8619 ok(hres == S_OK, "VarDecFromR4 failed!\n");
8620 memset(&left, 0, sizeof(left));
8621 memset(&right, 0, sizeof(right));
8622 V_VT(&left) = VT_I4;
8623 V_I4(&left) = 100;
8624 V_VT(&right) = VT_UI1;
8625 V_UI1(&right) = 2;
8626
8627 hres = pVarDiv(&cy, &cy, &result);
8628 ok(hres == S_OK && V_VT(&result) == VT_R8,
8629 "VARDIV: expected coerced type VT_R8, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8630 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 1.0),
8631 "VARDIV: CY value %f, expected %f\n", V_R8(&result), 1.0);
8632
8633 hres = pVarDiv(&cy, &right, &result);
8634 ok(hres == S_OK && V_VT(&result) == VT_R8,
8635 "VARDIV: expected coerced type VT_R8, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8636 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 5000.0),
8637 "VARDIV: CY value %f, expected %f\n", V_R8(&result), 5000.0);
8638
8639 hres = pVarDiv(&left, &cy, &result);
8640 ok(hres == S_OK && V_VT(&result) == VT_R8,
8641 "VARDIV: expected coerced type VT_R8, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8642 ok(hres == S_OK && EQ_DOUBLE(V_R8(&result), 0.01),
8643 "VARDIV: CY value %f, expected %f\n", V_R8(&result), 0.01);
8644
8645 hres = pVarDiv(&left, &dec, &result);
8646 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
8647 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8649 ok(hres == S_OK && EQ_DOUBLE(r, 50.0), "VARDIV: DECIMAL value %f, expected %f\n", r, 50.0);
8650
8651 hres = pVarDiv(&dec, &dec, &result);
8652 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
8653 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8655 ok(hres == S_OK && EQ_DOUBLE(r, 1.0), "VARDIV: DECIMAL value %f, expected %f\n", r, 1.0);
8656
8657 hres = pVarDiv(&dec, &right, &result);
8658 ok(hres == S_OK && V_VT(&result) == VT_DECIMAL,
8659 "VARDIV: expected coerced type VT_DECIMAL, got %s!\n", wine_dbgstr_vt(V_VT(&result)));
8661 ok(hres == S_OK && EQ_DOUBLE(r, 1.0), "VARDIV: DECIMAL value %f, expected %f\n", r, 1.0);
8662
8663 /* Check for division by zero and overflow */
8664 V_VT(&left) = VT_R8;
8665 V_I4(&left) = 1;
8666 V_VT(&right) = VT_R8;
8667 V_I4(&right) = 0;
8668 hres = pVarDiv(&left, &right, &result);
8670 "VARDIV: Division by (1.0/0.0) should result in DISP_E_DIVBYZERO but got 0x%lX\n", hres);
8671
8672 V_VT(&left) = VT_R8;
8673 V_I4(&left) = 0;
8674 V_VT(&right) = VT_R8;
8675 V_I4(&right) = 0;
8676 hres = pVarDiv(&left, &right, &result);
8678 "VARDIV: Division by (0.0/0.0) should result in DISP_E_OVERFLOW but got 0x%lX\n", hres);
8679
8680 SysFreeString(num1_str);
8681 SysFreeString(num2_str);
8682}
8683
8684static HRESULT (WINAPI *pVarIdiv)(LPVARIANT,LPVARIANT,LPVARIANT);
8685
8686#define VARIDIV(vt1,val1,vt2,val2,rvt,rval) \
8687 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
8688 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
8689 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
8690 test_var_call2( __LINE__, pVarIdiv, &left, &right, &exp )
8691
8692/* Skip any type that is not defined or produces an error for every case */
8693#define SKIPTESTIDIV(a) \
8694 if (a == VT_ERROR || a == VT_VARIANT || \
8695 a == VT_DISPATCH || a == VT_UNKNOWN || \
8696 a == VT_RECORD || a > VT_UINT || \
8697 a == 15 /*not defined*/) \
8698 continue
8699
8700static void test_VarIdiv(void)
8701{
8703 BSTR num1_str, num2_str;
8704 VARTYPE i;
8705 HRESULT hres;
8706
8708
8709 num1_str = SysAllocString(L"1");
8710 num2_str = SysAllocString(L"2");
8711
8712 /* Test all possible flag/vt combinations & the resulting vt type */
8713 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
8714 {
8715 VARTYPE leftvt, rightvt, resvt;
8716
8717 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
8718 {
8719 SKIPTESTIDIV(leftvt);
8720
8721 /* Check if we need/have support for I8 and/or UI8 */
8722 if ((leftvt == VT_I8 || leftvt == VT_UI8) && !has_i8)
8723 continue;
8724
8725 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
8726 {
8727 BOOL bFail = FALSE;
8728 SKIPTESTIDIV(rightvt);
8729
8730 /* Native crashes with extra flag VT_BYREF */
8731 if (ExtraFlags[i] == VT_BYREF)
8732 continue;
8733
8734 /* Check if we need/have support for I8 and/or UI8 */
8735 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !has_i8)
8736 continue;
8737
8738 memset(&left, 0, sizeof(left));
8739 memset(&right, 0, sizeof(right));
8740 V_VT(&left) = leftvt | ExtraFlags[i];
8741 V_VT(&right) = rightvt | ExtraFlags[i];
8742 V_VT(&result) = VT_EMPTY;
8743 resvt = VT_EMPTY;
8744
8745 if (leftvt == VT_BSTR)
8746 V_BSTR(&left) = num2_str;
8747 else if (leftvt == VT_DECIMAL)
8748 {
8749 VarDecFromR8(2.0, &V_DECIMAL(&left));
8750 V_VT(&left) = leftvt | ExtraFlags[i];
8751 }
8752
8753 /* Division by 0 is undefined */
8754 switch(rightvt)
8755 {
8756 case VT_BSTR:
8757 V_BSTR(&right) = num2_str;
8758 break;
8759 case VT_DECIMAL:
8760 VarDecFromR8(2.0, &V_DECIMAL(&right));
8761 V_VT(&right) = rightvt | ExtraFlags[i];
8762 break;
8763 case VT_BOOL:
8764 V_BOOL(&right) = VARIANT_TRUE;
8765 break;
8766 case VT_CY:
8767 VarCyFromI4(10000, &V_CY(&right));
8768 V_VT(&right) = rightvt | ExtraFlags[i];
8769 break;
8770 case VT_I2: V_I2(&right) = 2; break;
8771 case VT_I4: V_I4(&right) = 2; break;
8772 case VT_R4: V_R4(&right) = 2.0f; break;
8773 case VT_R8: V_R8(&right) = 2.0; break;
8774 case VT_DATE: V_DATE(&right) = 2; break;
8775 case VT_I1: V_I1(&right) = 2; break;
8776 case VT_UI1: V_UI1(&right) = 2; break;
8777 case VT_UI2: V_UI2(&right) = 2; break;
8778 case VT_UI4: V_UI4(&right) = 2; break;
8779 case VT_I8: V_I8(&right) = 2; break;
8780 case VT_UI8: V_UI8(&right) = 2; break;
8781 case VT_INT: V_INT(&right) = 2; break;
8782 case VT_UINT: V_UINT(&right) = 2; break;
8783 default: break;
8784 }
8785
8786 /* Native VarIdiv always returns an error when using extra
8787 * flags or if the variant combination is I8 and INT.
8788 */
8789 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
8790 (leftvt == VT_INT && rightvt == VT_I8) ||
8791 (rightvt == VT_EMPTY && leftvt != VT_NULL) ||
8792 ExtraFlags[i] != 0)
8793 bFail = TRUE;
8794
8795 /* Determine variant type */
8796 else if (leftvt == VT_NULL || rightvt == VT_NULL)
8797 resvt = VT_NULL;
8798 else if (leftvt == VT_I8 || rightvt == VT_I8)
8799 resvt = VT_I8;
8800 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
8801 leftvt == VT_INT || rightvt == VT_INT ||
8802 leftvt == VT_UINT || rightvt == VT_UINT ||
8803 leftvt == VT_UI8 || rightvt == VT_UI8 ||
8804 leftvt == VT_UI4 || rightvt == VT_UI4 ||
8805 leftvt == VT_UI2 || rightvt == VT_UI2 ||
8806 leftvt == VT_I1 || rightvt == VT_I1 ||
8807 leftvt == VT_BSTR || rightvt == VT_BSTR ||
8808 leftvt == VT_DATE || rightvt == VT_DATE ||
8809 leftvt == VT_CY || rightvt == VT_CY ||
8810 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
8811 leftvt == VT_R8 || rightvt == VT_R8 ||
8812 leftvt == VT_R4 || rightvt == VT_R4)
8813 resvt = VT_I4;
8814 else if (leftvt == VT_I2 || rightvt == VT_I2 ||
8815 leftvt == VT_BOOL || rightvt == VT_BOOL ||
8816 leftvt == VT_EMPTY)
8817 resvt = VT_I2;
8818 else if (leftvt == VT_UI1 || rightvt == VT_UI1)
8819 resvt = VT_UI1;
8820 else
8821 bFail = TRUE;
8822
8823 hres = pVarIdiv(&left, &right, &result);
8824
8825 /* Check expected HRESULT and if result variant type is correct */
8826 if (bFail)
8829 "VarIdiv: %s|0x%X, %s|0x%X: got vt %s hr 0x%lX\n",
8830 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i],
8831 wine_dbgstr_vt(V_VT(&result)), hres);
8832 else
8833 ok (hres == S_OK && resvt == V_VT(&result),
8834 "VarIdiv: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
8835 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i], wine_dbgstr_vt(resvt),
8836 S_OK, wine_dbgstr_vt(V_VT(&result)), hres);
8837 }
8838 }
8839 }
8840
8841 /* Test return values for all the good cases */
8842 VARIDIV(EMPTY,0,NULL,0,NULL,0);
8843 VARIDIV(EMPTY,0,I2,1,I2,0);
8844 VARIDIV(EMPTY,0,I4,1,I4,0);
8845 VARIDIV(EMPTY,0,R4,1.0f,I4,0);
8846 VARIDIV(EMPTY,0,R8,1.0,I4,0);
8847 VARIDIV(EMPTY,0,DATE,1.0,I4,0);
8848 VARIDIV(EMPTY,0,BSTR,num1_str,I4,0);
8849 VARIDIV(EMPTY,0,BOOL,VARIANT_TRUE,I2,0);
8850 VARIDIV(EMPTY,0,I1,1,I4,0);
8851 VARIDIV(EMPTY,0,UI1,1,I2,0);
8852 VARIDIV(EMPTY,0,UI2,1,I4,0);
8853 VARIDIV(EMPTY,0,UI4,1,I4,0);
8854 if (has_i8)
8855 {
8856 VARIDIV(EMPTY,0,I8,1,I8,0);
8857 VARIDIV(EMPTY,0,UI8,1,I4,0);
8858 }
8859 VARIDIV(EMPTY,0,INT,1,I4,0);
8860 VARIDIV(EMPTY,0,UINT,1,I4,0);
8861 VARIDIV(NULL,0,EMPTY,0,NULL,0);
8862 VARIDIV(NULL,0,NULL,0,NULL,0);
8863 VARIDIV(NULL,0,I2,1,NULL,0);
8864 VARIDIV(NULL,0,I4,1,NULL,0);
8865 VARIDIV(NULL,0,R4,1,NULL,0);
8866 VARIDIV(NULL,0,R8,1,NULL,0);
8867 VARIDIV(NULL,0,DATE,1,NULL,0);
8868 VARIDIV(NULL,0,BSTR,num1_str,NULL,0);
8869 VARIDIV(NULL,0,BOOL,VARIANT_TRUE,NULL,0);
8870 VARIDIV(NULL,0,I1,1,NULL,0);
8871 VARIDIV(NULL,0,UI1,1,NULL,0);
8872 VARIDIV(NULL,0,UI2,1,NULL,0);
8873 VARIDIV(NULL,0,UI4,1,NULL,0);
8874 if (has_i8)
8875 {
8876 VARIDIV(NULL,0,I8,1,NULL,0);
8877 VARIDIV(NULL,0,UI8,1,NULL,0);
8878 }
8879 VARIDIV(NULL,0,INT,1,NULL,0);
8880 VARIDIV(NULL,0,UINT,1,NULL,0);
8881 VARIDIV(I2,2,NULL,0,NULL,0);
8882 VARIDIV(I2,2,I2,1,I2,2);
8883 VARIDIV(I2,2,I4,1,I4,2);
8884 VARIDIV(I2,2,R4,1,I4,2);
8885 VARIDIV(I2,2,R8,1,I4,2);
8886 VARIDIV(I2,2,DATE,1,I4,2);
8887 VARIDIV(I2,2,BSTR,num1_str,I4,2);
8888 VARIDIV(I2,2,BOOL,VARIANT_TRUE,I2,-2);
8889 VARIDIV(I2,2,I1,1,I4,2);
8890 VARIDIV(I2,2,UI1,1,I2,2);
8891 VARIDIV(I2,2,UI2,1,I4,2);
8892 VARIDIV(I2,2,UI4,1,I4,2);
8893 if (has_i8)
8894 {
8895 VARIDIV(I2,2,I8,1,I8,2);
8896 VARIDIV(I2,2,UI8,1,I4,2);
8897 }
8898 VARIDIV(I2,2,INT,1,I4,2);
8899 VARIDIV(I2,2,UINT,1,I4,2);
8900 VARIDIV(I4,2,NULL,0,NULL,0);
8901 VARIDIV(I4,2,I2,1,I4,2);
8902 VARIDIV(I4,2,I4,1,I4,2);
8903 VARIDIV(I4,2,R4,1,I4,2);
8904 VARIDIV(I4,2,R8,1,I4,2);
8905 VARIDIV(I4,2,DATE,1,I4,2);
8906 VARIDIV(I4,2,BSTR,num1_str,I4,2);
8907 VARIDIV(I4,2,BOOL,VARIANT_TRUE,I4,-2);
8908 VARIDIV(I4,2,I1,1,I4,2);
8909 VARIDIV(I4,2,UI1,1,I4,2);
8910 VARIDIV(I4,2,UI2,1,I4,2);
8911 VARIDIV(I4,2,UI4,1,I4,2);
8912 if (has_i8)
8913 {
8914 VARIDIV(I4,2,I8,1,I8,2);
8915 VARIDIV(I4,2,UI8,1,I4,2);
8916 }
8917 VARIDIV(I4,2,INT,1,I4,2);
8918 VARIDIV(I4,2,UINT,1,I4,2);
8919 VARIDIV(R4,2.0f,NULL,0,NULL,0);
8920 VARIDIV(R4,2.0f,I2,1,I4,2);
8921 VARIDIV(R4,2.0f,I4,1,I4,2);
8922 VARIDIV(R4,2.0f,R4,1.0f,I4,2);
8923 VARIDIV(R4,2.0f,R8,1.0,I4,2);
8924 VARIDIV(R4,2.0f,DATE,1,I4,2);
8925 VARIDIV(R4,2.0f,BSTR,num1_str,I4,2);
8926 VARIDIV(R4,2.0f,BOOL,VARIANT_TRUE,I4,-2);
8927 VARIDIV(R4,2.0f,I1,1,I4,2);
8928 VARIDIV(R4,2.0f,UI1,1,I4,2);
8929 VARIDIV(R4,2.0f,UI2,1,I4,2);
8930 VARIDIV(R4,2.0f,UI4,1,I4,2);
8931 if (has_i8)
8932 {
8933 VARIDIV(R4,2.0f,I8,1,I8,2);
8934 VARIDIV(R4,2.0f,UI8,1,I4,2);
8935 }
8936 VARIDIV(R4,2.0f,INT,1,I4,2);
8937 VARIDIV(R4,2.0f,UINT,1,I4,2);
8938 VARIDIV(R8,2.0,NULL,0,NULL,0);
8939 VARIDIV(R8,2.0,I2,1,I4,2);
8940 VARIDIV(R8,2.0,I4,1,I4,2);
8941 VARIDIV(R8,2.0,R4,1,I4,2);
8942 VARIDIV(R8,2.0,R8,1,I4,2);
8943 VARIDIV(R8,2.0,DATE,1,I4,2);
8944 VARIDIV(R8,2.0,BSTR,num1_str,I4,2);
8945 VARIDIV(R8,2.0,BOOL,VARIANT_TRUE,I4,-2);
8946 VARIDIV(R8,2.0,I1,1,I4,2);
8947 VARIDIV(R8,2.0,UI1,1,I4,2);
8948 VARIDIV(R8,2.0,UI2,1,I4,2);
8949 VARIDIV(R8,2.0,UI4,1,I4,2);
8950 if (has_i8)
8951 {
8952 VARIDIV(R8,2.0,I8,1,I8,2);
8953 VARIDIV(R8,2.0,UI8,1,I4,2);
8954 }
8955 VARIDIV(R8,2.0,INT,1,I4,2);
8956 VARIDIV(R8,2.0,UINT,1,I4,2);
8957 VARIDIV(DATE,2,NULL,0,NULL,0);
8958 VARIDIV(DATE,2,I2,1,I4,2);
8959 VARIDIV(DATE,2,I4,1,I4,2);
8960 VARIDIV(DATE,2,R4,1,I4,2);
8961 VARIDIV(DATE,2,R8,1,I4,2);
8962 VARIDIV(DATE,2,DATE,1,I4,2);
8963 VARIDIV(DATE,2,BSTR,num1_str,I4,2);
8964 VARIDIV(DATE,2,BOOL,VARIANT_TRUE,I4,-2);
8965 VARIDIV(DATE,2,I1,1,I4,2);
8966 VARIDIV(DATE,2,UI1,1,I4,2);
8967 VARIDIV(DATE,2,UI2,1,I4,2);
8968 VARIDIV(DATE,2,UI4,1,I4,2);
8969 if (has_i8)
8970 {
8971 VARIDIV(DATE,2,I8,1,I8,2);
8972 VARIDIV(DATE,2,UI8,1,I4,2);
8973 }
8974 VARIDIV(DATE,2,INT,1,I4,2);
8975 VARIDIV(DATE,2,UINT,1,I4,2);
8976 VARIDIV(BSTR,num2_str,NULL,0,NULL,0);
8977 VARIDIV(BSTR,num2_str,I2,1,I4,2);
8978 VARIDIV(BSTR,num2_str,I4,1,I4,2);
8979 VARIDIV(BSTR,num2_str,R4,1.0f,I4,2);
8980 VARIDIV(BSTR,num2_str,R8,1.0,I4,2);
8981 VARIDIV(BSTR,num2_str,DATE,1,I4,2);
8982 VARIDIV(BSTR,num2_str,BSTR,num1_str,I4,2);
8983 VARIDIV(BSTR,num2_str,BOOL,VARIANT_TRUE,I4,-2);
8984 VARIDIV(BSTR,num2_str,I1,1,I4,2);
8985 VARIDIV(BSTR,num2_str,UI1,1,I4,2);
8986 VARIDIV(BSTR,num2_str,UI2,1,I4,2);
8987 VARIDIV(BSTR,num2_str,UI4,1,I4,2);
8988 if (has_i8)
8989 {
8990 VARIDIV(BSTR,num2_str,I8,1,I8,2);
8991 VARIDIV(BSTR,num2_str,UI8,1,I4,2);
8992 }
8993 VARIDIV(BSTR,num2_str,INT,1,I4,2);
8994 VARIDIV(BSTR,num2_str,UINT,1,I4,2);
8995 VARIDIV(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
8996 VARIDIV(BOOL,VARIANT_TRUE,I2,1,I2,-1);
8997 VARIDIV(BOOL,VARIANT_TRUE,I4,1,I4,-1);
8998 VARIDIV(BOOL,VARIANT_TRUE,R4,1.0f,I4,-1);
8999 VARIDIV(BOOL,VARIANT_TRUE,R8,1.0,I4,-1);
9000 VARIDIV(BOOL,VARIANT_TRUE,DATE,1,I4,-1);
9001 VARIDIV(BOOL,VARIANT_TRUE,BSTR,num1_str,I4,-1);
9002 VARIDIV(BOOL,VARIANT_TRUE,BOOL,VARIANT_TRUE,I2,1);
9003 VARIDIV(BOOL,VARIANT_TRUE,I1,1,I4,-1);
9004 VARIDIV(BOOL,VARIANT_TRUE,UI1,1,I2,-1);
9005 VARIDIV(BOOL,VARIANT_TRUE,UI2,1,I4,-1);
9006 VARIDIV(BOOL,VARIANT_TRUE,UI4,1,I4,-1);
9007 if (has_i8)
9008 {
9009 VARIDIV(BOOL,VARIANT_TRUE,I8,1,I8,-1);
9010 VARIDIV(BOOL,VARIANT_TRUE,UI8,1,I4,-1);
9011 }
9012 VARIDIV(BOOL,VARIANT_TRUE,INT,1,I4,-1);
9013 VARIDIV(BOOL,VARIANT_TRUE,UINT,1,I4,-1);
9014 VARIDIV(I1,2,NULL,0,NULL,0);
9015 VARIDIV(I1,2,I2,1,I4,2);
9016 VARIDIV(I1,2,I4,1,I4,2);
9017 VARIDIV(I1,2,R4,1.0f,I4,2);
9018 VARIDIV(I1,2,R8,1.0,I4,2);
9019 VARIDIV(I1,2,DATE,1,I4,2);
9020 VARIDIV(I1,2,BSTR,num1_str,I4,2);
9021 VARIDIV(I1,2,BOOL,VARIANT_TRUE,I4,-2);
9022 VARIDIV(I1,2,I1,1,I4,2);
9023 VARIDIV(I1,2,UI1,1,I4,2);
9024 VARIDIV(I1,2,UI2,1,I4,2);
9025 VARIDIV(I1,2,UI4,1,I4,2);
9026 if (has_i8)
9027 {
9028 VARIDIV(I1,2,I8,1,I8,2);
9029 VARIDIV(I1,2,UI8,1,I4,2);
9030 }
9031 VARIDIV(I1,2,INT,1,I4,2);
9032 VARIDIV(I1,2,UINT,1,I4,2);
9033 VARIDIV(UI1,2,NULL,0,NULL,0);
9034 VARIDIV(UI1,2,I2,1,I2,2);
9035 VARIDIV(UI1,2,I4,1,I4,2);
9036 VARIDIV(UI1,2,R4,1.0f,I4,2);
9037 VARIDIV(UI1,2,R8,1.0,I4,2);
9038 VARIDIV(UI1,2,DATE,1,I4,2);
9039 VARIDIV(UI1,2,BSTR,num1_str,I4,2);
9040 VARIDIV(UI1,2,BOOL,VARIANT_TRUE,I2,-2);
9041 VARIDIV(UI1,2,I1,1,I4,2);
9042 VARIDIV(UI1,2,UI1,1,UI1,2);
9043 VARIDIV(UI1,2,UI2,1,I4,2);
9044 VARIDIV(UI1,2,UI4,1,I4,2);
9045 if (has_i8)
9046 {
9047 VARIDIV(UI1,2,I8,1,I8,2);
9048 VARIDIV(UI1,2,UI8,1,I4,2);
9049 }
9050 VARIDIV(UI1,2,INT,1,I4,2);
9051 VARIDIV(UI1,2,UINT,1,I4,2);
9052 VARIDIV(UI2,2,NULL,0,NULL,0);
9053 VARIDIV(UI2,2,I2,1,I4,2);
9054 VARIDIV(UI2,2,I4,1,I4,2);
9055 VARIDIV(UI2,2,R4,1.0f,I4,2);
9056 VARIDIV(UI2,2,R8,1.0,I4,2);
9057 VARIDIV(UI2,2,DATE,1,I4,2);
9058 VARIDIV(UI2,2,BSTR,num1_str,I4,2);
9059 VARIDIV(UI2,2,BOOL,VARIANT_TRUE,I4,-2);
9060 VARIDIV(UI2,2,I1,1,I4,2);
9061 VARIDIV(UI2,2,UI1,1,I4,2);
9062 VARIDIV(UI2,2,UI2,1,I4,2);
9063 VARIDIV(UI2,2,UI4,1,I4,2);
9064 if (has_i8)
9065 {
9066 VARIDIV(UI2,2,I8,1,I8,2);
9067 VARIDIV(UI2,2,UI8,1,I4,2);
9068 }
9069 VARIDIV(UI2,2,INT,1,I4,2);
9070 VARIDIV(UI2,2,UINT,1,I4,2);
9071 VARIDIV(UI4,2,NULL,0,NULL,0);
9072 VARIDIV(UI4,2,I2,1,I4,2);
9073 VARIDIV(UI4,2,I4,1,I4,2);
9074 VARIDIV(UI4,2,R4,1.0f,I4,2);
9075 VARIDIV(UI4,2,R8,1.0,I4,2);
9076 VARIDIV(UI4,2,DATE,1,I4,2);
9077 VARIDIV(UI4,2,BSTR,num1_str,I4,2);
9078 VARIDIV(UI4,2,BOOL,VARIANT_TRUE,I4,-2);
9079 VARIDIV(UI4,2,I1,1,I4,2);
9080 VARIDIV(UI4,2,UI1,1,I4,2);
9081 VARIDIV(UI4,2,UI2,1,I4,2);
9082 VARIDIV(UI4,2,UI4,1,I4,2);
9083 if (has_i8)
9084 {
9085 VARIDIV(UI4,2,I8,1,I8,2);
9086 VARIDIV(UI4,2,UI8,1,I4,2);
9087 }
9088 VARIDIV(UI4,2,INT,1,I4,2);
9089 VARIDIV(UI4,2,UINT,1,I4,2);
9090 if (has_i8)
9091 {
9092 VARIDIV(I8,2,NULL,0,NULL,0);
9093 VARIDIV(I8,2,I2,1,I8,2);
9094 VARIDIV(I8,2,I4,1,I8,2);
9095 VARIDIV(I8,2,R4,1.0f,I8,2);
9096 VARIDIV(I8,2,R8,1.0,I8,2);
9097 VARIDIV(I8,2,DATE,1,I8,2);
9098 VARIDIV(I8,2,BSTR,num1_str,I8,2);
9099 VARIDIV(I8,2,BOOL,1,I8,2);
9100 VARIDIV(I8,2,I1,1,I8,2);
9101 VARIDIV(I8,2,UI1,1,I8,2);
9102 VARIDIV(I8,2,UI2,1,I8,2);
9103 VARIDIV(I8,2,UI4,1,I8,2);
9104 VARIDIV(I8,2,I8,1,I8,2);
9105 VARIDIV(I8,2,UI8,1,I8,2);
9106 VARIDIV(I8,2,UINT,1,I8,2);
9107 VARIDIV(UI8,2,NULL,0,NULL,0);
9108 VARIDIV(UI8,2,I2,1,I4,2);
9109 VARIDIV(UI8,2,I4,1,I4,2);
9110 VARIDIV(UI8,2,R4,1.0f,I4,2);
9111 VARIDIV(UI8,2,R8,1.0,I4,2);
9112 VARIDIV(UI8,2,DATE,1,I4,2);
9113 VARIDIV(UI8,2,BSTR,num1_str,I4,2);
9114 VARIDIV(UI8,2,BOOL,VARIANT_TRUE,I4,-2);
9115 VARIDIV(UI8,2,I1,1,I4,2);
9116 VARIDIV(UI8,2,UI1,1,I4,2);
9117 VARIDIV(UI8,2,UI2,1,I4,2);
9118 VARIDIV(UI8,2,UI4,1,I4,2);
9119 VARIDIV(UI8,2,I8,1,I8,2);
9120 VARIDIV(UI8,2,UI8,1,I4,2);
9121 VARIDIV(UI8,2,INT,1,I4,2);
9122 VARIDIV(UI8,2,UINT,1,I4,2);
9123 }
9124 VARIDIV(INT,2,NULL,0,NULL,0);
9125 VARIDIV(INT,2,I2,1,I4,2);
9126 VARIDIV(INT,2,I4,1,I4,2);
9127 VARIDIV(INT,2,R4,1.0f,I4,2);
9128 VARIDIV(INT,2,R8,1.0,I4,2);
9129 VARIDIV(INT,2,DATE,1,I4,2);
9130 VARIDIV(INT,2,BSTR,num1_str,I4,2);
9131 VARIDIV(INT,2,BOOL,VARIANT_TRUE,I4,-2);
9132 VARIDIV(INT,2,I1,1,I4,2);
9133 VARIDIV(INT,2,UI1,1,I4,2);
9134 VARIDIV(INT,2,UI2,1,I4,2);
9135 VARIDIV(INT,2,UI4,1,I4,2);
9136 if (has_i8)
9137 {
9138 VARIDIV(INT,2,UI8,1,I4,2);
9139 }
9140 VARIDIV(INT,2,INT,1,I4,2);
9141 VARIDIV(INT,2,UINT,1,I4,2);
9142 VARIDIV(UINT,2,NULL,0,NULL,0);
9143 VARIDIV(UINT,2,I2,1,I4,2);
9144 VARIDIV(UINT,2,I4,1,I4,2);
9145 VARIDIV(UINT,2,R4,1.0f,I4,2);
9146 VARIDIV(UINT,2,R8,1.0,I4,2);
9147 VARIDIV(UINT,2,DATE,1,I4,2);
9148 VARIDIV(UINT,2,BSTR,num1_str,I4,2);
9149 VARIDIV(UINT,2,BOOL,VARIANT_TRUE,I4,-2);
9150 VARIDIV(UINT,2,I1,1,I4,2);
9151 VARIDIV(UINT,2,UI1,1,I4,2);
9152 VARIDIV(UINT,2,UI2,1,I4,2);
9153 VARIDIV(UINT,2,UI4,1,I4,2);
9154 if (has_i8)
9155 {
9156 VARIDIV(UINT,2,I8,1,I8,2);
9157 VARIDIV(UINT,2,UI8,1,I4,2);
9158 }
9159 VARIDIV(UINT,2,INT,1,I4,2);
9160 VARIDIV(UINT,2,UINT,1,I4,2);
9161
9162 /* Manually test some VT_CY, VT_DECIMAL variants */
9163 V_VT(&cy) = VT_CY;
9164 hres = VarCyFromI4(10000, &V_CY(&cy));
9165 ok(hres == S_OK, "VarCyFromI4 failed!\n");
9166 V_VT(&dec) = VT_DECIMAL;
9167 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
9168 ok(hres == S_OK, "VarDecFromR4 failed!\n");
9169 memset(&left, 0, sizeof(left));
9170 memset(&right, 0, sizeof(right));
9171 V_VT(&left) = VT_I4;
9172 V_I4(&left) = 100;
9173 V_VT(&right) = VT_I8;
9174 V_UI1(&right) = 2;
9175
9176 hres = pVarIdiv(&cy, &cy, &result);
9177 ok(hres == S_OK && V_VT(&result) == VT_I4,
9178 "VARIDIV: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9179 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9180 ok(hres == S_OK && V_I4(&result) == 1,
9181 "VARIDIV: CY value %ld, expected %d\n", V_I4(&result), 1);
9182
9183 if (has_i8)
9184 {
9185 hres = pVarIdiv(&cy, &right, &result);
9186 ok(hres == S_OK && V_VT(&result) == VT_I8,
9187 "VARIDIV: expected coerced hres 0x%lX type VT_I8, got hres 0x%lX type %s!\n",
9188 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9189 ok(hres == S_OK && V_I8(&result) == 5000,
9190 "VARIDIV: CY value %#I64x, expected %#x\n",
9191 V_I8(&result), 5000);
9192 }
9193
9194 hres = pVarIdiv(&left, &cy, &result);
9195 ok(hres == S_OK && V_VT(&result) == VT_I4,
9196 "VARIDIV: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9197 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9198 ok(hres == S_OK && V_I4(&result) == 0,
9199 "VARIDIV: CY value %ld, expected %d\n", V_I4(&result), 0);
9200
9201 hres = pVarIdiv(&left, &dec, &result);
9202 ok(hres == S_OK && V_VT(&result) == VT_I4,
9203 "VARIDIV: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9204 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9205 ok(hres == S_OK && V_I4(&result) == 50,
9206 "VARIDIV: DECIMAL value %ld, expected %d\n", V_I4(&result), 50);
9207
9208 hres = pVarIdiv(&dec, &dec, &result);
9209 ok(hres == S_OK && V_VT(&result) == VT_I4,
9210 "VARIDIV: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9211 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9212 ok(hres == S_OK && V_I4(&result) == 1,
9213 "VARIDIV: DECIMAL value %ld, expected %d\n", V_I4(&result), 1);
9214
9215 if (has_i8)
9216 {
9217 hres = pVarIdiv(&dec, &right, &result);
9218 ok(hres == S_OK && V_VT(&result) == VT_I8,
9219 "VARIDIV: expected coerced hres 0x%lX type VT_I8, got hres 0x%lX type %s!\n",
9220 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9221 ok(hres == S_OK && V_I8(&result) == 1,
9222 "VARIDIV: DECIMAL value %I64d, expected %d\n",
9223 V_I8(&result), 1);
9224 }
9225
9226 /* Check for division by zero */
9227 V_VT(&left) = VT_INT;
9228 V_I4(&left) = 1;
9229 V_VT(&right) = VT_INT;
9230 V_I4(&right) = 0;
9231 hres = pVarIdiv(&left, &right, &result);
9233 "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%lX\n", hres);
9234
9235 V_VT(&left) = VT_INT;
9236 V_I4(&left) = 0;
9237 V_VT(&right) = VT_INT;
9238 V_I4(&right) = 0;
9239 hres = pVarIdiv(&left, &right, &result);
9241 "VARIDIV: Division by 0 should result in DISP_E_DIVBYZERO but got 0x%lX\n", hres);
9242
9243 SysFreeString(num1_str);
9244 SysFreeString(num2_str);
9245}
9246
9247
9248static HRESULT (WINAPI *pVarImp)(LPVARIANT,LPVARIANT,LPVARIANT);
9249
9250#define VARIMP(vt1,val1,vt2,val2,rvt,rval) \
9251 V_VT(&left) = VT_##vt1; V_##vt1(&left) = val1; \
9252 V_VT(&right) = VT_##vt2; V_##vt2(&right) = val2; \
9253 V_VT(&exp) = VT_##rvt; V_##rvt(&exp) = rval; \
9254 test_var_call2( __LINE__, pVarImp, &left, &right, &exp )
9255
9256/* Skip any type that is not defined or produces an error for every case */
9257#define SKIPTESTIMP(a) \
9258 if (a == VT_ERROR || a == VT_VARIANT || \
9259 a == VT_DISPATCH || a == VT_UNKNOWN || \
9260 a == VT_RECORD || a > VT_UINT || \
9261 a == 15 /*not defined*/) \
9262 continue
9263
9264static void test_VarImp(void)
9265{
9266 static const WCHAR szFalse[] = { '#','F','A','L','S','E','#','\0' };
9267 static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
9269 BSTR true_str, false_str;
9270 VARTYPE i;
9271 HRESULT hres;
9272
9274
9275 true_str = SysAllocString(szTrue);
9276 false_str = SysAllocString(szFalse);
9277
9278 /* Test all possible flag/vt combinations & the resulting vt type */
9279 for (i = 0; i < ARRAY_SIZE(ExtraFlags); i++)
9280 {
9281 VARTYPE leftvt, rightvt, resvt;
9282
9283 for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
9284 {
9285 SKIPTESTIMP(leftvt);
9286
9287 /* Check if we need/have support for I8 and/or UI8 */
9288 if ((leftvt == VT_I8 || leftvt == VT_UI8) && !has_i8)
9289 continue;
9290
9291 for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
9292 {
9293 BOOL bFail = FALSE;
9294 SKIPTESTIMP(rightvt);
9295
9296 /* Native crashes when using the extra flag VT_BYREF
9297 * or with the following VT combinations
9298 */
9299 if ((leftvt == VT_UI4 && rightvt == VT_BSTR) ||
9300 (leftvt == VT_UI8 && rightvt == VT_BSTR) ||
9301 ExtraFlags[i] == VT_BYREF)
9302 continue;
9303
9304 /* Check if we need/have support for I8 and/or UI8 */
9305 if ((rightvt == VT_I8 || rightvt == VT_UI8) && !has_i8)
9306 continue;
9307
9308 memset(&left, 0, sizeof(left));
9309 memset(&right, 0, sizeof(right));
9310 V_VT(&left) = leftvt | ExtraFlags[i];
9311 V_VT(&right) = rightvt | ExtraFlags[i];
9312 V_VT(&result) = VT_EMPTY;
9313 resvt = VT_EMPTY;
9314
9315 if (leftvt == VT_BSTR)
9316 V_BSTR(&left) = true_str;
9317
9318 /* This allows us to test return types that are not NULL
9319 * (NULL Imp value = n, NULL Imp 0 = NULL)
9320 */
9321 switch(rightvt)
9322 {
9323 case VT_BSTR:
9324 V_BSTR(&right) = true_str;
9325 break;
9326 case VT_DECIMAL:
9327 VarDecFromR8(2.0, &V_DECIMAL(&right));
9328 V_VT(&right) = rightvt | ExtraFlags[i];
9329 break;
9330 case VT_BOOL:
9331 V_BOOL(&right) = VARIANT_TRUE;
9332 break;
9333 case VT_I1: V_I1(&right) = 2; break;
9334 case VT_I2: V_I2(&right) = 2; break;
9335 case VT_I4: V_I4(&right) = 2; break;
9336 case VT_R4: V_R4(&right) = 2.0f; break;
9337 case VT_R8: V_R8(&right) = 2.0; break;
9338 case VT_CY: V_CY(&right).int64 = 10000; break;
9339 case VT_DATE: V_DATE(&right) = 2; break;
9340 case VT_I8: V_I8(&right) = 2; break;
9341 case VT_INT: V_INT(&right) = 2; break;
9342 case VT_UINT: V_UINT(&right) = 2; break;
9343 case VT_UI1: V_UI1(&right) = 2; break;
9344 case VT_UI2: V_UI2(&right) = 2; break;
9345 case VT_UI4: V_UI4(&right) = 2; break;
9346 case VT_UI8: V_UI8(&right) = 2; break;
9347 default: break;
9348 }
9349
9350 /* Native VarImp always returns an error when using extra
9351 * flags or if the variants are I8 and INT.
9352 */
9353 if ((leftvt == VT_I8 && rightvt == VT_INT) ||
9354 ExtraFlags[i] != 0)
9355 bFail = TRUE;
9356
9357 /* Determine result type */
9358 else if ((leftvt == VT_BSTR && rightvt == VT_NULL) ||
9359 (leftvt == VT_NULL && rightvt == VT_NULL) ||
9360 (leftvt == VT_NULL && rightvt == VT_EMPTY))
9361 resvt = VT_NULL;
9362 else if (leftvt == VT_I8 || rightvt == VT_I8)
9363 resvt = VT_I8;
9364 else if (leftvt == VT_I4 || rightvt == VT_I4 ||
9365 leftvt == VT_INT || rightvt == VT_INT ||
9366 leftvt == VT_UINT || rightvt == VT_UINT ||
9367 leftvt == VT_UI4 || rightvt == VT_UI4 ||
9368 leftvt == VT_UI8 || rightvt == VT_UI8 ||
9369 leftvt == VT_UI2 || rightvt == VT_UI2 ||
9370 leftvt == VT_DECIMAL || rightvt == VT_DECIMAL ||
9371 leftvt == VT_DATE || rightvt == VT_DATE ||
9372 leftvt == VT_CY || rightvt == VT_CY ||
9373 leftvt == VT_R8 || rightvt == VT_R8 ||
9374 leftvt == VT_R4 || rightvt == VT_R4 ||
9375 leftvt == VT_I1 || rightvt == VT_I1)
9376 resvt = VT_I4;
9377 else if ((leftvt == VT_UI1 && rightvt == VT_UI1) ||
9378 (leftvt == VT_UI1 && rightvt == VT_NULL) ||
9379 (leftvt == VT_NULL && rightvt == VT_UI1))
9380 resvt = VT_UI1;
9381 else if (leftvt == VT_EMPTY || rightvt == VT_EMPTY ||
9382 leftvt == VT_I2 || rightvt == VT_I2 ||
9383 leftvt == VT_UI1 || rightvt == VT_UI1)
9384 resvt = VT_I2;
9385 else if (leftvt == VT_BOOL || rightvt == VT_BOOL ||
9386 leftvt == VT_BSTR || rightvt == VT_BSTR)
9387 resvt = VT_BOOL;
9388
9389 hres = pVarImp(&left, &right, &result);
9390
9391 /* Check expected HRESULT and if result variant type is correct */
9392 if (bFail)
9394 "VarImp: %s|0x%X, %s|0x%X: got vt %s hr 0x%lX\n",
9395 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i],
9396 wine_dbgstr_vt(V_VT(&result)), hres);
9397 else
9398 ok (hres == S_OK && resvt == V_VT(&result),
9399 "VarImp: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
9400 wine_dbgstr_vt(leftvt), ExtraFlags[i], wine_dbgstr_vt(rightvt), ExtraFlags[i], wine_dbgstr_vt(resvt),
9401 S_OK, wine_dbgstr_vt(V_VT(&result)), hres);
9402 }
9403 }
9404 }
9405
9406 VARIMP(EMPTY,0,EMPTY,0,I2,-1);
9407 VARIMP(EMPTY,0,NULL,0,I2,-1);
9408 VARIMP(EMPTY,0,I2,-1,I2,-1);
9409 VARIMP(EMPTY,0,I4,-1,I4,-1);
9410 VARIMP(EMPTY,0,R4,0.0f,I4,-1);
9411 VARIMP(EMPTY,0,R8,-1.0,I4,-1);
9412 VARIMP(EMPTY,0,DATE,0,I4,-1);
9413 VARIMP(EMPTY,0,BSTR,true_str,I2,-1);
9414 VARIMP(EMPTY,0,BOOL,VARIANT_FALSE,I2,-1);
9415 VARIMP(EMPTY,0,I1,0,I4,-1);
9416 VARIMP(EMPTY,0,UI1,1,I2,-1);
9417 VARIMP(EMPTY,0,UI2,1,I4,-1);
9418 VARIMP(EMPTY,0,UI4,1,I4,-1);
9419 if (has_i8)
9420 {
9421 VARIMP(EMPTY,0,I8,1,I8,-1);
9422 VARIMP(EMPTY,0,UI8,1,I4,-1);
9423 }
9424 VARIMP(EMPTY,0,INT,-1,I4,-1);
9425 VARIMP(EMPTY,0,UINT,1,I4,-1);
9426 VARIMP(NULL,0,EMPTY,0,NULL,0);
9427 VARIMP(NULL,0,NULL,0,NULL,0);
9428 VARIMP(NULL,0,I2,-1,I2,-1);
9429 VARIMP(NULL,0,I4,-1,I4,-1);
9430 VARIMP(NULL,0,R4,0.0f,NULL,0);
9431 VARIMP(NULL,0,R8,-1.0,I4,-1);
9432 VARIMP(NULL,0,DATE,0,NULL,0);
9433 VARIMP(NULL,0,BSTR,true_str,BOOL,-1);
9434 VARIMP(NULL,0,BOOL,VARIANT_FALSE,NULL,0);
9435 VARIMP(NULL,0,I1,0,NULL,0);
9436 VARIMP(NULL,0,UI1,1,UI1,1);
9437 VARIMP(NULL,0,UI2,1,I4,1);
9438 VARIMP(NULL,0,UI4,1,I4,1);
9439 if (has_i8)
9440 {
9441 VARIMP(NULL,0,I8,1,I8,1);
9442 VARIMP(NULL,0,UI8,1,I4,1);
9443 }
9444 VARIMP(NULL,0,INT,-1,I4,-1);
9445 VARIMP(NULL,0,UINT,1,I4,1);
9446 VARIMP(I2,-1,EMPTY,0,I2,0);
9447 VARIMP(I2,-1,I2,-1,I2,-1);
9448 VARIMP(I2,-1,I4,-1,I4,-1);
9449 VARIMP(I2,-1,R4,0.0f,I4,0);
9450 VARIMP(I2,-1,R8,-1.0,I4,-1);
9451 VARIMP(I2,-1,DATE,0,I4,0);
9452 VARIMP(I2,-1,BSTR,true_str,I2,-1);
9453 VARIMP(I2,-1,BOOL,VARIANT_FALSE,I2,0);
9454 VARIMP(I2,-1,I1,0,I4,0);
9455 VARIMP(I2,-1,UI1,1,I2,1);
9456 VARIMP(I2,-1,UI2,1,I4,1);
9457 VARIMP(I2,-1,UI4,1,I4,1);
9458 if (has_i8)
9459 {
9460 VARIMP(I2,-1,I8,1,I8,1);
9461 VARIMP(I2,-1,UI8,1,I4,1);
9462 }
9463 VARIMP(I2,-1,INT,-1,I4,-1);
9464 VARIMP(I2,-1,UINT,1,I4,1);
9465 VARIMP(I4,2,EMPTY,0,I4,-3);
9466 VARIMP(I4,2,NULL,0,I4,-3);
9467 VARIMP(I4,2,I2,-1,I4,-1);
9468 VARIMP(I4,2,I4,-1,I4,-1);
9469 VARIMP(I4,2,R4,0.0f,I4,-3);
9470 VARIMP(I4,2,R8,-1.0,I4,-1);
9471 VARIMP(I4,2,DATE,0,I4,-3);
9472 VARIMP(I4,2,BSTR,true_str,I4,-1);
9473 VARIMP(I4,2,BOOL,VARIANT_FALSE,I4,-3);
9474 VARIMP(I4,2,I1,0,I4,-3);
9475 VARIMP(I4,2,UI1,1,I4,-3);
9476 VARIMP(I4,2,UI2,1,I4,-3);
9477 VARIMP(I4,2,UI4,1,I4,-3);
9478 if (has_i8)
9479 {
9480 VARIMP(I4,2,I8,1,I8,-3);
9481 VARIMP(I4,2,UI8,1,I4,-3);
9482 }
9483 VARIMP(I4,2,INT,-1,I4,-1);
9484 VARIMP(I4,2,UINT,1,I4,-3);
9485 VARIMP(R4,-1.0f,EMPTY,0,I4,0);
9486 VARIMP(R4,-1.0f,NULL,0,NULL,0);
9487 VARIMP(R4,-1.0f,I2,-1,I4,-1);
9488 VARIMP(R4,-1.0f,I4,-1,I4,-1);
9489 VARIMP(R4,-1.0f,R4,0.0f,I4,0);
9490 VARIMP(R4,-1.0f,R8,-1.0,I4,-1);
9491 VARIMP(R4,-1.0f,DATE,1,I4,1);
9492 VARIMP(R4,-1.0f,BSTR,true_str,I4,-1);
9493 VARIMP(R4,-1.0f,BOOL,VARIANT_FALSE,I4,0);
9494 VARIMP(R4,-1.0f,I1,0,I4,0);
9495 VARIMP(R4,-1.0f,UI1,1,I4,1);
9496 VARIMP(R4,-1.0f,UI2,1,I4,1);
9497 VARIMP(R4,-1.0f,UI4,1,I4,1);
9498 if (has_i8)
9499 {
9500 VARIMP(R4,-1.0f,I8,1,I8,1);
9501 VARIMP(R4,-1.0f,UI8,1,I4,1);
9502 }
9503 VARIMP(R4,-1.0f,INT,-1,I4,-1);
9504 VARIMP(R4,-1.0f,UINT,1,I4,1);
9505 VARIMP(R8,1.0,EMPTY,0,I4,-2);
9506 VARIMP(R8,1.0,NULL,0,I4,-2);
9507 VARIMP(R8,1.0,I2,-1,I4,-1);
9508 VARIMP(R8,1.0,I4,-1,I4,-1);
9509 VARIMP(R8,1.0,R4,0.0f,I4,-2);
9510 VARIMP(R8,1.0,R8,-1.0,I4,-1);
9511 VARIMP(R8,1.0,DATE,0,I4,-2);
9512 VARIMP(R8,1.0,BSTR,true_str,I4,-1);
9513 VARIMP(R8,1.0,BOOL,VARIANT_FALSE,I4,-2);
9514 VARIMP(R8,1.0,I1,0,I4,-2);
9515 VARIMP(R8,1.0,UI1,1,I4,-1);
9516 VARIMP(R8,1.0,UI2,1,I4,-1);
9517 VARIMP(R8,1.0,UI4,1,I4,-1);
9518 if (has_i8)
9519 {
9520 VARIMP(R8,1.0,I8,1,I8,-1);
9521 VARIMP(R8,1.0,UI8,1,I4,-1);
9522 }
9523 VARIMP(R8,1.0,INT,-1,I4,-1);
9524 VARIMP(R8,1.0,UINT,1,I4,-1);
9525 VARIMP(DATE,0,EMPTY,0,I4,-1);
9526 VARIMP(DATE,0,NULL,0,I4,-1);
9527 VARIMP(DATE,0,I2,-1,I4,-1);
9528 VARIMP(DATE,0,I4,-1,I4,-1);
9529 VARIMP(DATE,0,R4,0.0f,I4,-1);
9530 VARIMP(DATE,0,R8,-1.0,I4,-1);
9531 VARIMP(DATE,0,DATE,0,I4,-1);
9532 VARIMP(DATE,0,BSTR,true_str,I4,-1);
9533 VARIMP(DATE,0,BOOL,VARIANT_FALSE,I4,-1);
9534 VARIMP(DATE,0,I1,0,I4,-1);
9535 VARIMP(DATE,0,UI1,1,I4,-1);
9536 VARIMP(DATE,0,UI2,1,I4,-1);
9537 VARIMP(DATE,0,UI4,1,I4,-1);
9538 if (has_i8)
9539 {
9540 VARIMP(DATE,0,I8,1,I8,-1);
9541 VARIMP(DATE,0,UI8,1,I4,-1);
9542 }
9543 VARIMP(DATE,0,INT,-1,I4,-1);
9544 VARIMP(DATE,0,UINT,1,I4,-1);
9545 VARIMP(BSTR,false_str,EMPTY,0,I2,-1);
9546 VARIMP(BSTR,false_str,NULL,0,BOOL,-1);
9547 VARIMP(BSTR,false_str,I2,-1,I2,-1);
9548 VARIMP(BSTR,false_str,I4,-1,I4,-1);
9549 VARIMP(BSTR,false_str,R4,0.0f,I4,-1);
9550 VARIMP(BSTR,false_str,R8,-1.0,I4,-1);
9551 VARIMP(BSTR,false_str,DATE,0,I4,-1);
9552 VARIMP(BSTR,false_str,BSTR,true_str,BOOL,-1);
9553 VARIMP(BSTR,false_str,BOOL,VARIANT_FALSE,BOOL,-1);
9554 VARIMP(BSTR,false_str,I1,0,I4,-1);
9555 VARIMP(BSTR,false_str,UI1,1,I2,-1);
9556 VARIMP(BSTR,false_str,UI2,1,I4,-1);
9557 VARIMP(BSTR,false_str,UI4,1,I4,-1);
9558 if (has_i8)
9559 {
9560 VARIMP(BSTR,false_str,I8,1,I8,-1);
9561 VARIMP(BSTR,false_str,UI8,1,I4,-1);
9562 }
9563 VARIMP(BSTR,false_str,INT,-1,I4,-1);
9564 VARIMP(BSTR,false_str,UINT,1,I4,-1);
9565 VARIMP(BOOL,VARIANT_TRUE,EMPTY,0,I2,0);
9566 VARIMP(BOOL,VARIANT_TRUE,NULL,0,NULL,0);
9567 VARIMP(BOOL,VARIANT_TRUE,I2,-1,I2,-1);
9568 VARIMP(BOOL,VARIANT_TRUE,I4,-1,I4,-1);
9569 VARIMP(BOOL,VARIANT_TRUE,R4,0.0f,I4,0);
9570 VARIMP(BOOL,VARIANT_TRUE,R8,-1.0,I4,-1);
9571 VARIMP(BOOL,VARIANT_TRUE,DATE,0,I4,0);
9572 VARIMP(BOOL,VARIANT_TRUE,BSTR,true_str,BOOL,-1);
9573 VARIMP(BOOL,VARIANT_TRUE,BOOL,VARIANT_FALSE,BOOL,0);
9574 VARIMP(BOOL,VARIANT_TRUE,I1,0,I4,0);
9575 VARIMP(BOOL,VARIANT_TRUE,UI1,1,I2,1);
9576 VARIMP(BOOL,VARIANT_TRUE,UI2,1,I4,1);
9577 VARIMP(BOOL,VARIANT_TRUE,UI4,1,I4,1);
9578 if (has_i8)
9579 {
9580 VARIMP(BOOL,VARIANT_TRUE,I8,1,I8,1);
9581 VARIMP(BOOL,VARIANT_TRUE,UI8,1,I4,1);
9582 }
9583 VARIMP(BOOL,VARIANT_TRUE,INT,-1,I4,-1);
9584 VARIMP(BOOL,VARIANT_TRUE,UINT,1,I4,1);
9585 VARIMP(I1,-1,EMPTY,0,I4,0);
9586 VARIMP(I1,-1,NULL,0,NULL,0);
9587 VARIMP(I1,-1,I2,-1,I4,-1);
9588 VARIMP(I1,-1,I4,-1,I4,-1);
9589 VARIMP(I1,-1,R4,0.0f,I4,0);
9590 VARIMP(I1,-1,R8,-1.0,I4,-1);
9591 VARIMP(I1,-1,DATE,0,I4,0);
9592 VARIMP(I1,-1,BSTR,true_str,I4,-1);
9593 VARIMP(I1,-1,BOOL,VARIANT_FALSE,I4,0);
9594 VARIMP(I1,-1,I1,0,I4,0);
9595 VARIMP(I1,-1,UI1,1,I4,1);
9596 VARIMP(I1,-1,UI2,1,I4,1);
9597 VARIMP(I1,-1,UI4,1,I4,1);
9598 if (has_i8)
9599 {
9600 VARIMP(I1,-1,I8,1,I8,1);
9601 VARIMP(I1,-1,UI8,1,I4,1);
9602 }
9603 VARIMP(I1,-1,INT,-1,I4,-1);
9604 VARIMP(I1,-1,UINT,1,I4,1);
9605 VARIMP(UI1,0,EMPTY,0,I2,-1);
9606 VARIMP(UI1,0,NULL,0,UI1,255);
9607 VARIMP(UI1,0,I2,-1,I2,-1);
9608 VARIMP(UI1,0,I4,-1,I4,-1);
9609 VARIMP(UI1,0,R4,0.0f,I4,-1);
9610 VARIMP(UI1,0,R8,-1.0,I4,-1);
9611 VARIMP(UI1,0,DATE,0,I4,-1);
9612 VARIMP(UI1,0,BSTR,true_str,I2,-1);
9613 VARIMP(UI1,0,BOOL,VARIANT_FALSE,I2,-1);
9614 VARIMP(UI1,0,I1,0,I4,-1);
9615 VARIMP(UI1,0,UI1,1,UI1,255);
9616 VARIMP(UI1,0,UI2,1,I4,-1);
9617 VARIMP(UI1,0,UI4,1,I4,-1);
9618 if (has_i8)
9619 {
9620 VARIMP(UI1,0,I8,1,I8,-1);
9621 VARIMP(UI1,0,UI8,1,I4,-1);
9622 }
9623 VARIMP(UI1,0,INT,-1,I4,-1);
9624 VARIMP(UI1,0,UINT,1,I4,-1);
9625 VARIMP(UI2,0,EMPTY,0,I4,-1);
9626 VARIMP(UI2,0,NULL,0,I4,-1);
9627 VARIMP(UI2,0,I2,-1,I4,-1);
9628 VARIMP(UI2,0,I4,-1,I4,-1);
9629 VARIMP(UI2,0,R4,0.0f,I4,-1);
9630 VARIMP(UI2,0,R8,-1.0,I4,-1);
9631 VARIMP(UI2,0,DATE,0,I4,-1);
9632 VARIMP(UI2,0,BSTR,true_str,I4,-1);
9633 VARIMP(UI2,0,BOOL,VARIANT_FALSE,I4,-1);
9634 VARIMP(UI2,0,I1,0,I4,-1);
9635 VARIMP(UI2,0,UI1,1,I4,-1);
9636 VARIMP(UI2,0,UI2,1,I4,-1);
9637 VARIMP(UI2,0,UI4,1,I4,-1);
9638 if (has_i8)
9639 {
9640 VARIMP(UI2,0,I8,1,I8,-1);
9641 VARIMP(UI2,0,UI8,1,I4,-1);
9642 }
9643 VARIMP(UI2,0,INT,-1,I4,-1);
9644 VARIMP(UI2,0,UINT,1,I4,-1);
9645 VARIMP(UI4,0,EMPTY,0,I4,-1);
9646 VARIMP(UI4,0,NULL,0,I4,-1);
9647 VARIMP(UI4,0,I2,-1,I4,-1);
9648 VARIMP(UI4,0,I4,-1,I4,-1);
9649 VARIMP(UI4,0,R4,0.0f,I4,-1);
9650 VARIMP(UI4,0,R8,-1.0,I4,-1);
9651 VARIMP(UI4,0,DATE,0,I4,-1);
9652 VARIMP(UI4,0,BSTR,true_str,I4,-1);
9653 VARIMP(UI4,0,BOOL,VARIANT_FALSE,I4,-1);
9654 VARIMP(UI4,0,I1,0,I4,-1);
9655 VARIMP(UI4,0,UI1,1,I4,-1);
9656 VARIMP(UI4,0,UI2,1,I4,-1);
9657 VARIMP(UI4,0,UI4,1,I4,-1);
9658 if (has_i8)
9659 {
9660 VARIMP(UI4,0,I8,1,I8,-1);
9661 VARIMP(UI4,0,UI8,1,I4,-1);
9662 }
9663 VARIMP(UI4,0,INT,-1,I4,-1);
9664 VARIMP(UI4,0,UINT,1,I4,-1);
9665 if (has_i8)
9666 {
9667 VARIMP(I8,-1,EMPTY,0,I8,0);
9668 VARIMP(I8,-1,NULL,0,NULL,0);
9669 VARIMP(I8,-1,I2,-1,I8,-1);
9670 VARIMP(I8,-1,I4,-1,I8,-1);
9671 VARIMP(I8,-1,R4,0.0f,I8,0);
9672 VARIMP(I8,-1,R8,-1.0,I8,-1);
9673 VARIMP(I8,-1,DATE,0,I8,0);
9674 VARIMP(I8,-1,BSTR,true_str,I8,-1);
9675 VARIMP(I8,-1,BOOL,VARIANT_FALSE,I8,0);
9676 VARIMP(I8,-1,I1,0,I8,0);
9677 VARIMP(I8,-1,UI1,1,I8,1);
9678 VARIMP(I8,-1,UI2,1,I8,1);
9679 VARIMP(I8,-1,UI4,1,I8,1);
9680 VARIMP(I8,-1,I8,1,I8,1);
9681 VARIMP(I8,-1,UI8,1,I8,1);
9682 VARIMP(I8,-1,UINT,1,I8,1);
9683 VARIMP(UI8,0,EMPTY,0,I4,-1);
9684 VARIMP(UI8,0,NULL,0,I4,-1);
9685 VARIMP(UI8,0,I2,-1,I4,-1);
9686 VARIMP(UI8,0,I4,-1,I4,-1);
9687 VARIMP(UI8,0,R4,0.0f,I4,-1);
9688 VARIMP(UI8,0,R8,-1.0,I4,-1);
9689 VARIMP(UI8,0,DATE,0,I4,-1);
9690 VARIMP(UI8,0,BSTR,true_str,I4,-1);
9691 VARIMP(UI8,0,BOOL,VARIANT_FALSE,I4,-1);
9692 VARIMP(UI8,0,I1,0,I4,-1);
9693 VARIMP(UI8,0,UI1,1,I4,-1);
9694 VARIMP(UI8,0,UI2,1,I4,-1);
9695 VARIMP(UI8,0,UI4,1,I4,-1);
9696 VARIMP(UI8,0,I8,1,I8,-1);
9697 VARIMP(UI8,0,UI8,1,I4,-1);
9698 VARIMP(UI8,0,INT,-1,I4,-1);
9699 VARIMP(UI8,0,UINT,1,I4,-1);
9700 }
9701 VARIMP(INT,-1,EMPTY,0,I4,0);
9702 VARIMP(INT,-1,NULL,0,NULL,0);
9703 VARIMP(INT,-1,I2,-1,I4,-1);
9704 VARIMP(INT,-1,I4,-1,I4,-1);
9705 VARIMP(INT,-1,R4,0.0f,I4,0);
9706 VARIMP(INT,-1,R8,-1.0,I4,-1);
9707 VARIMP(INT,-1,DATE,0,I4,0);
9708 VARIMP(INT,-1,BSTR,true_str,I4,-1);
9709 VARIMP(INT,-1,BOOL,VARIANT_FALSE,I4,0);
9710 VARIMP(INT,-1,I1,0,I4,0);
9711 VARIMP(INT,-1,UI1,1,I4,1);
9712 VARIMP(INT,-1,UI2,1,I4,1);
9713 VARIMP(INT,-1,UI4,1,I4,1);
9714 if (has_i8)
9715 {
9716 VARIMP(INT,-1,I8,1,I8,1);
9717 VARIMP(INT,-1,UI8,1,I4,1);
9718 }
9719 VARIMP(INT,-1,INT,-1,I4,-1);
9720 VARIMP(INT,-1,UINT,1,I4,1);
9721 VARIMP(UINT,1,EMPTY,0,I4,-2);
9722 VARIMP(UINT,1,NULL,0,I4,-2);
9723 VARIMP(UINT,1,I2,-1,I4,-1);
9724 VARIMP(UINT,1,I4,-1,I4,-1);
9725 VARIMP(UINT,1,R4,0.0f,I4,-2);
9726 VARIMP(UINT,1,R8,-1.0,I4,-1);
9727 VARIMP(UINT,1,DATE,0,I4,-2);
9728 VARIMP(UINT,1,BSTR,true_str,I4,-1);
9729 VARIMP(UINT,1,BOOL,VARIANT_FALSE,I4,-2);
9730 VARIMP(UINT,1,I1,0,I4,-2);
9731 VARIMP(UINT,1,UI1,1,I4,-1);
9732 VARIMP(UINT,1,UI2,1,I4,-1);
9733 VARIMP(UINT,1,UI4,1,I4,-1);
9734 if (has_i8)
9735 {
9736 VARIMP(UINT,1,I8,1,I8,-1);
9737 VARIMP(UINT,1,UI8,1,I4,-1);
9738 }
9739 VARIMP(UINT,1,INT,-1,I4,-1);
9740 VARIMP(UINT,1,UINT,1,I4,-1);
9741
9742 /* Manually test some VT_CY, VT_DECIMAL variants */
9743 V_VT(&cy) = VT_CY;
9744 hres = VarCyFromI4(1, &V_CY(&cy));
9745 ok(hres == S_OK, "VarCyFromI4 failed!\n");
9746 V_VT(&dec) = VT_DECIMAL;
9747 hres = VarDecFromR8(2.0, &V_DECIMAL(&dec));
9748 ok(hres == S_OK, "VarDecFromR4 failed!\n");
9749 memset(&left, 0, sizeof(left));
9750 memset(&right, 0, sizeof(right));
9751 V_VT(&left) = VT_I4;
9752 V_I4(&left) = 0;
9753 V_VT(&right) = VT_I8;
9754 V_UI1(&right) = 0;
9755
9756 hres = pVarImp(&cy, &cy, &result);
9757 ok(hres == S_OK && V_VT(&result) == VT_I4,
9758 "VARIMP: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9759 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9760 ok(hres == S_OK && V_I4(&result) == -1,
9761 "VARIMP: CY value %ld, expected %d\n", V_I4(&result), -1);
9762
9763 if (has_i8)
9764 {
9765 hres = pVarImp(&cy, &right, &result);
9766 ok(hres == S_OK && V_VT(&result) == VT_I8,
9767 "VARIMP: expected coerced hres 0x%lX type VT_I8, got hres 0x%lX type %s!\n",
9768 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9769 ok(hres == S_OK && V_I8(&result) == -2,
9770 "VARIMP: CY value %I64d, expected %d\n",
9771 V_I8(&result), -2);
9772 }
9773
9774 hres = pVarImp(&left, &cy, &result);
9775 ok(hres == S_OK && V_VT(&result) == VT_I4,
9776 "VARIMP: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9777 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9778 ok(hres == S_OK && V_I4(&result) == -1,
9779 "VARIMP: CY value %ld, expected %d\n", V_I4(&result), -1);
9780
9781 hres = pVarImp(&left, &dec, &result);
9782 ok(hres == S_OK && V_VT(&result) == VT_I4,
9783 "VARIMP: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9784 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9785 ok(hres == S_OK && V_I4(&result) == -1,
9786 "VARIMP: DECIMAL value %ld, expected %d\n", V_I4(&result), -1);
9787
9788 hres = pVarImp(&dec, &dec, &result);
9789 ok(hres == S_OK && V_VT(&result) == VT_I4,
9790 "VARIMP: expected coerced hres 0x%lX type VT_I4, got hres 0x%lX type %s!\n",
9791 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9792 ok(hres == S_OK && V_I4(&result) == -1,
9793 "VARIMP: DECIMAL value %ld, expected %d\n", V_I4(&result), -1);
9794
9795 if (has_i8)
9796 {
9797 hres = pVarImp(&dec, &right, &result);
9798 ok(hres == S_OK && V_VT(&result) == VT_I8,
9799 "VARIMP: expected coerced hres 0x%lX type VT_I8, got hres 0x%lX type %s!\n",
9800 S_OK, hres, wine_dbgstr_vt(V_VT(&result)));
9801 ok(hres == S_OK && V_I8(&result) == -3,
9802 "VARIMP: DECIMAL value %#I64x, expected %d\n",
9803 V_I8(&result), -3);
9804 }
9805
9806 SysFreeString(false_str);
9807 SysFreeString(true_str);
9808}
9809
9811{
9812 init();
9813
9828 test_VarAbs();
9829 test_VarNot();
9830 test_VarSub();
9831 test_VarMod();
9832 test_VarFix();
9833 test_VarInt();
9834 test_VarNeg();
9835 test_VarRound();
9836 test_VarXor();
9837 test_VarOr();
9838 test_VarPow();
9839 test_VarEqv();
9840 test_VarMul();
9841 test_VarAdd();
9842 test_VarCmp();
9843 test_VarCat();
9844 test_VarAnd();
9845 test_VarDiv();
9846 test_VarIdiv();
9847 test_VarImp();
9848}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
ios_base &_STLP_CALL dec(ios_base &__s)
Definition: _ios_base.h:321
#define vsnprintf
Definition: acwin.h:108
@ R8
Definition: amd64_sup.c:13
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(A)
Definition: main.h:20
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
const GUID IID_IUnknown
r l[0]
Definition: byte_order.h:168
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
static LPVOID LPUNKNOWN
Definition: dinput.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
double DATE
Definition: compat.h:2253
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define GetProcAddress(x, y)
Definition: compat.h:753
#define HeapAlloc
Definition: compat.h:733
WCHAR OLECHAR
Definition: compat.h:2292
OLECHAR * BSTR
Definition: compat.h:2293
unsigned short VARTYPE
Definition: compat.h:2254
#define HeapFree(x, y, z)
Definition: compat.h:735
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_VOID
Definition: compat.h:2318
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_TYPEMASK
Definition: compat.h:2346
@ VT_RESERVED
Definition: compat.h:2343
@ VT_BYREF
Definition: compat.h:2342
@ VT_UI2
Definition: compat.h:2312
@ VT_DECIMAL
Definition: compat.h:2309
@ VT_ERROR
Definition: compat.h:2305
@ VT_CLSID
Definition: compat.h:2337
@ VT_ARRAY
Definition: compat.h:2341
@ VT_BSTR_BLOB
Definition: compat.h:2339
@ VT_SAFEARRAY
Definition: compat.h:2321
@ VT_LPWSTR
Definition: compat.h:2325
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_EMPTY
Definition: compat.h:2295
@ VT_RECORD
Definition: compat.h:2326
@ VT_VECTOR
Definition: compat.h:2340
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
INT WINAPI GetLocaleInfoA(LCID lcid, LCTYPE lctype, LPSTR buffer, INT len)
Definition: locale.c:1609
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
BOOL WINAPI SetLocaleInfoA(LCID lcid, LCTYPE lctype, LPCSTR data)
Definition: locale.c:1891
BOOL WINAPI SetLocaleInfoW(LCID lcid, LCTYPE lctype, LPCWSTR data)
Definition: locale.c:1923
LCID lcid
Definition: locale.c:5660
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
Definition: vartype.c:6852
HRESULT WINAPI VarR8FromCy(CY cyIn, double *pDblOut)
Definition: vartype.c:3113
HRESULT WINAPI VarDecFromR8(double dblIn, DECIMAL *pDecOut)
Definition: vartype.c:4200
HRESULT WINAPI VarDecFromI4(LONG lIn, DECIMAL *pDecOut)
Definition: vartype.c:4131
HRESULT WINAPI VarCyFromI4(LONG lIn, CY *pCyOut)
Definition: vartype.c:3462
HRESULT WINAPI VarR8FromDec(const DECIMAL *pDecIn, double *pDblOut)
Definition: vartype.c:3267
HRESULT WINAPI VarR8FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, double *pDblOut)
Definition: vartype.c:3151
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
long long int64
Definition: platform.h:13
#define ERROR(name)
Definition: error_private.h:53
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
const GLdouble * v
Definition: gl.h:2040
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum func
Definition: glext.h:6028
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLuint GLuint * names
Definition: glext.h:11545
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLdouble GLdouble right
Definition: glext.h:10859
GLfloat f
Definition: glext.h:7540
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum const GLfloat * params
Definition: glext.h:5645
GLint left
Definition: glext.h:7726
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat GLfloat GLfloat v3
Definition: glext.h:6064
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLfloat GLfloat v1
Definition: glext.h:6062
GLfloat GLfloat GLfloat v2
Definition: glext.h:6063
const GLfloat * m
Definition: glext.h:10848
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID DWORD_PTR dw
Definition: atlbase.h:40
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define f
Definition: ke_i.h:83
#define a
Definition: ke_i.h:78
#define c
Definition: ke_i.h:80
#define b
Definition: ke_i.h:79
#define wine_dbgstr_w
Definition: kernel32.h:34
GLint dy
Definition: linetemp.h:97
#define sign(x)
Definition: mapdesc.cc:613
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
Definition: test.h:537
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned __int64 ULONG64
Definition: imports.h:198
static PVOID ptr
Definition: dispmode.c:27
BOOL expected
Definition: store.c:2000
HRESULT hres
Definition: protocol.c:465
#define cmp(status, error)
Definition: error.c:118
static char * dest
Definition: rtl.c:149
static VARIANTARG static DISPID
Definition: ordinal.c:49
DWORD exp
Definition: msg.c:18625
#define EMPTY(rect)
Definition: text.c:32
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define LOCALE_USER_DEFAULT
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
UINT WINAPI SysStringByteLen(BSTR str)
Definition: oleaut.c:215
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define VARCMP_LT
Definition: oleauto.h:657
#define V_UI1(A)
Definition: oleauto.h:266
#define V_I8(A)
Definition: oleauto.h:249
#define V_BOOL(A)
Definition: oleauto.h:224
#define NUMPRS_USE_ALL
Definition: oleauto.h:747
#define V_RECORDINFO(A)
Definition: oleauto.h:214
#define VARCMP_NULL
Definition: oleauto.h:660
#define V_INT(A)
Definition: oleauto.h:251
#define NUMPRS_LEADING_WHITE
Definition: oleauto.h:735
#define NUMPRS_EXPONENT
Definition: oleauto.h:746
#define VTBIT_R4
Definition: oleauto.h:760
#define NUMPRS_HEX_OCT
Definition: oleauto.h:741
#define NUMPRS_NEG
Definition: oleauto.h:749
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define VARCMP_EQ
Definition: oleauto.h:658
#define VTBIT_I2
Definition: oleauto.h:754
#define V_UNKNOWNREF(A)
Definition: oleauto.h:282
#define VAR_DATEVALUEONLY
Definition: oleauto.h:327
#define V_UI2(A)
Definition: oleauto.h:268
#define NUMPRS_TRAILING_WHITE
Definition: oleauto.h:736
#define VTBIT_CY
Definition: oleauto.h:762
#define VTBIT_UI1
Definition: oleauto.h:753
#define V_I1(A)
Definition: oleauto.h:243
#define VARCMP_GT
Definition: oleauto.h:659
#define VTBIT_DECIMAL
Definition: oleauto.h:763
#define NUMPRS_CURRENCY
Definition: oleauto.h:745
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define NUMPRS_TRAILING_MINUS
Definition: oleauto.h:740
#define VAR_LOCALBOOL
Definition: oleauto.h:330
#define NUMPRS_LEADING_PLUS
Definition: oleauto.h:737
#define V_DISPATCHREF(A)
Definition: oleauto.h:240
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_BYREF(A)
Definition: oleauto.h:228
#define NUMPRS_THOUSANDS
Definition: oleauto.h:744
#define VTBIT_I8
Definition: oleauto.h:758
#define NUMPRS_LEADING_MINUS
Definition: oleauto.h:739
#define NUMPRS_DECIMAL
Definition: oleauto.h:743
#define V_I4(A)
Definition: oleauto.h:247
#define VTBIT_I4
Definition: oleauto.h:756
#define V_R4(A)
Definition: oleauto.h:260
#define V_DECIMAL(A)
Definition: oleauto.h:236
#define V_UINT(A)
Definition: oleauto.h:264
#define V_CY(A)
Definition: oleauto.h:229
#define NUMPRS_INEXACT
Definition: oleauto.h:750
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_RECORD(A)
Definition: oleauto.h:213
#define V_R8(A)
Definition: oleauto.h:262
#define VTBIT_I1
Definition: oleauto.h:752
#define VTBIT_R8
Definition: oleauto.h:761
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define VAR_TIMEVALUEONLY
Definition: oleauto.h:326
#define NUMPRS_PARENS
Definition: oleauto.h:742
#define V_DATE(A)
Definition: oleauto.h:231
#define V_UI1REF(A)
Definition: oleauto.h:267
#define V_UI8(A)
Definition: oleauto.h:272
#define NUMPRS_STD
Definition: oleauto.h:748
#define NUMPRS_TRAILING_PLUS
Definition: oleauto.h:738
#define VAR_VALIDDATE
Definition: oleauto.h:328
#define V_I2(A)
Definition: oleauto.h:245
#define V_I4REF(A)
Definition: oleauto.h:248
const GUID IID_IDispatch
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
const WCHAR * str
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_FRENCH_SWISS
Definition: nls.h:245
#define LANG_POLISH
Definition: nls.h:107
#define SUBLANG_FRENCH
Definition: nls.h:242
#define LANG_ENGLISH
Definition: nls.h:52
#define LANG_ARABIC
Definition: nls.h:29
DWORD LCID
Definition: nls.h:13
#define SUBLANG_POLISH_POLAND
Definition: nls.h:306
#define SUBLANG_ARABIC_MOROCCO
Definition: nls.h:183
#define LANG_FRENCH
Definition: nls.h:58
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
Definition: parser.h:35
XML_HIDDEN void xmlParserErrors const char const xmlChar * str1
Definition: parser.h:35
#define R4(v, w, x, y, z, i)
Definition: sha1.c:39
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
static const char *static const char const char DWORD void DWORD *static const char const char DWORD void DWORD *static const char DWORD DWORD void * buff
Definition: shcore.c:41
#define CF
Definition: simd.h:157
struct storage STORAGE
HRESULT result
Definition: vartest.c:187
IDispatch IDispatch_iface
Definition: vartest.c:185
VARTYPE vt
Definition: vartest.c:186
IRecordInfo IRecordInfo_iface
Definition: recinfo.c:43
unsigned int recordcopy
Definition: safearray.c:80
unsigned int getsize
Definition: vartest.c:306
VARIANT * v
Definition: vartest.c:308
unsigned int recordclear
Definition: vartest.c:305
ULONG dwInFlags
Definition: oleauto.h:728
INT cDig
Definition: oleauto.h:727
ULONG dwOutFlags
Definition: oleauto.h:729
INT nBaseShift
Definition: oleauto.h:731
INT cchUsed
Definition: oleauto.h:730
INT nPwr10
Definition: oleauto.h:732
Definition: oleauto.h:720
SYSTEMTIME st
Definition: oleauto.h:721
USHORT wDayOfYear
Definition: oleauto.h:722
Definition: shimeng.h:16
Definition: nspapi.h:57
WORD wMilliseconds
Definition: minwinbase.h:263
WORD wSecond
Definition: minwinbase.h:262
WORD wMinute
Definition: minwinbase.h:261
WORD wDayOfWeek
Definition: minwinbase.h:258
Definition: match.c:390
struct decimal_t ret
Definition: vartest.c:4331
ULONG Mid32
Definition: vartest.c:4325
BYTE scale
Definition: vartest.c:4322
BYTE sign
Definition: vartest.c:4323
ULONG Lo32
Definition: vartest.c:4326
ULONG Hi32
Definition: vartest.c:4324
Definition: format.c:58
Definition: parser.c:49
Definition: send.c:48
Definition: parse.h:23
ULONG Hi32
Definition: compat.h:2276
BYTE sign
Definition: compat.h:2272
ULONG Lo32
Definition: compat.h:2283
BYTE scale
Definition: compat.h:2271
ULONG Mid32
Definition: compat.h:2284
IUnknown IUnknown_iface
Definition: vartest.c:679
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
Definition: compat.h:2255
LONGLONG int64
Definition: compat.h:2265
HRESULT WINAPI VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *lpUdate)
Definition: variant.c:1427
HRESULT WINAPI VarNot(LPVARIANT pVarIn, LPVARIANT pVarOut)
Definition: variant.c:4909
HRESULT WINAPI VarMul(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:3343
INT WINAPI VariantTimeToSystemTime(double dateIn, LPSYSTEMTIME lpSt)
Definition: variant.c:1317
HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:2893
INT WINAPI VariantTimeToDosDateTime(double dateIn, USHORT *pwDosDate, USHORT *pwDosTime)
Definition: variant.c:1252
HRESULT WINAPI VarXor(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut)
Definition: variant.c:4546
HRESULT WINAPI VarDiv(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:3521
HRESULT WINAPI VarSub(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:3683
HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
Definition: variant.c:2515
INT WINAPI DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, double *pDateOut)
Definition: variant.c:1211
HRESULT WINAPI VarOr(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut)
Definition: variant.c:3951
HRESULT WINAPI VarAdd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:3130
HRESULT WINAPI VarRound(LPVARIANT pVarIn, int deci, LPVARIANT pVarOut)
Definition: variant.c:5032
HRESULT WINAPI VarImp(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:5693
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
HRESULT WINAPI VarFix(LPVARIANT pVarIn, LPVARIANT pVarOut)
Definition: variant.c:4367
HRESULT WINAPI VarIdiv(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:5183
HRESULT WINAPI VarAbs(LPVARIANT pVarIn, LPVARIANT pVarOut)
Definition: variant.c:4263
HRESULT WINAPI VarMod(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:5337
HRESULT WINAPI VarEqv(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut)
Definition: variant.c:4727
HRESULT WINAPI VarParseNumFromStr(OLECHAR *lpszStr, LCID lcid, ULONG dwFlags, NUMPARSE *pNumprs, BYTE *rgbDig)
Definition: variant.c:1604
HRESULT WINAPI VarCmp(LPVARIANT left, LPVARIANT right, LCID lcid, DWORD flags)
Definition: variant.c:2712
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
INT WINAPI SystemTimeToVariantTime(LPSYSTEMTIME lpSt, double *pDateOut)
Definition: variant.c:1286
HRESULT WINAPI VarNeg(LPVARIANT pVarIn, LPVARIANT pVarOut)
Definition: variant.c:4781
HRESULT WINAPI VarInt(LPVARIANT pVarIn, LPVARIANT pVarOut)
Definition: variant.c:4473
HRESULT WINAPI VariantCopyInd(VARIANT *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:847
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:748
HRESULT WINAPI VarDateFromUdate(UDATE *pUdateIn, ULONG dwFlags, DATE *pDateOut)
Definition: variant.c:1406
HRESULT WINAPI VarPow(LPVARIANT left, LPVARIANT right, LPVARIANT result)
Definition: variant.c:5579
long sgn(REAL x)
Definition: varray.cc:48
static WCHAR sz12_true[32]
Definition: vartest.c:112
#define SET_EXPECT(func)
Definition: vartest.c:160
static ULONG WINAPI VC_AddRef(LPUNKNOWN iface)
Definition: vartest.c:696
static void test_VarFix(void)
Definition: vartest.c:3960
static void test_VarMul(void)
Definition: vartest.c:6091
#define CASE(vt)
static void test_cmpex(int line, LCID lcid, VARIANT *left, VARIANT *right, HRESULT res1, HRESULT res2, HRESULT res3, HRESULT res4)
Definition: vartest.c:7532
#define I2_MIN
Definition: vartest.c:139
static void test_VarOr(void)
Definition: vartest.c:5217
#define VARADD(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:6256
#define VARXORCY(vt1, val1, val2, rvt, rval)
Definition: vartest.c:4477
static void test_VarRound(void)
Definition: vartest.c:4348
#define EXPECTRGB(a, b)
Definition: vartest.c:1255
static void test_VarParseNumFromStrMisc(void)
Definition: vartest.c:2137
static void init(void)
Definition: vartest.c:493
static void test_st2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms, INT r, double dt, double dt2)
Definition: vartest.c:2783
#define EXPECT_I4(val)
Definition: vartest.c:2463
#define DATE_MAX
Definition: vartest.c:150
static void test_VarPow(void)
Definition: vartest.c:7806
static void test_dt2st(int line, double dt, INT r, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms)
Definition: vartest.c:2829
static void test_VarAdd(void)
Definition: vartest.c:6262
static void test_Round(int line, VARIANT *arg, int deci, VARIANT *expected)
Definition: vartest.c:4304
#define SETRGB(indx, val)
Definition: vartest.c:2444
static test_VariantClearImpl * impl_from_IUnknown(IUnknown *iface)
Definition: vartest.c:684
#define I4_MAX
Definition: vartest.c:142
#define VARPOW(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:7792
#define EXPECT_R4(val)
Definition: vartest.c:2471
static HRESULT WINAPI RecordInfo_RecordCreateCopy(IRecordInfo *iface, PVOID pvSource, PVOID *ppvDest)
Definition: vartest.c:443
static void test_cmp(int line, LCID lcid, UINT flags, VARIANT *left, VARIANT *right, HRESULT result)
Definition: vartest.c:7524
static ULONG WINAPI DummyDispatch_Release(IDispatch *iface)
Definition: vartest.c:200
#define I2_MAX
Definition: vartest.c:138
static void test_VarCmp(void)
Definition: vartest.c:7562
static void test_var_call2(int line, HRESULT(WINAPI *func)(LPVARIANT, LPVARIANT, LPVARIANT), VARIANT *left, VARIANT *right, VARIANT *expected)
Definition: vartest.c:594
static HRESULT WINAPI DummyDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names, UINT cnames, LCID lcid, DISPID *dispid)
Definition: vartest.c:233
static ULONG WINAPI RecordInfo_Release(IRecordInfo *iface)
Definition: vartest.c:337
#define VARIMP(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:9250
static HMODULE hOleaut32
Definition: vartest.c:107
static void test_VarInt(void)
Definition: vartest.c:4074
static void test_VariantCopyInd(void)
Definition: vartest.c:1015
static void test_VariantTimeToSystemTime(void)
Definition: vartest.c:2848
static BOOL has_i8
Definition: vartest.c:119
#define VARROUND(vt, val, deci, rvt, rval)
Definition: vartest.c:4316
static void test_VarIdiv(void)
Definition: vartest.c:8700
#define EXPECT_UI1(val)
Definition: vartest.c:2457
static void setdec64(DECIMAL *dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG mid32, ULONG lo32)
Definition: vartest.c:526
static IRecordInfoImpl * impl_from_IRecordInfo(IRecordInfo *iface)
Definition: vartest.c:311
static void _test_bstr_var(unsigned line, const VARIANT *v, const WCHAR *str)
Definition: vartest.c:615
static HRESULT WINAPI RecordInfo_RecordDestroy(IRecordInfo *iface, PVOID pvRecord)
Definition: vartest.c:450
#define VARABS(vt, val, rvt, rval)
Definition: vartest.c:2976
static const VARTYPE ExtraFlags[16]
Definition: vartest.c:638
static const char * szFailOk
Definition: vartest.c:2451
static HRESULT WINAPI RecordInfo_RecordClear(IRecordInfo *iface, void *data)
Definition: vartest.c:354
static void test_VarNot(void)
Definition: vartest.c:3089
static HRESULT WINAPI RecordInfo_GetFieldNames(IRecordInfo *iface, ULONG *pcNames, BSTR *rgBstrNames)
Definition: vartest.c:424
static void test_VarNeg(void)
Definition: vartest.c:4189
static void test_VarAnd(void)
Definition: vartest.c:6868
#define EXPECT(a, b, c, d, e, f)
Definition: vartest.c:1254
static HRESULT WINAPI RecordInfo_GetTypeInfo(IRecordInfo *iface, ITypeInfo **ppTypeInfo)
Definition: vartest.c:390
#define R4_MAX
Definition: vartest.c:152
static ULONG WINAPI DummyDispatch_AddRef(IDispatch *iface)
Definition: vartest.c:195
#define EXPECTFAIL
Definition: vartest.c:1256
#define CHECK_EXPECT(func)
Definition: vartest.c:169
static void test_dt2dos(int line, double dt, INT r, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s)
Definition: vartest.c:2937
static BOOL is_expected_variant(const VARIANT *result, const VARIANT *expected)
Definition: vartest.c:535
static ULONG WINAPI RecordInfo_AddRef(IRecordInfo *iface)
Definition: vartest.c:331
static void expect_NumFromStr(int line, HRESULT hres, NUMPARSE *np, INT a, ULONG b, ULONG c, INT d, INT e, INT f)
Definition: vartest.c:1235
#define DEFINE_EXPECT(func)
Definition: vartest.c:157
#define MKDOSDATE(d, m, y)
Definition: vartest.c:2854
#define SKIPTESTAND(a)
Definition: vartest.c:6862
#define EXPECT_I1(val)
Definition: vartest.c:2455
#define MKDOSTIME(h, m, s)
Definition: vartest.c:2855
#define EXPECT2(a, b)
Definition: vartest.c:1257
#define DT2UD(dt, flags, r, d, m, y, h, mn, s, ms, dw, dy)
Definition: vartest.c:2672
#define EXPECT_UI2(val)
Definition: vartest.c:2461
#define R4_MIN
Definition: vartest.c:153
#define DOS2DT(d, m, y, h, mn, s, r, dt)
Definition: vartest.c:2871
static const IRecordInfoVtbl RecordInfoVtbl
Definition: vartest.c:456
static void test_VarAbs(void)
Definition: vartest.c:2981
static void test_VarDateFromUdate(void)
Definition: vartest.c:2729
#define DT2ST(dt, r, d, m, y, h, mn, s, ms)
Definition: vartest.c:2846
#define CONVERTN(str, dig, flags)
Definition: vartest.c:1252
#define EXPECT_I8(val)
Definition: vartest.c:2467
static void test_VarCat(void)
Definition: vartest.c:6446
static void test_SystemTimeToVariantTime(void)
Definition: vartest.c:2806
#define VARIDIV(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:8686
#define VARDIV(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:8312
static BOOL WINAPI RecordInfo_IsMatchingType(IRecordInfo *iface, IRecordInfo *info2)
Definition: vartest.c:431
static HRESULT WINAPI DummyDispatch_Invoke(IDispatch *iface, DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, UINT *arg_err)
Definition: vartest.c:240
#define EQ_FLOAT(a, b)
Definition: vartest.c:125
static void test_VariantTimeToDosDateTime(void)
Definition: vartest.c:2959
static HRESULT WINAPI DummyDispatch_GetTypeInfo(IDispatch *iface, UINT tinfo, LCID lcid, ITypeInfo **ti)
Definition: vartest.c:227
static void test_DateFromUDate(int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms, WORD dw, WORD dy, ULONG flags, HRESULT r, DATE dt)
Definition: vartest.c:2707
#define VAROR(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:5205
#define SKIPTESTDIV(a)
Definition: vartest.c:8319
static HRESULT WINAPI RecordInfo_GetSize(IRecordInfo *iface, ULONG *size)
Definition: vartest.c:382
#define VARNOT(vt, val, rvt, rval)
Definition: vartest.c:3084
#define I4_MIN
Definition: vartest.c:143
static HRESULT WINAPI RecordInfo_GetGuid(IRecordInfo *iface, GUID *pguid)
Definition: vartest.c:370
static void init_test_dispatch(VARTYPE vt, DummyDispatch *dispatch)
Definition: vartest.c:294
static HRESULT wconvert_str(const OLECHAR *str, INT dig, ULONG npflags, NUMPARSE *np, BYTE rgb[128], LCID lcid, ULONG flags)
Definition: vartest.c:1217
static PVOID WINAPI RecordInfo_RecordCreate(IRecordInfo *iface)
Definition: vartest.c:437
static HRESULT WINAPI RecordInfo_GetField(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: vartest.c:396
static test_VariantClearImpl test_myVariantClearImpl
Definition: vartest.c:715
static void test_VariantCopy(void)
Definition: vartest.c:856
static void test_VarXor(void)
Definition: vartest.c:4483
static HRESULT WINAPI RecordInfo_GetFieldNoCopy(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
Definition: vartest.c:403
#define INTEGER_VTBITS
static LPVARIANT
Definition: vartest.c:2974
#define SKIPTESTIDIV(a)
Definition: vartest.c:8693
#define EXPECT_I2(val)
Definition: vartest.c:2459
#define CONVERT(str, flags)
Definition: vartest.c:2446
#define VARMUL(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:6085
static BOOL IsValidVariantCopyIndVT(VARTYPE vt, VARTYPE extraFlags)
Definition: vartest.c:1002
#define test_bstr_var(a, b)
Definition: vartest.c:614
static const WCHAR sz12[]
Definition: vartest.c:109
static void test_VarUdateFromDate(void)
Definition: vartest.c:2674
#define VARCMPEX(vt1, val1, vt2, val2, res1, res2, res3, res4)
Definition: vartest.c:7552
static void test_VarImp(void)
Definition: vartest.c:9264
static HRESULT WINAPI DummyDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
Definition: vartest.c:221
static void test_VarParseNumFromStrFr(void)
Definition: vartest.c:1905
static WCHAR sz12_false[32]
Definition: vartest.c:111
#define VARINT(vt, val, rvt, rval)
Definition: vartest.c:4069
#define VARFIX(vt, val, rvt, rval)
Definition: vartest.c:3955
static void test_VarNumFromParseNum(void)
Definition: vartest.c:2485
static HRESULT WINAPI RecordInfo_GetName(IRecordInfo *iface, BSTR *pbstrName)
Definition: vartest.c:376
#define CHECK_CALLED(func)
Definition: vartest.c:175
static const struct decimal_round_t decimal_round_data[]
Definition: vartest.c:4335
static void test_VarParseNumFromStrEn(void)
Definition: vartest.c:1259
static ULONG WINAPI VC_Release(LPUNKNOWN iface)
Definition: vartest.c:702
static void test_VarSub(void)
Definition: vartest.c:3217
#define VARNEG(vt, val, rvt, rval)
Definition: vartest.c:4184
#define R8_MIN
Definition: vartest.c:155
#define VAREQV(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:5946
#define DATE_MIN
Definition: vartest.c:151
#define VARSUB(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:3211
static HRESULT WINAPI VC_QueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID *ppobj)
Definition: vartest.c:689
static HRESULT WINAPI RecordInfo_QueryInterface(IRecordInfo *iface, REFIID riid, void **obj)
Definition: vartest.c:316
#define VARXOR(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:4471
#define EXPECT_CY(val)
Definition: vartest.c:2476
#define DT2DOS(dt, r, d, m, y, h, mn, s)
Definition: vartest.c:2957
static BOOL IsValidVariantClearVT(VARTYPE vt, VARTYPE extraFlags)
Definition: vartest.c:659
#define R8_MAX
Definition: vartest.c:154
static void test_VarEqv(void)
Definition: vartest.c:5952
#define VARORCY(vt1, val1, val2, rvt, rval)
Definition: vartest.c:5211
static void test_VariantInit(void)
Definition: vartest.c:623
static HRESULT WINAPI RecordInfo_RecordInit(IRecordInfo *iface, PVOID pvNew)
Definition: vartest.c:348
#define FAILDIG
Definition: vartest.c:1215
static HRESULT WINAPI DummyDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppvObject)
Definition: vartest.c:205
#define SKIPTESTPOW(a)
Definition: vartest.c:7799
#define WCONVERT(str, flags)
Definition: vartest.c:1251
#define _VARCMP(vt1, val1, vtfl1, vt2, val2, vtfl2, lcid, flags, result)
Definition: vartest.c:7548
static void test_VariantClear(void)
Definition: vartest.c:717
#define VARAND(vt1, val1, vt2, val2, rvt, rval)
Definition: vartest.c:6849
#define ST2DT(d, m, y, h, mn, s, ms, r, dt, dt2)
Definition: vartest.c:2804
static void test_var_call1(int line, HRESULT(WINAPI *func)(LPVARIANT, LPVARIANT), VARIANT *arg, VARIANT *expected)
Definition: vartest.c:576
static HRESULT WINAPI RecordInfo_PutField(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: vartest.c:410
#define SKIPTESTIMP(a)
Definition: vartest.c:9257
static const IDispatchVtbl DummyDispatch_VTable
Definition: vartest.c:283
#define V_EMPTY(v)
Definition: vartest.c:130
static const char * szFailOverflow
Definition: vartest.c:2449
#define VARMOD(vt1, vt2, val1, val2, rvt, rval)
Definition: vartest.c:3462
static DummyDispatch * impl_from_IDispatch(IDispatch *iface)
Definition: vartest.c:190
static const IUnknownVtbl test_VariantClear_vtbl
Definition: vartest.c:709
static void test_Mod(int line, VARIANT *left, VARIANT *right, VARIANT *expected, HRESULT expres)
Definition: vartest.c:3441
static HRESULT WINAPI RecordInfo_PutFieldNoCopy(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: vartest.c:417
#define EXPECT_OVERFLOW
Definition: vartest.c:2450
#define VARANDCY(vt1, val1, val2, rvt, rval)
Definition: vartest.c:6855
#define EXPECT_DECIMAL(valHi, valMid, valLo)
Definition: vartest.c:2479
#define UD2T(d, m, y, h, mn, s, ms, dw, dy, flags, r, dt)
Definition: vartest.c:2727
static void setdec(DECIMAL *dec, BYTE scl, BYTE sgn, ULONG hi32, ULONG64 lo64)
Definition: vartest.c:518
static void test_UdateFromDate(int line, DATE dt, ULONG flags, HRESULT r, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, WORD ms, WORD dw, WORD dy)
Definition: vartest.c:2656
static void test_DosDateTimeToVariantTime(void)
Definition: vartest.c:2873
static void test_VarDiv(void)
Definition: vartest.c:8329
#define VARCMP(vt1, val1, vt2, val2, result)
Definition: vartest.c:7556
#define CHECKPTR(func)
Definition: vartest.c:115
static HRESULT convert_str(const char *str, INT dig, ULONG flags, NUMPARSE *np, BYTE rgb[128], LCID lcid)
Definition: vartest.c:1227
static void test_VarMod(void)
Definition: vartest.c:3474
static IRecordInfoImpl * get_test_recordinfo(void)
Definition: vartest.c:479
#define VARMOD2(vt1, vt2, val1, val2, rvt, rval, hexpected)
Definition: vartest.c:3468
#define EXPECT_R8(val)
Definition: vartest.c:2473
static void test_dos2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn, WORD s, INT r, double dt)
Definition: vartest.c:2857
static HRESULT WINAPI RecordInfo_RecordCopy(IRecordInfo *iface, void *src, void *dest)
Definition: vartest.c:362
#define SKIPTESTS(a)
Definition: vartest.c:127
#define UI1_MAX
Definition: vartest.c:136
#define EQ_DOUBLE(a, b)
Definition: vartest.c:124
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
_In_ ULONG _In_ ULONG rgb
Definition: winddi.h:3521
void * arg
Definition: msvc.h:10
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_OVERFLOW
Definition: winerror.h:3622
#define DISP_E_BADVARTYPE
Definition: winerror.h:3620
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:3617
#define DISP_E_DIVBYZERO
Definition: winerror.h:3630
#define LOCALE_SDECIMAL
Definition: winnls.h:52
#define LOCALE_SSHORTDATE
Definition: winnls.h:70
#define LOCALE_SMONDECIMALSEP
Definition: winnls.h:61
#define LOCALE_SMONTHOUSANDSEP
Definition: winnls.h:62
#define LOCALE_NOUSEROVERRIDE
Definition: winnls.h:19
#define LOCALE_STHOUSAND
Definition: winnls.h:53
#define LOCALE_SCURRENCY
Definition: winnls.h:59
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
unsigned char BYTE
Definition: xxhash.c:193