32DEFINE_GUID(UUID_test_struct, 0x4029f190, 0xca4a, 0x4611, 0xae,0xb9,0x67,0x39,0x83,0xcb,0x96,0xdd);
39# define HAS_UINT64_TO_FLOAT
42# define HAS_UINT64_TO_FLOAT
47# define HAS_UINT64_TO_FLOAT
61#define IS_MODERN_VTYPE(vt) (vt==VT_VARIANT||vt==VT_DECIMAL|| \
62 vt==VT_I1||vt==VT_UI2||vt==VT_UI4||vt == VT_INT||vt == VT_UINT)
65#define CONVVARS(typ) HRESULT hres; CONV_TYPE out; typ in
67#define _EXPECT_NO_OUT(res) ok(hres == res, "expected " #res ", got hres=0x%08x\n", hres)
68#define EXPECT_OVERFLOW _EXPECT_NO_OUT(DISP_E_OVERFLOW)
69#define EXPECT_MISMATCH _EXPECT_NO_OUT(DISP_E_TYPEMISMATCH)
70#define EXPECT_BADVAR _EXPECT_NO_OUT(DISP_E_BADVARTYPE)
71#define EXPECT_INVALID _EXPECT_NO_OUT(E_INVALIDARG)
72#define EXPECT_LT _EXPECT_NO_OUT(VARCMP_LT)
73#define EXPECT_GT _EXPECT_NO_OUT(VARCMP_GT)
74#define EXPECT_EQ _EXPECT_NO_OUT(VARCMP_EQ)
76#define _EXPECTRES(res, x, fs) \
77 ok(hres == S_OK && out == (CONV_TYPE)(x), "expected " #x ", got " fs "; hres=0x%08x\n", out, hres)
78#define EXPECT(x) EXPECTRES(S_OK, (x))
79#define EXPECT_DBL(x) \
80 ok(hres == S_OK && fabs(out-(x))<=1e-14*(x), "expected %16.16g, got %16.16g; hres=0x%08x\n", (x), out, hres)
82#define CONVERT(func, val) in = val; hres = func(in, &out)
83#define CONVERTRANGE(func,start,end) for (i = start; i < end; i+=1) { CONVERT(func, i); EXPECT(i); };
84#define OVERFLOWRANGE(func,start,end) for (i = start; i < end; i+=1) { CONVERT(func, i); EXPECT_OVERFLOW; };
86#define CY_MULTIPLIER 10000
88#define DATE_MIN -657434
89#define DATE_MAX 2958465
91#define CONVERT_I8(func,hi,lo) in = hi; in = (in << 32) | lo; hres = func(in, &out)
93#define CONVERT_CY(func,val) in.int64 = (LONGLONG)(val * CY_MULTIPLIER); hres = func(in, &out)
95#define CONVERT_CY64(func,hi,lo) S(in).Hi = hi; S(in).Lo = lo; in.int64 *= CY_MULTIPLIER; hres = func(in, &out)
97#define SETDEC(dec, scl, sgn, hi, lo) S(U(dec)).scale = (BYTE)scl; S(U(dec)).sign = (BYTE)sgn; \
98 dec.Hi32 = (ULONG)hi; U1(dec).Lo64 = (ULONG64)lo
100#define SETDEC64(dec, scl, sgn, hi, mid, lo) S(U(dec)).scale = (BYTE)scl; S(U(dec)).sign = (BYTE)sgn; \
101 dec.Hi32 = (ULONG)hi; S1(U1(dec)).Mid32 = mid; S1(U1(dec)).Lo32 = lo;
103#define CONVERT_DEC(func,scl,sgn,hi,lo) SETDEC(in,scl,sgn,hi,lo); hres = func(&in, &out)
105#define CONVERT_DEC64(func,scl,sgn,hi,mid,lo) SETDEC64(in,scl,sgn,hi,mid,lo); hres = func(&in, &out)
107#define CONVERT_BADDEC(func) \
108 CONVERT_DEC(func,29,0,0,0); EXPECT_INVALID; \
109 CONVERT_DEC(func,0,0x1,0,0); EXPECT_INVALID; \
110 CONVERT_DEC(func,0,0x40,0,0); EXPECT_INVALID; \
111 CONVERT_DEC(func,0,0x7f,0,0); EXPECT_INVALID;
113#define CONVERT_STR(func,str,flags) \
115 if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,ARRAY_SIZE(buff)); \
116 hres = func(str ? buff : NULL,in,flags,&out)
118#define COPYTEST(val, vt, srcval, dstval, srcref, dstref, fs) do { \
119 HRESULT hres; VARIANTARG vSrc, vDst; CONV_TYPE in = val; \
120 VariantInit(&vSrc); VariantInit(&vDst); \
121 V_VT(&vSrc) = vt; srcval = in; \
122 hres = VariantCopy(&vDst, &vSrc); \
123 ok(hres == S_OK && V_VT(&vDst) == vt && dstval == in, \
124 "copy hres 0x%X, type %d, value (" fs ") " fs "\n", hres, V_VT(&vDst), val, dstval); \
125 V_VT(&vSrc) = vt|VT_BYREF; srcref = ∈ \
126 hres = VariantCopy(&vDst, &vSrc); \
127 ok(hres == S_OK && V_VT(&vDst) == (vt|VT_BYREF) && dstref == &in, \
128 "ref hres 0x%X, type %d, ref (%p) %p\n", hres, V_VT(&vDst), &in, dstref); \
129 hres = VariantCopyInd(&vDst, &vSrc); \
130 ok(hres == S_OK && V_VT(&vDst) == vt && dstval == in, \
131 "ind hres 0x%X, type %d, value (" fs ") " fs "\n", hres, V_VT(&vDst), val, dstval); \
134#define CHANGETYPEEX(typ) hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, typ)
136#define TYPETEST(typ,res,fs) CHANGETYPEEX(typ); \
137 ok(hres == S_OK && V_VT(&vDst) == typ && (CONV_TYPE)res == in, \
138 "hres=0x%X, type=%d (should be %d(" #typ ")), value=" fs " (should be " fs ")\n", \
139 hres, V_VT(&vDst), typ, (CONV_TYPE)res, in);
140#define TYPETESTI8(typ,res) CHANGETYPEEX(typ); \
141 ok(hres == S_OK && V_VT(&vDst) == typ && (CONV_TYPE)res == in, \
142 "hres=0x%X, type=%d (should be %d(" #typ ")), value=%d (should be 1)\n", \
143 hres, V_VT(&vDst), typ, (int)res);
144#define BADVAR(typ) CHANGETYPEEX(typ); EXPECT_BADVAR
145#define MISMATCH(typ) CHANGETYPEEX(typ); EXPECT_MISMATCH
147#define INITIAL_TYPETEST(vt, val, fs) \
148 VariantInit(&vSrc); \
149 VariantInit(&vDst); \
152 TYPETEST(VT_I1, V_I1(&vDst), fs); \
153 TYPETEST(VT_UI2, V_UI2(&vDst), fs); \
154 TYPETEST(VT_UI4, V_UI4(&vDst), fs); \
155 TYPETEST(VT_INT, V_INT(&vDst), fs); \
156 TYPETEST(VT_UINT, V_UINT(&vDst), fs); \
157 TYPETEST(VT_UI1, V_UI1(&vDst), fs); \
158 TYPETEST(VT_I2, V_I2(&vDst), fs); \
159 TYPETEST(VT_I4, V_I4(&vDst), fs); \
160 TYPETEST(VT_R4, V_R4(&vDst), fs); \
161 TYPETEST(VT_R8, V_R8(&vDst), fs); \
162 TYPETEST(VT_DATE, V_DATE(&vDst), fs); \
165 TYPETEST(VT_I8, V_I8(&vDst), fs); \
166 TYPETEST(VT_UI8, V_UI8(&vDst), fs); \
168#define NEGATIVE_TYPETEST(vt, val, fs, vtneg, valneg) \
170 VariantInit(&vSrc); \
171 VariantInit(&vDst); \
174 TYPETEST(vtneg, valneg(&vDst), fs);
176#define INITIAL_TYPETESTI8(vt, val) \
177 VariantInit(&vSrc); \
178 VariantInit(&vDst); \
181 TYPETESTI8(VT_I1, V_I1(&vDst)); \
182 TYPETESTI8(VT_UI1, V_UI1(&vDst)); \
183 TYPETESTI8(VT_I2, V_I2(&vDst)); \
184 TYPETESTI8(VT_UI2, V_UI2(&vDst)); \
185 TYPETESTI8(VT_I4, V_I4(&vDst)); \
186 TYPETESTI8(VT_UI4, V_UI4(&vDst)); \
187 TYPETESTI8(VT_INT, V_INT(&vDst)); \
188 TYPETESTI8(VT_UINT, V_UINT(&vDst)); \
189 TYPETESTI8(VT_R4, V_R4(&vDst)); \
190 TYPETESTI8(VT_R8, V_R8(&vDst)); \
191 TYPETESTI8(VT_DATE, V_DATE(&vDst)); \
192 TYPETESTI8(VT_I8, V_I8(&vDst)); \
193 TYPETESTI8(VT_UI8, V_UI8(&vDst))
195#define COMMON_TYPETEST \
196 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_BOOL); \
197 ok(hres == S_OK && V_VT(&vDst) == VT_BOOL && \
198 (V_BOOL(&vDst) == VARIANT_TRUE || (V_VT(&vSrc) == VT_BOOL && V_BOOL(&vDst) == 1)), \
199 "->VT_BOOL hres=0x%X, type=%d (should be VT_BOOL), value %d (should be VARIANT_TRUE)\n", \
200 hres, V_VT(&vDst), V_BOOL(&vDst)); \
201 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_CY); \
202 ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == CY_MULTIPLIER, \
203 "->VT_CY hres=0x%X, type=%d (should be VT_CY), value (%08x,%08x) (should be CY_MULTIPLIER)\n", \
204 hres, V_VT(&vDst), S(V_CY(&vDst)).Hi, S(V_CY(&vDst)).Lo); \
205 if (V_VT(&vSrc) != VT_DATE) \
207 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_BSTR); \
208 ok(hres == S_OK && V_VT(&vDst) == VT_BSTR && \
209 V_BSTR(&vDst) && V_BSTR(&vDst)[0] == '1' && V_BSTR(&vDst)[1] == '\0', \
210 "->VT_BSTR hres=0x%X, type=%d (should be VT_BSTR), *bstr='%c'\n", \
211 hres, V_VT(&vDst), V_BSTR(&vDst) ? *V_BSTR(&vDst) : '?'); \
213 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_DECIMAL); \
214 ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && \
215 S(U(V_DECIMAL(&vDst))).sign == 0 && S(U(V_DECIMAL(&vDst))).scale == 0 && \
216 V_DECIMAL(&vDst).Hi32 == 0 && U1(V_DECIMAL(&vDst)).Lo64 == (ULONGLONG)in, \
217 "->VT_DECIMAL hres=0x%X, type=%d (should be VT_DECIMAL), sign=%d, scale=%d, hi=%u, lo=(%8x %8x),\n", \
218 hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign, S(U(V_DECIMAL(&vDst))).scale, \
219 V_DECIMAL(&vDst).Hi32, S1(U1(V_DECIMAL(&vDst))).Mid32, S1(U1(V_DECIMAL(&vDst))).Lo32); \
220 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_EMPTY); \
221 ok(hres == S_OK && V_VT(&vDst) == VT_EMPTY, "->VT_EMPTY hres=0x%X, type=%d (should be VT_EMPTY)\n", hres, V_VT(&vDst)); \
222 hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_NULL); \
223 ok(hres == S_OK && V_VT(&vDst) == VT_NULL, "->VT_NULL hres=0x%X, type=%d (should be VT_NULL)\n", hres, V_VT(&vDst)); \
224 MISMATCH(VT_DISPATCH); \
225 MISMATCH(VT_ERROR); \
226 MISMATCH(VT_UNKNOWN); \
227 MISMATCH(VT_VARIANT); \
228 MISMATCH(VT_RECORD); \
230 BADVAR(VT_HRESULT); \
231 BADVAR(VT_SAFEARRAY); \
233 BADVAR(VT_USERDEFINED); \
237 BADVAR(VT_INT_PTR); \
238 BADVAR(VT_UINT_PTR); \
239 BADVAR(VT_FILETIME); \
242 BADVAR(VT_STORAGE); \
243 BADVAR(VT_STREAMED_OBJECT); \
244 BADVAR(VT_STORED_OBJECT); \
245 BADVAR(VT_BLOB_OBJECT); \
250#define DEFINE_EXPECT(func) \
251 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
253#define SET_EXPECT(func) \
254 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
256#define CHECK_EXPECT2(func) \
258 ok(expect_ ##func, "unexpected call " #func "\n"); \
259 called_ ## func = TRUE; \
262#define CHECK_EXPECT(func) \
264 CHECK_EXPECT2(func); \
265 expect_ ## func = FALSE; \
268#define CHECK_CALLED(func) \
270 ok(called_ ## func, "expected " #func "\n"); \
271 expect_ ## func = called_ ## func = FALSE; \
318 IDispatch_AddRef(iface);
326 ok(0,
"Unexpected call\n");
332 ok(0,
"Unexpected call\n");
339 ok(0,
"Unexpected call\n");
355 ok(dispid == DISPID_VALUE,
"got dispid %d\n", dispid);
366 ok(ei ==
NULL,
"got %p\n", ei);
367 ok(arg_err ==
NULL,
"got %p\n", arg_err);
369 if (
This->bFailInvoke)
405#define CONV_TYPE signed char
407#define EXPECTRES(res, x) _EXPECTRES(res, x, "%d")
643#define CONV_TYPE BYTE
937#define CONV_TYPE SHORT
1173#define CONV_TYPE USHORT
1406#define CONV_TYPE LONG
1637#define CONV_TYPE ULONG
1639#define EXPECTRES(res, x) _EXPECTRES(res, x, "%u")
1863#define CONV_TYPE LONG64
1865#define EXPECTI8(x) \
1866 ok((hres == S_OK && out == (CONV_TYPE)(x)), \
1867 "expected " #x "(%u,%u), got (%u,%u); hres=0x%08x\n", \
1868 (ULONG)((LONG64)(x) >> 32), (ULONG)((x) & 0xffffffff), \
1869 (ULONG)(out >> 32), (ULONG)(out & 0xffffffff), hres)
1871#define EXPECTI864(x,y) \
1872 ok(hres == S_OK && (out >> 32) == (CONV_TYPE)(x) && (out & 0xffffffff) == (CONV_TYPE)(y), \
1873 "expected " #x "(%u,%u), got (%u,%u); hres=0x%08x\n", \
1874 (ULONG)(x), (ULONG)(y), \
1875 (ULONG)(out >> 32), (ULONG)(out & 0xffffffff), hres)
1882 for (
i = -128;
i < 128;
i++)
1893 for (
i = 0;
i < 256;
i++)
1904 for (
i = -32768;
i < 32768;
i++)
1915 for (
i = -0;
i < 65535;
i++)
1995 for (
i = -32768;
i < 32768;
i++)
2077 win_skip(
"I8 and UI8 data types are not available\n");
2087 "copy hres 0x%X, type %d, value (%x%08x) %x%08x\n",
2093 "ref hres 0x%X, type %d, ref (%p) %p\n",
hres,
V_VT(&vDst), &
in,
V_I8REF(&vDst));
2096 "copy hres 0x%X, type %d, value (%x%08x) %x%08x\n",
2108 win_skip(
"I8 and UI8 data types are not available\n");
2120#define CONV_TYPE ULONG64
2127 for (
i = -128;
i < 128;
i++)
2142 for (
i = 0;
i < 256;
i++)
2153 for (
i = -32768;
i < 32768;
i++)
2168 for (
i = 0;
i < 65535;
i++)
2244 for (
i = -32768;
i < 32768;
i++)
2331 win_skip(
"I8 and UI8 data types are not available\n");
2341 "copy hres 0x%X, type %d, value (%x%08x) %x%08x\n",
2350 "copy hres 0x%X, type %d, value (%x%08x) %x%08x\n",
2362 win_skip(
"I8 and UI8 data types are not available\n");
2377#define CONV_TYPE float
2379#define EXPECTRES(res, x) _EXPECTRES(res, x, "%15.15f")
2430#if defined(__i386__) && (defined(_MSC_VER) || defined(__GNUC__))
2549#ifdef HAS_UINT64_TO_FLOAT
2566#define CONV_TYPE double
2669#if defined(__i386__) && (defined(_MSC_VER) || defined(__GNUC__))
2680#if defined(__i386__) && (defined(_MSC_VER) || defined(__GNUC__))
2744#ifdef HAS_UINT64_TO_FLOAT
2756#define MATHRND(l, r) left = l; right = r; hres = VarR8Round(left, right, &out)
2793#define CONV_TYPE DATE
2946 buff[0] = '\0'; out = 0.0; \
2947 if (str) MultiByteToWideChar(CP_ACP,0,str,-1,buff,ARRAY_SIZE(buff)); \
2948 hres = VarDateFromStr(str ? buff : NULL,lcid,LOCALE_NOUSEROVERRIDE,&out)
2950#define MKRELDATE(day,mth) st.wMonth = mth; st.wDay = day; \
2951 SystemTimeToVariantTime(&st,&relative)
2956 "0.",
".0",
"-1.1",
"1.1-",
2957 "1;2;3",
"1*2*3",
"1@2@3",
"1#2#3",
"(1:2)",
"<1:2>",
"1|2|3",
2959 "0.60",
"24.00",
"0:60",
"24:00",
"1 2 am",
"1 am 2",
2960 "1.5 2",
"1 5.2",
"2 32 3",
"1 2 am 3",
2961 "1 2.3 4",
"1.2.3 4",
"1 2.3.4",
"1.2 3.4",
"1.2.3.4",
"1 2 3 4",
2962 "1 am 2 3.4",
"1 2 am 3.4",
"1.2 3 am 4",
"1.2 3 4 am",
2963 "1.2.3.4.5",
"1.2.3.4 5",
"1.2.3 4.5",
"1.2 3.4.5",
"1.2 3.4 5",
"1.2 3 4.5",
2964 "1 2.3.4.5",
"1 2.3.4 5",
"1 2.3 4.5",
"1 2.3 4 5",
"1 2 3.4 5",
"1 2 3 4 5",
2965 "1.2.3 4 am 5",
"1.2.3 4 5 am",
"1.2 3 am 4 5",
2966 "1.2 3 4 am 5",
"1.2 3 4 5 am",
"1 am 2 3.4.5",
"1 2 am 3.4.5",
2967 "1 am 2 3 4.5",
"1 2 am 3 4.5",
"1 2 3 am 4.5",
2969 "1.2.3.4.5.6",
"1.2.3.4.5 6",
"1.2.3.4 5.6",
"1.2.3.4 5 6",
"1.2.3 4.5.6",
2970 "1.2.3 4.5 6",
"1.2.3 4 5.6",
"1.2 3.4.5.6",
"1.2 3.4.5 6",
"1.2 3.4 5.6",
2971 "1.2 3.4 5 6",
"1.2 3 4.5.6",
"1.2 3 4.5 6",
"1.2 3 4 5.6",
"1.2 3 4 5 6",
2972 "1 2.3.4.5.6",
"1 2.3.4.5 6",
"1 2.3.4 5.6",
"1 2.3.4 5 6",
"1 2.3 4.5.6",
2975 "1 2.3 4.5 6",
"1 2.3 4 5.6",
"1 2.3 4 5 6",
"1 2 3.4.5.6",
"1 2 3.4.5 6",
2977 "1 2 3.4 5.6",
"1 2 3.4 5 6",
"1 2 3 4.5 6",
"1 2 3 4 5.6",
"1 2 3 4 5 6",
2980 "1.2.3 4 am 5 6",
"1.2.3 4 5 am 6",
"1.2.3 4 5 6 am",
"1 am 2 3 4.5.6",
2982 "1 2 am 3 4.5.6",
"1 2 3 am 4.5.6"
2993 OLECHAR with_ideographic_spaceW[] = {
'6',
'/',
'3',
'0',
'/',
'2',
'0',
'1',
'1',0x3000,
2994 '1',
':',
'2',
'0',
':',
'3',
'4',0 };
3111 DFS(
"6/30/2011 01:20:34 AM");
EXPECT_DBL(40724.05594907407);
3112 DFS(
"6/30/2011 01:20:34 PM");
EXPECT_DBL(40724.55594907407);
3146 static char buff[256];