[1/4] fusion: Implement IAssemblyName::IsEqual.

Hans Leidekker hans at codeweavers.com
Wed May 16 03:06:54 CDT 2012


---
 dlls/fusion/asmname.c       |   33 +++++++++++++++++--
 dlls/fusion/tests/asmname.c |   76 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 106 insertions(+), 3 deletions(-)

diff --git a/dlls/fusion/asmname.c b/dlls/fusion/asmname.c
index 4957ae8..be5ccae 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 a99b288..d180b9e 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();
 }
-- 
1.7.10







More information about the wine-patches mailing list