Module: wine Branch: master Commit: a3b8be05b77d7c42ab6c8b6290163834fcd6e30f URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3b8be05b77d7c42ab6c8b6290...
Author: Huw Davies huw@codeweavers.com Date: Fri May 11 15:23:31 2007 +0100
oleaut32: Typelib inheritance tests.
---
dlls/oleaut32/tests/tmarshal.idl | 70 ++++++++++++++++ dlls/oleaut32/tests/typelib.c | 168 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index e99dbc7..24cc83b 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -158,4 +158,74 @@ library TestTypelib interface IWidget; [source] interface IWidget; }; + + [ + odl, + uuid(375f8a9d-33d0-44f3-b972-61f8407899e0) + ] + interface ItestIF1 : IUnknown + { + HRESULT fn1([in] int x); + HRESULT fn2([out,retval] int *x); + } + + [ + odl, + uuid(094056a3-666f-4956-be12-1859668310b8) + ] + interface ItestIF2 : ItestIF1 + { + HRESULT fn3([in] int y); + } + + [ + odl, + uuid(33baba09-2e68-43ab-81fe-d84b403df2e5) + ] + dispinterface ItestIF3 + { + interface ItestIF2; + } + + [ + odl, + uuid(a01005c7-7491-42eb-94f3-668e37ce60a6) + ] + dispinterface ItestIF4 + { + properties: + methods: + [id(0x1c)] HRESULT fn([in] int z); + } + + [ + odl, + uuid(4ab61e25-c09f-4239-8f7f-7a018ea0199f), + dual + ] + interface ItestIF5 : ItestIF2 + { + [id(0x1234)] HRESULT fn4([in] int a); + [id(0x1235)] HRESULT fn5([in] int a); + } + + [ + odl, + uuid(ec236d8e-2cc7-44f2-b394-36c86ff3da74) + ] + interface ItestIF6 : IDispatch + { + [id(0x1234)] HRESULT fn4([in] int a); + [id(0x1235)] HRESULT fn5([in] int a); + } + + [ + odl, + uuid(f711b105-554d-4751-818c-46fcc5d7c0d5), + dual + ] + interface ItestIF7 : ItestIF6 + { + [id(0x1236)] HRESULT fn6([in] int a); + } }; diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 6b1b579..fced34b 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -29,6 +29,7 @@ #include "oleauto.h" #include "ocidl.h" #include "shlwapi.h" +#include "tmarshal.h"
#define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08x\n", hr)
@@ -573,6 +574,172 @@ static void test_QueryPathOfRegTypeLib(void) do_typelib_reg_key(&uid, 0, 0, NULL, 1); }
+static void test_inheritance(void) +{ + HRESULT hr; + ITypeLib *pTL; + ITypeInfo *pTI, *pTI_p; + TYPEATTR *pTA; + HREFTYPE href; + FUNCDESC *pFD; + WCHAR path[MAX_PATH]; + static const WCHAR tl_path[] = {'.','\','m','i','d','l','_','t','m','a','r','s','h','a','l','.','t','l','b',0}; + + BOOL use_midl_tlb = 0; + + GetModuleFileNameW(NULL, path, MAX_PATH); + + if(use_midl_tlb) + memcpy(path, tl_path, sizeof(tl_path)); + + hr = LoadTypeLib(path, &pTL); + if(FAILED(hr)) return; + + + /* ItestIF3 is a syntax 2 dispinterface */ + hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF3, &pTI); + ok(hr == S_OK, "hr %08x\n", hr); + + hr = ITypeInfo_GetTypeAttr(pTI, &pTA); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); + ok(pTA->cbSizeVft == 28, "sizevft %d\n", pTA->cbSizeVft); + ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags); +if(use_midl_tlb) { + ok(pTA->cFuncs == 6, "cfuncs %d\n", pTA->cFuncs); + ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); + ITypeInfo_ReleaseTypeAttr(pTI, pTA); + + hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA); +todo_wine { + ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid {%08x-....\n", pTA->guid.Data1); + } + ITypeInfo_ReleaseTypeAttr(pTI_p, pTA); + ITypeInfo_Release(pTI_p); + + /* Should have six methods */ + hr = ITypeInfo_GetFuncDesc(pTI, 6, &pFD); +todo_wine{ + ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08x\n", hr); +} + hr = ITypeInfo_GetFuncDesc(pTI, 5, &pFD); +todo_wine { + ok(hr == S_OK, "hr %08x\n", hr); +} + if(SUCCEEDED(hr)) + { + ok(pFD->memid == 0x60020000, "memid %08x\n", pFD->memid); + ok(pFD->oVft == 20, "oVft %d\n", pFD->oVft); + ITypeInfo_ReleaseFuncDesc(pTI, pFD); + } +} + ITypeInfo_Release(pTI); + + + /* ItestIF4 is a syntax 1 dispinterface */ + hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF4, &pTI); + ok(hr == S_OK, "hr %08x\n", hr); + + hr = ITypeInfo_GetTypeAttr(pTI, &pTA); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); + ok(pTA->cbSizeVft == 28, "sizevft %d\n", pTA->cbSizeVft); + ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags); + ok(pTA->cFuncs == 1, "cfuncs %d\n", pTA->cFuncs); + ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); + ITypeInfo_ReleaseTypeAttr(pTI, pTA); + + hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA); + ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid {%08x-....\n", pTA->guid.Data1); + ITypeInfo_ReleaseTypeAttr(pTI_p, pTA); + ITypeInfo_Release(pTI_p); + hr = ITypeInfo_GetFuncDesc(pTI, 1, &pFD); +todo_wine { + ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08x\n", hr); + } + hr = ITypeInfo_GetFuncDesc(pTI, 0, &pFD); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pFD->memid == 0x1c, "memid %08x\n", pFD->memid); + ITypeInfo_ReleaseFuncDesc(pTI, pFD); + ITypeInfo_Release(pTI); + + + /* ItestIF5 is dual with inherited ifaces which derive from IUnknown but not IDispatch */ + hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF5, &pTI); + ok(hr == S_OK, "hr %08x\n", hr); + + hr = ITypeInfo_GetTypeAttr(pTI, &pTA); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); + ok(pTA->cbSizeVft == 28, "sizevft %d\n", pTA->cbSizeVft); +if(use_midl_tlb) { + ok(pTA->wTypeFlags == TYPEFLAG_FDUAL, "typeflags %x\n", pTA->wTypeFlags); + } + ok(pTA->cFuncs == 8, "cfuncs %d\n", pTA->cFuncs); + ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); + ITypeInfo_ReleaseTypeAttr(pTI, pTA); + + hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA); +todo_wine { + ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid {%08x-....\n", pTA->guid.Data1); + } + ITypeInfo_ReleaseTypeAttr(pTI_p, pTA); + ITypeInfo_Release(pTI_p); +if(use_midl_tlb) { + hr = ITypeInfo_GetFuncDesc(pTI, 6, &pFD); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pFD->memid == 0x1234, "memid %08x\n", pFD->memid); + ITypeInfo_ReleaseFuncDesc(pTI, pFD); +} + ITypeInfo_Release(pTI); + + /* ItestIF7 is dual with inherited ifaces which derive from Dispatch */ + hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF7, &pTI); + ok(hr == S_OK, "hr %08x\n", hr); + + hr = ITypeInfo_GetTypeAttr(pTI, &pTA); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); + ok(pTA->cbSizeVft == 28, "sizevft %d\n", pTA->cbSizeVft); + ok(pTA->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "typeflags %x\n", pTA->wTypeFlags); + ok(pTA->cFuncs == 10, "cfuncs %d\n", pTA->cFuncs); + ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); + ITypeInfo_ReleaseTypeAttr(pTI, pTA); + + hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p); + ok(hr == S_OK, "hr %08x\n", hr); + hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA); +todo_wine { + ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid {%08x-....\n", pTA->guid.Data1); +} + ITypeInfo_ReleaseTypeAttr(pTI_p, pTA); + ITypeInfo_Release(pTI_p); + + hr = ITypeInfo_GetFuncDesc(pTI, 9, &pFD); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pFD->memid == 0x1236, "memid %08x\n", pFD->memid); + ITypeInfo_ReleaseFuncDesc(pTI, pFD); + ITypeInfo_Release(pTI); + + ITypeLib_Release(pTL); + + return; +} + START_TEST(typelib) { ref_count_test(wszStdOle2); @@ -580,4 +747,5 @@ START_TEST(typelib) test_CreateDispTypeInfo(); test_TypeInfo(); test_QueryPathOfRegTypeLib(); + test_inheritance(); }