32 DEFINE_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 45 # if defined(_mm_free) 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];
3153 static const WCHAR sz25570[] = {
3154 '1',
'/',
'2',
'/',
'1',
'9',
'7',
'0',
'\0' };
3155 static const WCHAR sz25570_2[] = {
3156 '1',
'/',
'2',
'/',
'7',
'0',
'\0' };
3157 static const WCHAR sz25570Nls[] = {
3158 '1',
'/',
'2',
'/',
'1',
'9',
'7',
'0',
' ',
'1',
'2',
':',
'0',
'0',
':',
'0',
'0',
' ',
'A',
'M',
'\0' };
3166 #ifdef HAS_UINT64_TO_FLOAT 3179 "hres=0x%X, type=%d (should be VT_BSTR), *bstr=%s\n",
3188 "hres=0x%X, type=%d (should be VT_BSTR), *bstr=%s\n",
3199 #define CONV_TYPE CY 3201 #define EXPECTCY(x) \ 3202 ok((hres == S_OK && out.int64 == (LONGLONG)(x*CY_MULTIPLIER)), \ 3203 "expected " #x "*CY_MULTIPLIER, got (%8x %8x); hres=0x%08x\n", S(out).Hi, S(out).Lo, hres) 3205 #define EXPECTCY64(x,y) \ 3206 ok(hres == S_OK && S(out).Hi == (LONG)x && S(out).Lo == y, \ 3207 "expected " #x " " #y " (%u,%u), got (%u,%u); hres=0x%08x\n", \ 3208 (ULONG)(x), (ULONG)(y), S(out).Hi, S(out).Lo, hres) 3215 for (
i = -128;
i < 128;
i++)
3226 for (
i = 0;
i < 256;
i++)
3237 for (
i = -16384;
i < 16384;
i++)
3248 for (
i = 0;
i < 32768;
i++)
3309 #if defined(__i386__) && (defined(_MSC_VER) || defined(__GNUC__))