[PATCH v3 05/13] oleaut32/tests: Include [dual] interface in test_dump_typelib

Kevin Puetz PuetzKevinA at JohnDeere.com
Fri Aug 7 15:36:34 CDT 2020


Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
---
 dlls/oleaut32/tests/typelib.c | 61 +++++++++++++++++++++++++++++++----
 1 file changed, 55 insertions(+), 6 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 9c341b4df8..5f1851aabf 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -4345,13 +4345,14 @@ static void test_dump_typelib(const WCHAR *name)
     ITypeLib *lib;
     int count;
     int i;
+    HREFTYPE hRefType = 0;
 
     OLE_CHECK(LoadTypeLib(name, &lib));
 
     printf("/*** Autogenerated data. Do not edit, change the generator above instead. ***/\n");
 
     count = ITypeLib_GetTypeInfoCount(lib);
-    for (i = 0; i < count; i++)
+    for (i = 0; i < count;)
     {
         TYPEATTR *attr;
         BSTR name;
@@ -4363,6 +4364,12 @@ static void test_dump_typelib(const WCHAR *name)
                "  \"%s\",\n", dump_string(name));
 
         OLE_CHECK(ITypeLib_GetTypeInfo(lib, i, &info));
+        if(hRefType) {
+            ITypeInfo *refInfo;
+            OLE_CHECK(ITypeInfo_GetRefTypeInfo(info, hRefType, &refInfo));
+            ITypeInfo_Release(info);
+            info = refInfo;
+        }
         OLE_CHECK(ITypeInfo_GetTypeAttr(info, &attr));
 
         printf("  \"%s\",\n", wine_dbgstr_guid(&attr->guid));
@@ -4446,6 +4453,14 @@ static void test_dump_typelib(const WCHAR *name)
         if (attr->cVars) printf("  },\n");
 
         printf("},\n");
+        if ((attr->typekind == TKIND_DISPATCH) && (attr->wTypeFlags & TYPEFLAG_FDUAL)
+        && SUCCEEDED(ITypeInfo_GetRefTypeOfImplType(info, -1, &hRefType))) {
+            /* next iteration dumps hRefType, the TKIND_INTERFACE reference underneath this [dual] TKIND_DISPATCH */
+        } else {
+            ++i; /* move to the next item in lib */
+            hRefType = 0;
+        }
+
         ITypeInfo_ReleaseTypeAttr(info, attr);
         ITypeInfo_Release(info);
         SysFreeString(name);
@@ -4805,6 +4820,27 @@ static const type_info info[] = {
   },
   { /* vars */ },
 },
+{
+  "IDualIface",
+  "{b14b6bb5-904e-4ff9-b247-bd361f7aaedd}",
+  /*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL, /*align*/ TYPE_ALIGNMENT(IDualIface*), /*size*/ sizeof(IDualIface*),
+  /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 8, /*#func*/ 1, /*#var*/ 0,
+  { /* funcs */
+    {
+      /*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
+      /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
+      {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      { /* params */
+        {-1, 0, 0}
+      },
+      { /* names */
+        "Test",
+        NULL,
+      },
+    },
+  },
+  { /* vars */ },
+},
 {
   "ISimpleIface",
   "{ec5dfcd6-eeb0-4cd6-b51e-8030e1dac009}",
@@ -5271,9 +5307,9 @@ static const type_info info[] = {
 static void test_dump_typelib(const WCHAR *name)
 {
     ITypeLib *typelib;
-    int ticount = ARRAY_SIZE(info);
     CUSTDATA cust_data;
-    int iface, func, var;
+    int iface = 0, func, var;
+    HREFTYPE hRefType = 0;
     VARIANT v;
     HRESULT hr;
     TLIBATTR *libattr;
@@ -5286,10 +5322,8 @@ static void test_dump_typelib(const WCHAR *name)
         skip("ignoring VARDESC::oInst, (libattr->syskind expected %d got %d)\n", info_syskind, libattr->syskind);
     }
 
-    expect_eq(ITypeLib_GetTypeInfoCount(typelib), ticount, UINT, "%d");
-    for (iface = 0; iface < ticount; iface++)
+    for (const type_info *ti = info; ti != info + ARRAY_SIZE(info); ++ti)
     {
-        const type_info *ti = &info[iface];
         ITypeInfo2 *typeinfo2;
         ITypeInfo *typeinfo;
         TYPEATTR *typeattr;
@@ -5298,6 +5332,12 @@ static void test_dump_typelib(const WCHAR *name)
 
         trace("Interface %s\n", ti->name);
         ole_check(ITypeLib_GetTypeInfo(typelib, iface, &typeinfo));
+        if(hRefType) {
+            ITypeInfo *refInfo;
+            ole_check(ITypeInfo_GetRefTypeInfo(typeinfo, hRefType, &refInfo));
+            ITypeInfo_Release(typeinfo);
+            typeinfo = refInfo;
+        }
         ole_check(ITypeLib_GetDocumentation(typelib, iface, &bstrIfName, NULL, &help_ctx, NULL));
         expect_wstr_acpval(bstrIfName, ti->name);
         SysFreeString(bstrIfName);
@@ -5438,11 +5478,20 @@ static void test_dump_typelib(const WCHAR *name)
             ITypeInfo_ReleaseVarDesc(typeinfo, desc);
         }
 
+        if ((typeattr->typekind == TKIND_DISPATCH) && (typeattr->wTypeFlags & TYPEFLAG_FDUAL)
+        && SUCCEEDED(ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &hRefType))) {
+            /* next iteration dumps hRefType, the TKIND_INTERFACE reference underneath this [dual] TKIND_DISPATCH */
+        } else {
+            ++iface; /* move to the next item in typelib */
+            hRefType = 0;
+        }
+
         ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
 
         ITypeInfo2_Release(typeinfo2);
         ITypeInfo_Release(typeinfo);
     }
+    expect_eq(ITypeLib_GetTypeInfoCount(typelib), iface, UINT, "%d");
     ITypeLib_ReleaseTLibAttr(typelib, libattr);
     ITypeLib_Release(typelib);
 }



More information about the wine-devel mailing list