[PATCH 4/4] riched20/tests: Add COM aggregation tests for CreateTextServices().

Michael Stefaniuc mstefani at redhat.de
Tue Mar 27 17:35:47 CDT 2012


---
 dlls/riched20/tests/txtsrv.c |   65 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c
index e55f5ef..fbd1f6b 100644
--- a/dlls/riched20/tests/txtsrv.c
+++ b/dlls/riched20/tests/txtsrv.c
@@ -21,6 +21,7 @@
  */
 
 #define COBJMACROS
+#define CONST_VTABLE
 
 #include <stdio.h>
 #include <stdarg.h>
@@ -811,6 +812,69 @@ static void test_IIDs(void)
        "unexpected value for IID_ITextHost2: %s\n", debugstr_guid(pIID_ITextHost2));
 }
 
+/* Outer IUnknown for COM aggregation tests */
+struct unk_impl {
+    IUnknown IUnknown_iface;
+    LONG ref;
+    IUnknown *inner_unk;
+};
+
+static inline struct unk_impl *impl_from_IUnknown(IUnknown *iface)
+{
+    return CONTAINING_RECORD(iface, struct unk_impl, IUnknown_iface);
+}
+
+static HRESULT WINAPI unk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+    struct unk_impl *This = impl_from_IUnknown(iface);
+
+    return IUnknown_QueryInterface(This->inner_unk, riid, ppv);
+}
+
+static ULONG WINAPI unk_AddRef(IUnknown *iface)
+{
+    struct unk_impl *This = impl_from_IUnknown(iface);
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI unk_Release(IUnknown *iface)
+{
+    struct unk_impl *This = impl_from_IUnknown(iface);
+
+    return InterlockedDecrement(&This->ref);
+}
+
+static const IUnknownVtbl unk_vtbl =
+{
+    unk_QueryInterface,
+    unk_AddRef,
+    unk_Release
+};
+
+static void test_COM(void)
+{
+    struct unk_impl unk_obj = {{&unk_vtbl}, 19, NULL};
+    struct ITextHostTestImpl texthost = {{&itextHostVtbl}, 1};
+    ITextServices *textsrv;
+    ULONG refcount;
+    HRESULT hr;
+
+    /* COM aggregation */
+    hr = pCreateTextServices(&unk_obj.IUnknown_iface, &texthost.ITextHost_iface,
+                             &unk_obj.inner_unk);
+    ok(hr == S_OK, "CreateTextServices failed: %08x\n", hr);
+    hr = IUnknown_QueryInterface(unk_obj.inner_unk, pIID_ITextServices, (void**)&textsrv);
+    ok(hr == S_OK, "QueryInterface for IID_ITextServices failed: %08x\n", hr);
+    refcount = ITextServices_AddRef(textsrv);
+    ok(refcount == unk_obj.ref, "CreateTextServices just pretends to support COM aggregation\n");
+    refcount = ITextServices_Release(textsrv);
+    ok(refcount == unk_obj.ref, "CreateTextServices just pretends to support COM aggregation\n");
+    refcount = ITextServices_Release(textsrv);
+    ok(refcount == 19, "Refcount should be back at 19 but is %u\n", refcount);
+
+    IUnknown_Release(unk_obj.inner_unk);
+}
 
 START_TEST( txtsrv )
 {
@@ -827,6 +891,7 @@ START_TEST( txtsrv )
     pCreateTextServices = (void*)GetProcAddress(hmoduleRichEdit, "CreateTextServices");
 
     test_IIDs();
+    test_COM();
 
     if (init_texthost())
     {
-- 
1.7.6.5



More information about the wine-patches mailing list