From 31c9881f603ba7cad8adb6d08aec08977c0e8389 Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Wed, 15 Jan 2014 01:11:24 +0100 Subject: [PATCH] dmstyle/tests: COM tests for the different DirectMusic*Tracks. --- dlls/dmstyle/tests/dmstyle.c | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/dlls/dmstyle/tests/dmstyle.c b/dlls/dmstyle/tests/dmstyle.c index bbc04bdb194..18f2a6b4280 100644 --- a/dlls/dmstyle/tests/dmstyle.c +++ b/dlls/dmstyle/tests/dmstyle.c @@ -24,6 +24,7 @@ #include #include +#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) static BOOL missing_dmstyle(void) { @@ -88,6 +89,74 @@ static void test_COM(void) while (IDirectMusicStyle8_Release(dms8)); } +static void test_COM_track(void) +{ + IDirectMusicTrack8 *dmt8; + IPersistStream *ps; + IUnknown *unk; + ULONG refcount; + HRESULT hr; +#define X(class) &CLSID_ ## class, #class + const struct { + REFCLSID clsid; + const char *name; + } class[] = { + { X(DirectMusicAuditionTrack) }, + { X(DirectMusicChordTrack) }, + { X(DirectMusicCommandTrack) }, + { X(DirectMusicMotifTrack) }, + { X(DirectMusicMuteTrack) }, + { X(DirectMusicStyleTrack) }, + }; +#undef X + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(class); i++) { + /* COM aggregation */ + dmt8 = (IDirectMusicTrack8*)0xdeadbeef; + hr = CoCreateInstance(class[i].clsid, (IUnknown*)&dmt8, CLSCTX_INPROC_SERVER, &IID_IUnknown, + (void**)&dmt8); + if (hr == REGDB_E_CLASSNOTREG) { + win_skip("%s not registered\n", class[i].name); + continue; + } + ok(hr == CLASS_E_NOAGGREGATION, + "%s create failed: %08x, expected CLASS_E_NOAGGREGATION\n", class[i].name, hr); + ok(!dmt8, "dmt8 = %p\n", dmt8); + + /* Invalid RIID */ + hr = CoCreateInstance(class[i].clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, + (void**)&dmt8); + ok(hr == E_NOINTERFACE, "%s create failed: %08x, expected E_NOINTERFACE\n", + class[i].name, hr); + + /* Same refcount for all DirectMusicTrack interfaces */ + hr = CoCreateInstance(class[i].clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicTrack8, + (void**)&dmt8); + if (hr == E_NOINTERFACE && !dmt8) { + skip("%s not created with CoCreateInstance()\n", class[i].name); + continue; + } + ok(hr == S_OK, "%s create failed: %08x, expected S_OK\n", class[i].name, hr); + refcount = IDirectMusicTrack8_AddRef(dmt8); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + + hr = IDirectMusicTrack8_QueryInterface(dmt8, &IID_IPersistStream, (void**)&ps); + ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr); + refcount = IPersistStream_AddRef(ps); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + refcount = IPersistStream_Release(ps); + + hr = IDirectMusicTrack8_QueryInterface(dmt8, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + refcount = IUnknown_AddRef(unk); + ok(refcount == 5, "refcount == %u, expected 5\n", refcount); + refcount = IUnknown_Release(unk); + + while (IDirectMusicTrack8_Release(dmt8)); + } +} + START_TEST(dmstyle) { CoInitialize(NULL); @@ -99,6 +168,7 @@ START_TEST(dmstyle) return; } test_COM(); + test_COM_track(); CoUninitialize(); }