mirror of
https://github.com/reactos/reactos.git
synced 2025-04-27 09:00:27 +00:00
[OLEAUT32_WINETEST]
* Sync with Wine 1.7.1. CORE-7469 svn path=/trunk/; revision=60357
This commit is contained in:
parent
17427e7cae
commit
7e8889c3eb
8 changed files with 2192 additions and 412 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue