Michael Stefaniuc : qedit/tests: Add SampleGrabber COM aggregation test.
Alexandre Julliard
julliard at winehq.org
Tue Nov 22 13:06:41 CST 2011
Module: wine
Branch: master
Commit: 24da40fa8556e247bb2521ac4ad920ad51532883
URL: http://source.winehq.org/git/wine.git/?a=commit;h=24da40fa8556e247bb2521ac4ad920ad51532883
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Mon Nov 21 14:46:57 2011 +0100
qedit/tests: Add SampleGrabber COM aggregation test.
---
dlls/qedit/tests/mediadet.c | 68 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 68 insertions(+), 0 deletions(-)
diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index de9b3a4..1d9a2f1 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -19,6 +19,7 @@
*/
#define COBJMACROS
+#define CONST_VTABLE
#include "initguid.h"
#include "ole2.h"
@@ -28,6 +29,47 @@
#include "qedit.h"
#include "rc.h"
+/* 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 WCHAR test_avi_filename[MAX_PATH];
static WCHAR test_sound_avi_filename[MAX_PATH];
@@ -294,6 +336,31 @@ static void test_mediadet(void)
DeleteFileW(test_sound_avi_filename);
}
+static void test_samplegrabber(void)
+{
+ struct unk_impl unk_obj = {{&unk_vtbl}, 19, NULL};
+ ISampleGrabber *sg;
+ ULONG refcount;
+ HRESULT hr;
+
+ /* COM aggregation */
+ hr = CoCreateInstance(&CLSID_SampleGrabber, &unk_obj.IUnknown_iface, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void**)&unk_obj.inner_unk);
+ todo_wine ok(hr == S_OK, "CoCreateInstance failed: %08x\n", hr);
+ if (hr != S_OK) return;
+
+ hr = IUnknown_QueryInterface(unk_obj.inner_unk, &IID_ISampleGrabber, (void**)&sg);
+ ok(hr == S_OK, "QueryInterface for IID_ISampleGrabber failed: %08x\n", hr);
+ refcount = ISampleGrabber_AddRef(sg);
+ ok(refcount == unk_obj.ref, "SampleGrabber just pretends to support COM aggregation\n");
+ refcount = ISampleGrabber_Release(sg);
+ ok(refcount == unk_obj.ref, "SampleGrabber just pretends to support COM aggregation\n");
+ refcount = ISampleGrabber_Release(sg);
+ ok(refcount == 19, "Refcount should be back at 19 but is %u\n", refcount);
+
+ IUnknown_Release(unk_obj.inner_unk);
+}
+
START_TEST(mediadet)
{
if (!init_tests())
@@ -304,5 +371,6 @@ START_TEST(mediadet)
CoInitialize(NULL);
test_mediadet();
+ test_samplegrabber();
CoUninitialize();
}
More information about the wine-cvs
mailing list