diff --git a/dlls/fusion/asmname.c b/dlls/fusion/asmname.c index 4957ae84770..be5ccaea145 100644 --- a/dlls/fusion/asmname.c +++ b/dlls/fusion/asmname.c @@ -407,10 +407,37 @@ static HRESULT WINAPI IAssemblyNameImpl_GetVersion(IAssemblyName *iface, static HRESULT WINAPI IAssemblyNameImpl_IsEqual(IAssemblyName *iface, IAssemblyName *pName, - DWORD dwCmpFlags) + DWORD flags) { - FIXME("(%p, %p, %d) stub!\n", iface, pName, dwCmpFlags); - return E_NOTIMPL; + IAssemblyNameImpl *name1 = impl_from_IAssemblyName(iface); + IAssemblyNameImpl *name2 = impl_from_IAssemblyName(pName); + + TRACE("(%p, %p, 0x%08x)\n", iface, pName, flags); + + if (!pName) return S_FALSE; + if (flags & ~ASM_CMPF_IL_ALL) FIXME("unsupported flags\n"); + + if ((flags & ASM_CMPF_NAME) && strcmpW(name1->name, name2->name)) return S_FALSE; + if (name1->versize && name2->versize) + { + if ((flags & ASM_CMPF_MAJOR_VERSION) && + name1->version[0] != name2->version[0]) return S_FALSE; + if ((flags & ASM_CMPF_MINOR_VERSION) && + name1->version[1] != name2->version[1]) return S_FALSE; + if ((flags & ASM_CMPF_BUILD_NUMBER) && + name1->version[2] != name2->version[2]) return S_FALSE; + if ((flags & ASM_CMPF_REVISION_NUMBER) && + name1->version[3] != name2->version[3]) return S_FALSE; + } + if ((flags & ASM_CMPF_PUBLIC_KEY_TOKEN) && + name1->haspubkey && name2->haspubkey && + memcmp(name1->pubkey, name2->pubkey, sizeof(name1->pubkey))) return S_FALSE; + + if ((flags & ASM_CMPF_CULTURE) && + name1->culture && name2->culture && + strcmpW(name1->culture, name2->culture)) return S_FALSE; + + return S_OK; } static HRESULT WINAPI IAssemblyNameImpl_Clone(IAssemblyName *iface, diff --git a/dlls/fusion/tests/asmname.c b/dlls/fusion/tests/asmname.c index a99b288dca5..d180b9e04aa 100644 --- a/dlls/fusion/tests/asmname.c +++ b/dlls/fusion/tests/asmname.c @@ -893,6 +893,81 @@ static void test_CreateAssemblyNameObject(void) ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); } +static void test_IAssemblyName_IsEqual(void) +{ + static const WCHAR wine1[] = + {'w','i','n','e',0}; + static const WCHAR wine2[] = + {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0}; + static const WCHAR wine3[] = + {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', + 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0}; + static const WCHAR wine4[] = + {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', + 'c','u','l','t','u','r','e','=','e','n',0}; + static const WCHAR wine5[] = + {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', + 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6', + '7','8','9','0','a','b','c','d','e','f',0}; + HRESULT hr; + IAssemblyName *name1, *name2; + + hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = pCreateAssemblyNameObject( &name2, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + if (0) { /* crashes on some old version */ + hr = IAssemblyName_IsEqual( name1, NULL, 0 ); + ok( hr == S_FALSE, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, NULL, ASM_CMPF_IL_ALL ); + ok( hr == S_FALSE, "got %08x\n", hr ); + } + + hr = IAssemblyName_IsEqual( name1, name1, ASM_CMPF_IL_ALL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); + ok( hr == S_OK, "got %08x\n", hr ); + + IAssemblyName_Release( name2 ); + hr = pCreateAssemblyNameObject( &name2, wine2, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); + ok( hr == S_OK, "got %08x\n", hr ); + + IAssemblyName_Release( name2 ); + hr = pCreateAssemblyNameObject( &name2, wine3, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); + ok( hr == S_OK, "got %08x\n", hr ); + + IAssemblyName_Release( name1 ); + hr = pCreateAssemblyNameObject( &name1, wine4, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); + todo_wine ok( hr == S_FALSE, "got %08x\n", hr ); + + IAssemblyName_Release( name1 ); + hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + IAssemblyName_Release( name2 ); + hr = pCreateAssemblyNameObject( &name2, wine5, CANOF_PARSE_DISPLAY_NAME, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); + ok( hr == S_OK, "got %08x\n", hr ); + + IAssemblyName_Release( name1 ); + IAssemblyName_Release( name2 ); +} + START_TEST(asmname) { if (!init_functionpointers()) @@ -902,4 +977,5 @@ START_TEST(asmname) } test_CreateAssemblyNameObject(); + test_IAssemblyName_IsEqual(); }