[OLEAUT32_WINETEST]

* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60357
This commit is contained in:
Amine Khaldi 2013-09-26 14:00:56 +00:00
parent 17427e7cae
commit 7e8889c3eb
8 changed files with 2192 additions and 412 deletions

View file

@ -1,5 +1,4 @@
add_definitions(-D__ROS_LONG64__)
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
add_typelib(test_reg.idl test_tlb.idl tmarshal.idl)
add_idl_Headers(oleaut32_idlheaders test_reg.idl tmarshal.idl)
@ -20,17 +19,16 @@ list(APPEND SOURCE
${CMAKE_CURRENT_BINARY_DIR}/test_reg_i.c
${CMAKE_CURRENT_BINARY_DIR}/tmarshal_i.c)
add_executable(oleaut32_winetest ${SOURCE} tmarshal.rc)
target_link_libraries(oleaut32_winetest uuid wine)
set_module_type(oleaut32_winetest win32cui)
add_importlibs(oleaut32_winetest oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 msvcrt kernel32 ntdll)
set(tmarshal.rc_DEPS
${CMAKE_CURRENT_BINARY_DIR}/test_reg.tlb
${CMAKE_CURRENT_BINARY_DIR}/test_tlb.tlb
${CMAKE_CURRENT_BINARY_DIR}/tmarshal.tlb)
SET(tmarshal.rc_DEPS
${REACTOS_BINARY_DIR}/include/psdk/stdole2.tlb
${CMAKE_CURRENT_BINARY_DIR}/test_reg.tlb
${CMAKE_CURRENT_BINARY_DIR}/test_tlb.tlb
${CMAKE_CURRENT_BINARY_DIR}/tmarshal.tlb)
set_source_files_properties(tmarshal.rc PROPERTIES OBJECT_DEPENDS "${tmarshal.rc_DEPS}")
add_dependencies(oleaut32_winetest stdole2 oleaut32_typelibs oleaut32_idlheaders )
add_executable(oleaut32_winetest ${SOURCE} tmarshal.rc)
target_link_libraries(oleaut32_winetest uuid)
set_module_type(oleaut32_winetest win32cui)
add_importlibs(oleaut32_winetest oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 msvcrt kernel32 ntdll)
add_dependencies(oleaut32_winetest stdole2 oleaut32_typelibs oleaut32_idlheaders)
add_cd_file(TARGET oleaut32_winetest DESTINATION reactos/bin FOR all)

View file

@ -56,22 +56,10 @@ static SAFEARRAY* (WINAPI *pSafeArrayCreateVector)(VARTYPE,LONG,ULONG);
#define GETPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func)
/* Is a given function exported from oleaut32? */
#define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL)
/* Have IRecordInfo data type? */
#define HAVE_OLEAUT32_RECORD HAVE_FUNC(SafeArraySetRecordInfo)
/* Have R8 data type? */
#define HAVE_OLEAUT32_R8 HAVE_FUNC(VarR8FromI1)
/* Have I8/UI8 data type? */
#define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
/* Have the decimal type? */
#define HAVE_OLEAUT32_DECIMAL HAVE_FUNC(VarDecAdd)
/* Have INT_PTR/UINT_PTR type? */
static BOOL HAVE_OLEAUT32_INT_PTR;
/* very old version? */
#define IS_ANCIENT (!HAVE_FUNC(VarI1FromI2))
/* Has I8/UI8 data type? */
static BOOL has_i8;
/* Has INT_PTR/UINT_PTR type? */
static BOOL has_int_ptr;
#define START_REF_COUNT 1
#define RECORD_SIZE 64
@ -189,19 +177,17 @@ static DWORD SAFEARRAY_GetVTSize(VARTYPE vt)
case VT_UI4:
case VT_R4:
case VT_ERROR: return sizeof(LONG);
case VT_R8:
if (HAVE_OLEAUT32_R8)
return sizeof(LONG64);
case VT_R8: return sizeof(LONG64);
case VT_I8:
case VT_UI8:
if (HAVE_OLEAUT32_I8)
if (has_i8)
return sizeof(LONG64);
break;
case VT_INT:
case VT_UINT: return sizeof(INT);
case VT_INT_PTR:
case VT_UINT_PTR:
if (HAVE_OLEAUT32_INT_PTR)
if (has_int_ptr)
return sizeof(UINT_PTR);
break;
case VT_CY: return sizeof(CY);
@ -210,10 +196,7 @@ static DWORD SAFEARRAY_GetVTSize(VARTYPE vt)
case VT_DISPATCH: return sizeof(LPDISPATCH);
case VT_VARIANT: return sizeof(VARIANT);
case VT_UNKNOWN: return sizeof(LPUNKNOWN);
case VT_DECIMAL:
if (HAVE_OLEAUT32_DECIMAL)
return sizeof(DECIMAL);
break;
case VT_DECIMAL: return sizeof(DECIMAL);
}
return 0;
}
@ -230,13 +213,13 @@ static void check_for_VT_INT_PTR(void)
if (a) {
HRESULT hres;
trace("VT_INT_PTR is supported\n");
HAVE_OLEAUT32_INT_PTR = TRUE;
has_int_ptr = TRUE;
hres = SafeArrayDestroy(a);
ok(hres == S_OK, "got 0x%08x\n", hres);
}
else {
trace("VT_INT_PTR is not supported\n");
HAVE_OLEAUT32_INT_PTR = FALSE;
has_int_ptr = FALSE;
}
}
@ -345,7 +328,8 @@ static void test_safearray(void)
a->rgsabound[1].cElements = 4;
a->rgsabound[1].lLbound = 1;
a->cbElements = 2;
SafeArrayAllocData(a);
hres = SafeArrayAllocData(a);
ok(hres == S_OK, "SafeArrayAllocData failed with hres %x\n", hres);
indices[0] = 4;
indices[1] = 2;
@ -477,7 +461,7 @@ static void test_safearray(void)
ok(hres == S_OK,"SAD failed with hres %x\n", hres);
for (i=0;i<sizeof(vttypes)/sizeof(vttypes[0]);i++) {
if ((i == VT_I8 || i == VT_UI8) && HAVE_OLEAUT32_I8)
if ((i == VT_I8 || i == VT_UI8) && has_i8)
{
vttypes[i].elemsize = sizeof(LONG64);
}
@ -485,17 +469,12 @@ static void test_safearray(void)
a = SafeArrayCreate(vttypes[i].vt, 1, &bound);
ok((!a && !vttypes[i].elemsize) ||
(a && vttypes[i].elemsize == a->cbElements) ||
(IS_ANCIENT && (vttypes[i].vt == VT_DECIMAL || vttypes[i].vt == VT_I1 ||
vttypes[i].vt == VT_UI2 || vttypes[i].vt == VT_UI4 || vttypes[i].vt == VT_INT ||
vttypes[i].vt == VT_UINT)),
(a && vttypes[i].elemsize == a->cbElements),
"SAC(%d,1,[1,0]), %p result %d, expected %d\n",
vttypes[i].vt,a,(a?a->cbElements:0),vttypes[i].elemsize);
if (a)
{
if (!HAVE_OLEAUT32_RECORD)
vttypes[i].expflags = 0;
ok(a->fFeatures == (vttypes[i].expflags | vttypes[i].addflags),
"SAC of %d returned feature flags %x, expected %x\n",
vttypes[i].vt, a->fFeatures,
@ -688,8 +667,7 @@ static void test_SafeArrayAllocDestroyDescriptor(void)
ok(hres == E_INVALIDARG, "0 dimensions gave hres 0x%x\n", hres);
hres = SafeArrayAllocDescriptor(65536, &sa);
ok(IS_ANCIENT || hres == E_INVALIDARG,
"65536 dimensions gave hres 0x%x\n", hres);
ok(hres == E_INVALIDARG, "65536 dimensions gave hres 0x%x\n", hres);
if (0)
{
@ -761,7 +739,7 @@ static void test_SafeArrayCreateLockDestroy(void)
ok(sa == NULL, "NULL bounds didn't fail\n");
*/
sa = SafeArrayCreate(VT_UI1, 65536, sab);
ok(IS_ANCIENT || !sa, "Max bounds didn't fail\n");
ok(!sa, "Max bounds didn't fail\n");
memset(sab, 0, sizeof(sab));
@ -780,9 +758,7 @@ static void test_SafeArrayCreateLockDestroy(void)
sa = SafeArrayCreate(vt, dimension, sab);
if (dwLen)
ok(sa || (IS_ANCIENT && (vt == VT_DECIMAL || vt == VT_I1 || vt == VT_UI2 ||
vt == VT_UI4 || vt == VT_INT || vt == VT_UINT)),
"VARTYPE %d (@%d dimensions) failed\n", vt, dimension);
ok(sa != NULL, "VARTYPE %d (@%d dimensions) failed\n", vt, dimension);
else
ok(sa == NULL || vt == VT_R8,
"VARTYPE %d (@%d dimensions) succeeded!\n", vt, dimension);
@ -810,7 +786,7 @@ static void test_SafeArrayCreateLockDestroy(void)
{
VARTYPE aVt;
ok(IS_ANCIENT || sa->fFeatures & FADF_HAVEVARTYPE,
ok(sa->fFeatures & FADF_HAVEVARTYPE,
"Non interface type should have FADF_HAVEVARTYPE\n");
if (pSafeArrayGetVartype)
{
@ -822,8 +798,7 @@ static void test_SafeArrayCreateLockDestroy(void)
}
else
{
ok(IS_ANCIENT || sa->fFeatures & FADF_HAVEIID,
"Interface type should have FADF_HAVEIID\n");
ok(sa->fFeatures & FADF_HAVEIID, "Interface type should have FADF_HAVEIID\n");
if (pSafeArraySetIID)
{
hres = pSafeArraySetIID(sa, &IID_IUnknown);
@ -1813,6 +1788,8 @@ START_TEST(safearray)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
has_i8 = GetProcAddress(hOleaut32, "VarI8FromI1") != NULL;
GETPTR(SafeArrayAllocDescriptorEx);
GETPTR(SafeArrayCopyData);
GETPTR(SafeArrayGetIID);

View file

@ -160,6 +160,58 @@ static void end_host_object(DWORD tid, HANDLE thread)
CloseHandle(thread);
}
static int external_connections;
static BOOL expect_last_release_closes;
static HRESULT WINAPI ExternalConnection_QueryInterface(IExternalConnection *iface, REFIID riid, void **ppv)
{
ok(0, "unxpected call\n");
*ppv = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI ExternalConnection_AddRef(IExternalConnection *iface)
{
return 2;
}
static ULONG WINAPI ExternalConnection_Release(IExternalConnection *iface)
{
return 1;
}
static DWORD WINAPI ExternalConnection_AddConnection(IExternalConnection *iface, DWORD extconn, DWORD reserved)
{
trace("add connection\n");
ok(extconn == EXTCONN_STRONG, "extconn = %d\n", extconn);
ok(!reserved, "reserved = %x\n", reserved);
return ++external_connections;
}
static DWORD WINAPI ExternalConnection_ReleaseConnection(IExternalConnection *iface, DWORD extconn,
DWORD reserved, BOOL fLastReleaseCloses)
{
trace("release connection\n");
ok(extconn == EXTCONN_STRONG, "extconn = %d\n", extconn);
ok(!reserved, "reserved = %x\n", reserved);
ok(fLastReleaseCloses == expect_last_release_closes, "fLastReleaseCloses = %x, expected %x\n",
fLastReleaseCloses, expect_last_release_closes);
return --external_connections;
}
static const IExternalConnectionVtbl ExternalConnectionVtbl = {
ExternalConnection_QueryInterface,
ExternalConnection_AddRef,
ExternalConnection_Release,
ExternalConnection_AddConnection,
ExternalConnection_ReleaseConnection
};
static IExternalConnection ExternalConnection = { &ExternalConnectionVtbl };
static ItestDual TestDual, TestDualDisp;
static HRESULT WINAPI TestSecondIface_QueryInterface(ITestSecondIface *iface, REFIID riid, void **ppv)
@ -191,6 +243,67 @@ static const ITestSecondIfaceVtbl TestSecondIfaceVtbl = {
static ITestSecondIface TestSecondIface = { &TestSecondIfaceVtbl };
static HRESULT WINAPI TestSecondDisp_QueryInterface(ITestSecondDisp *iface, REFIID riid, void **ppv)
{
return ItestDual_QueryInterface(&TestDual, riid, ppv);
}
static ULONG WINAPI TestSecondDisp_AddRef(ITestSecondDisp *iface)
{
return 2;
}
static ULONG WINAPI TestSecondDisp_Release(ITestSecondDisp *iface)
{
return 1;
}
static HRESULT WINAPI TestSecondDisp_GetTypeInfoCount(ITestSecondDisp *iface, UINT *pctinfo)
{
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static HRESULT WINAPI TestSecondDisp_GetTypeInfo(ITestSecondDisp *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static HRESULT WINAPI TestSecondDisp_GetIDsOfNames(ITestSecondDisp *iface, REFIID riid, LPOLESTR *rgszNames,
UINT cNames, LCID lcid, DISPID *rgDispId)
{
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static HRESULT WINAPI TestSecondDisp_Invoke(ITestSecondDisp *iface, DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static HRESULT WINAPI TestSecondDisp_test(ITestSecondDisp *iface)
{
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static ITestSecondDispVtbl TestSecondDispVtbl = {
TestSecondDisp_QueryInterface,
TestSecondDisp_AddRef,
TestSecondDisp_Release,
TestSecondDisp_GetTypeInfoCount,
TestSecondDisp_GetTypeInfo,
TestSecondDisp_GetIDsOfNames,
TestSecondDisp_Invoke,
TestSecondDisp_test
};
static ITestSecondDisp TestSecondDisp = { &TestSecondDispVtbl };
static HRESULT WINAPI TestDual_QueryInterface(ItestDual *iface, REFIID riid, void **ppvObject)
{
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDispatch)) {
@ -202,6 +315,13 @@ static HRESULT WINAPI TestDual_QueryInterface(ItestDual *iface, REFIID riid, voi
}else if(IsEqualGUID(riid, &IID_ITestSecondIface)) {
*ppvObject = &TestSecondIface;
return S_OK;
}else if(IsEqualGUID(riid, &IID_ITestSecondDisp)) {
*ppvObject = &TestSecondDisp;
return S_OK;
}else if (IsEqualGUID(riid, &IID_IExternalConnection)) {
trace("QI external connection\n");
*ppvObject = &ExternalConnection;
return S_OK;
}
*ppvObject = NULL;
@ -884,7 +1004,7 @@ static ITypeInfo *get_type_info(REFIID riid)
ITypeLib *pTypeLib;
HRESULT hr;
hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &pTypeLib);
hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 5, LOCALE_NEUTRAL, &pTypeLib);
ok_ole_success(hr, LoadRegTypeLib);
if (FAILED(hr))
return NULL;
@ -1067,7 +1187,7 @@ static INonOleAutomation NonOleAutomation = { &NonOleAutomation_VTable };
static ITypeInfo *NonOleAutomation_GetTypeInfo(void)
{
ITypeLib *pTypeLib;
HRESULT hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &pTypeLib);
HRESULT hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 5, LOCALE_NEUTRAL, &pTypeLib);
ok_ole_success(hr, LoadRegTypeLib);
if (SUCCEEDED(hr))
{
@ -1696,7 +1816,7 @@ static void test_libattr(void)
HRESULT hr;
TLIBATTR *pattr;
hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &pTypeLib);
hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 5, LOCALE_NEUTRAL, &pTypeLib);
ok_ole_success(hr, LoadRegTypeLib);
if (FAILED(hr))
return;
@ -1713,6 +1833,112 @@ static void test_libattr(void)
ITypeLib_Release(pTypeLib);
}
static void test_external_connection(void)
{
IStream *stream, *stream2;
ITestSecondDisp *second;
ItestDual *iface;
HANDLE thread;
DWORD tid;
HRESULT hres;
static const LARGE_INTEGER zero;
trace("Testing IExternalConnection...\n");
external_connections = 0;
/* Marshaling an interface increases external connection count. */
expect_last_release_closes = FALSE;
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hres == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hres);
tid = start_host_object(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHLFLAGS_NORMAL, &thread);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoUnmarshalInterface(stream, &IID_ItestDual, (void**)&iface);
ok(hres == S_OK, "CoUnmarshalInterface failed: %08x\n", hres);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
IStream_Release(stream);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
/* Creating a stub for new iface causes new external connection. */
hres = ItestDual_QueryInterface(iface, &IID_ITestSecondDisp, (void**)&second);
ok(hres == S_OK, "Could not get ITestSecondDisp iface: %08x\n", hres);
todo_wine
ok(external_connections == 2, "external_connections = %d\n", external_connections);
ITestSecondDisp_Release(second);
todo_wine
ok(external_connections == 2, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
ItestDual_Release(iface);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
end_host_object(tid, thread);
/* A test with direct CoMarshalInterface call. */
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hres == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hres);
expect_last_release_closes = FALSE;
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
/* Two separated marshal data are still one external connection. */
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream2);
ok(hres == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hres);
expect_last_release_closes = FALSE;
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
hres = CoMarshalInterface(stream2, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 1, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
IStream_Seek(stream2, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream2);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
/* Weak table marshaling does not increment external connections */
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hres == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hres);
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoUnmarshalInterface(stream, &IID_ItestDual, (void**)&iface);
ok(hres == S_OK, "CoUnmarshalInterface failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
ItestDual_Release(iface);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
ok(external_connections == 0, "external_connections = %d\n", external_connections);
}
START_TEST(tmarshal)
{
HRESULT hr;
@ -1733,8 +1959,9 @@ START_TEST(tmarshal)
test_DispCallFunc();
test_StaticWidget();
test_libattr();
test_external_connection();
hr = UnRegisterTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL,
hr = UnRegisterTypeLib(&LIBID_TestTypelib, 2, 5, LOCALE_NEUTRAL,
sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
ok_ole_success(hr, UnRegisterTypeLib);

View file

@ -22,7 +22,7 @@ import "ocidl.idl";
[
uuid(d96d8a3e-78b6-4c8d-8f27-059db959be8a),
version(1.0),
version(2.5),
helpstring("Test Typelib")
]
library TestTypelib
@ -73,6 +73,17 @@ library TestTypelib
HRESULT test();
}
[
odl,
oleautomation,
dual,
uuid(3f7e06fe-0bce-46f0-8b7d-3a68393c7969)
]
interface ITestSecondDisp : IDispatch
{
HRESULT test();
}
[
odl,
uuid(a1f8cae3-c947-4c5f-b57d-c87b9b5f3586),

File diff suppressed because it is too large Load diff

View file

@ -48,11 +48,8 @@ static HRESULT (WINAPI *pVarFormatNumber)(LPVARIANT,int,int,int,int,ULONG,BSTR*)
static HRESULT (WINAPI *pVarFormat)(LPVARIANT,LPOLESTR,int,int,ULONG,BSTR*);
static HRESULT (WINAPI *pVarWeekdayName)(int,int,int,ULONG,BSTR*);
/* Have I8/UI8 data type? */
#define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
/* Is a given function exported from oleaut32? */
#define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL)
/* Has I8/UI8 data type? */
static BOOL has_i8;
/* Get a conversion function ptr, return if function not available */
#define CHECKPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func); \
@ -100,7 +97,7 @@ static void test_VarFormatNumber(void)
FMT_NUMBER(VT_UI2, V_UI2);
FMT_NUMBER(VT_I4, V_I4);
FMT_NUMBER(VT_UI4, V_UI4);
if (HAVE_OLEAUT32_I8)
if (has_i8)
{
FMT_NUMBER(VT_I8, V_I8);
FMT_NUMBER(VT_UI8, V_UI8);
@ -282,7 +279,7 @@ static void test_VarFormat(void)
VNUMFMT(VT_I1,V_I1);
VNUMFMT(VT_I2,V_I2);
VNUMFMT(VT_I4,V_I4);
if (HAVE_OLEAUT32_I8)
if (has_i8)
{
VNUMFMT(VT_I8,V_I8);
}
@ -290,7 +287,7 @@ static void test_VarFormat(void)
VNUMFMT(VT_UI1,V_UI1);
VNUMFMT(VT_UI2,V_UI2);
VNUMFMT(VT_UI4,V_UI4);
if (HAVE_OLEAUT32_I8)
if (has_i8)
{
VNUMFMT(VT_UI8,V_UI8);
}
@ -569,6 +566,8 @@ START_TEST(varformat)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
has_i8 = GetProcAddress(hOleaut32, "VarI8FromI1") != NULL;
test_VarFormatNumber();
test_VarFormat();
test_VarWeekdayName();

File diff suppressed because it is too large Load diff

View file

@ -56,21 +56,11 @@ static HMODULE hOleaut32;
if (!p##func) { \
win_skip("function " # func " not available, not testing it\n"); return; }
/* Is a given function exported from oleaut32? */
#define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL)
/* Has I8/UI8 data type? */
static BOOL has_i8;
/* Has proper locale conversions? */
static BOOL has_locales;
/* Have IRecordInfo data type? */
#define HAVE_OLEAUT32_RECORD HAVE_FUNC(SafeArraySetRecordInfo)
/* Have DECIMAL data type with new error checking? */
#define HAVE_OLEAUT32_DECIMAL HAVE_FUNC(VarDecAdd)
/* Have CY data type? */
#define HAVE_OLEAUT32_CY HAVE_FUNC(VarCyAdd)
/* Have I8/UI8 data type? */
#define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
/* Have proper locale conversions? */
#define HAVE_OLEAUT32_LOCALES (HAVE_FUNC(GetVarConversionLocaleSetting) && HAVE_OLEAUT32_I8)
/* Is this an ancient version with support for only I2/I4/R4/R8/DATE? */
#define IS_ANCIENT (!HAVE_FUNC(VarI1FromI2))
/* Is vt a type unavailable to ancient versions? */
#define IS_MODERN_VTYPE(vt) (vt==VT_VARIANT||vt==VT_DECIMAL|| \
vt==VT_I1||vt==VT_UI2||vt==VT_UI4||vt == VT_INT||vt == VT_UINT)
@ -119,13 +109,10 @@ static HMODULE hOleaut32;
#define CONVERT_DEC64(func,scl,sgn,hi,mid,lo) SETDEC64(in,scl,sgn,hi,mid,lo); hres = p##func(&in, &out)
#define CONVERT_BADDEC(func) \
if (HAVE_OLEAUT32_DECIMAL) \
{ \
CONVERT_DEC(func,29,0,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x1,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x40,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x7f,0,0); EXPECT_INVALID; \
}
CONVERT_DEC(func,29,0,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x1,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x40,0,0); EXPECT_INVALID; \
CONVERT_DEC(func,0,0x7f,0,0); EXPECT_INVALID;
#define CONVERT_STR(func,str,flags) \
SetLastError(0); \
@ -166,23 +153,18 @@ static HMODULE hOleaut32;
VariantInit(&vDst); \
V_VT(&vSrc) = vt; \
(val(&vSrc)) = in; \
if (!IS_ANCIENT) { \
TYPETEST(VT_I1, V_I1(&vDst), fs); \
TYPETEST(VT_UI2, V_UI2(&vDst), fs); \
TYPETEST(VT_UI4, V_UI4(&vDst), fs); \
TYPETEST(VT_INT, V_INT(&vDst), fs); \
TYPETEST(VT_UINT, V_UINT(&vDst), fs); \
} else { \
BADVAR(VT_I1); BADVAR(VT_UI2); BADVAR(VT_UI4); \
BADVAR(VT_INT); BADVAR(VT_UINT); \
} \
TYPETEST(VT_I1, V_I1(&vDst), fs); \
TYPETEST(VT_UI2, V_UI2(&vDst), fs); \
TYPETEST(VT_UI4, V_UI4(&vDst), fs); \
TYPETEST(VT_INT, V_INT(&vDst), fs); \
TYPETEST(VT_UINT, V_UINT(&vDst), fs); \
TYPETEST(VT_UI1, V_UI1(&vDst), fs); \
TYPETEST(VT_I2, V_I2(&vDst), fs); \
TYPETEST(VT_I4, V_I4(&vDst), fs); \
TYPETEST(VT_R4, V_R4(&vDst), fs); \
TYPETEST(VT_R8, V_R8(&vDst), fs); \
TYPETEST(VT_DATE, V_DATE(&vDst), fs); \
if (HAVE_OLEAUT32_I8) \
if (has_i8) \
{ \
TYPETEST(VT_I8, V_I8(&vDst), fs); \
TYPETEST(VT_UI8, V_UI8(&vDst), fs); \
@ -193,9 +175,7 @@ static HMODULE hOleaut32;
VariantInit(&vDst); \
V_VT(&vSrc) = vt; \
(val(&vSrc)) = in; \
if (!IS_ANCIENT) { \
TYPETEST(vtneg, valneg(&vDst), fs); \
}
TYPETEST(vtneg, valneg(&vDst), fs);
#define INITIAL_TYPETESTI8(vt, val) \
VariantInit(&vSrc); \
@ -222,13 +202,10 @@ static HMODULE hOleaut32;
(V_BOOL(&vDst) == VARIANT_TRUE || (V_VT(&vSrc) == VT_BOOL && V_BOOL(&vDst) == 1)), \
"->VT_BOOL hres=0x%X, type=%d (should be VT_BOOL), value %d (should be VARIANT_TRUE)\n", \
hres, V_VT(&vDst), V_BOOL(&vDst)); \
if (HAVE_OLEAUT32_CY) \
{ \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_CY); \
ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == CY_MULTIPLIER, \
"->VT_CY hres=0x%X, type=%d (should be VT_CY), value (%08x,%08x) (should be CY_MULTIPLIER)\n", \
hres, V_VT(&vDst), S(V_CY(&vDst)).Hi, S(V_CY(&vDst)).Lo); \
} \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_CY); \
ok(hres == S_OK && V_VT(&vDst) == VT_CY && V_CY(&vDst).int64 == CY_MULTIPLIER, \
"->VT_CY hres=0x%X, type=%d (should be VT_CY), value (%08x,%08x) (should be CY_MULTIPLIER)\n", \
hres, V_VT(&vDst), S(V_CY(&vDst)).Hi, S(V_CY(&vDst)).Lo); \
if (V_VT(&vSrc) != VT_DATE) \
{ \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_BSTR); \
@ -237,16 +214,13 @@ static HMODULE hOleaut32;
"->VT_BSTR hres=0x%X, type=%d (should be VT_BSTR), *bstr='%c'\n", \
hres, V_VT(&vDst), V_BSTR(&vDst) ? *V_BSTR(&vDst) : '?'); \
} \
if (HAVE_OLEAUT32_DECIMAL) \
{ \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_DECIMAL); \
ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && \
S(U(V_DECIMAL(&vDst))).sign == 0 && S(U(V_DECIMAL(&vDst))).scale == 0 && \
V_DECIMAL(&vDst).Hi32 == 0 && U1(V_DECIMAL(&vDst)).Lo64 == (ULONGLONG)in, \
"->VT_DECIMAL hres=0x%X, type=%d (should be VT_DECIMAL), sign=%d, scale=%d, hi=%u, lo=(%8x %8x),\n", \
hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign, S(U(V_DECIMAL(&vDst))).scale, \
V_DECIMAL(&vDst).Hi32, S1(U1(V_DECIMAL(&vDst))).Mid32, S1(U1(V_DECIMAL(&vDst))).Lo32); \
} \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_DECIMAL); \
ok(hres == S_OK && V_VT(&vDst) == VT_DECIMAL && \
S(U(V_DECIMAL(&vDst))).sign == 0 && S(U(V_DECIMAL(&vDst))).scale == 0 && \
V_DECIMAL(&vDst).Hi32 == 0 && U1(V_DECIMAL(&vDst)).Lo64 == (ULONGLONG)in, \
"->VT_DECIMAL hres=0x%X, type=%d (should be VT_DECIMAL), sign=%d, scale=%d, hi=%u, lo=(%8x %8x),\n", \
hres, V_VT(&vDst), S(U(V_DECIMAL(&vDst))).sign, S(U(V_DECIMAL(&vDst))).scale, \
V_DECIMAL(&vDst).Hi32, S1(U1(V_DECIMAL(&vDst))).Mid32, S1(U1(V_DECIMAL(&vDst))).Lo32); \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_EMPTY); \
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)); \
hres = VariantChangeTypeEx(&vDst, &vSrc, 0, 0, VT_NULL); \
@ -254,11 +228,8 @@ static HMODULE hOleaut32;
MISMATCH(VT_DISPATCH); \
MISMATCH(VT_ERROR); \
MISMATCH(VT_UNKNOWN); \
if (!IS_ANCIENT) { MISMATCH(VT_VARIANT); } else { BADVAR(VT_VARIANT); } \
if (HAVE_OLEAUT32_RECORD) \
{ \
MISMATCH(VT_RECORD); \
} \
MISMATCH(VT_VARIANT); \
MISMATCH(VT_RECORD); \
BADVAR(VT_VOID); \
BADVAR(VT_HRESULT); \
BADVAR(VT_SAFEARRAY); \
@ -488,6 +459,7 @@ static HRESULT (WINAPI *pVarDecSub)(const DECIMAL*,const DECIMAL*,DECIMAL*);
static HRESULT (WINAPI *pVarDecMul)(const DECIMAL*,const DECIMAL*,DECIMAL*);
static HRESULT (WINAPI *pVarDecDiv)(const DECIMAL*,const DECIMAL*,DECIMAL*);
static HRESULT (WINAPI *pVarDecCmp)(const DECIMAL*,const DECIMAL*);
static HRESULT (WINAPI *pVarDecCmpR8)(const DECIMAL*,double);
static HRESULT (WINAPI *pVarDecNeg)(const DECIMAL*,DECIMAL*);
static HRESULT (WINAPI *pVarBoolFromUI1)(BYTE,VARIANT_BOOL*);
@ -847,10 +819,7 @@ static void test_VarI1FromStr(void)
static void test_VarI1Copy(void)
{
if (!IS_ANCIENT)
{
COPYTEST(1, VT_I1, V_I1(&vSrc), V_I1(&vDst), V_I1REF(&vSrc), V_I1REF(&vDst), "%d");
}
COPYTEST(1, VT_I1, V_I1(&vSrc), V_I1(&vDst), V_I1REF(&vSrc), V_I1REF(&vDst), "%d");
}
static void test_VarI1ChangeTypeEx(void)
@ -861,12 +830,9 @@ static void test_VarI1ChangeTypeEx(void)
in = 1;
if (!IS_ANCIENT)
{
INITIAL_TYPETEST(VT_I1, V_I1, "%d");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_I1, V_I1, "%d", VT_UI1, V_UI1);
}
INITIAL_TYPETEST(VT_I1, V_I1, "%d");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_I1, V_I1, "%d", VT_UI1, V_UI1);
}
#undef CONV_TYPE
@ -1620,10 +1586,7 @@ static void test_VarUI2FromStr(void)
static void test_VarUI2Copy(void)
{
if (!IS_ANCIENT)
{
COPYTEST(1, VT_UI2, V_UI2(&vSrc), V_UI2(&vDst), V_UI2REF(&vSrc), V_UI2REF(&vDst), "%d");
}
COPYTEST(1, VT_UI2, V_UI2(&vSrc), V_UI2(&vDst), V_UI2REF(&vSrc), V_UI2REF(&vDst), "%d");
}
static void test_VarUI2ChangeTypeEx(void)
@ -1634,12 +1597,9 @@ static void test_VarUI2ChangeTypeEx(void)
in = 1;
if (!IS_ANCIENT)
{
INITIAL_TYPETEST(VT_UI2, V_UI2, "%d");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_UI2, V_UI2, "%d", VT_I2, V_I2);
}
INITIAL_TYPETEST(VT_UI2, V_UI2, "%d");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_UI2, V_UI2, "%d", VT_I2, V_I2);
}
/*
@ -2108,10 +2068,7 @@ static void test_VarUI4FromStr(void)
static void test_VarUI4Copy(void)
{
if (!IS_ANCIENT)
{
COPYTEST(1u, VT_UI4, V_UI4(&vSrc), V_UI4(&vDst), V_UI4REF(&vSrc), V_UI4REF(&vDst), "%u");
}
COPYTEST(1u, VT_UI4, V_UI4(&vSrc), V_UI4(&vDst), V_UI4REF(&vSrc), V_UI4REF(&vDst), "%u");
}
static void test_VarUI4ChangeTypeEx(void)
@ -2122,12 +2079,9 @@ static void test_VarUI4ChangeTypeEx(void)
in = 1;
if (!IS_ANCIENT)
{
INITIAL_TYPETEST(VT_UI4, V_UI4, "%u");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_UI4, V_UI4, "%u", VT_I4, V_I4);
}
INITIAL_TYPETEST(VT_UI4, V_UI4, "%u");
COMMON_TYPETEST;
NEGATIVE_TYPETEST(VT_UI4, V_UI4, "%u", VT_I4, V_I4);
}
/*
@ -2363,7 +2317,7 @@ static void test_VarI8Copy(void)
VARIANTARG vSrc, vDst;
LONGLONG in = 1;
if (!HAVE_OLEAUT32_I8)
if (!has_i8)
{
win_skip("I8 and UI8 data types are not available\n");
return;
@ -2394,7 +2348,7 @@ static void test_VarI8ChangeTypeEx(void)
LONG64 in;
VARIANTARG vSrc, vDst;
if (!HAVE_OLEAUT32_I8)
if (!has_i8)
{
win_skip("I8 and UI8 data types are not available\n");
return;
@ -2632,7 +2586,7 @@ static void test_VarUI8Copy(void)
VARIANTARG vSrc, vDst;
ULONGLONG in = 1;
if (!HAVE_OLEAUT32_I8)
if (!has_i8)
{
win_skip("I8 and UI8 data types are not available\n");
return;
@ -2663,7 +2617,7 @@ static void test_VarUI8ChangeTypeEx(void)
ULONG64 in;
VARIANTARG vSrc, vDst;
if (!HAVE_OLEAUT32_I8)
if (!has_i8)
{
win_skip("I8 and UI8 data types are not available\n");
return;
@ -3523,7 +3477,7 @@ static void test_VarDateChangeTypeEx(void)
VariantClear(&vDst);
lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
if (HAVE_OLEAUT32_LOCALES)
if (has_locales)
{
hres = VariantChangeTypeEx(&vDst, &vSrc, lcid, VARIANT_NOUSEROVERRIDE|VARIANT_USE_NLS, VT_BSTR);
ok(hres == S_OK && V_VT(&vDst) == VT_BSTR && V_BSTR(&vDst) && !lstrcmpW(V_BSTR(&vDst), sz25570Nls),
@ -4264,6 +4218,8 @@ static void test_VarDecFromCy(void)
#define MATH1(func) hres = p##func(&l, &out)
#undef MATH2
#define MATH2(func) hres = p##func(&l, &r, &out)
#undef MATH3
#define MATH3(func) hres = p##func(&l, r)
static void test_VarDecAbs(void)
{
@ -4338,6 +4294,9 @@ static void test_VarDecAdd(void)
ok(hres == DISP_E_OVERFLOW,"Expected overflow, got (%d,%d,%d,(%8x,%8x)x) hres 0x%08x\n",
S(U(out)).scale, S(U(out)).sign, out.Hi32, S1(U1(out)).Mid32, S1(U1(out)).Lo32, hres);
SETDEC(l,3,128,0,123456); SETDEC64(r,0,0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
MATH2(VarDecAdd); todo_wine EXPECTDEC64(0,0,-1,0xFFFFFFFF,0xFFFFFF84);
/* Promotes to the highest scale, so here the results are in the scale of 2 */
SETDEC(l,2,0,0,0); SETDEC(r,0,0,0,0); MATH2(VarDecAdd); EXPECTDEC(2,0,0,0);
SETDEC(l,2,0,0,100); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDEC(2,0,0,200);
@ -4558,6 +4517,38 @@ static void test_VarDecCmp(void)
SETDEC(out,0,DECIMAL_NEG,-1,-1); SETDEC(l,0,DECIMAL_NEG,0,0); MATH1(VarDecCmp); EXPECT_GT;
SETDEC(out,0,DECIMAL_NEG,-1,-1); SETDEC(l,0,DECIMAL_NEG,-1,-1); MATH1(VarDecCmp); EXPECT_EQ;
SETDEC(l,3,0,0,123456); SETDEC64(out,0,0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF);
MATH1(VarDecCmp); todo_wine EXPECT_LT;
}
static void test_VarDecCmpR8(void)
{
HRESULT hres;
DECIMAL l;
double r;
CHECKPTR(VarDecCmpR8);
SETDEC(l,0,0,0,1); r = 0.0; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,0,0,1); r = 0.1; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,0,0,1); r = -0.1; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,DECIMAL_NEG,0,1); r = 0.0; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,DECIMAL_NEG,0,1); r = 0.1; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,DECIMAL_NEG,0,1); r = -0.1; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,0,0,0); r = 0.0; MATH3(VarDecCmpR8); EXPECT_EQ;
SETDEC(l,0,0,0,0); r = 0.1; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,0,0,0); r = -0.1; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,DECIMAL_NEG,0,0); r = 0.0; MATH3(VarDecCmpR8); EXPECT_EQ;
SETDEC(l,0,DECIMAL_NEG,0,0); r = 0.1; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,DECIMAL_NEG,0,0); r = -0.1; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,0,0,1); r = DECIMAL_NEG; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,DECIMAL_NEG,0,0); r = DECIMAL_NEG; MATH3(VarDecCmpR8); EXPECT_LT;
SETDEC(l,0,0,-1,-1); r = DECIMAL_NEG; MATH3(VarDecCmpR8); EXPECT_GT;
SETDEC(l,0,DECIMAL_NEG,-1,-1); r = DECIMAL_NEG; MATH3(VarDecCmpR8); EXPECT_LT;
}
/*
@ -4704,14 +4695,10 @@ static void test_VarBoolFromDec(void)
CHECKPTR(VarBoolFromDec);
CONVERT_BADDEC(VarBoolFromDec);
if (HAVE_OLEAUT32_DECIMAL)
{
/* Early versions of oleaut32 don't catch these errors */
CONVERT_DEC(VarBoolFromDec,29,0,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x1,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x40,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x7f,0,0); EXPECT_INVALID;
}
CONVERT_DEC(VarBoolFromDec,29,0,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x1,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x40,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x7f,0,0); EXPECT_INVALID;
CONVERT_DEC(VarBoolFromDec,0,0x80,0,1); EXPECT(VARIANT_TRUE);
CONVERT_DEC(VarBoolFromDec,0,0,0,0); EXPECT(VARIANT_FALSE);
@ -4773,7 +4760,7 @@ static void test_VarBoolFromStr(void)
/* And is still not case sensitive */
CONVERT_STR(VarBoolFromStr,"False",0); EXPECT(VARIANT_FALSE);
if (HAVE_OLEAUT32_LOCALES)
if (has_locales)
{
/* French is rejected without VARIANT_LOCALBOOL */
CONVERT_STR(VarBoolFromStr,"faux",0); EXPECT_MISMATCH;
@ -4793,7 +4780,7 @@ static void test_VarBoolFromStr(void)
CONVERT_STR(VarBoolFromStr,"-1",0); EXPECT(VARIANT_TRUE);
CONVERT_STR(VarBoolFromStr,"+1",0); EXPECT(VARIANT_TRUE);
if (HAVE_OLEAUT32_LOCALES)
if (has_locales)
{
/* Numeric strings are read as floating point numbers. The line below fails
* because '.' is not a valid decimal separator for Polish numbers */
@ -4838,14 +4825,11 @@ static void test_VarBoolChangeTypeEx(void)
V_VT(&vSrc) = VT_BOOL;
V_BOOL(&vSrc) = 1;
if (!IS_ANCIENT)
{
BOOL_STR(VARIANT_ALPHABOOL, szTrue);
V_BOOL(&vSrc) = 0;
BOOL_STR(VARIANT_ALPHABOOL, szFalse);
}
BOOL_STR(VARIANT_ALPHABOOL, szTrue);
V_BOOL(&vSrc) = 0;
BOOL_STR(VARIANT_ALPHABOOL, szFalse);
if (HAVE_OLEAUT32_LOCALES)
if (has_locales)
{
lcid = MAKELCID(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT);
@ -5719,19 +5703,16 @@ static void test_IUnknownChangeTypeEx(void)
{
if (vt == VT_I8 || vt == VT_UI8)
{
if (HAVE_OLEAUT32_I8)
if (has_i8)
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt == VT_RECORD)
{
if (HAVE_OLEAUT32_RECORD)
hExpected = DISP_E_TYPEMISMATCH;
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt >= VT_I2 && vt <= VT_UINT && vt != (VARTYPE)15)
hExpected = DISP_E_TYPEMISMATCH;
}
if (IS_ANCIENT && IS_MODERN_VTYPE(vt))
hExpected = DISP_E_BADVARTYPE;
hres = VariantChangeTypeEx(&vDst, &vSrc, lcid, 0, vt);
ok(hres == hExpected,
@ -5872,19 +5853,16 @@ static void test_ErrorChangeTypeEx(void)
{
if (vt == VT_I8 || vt == VT_UI8)
{
if (HAVE_OLEAUT32_I8)
if (has_i8)
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt == VT_RECORD)
{
if (HAVE_OLEAUT32_RECORD)
hExpected = DISP_E_TYPEMISMATCH;
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt <= VT_UINT && vt != (VARTYPE)15)
hExpected = DISP_E_TYPEMISMATCH;
}
if (IS_ANCIENT && IS_MODERN_VTYPE(vt))
hExpected = DISP_E_BADVARTYPE;
ok(hres == hExpected,
"change err: vt %d expected 0x%08x, got 0x%08x\n", vt, hExpected, hres);
@ -5911,13 +5889,12 @@ static void test_EmptyChangeTypeEx(void)
if (vt == VT_I8 || vt == VT_UI8)
{
if (HAVE_OLEAUT32_I8)
if (has_i8)
hExpected = S_OK;
}
else if (vt == VT_RECORD)
{
if (HAVE_OLEAUT32_RECORD)
hExpected = DISP_E_TYPEMISMATCH;
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt == VT_VARIANT || vt == VT_DISPATCH ||
vt == VT_UNKNOWN || vt == VT_ERROR)
@ -5927,9 +5904,6 @@ static void test_EmptyChangeTypeEx(void)
else if (vt <= VT_UINT && vt != (VARTYPE)15)
hExpected = S_OK;
if (IS_ANCIENT && IS_MODERN_VTYPE(vt))
hExpected = DISP_E_BADVARTYPE;
hres = VariantChangeTypeEx(&vDst, &vSrc, lcid, 0, vt);
ok(hres == hExpected && (hres != S_OK || V_VT(&vDst) == vt),
@ -5960,13 +5934,12 @@ static void test_NullChangeTypeEx(void)
if (vt == VT_I8 || vt == VT_UI8)
{
if (HAVE_OLEAUT32_I8)
if (has_i8)
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt == VT_RECORD)
{
if (HAVE_OLEAUT32_RECORD)
hExpected = DISP_E_TYPEMISMATCH;
hExpected = DISP_E_TYPEMISMATCH;
}
else if (vt == VT_NULL)
{
@ -5977,9 +5950,6 @@ static void test_NullChangeTypeEx(void)
(vt <= VT_UINT && vt != (VARTYPE)15))
hExpected = DISP_E_TYPEMISMATCH;
if (IS_ANCIENT && IS_MODERN_VTYPE(vt))
hExpected = DISP_E_BADVARTYPE;
hres = VariantChangeTypeEx(&vDst, &vSrc, lcid, 0, vt);
ok(hres == hExpected && (hres != S_OK || V_VT(&vDst) == vt),
@ -6124,6 +6094,9 @@ START_TEST(vartype)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
has_i8 = GetProcAddress(hOleaut32, "VarI8FromI1") != NULL;
has_locales = has_i8 && GetProcAddress(hOleaut32, "GetVarConversionLocaleSetting") != NULL;
trace("LCIDs: System=0x%08x, User=0x%08x\n", GetSystemDefaultLCID(),
GetUserDefaultLCID());
@ -6364,6 +6337,7 @@ START_TEST(vartype)
test_VarDecAdd();
test_VarDecSub();
test_VarDecCmp();
test_VarDecCmpR8();
test_VarDecMul();
test_VarDecDiv();