2 * Copyright 2014 Michael Stefaniuc
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include <wine/test.h>
27 static BOOL
missing_dmscript(void)
29 IDirectMusicScript
*dms
;
30 HRESULT hr
= CoCreateInstance(&CLSID_DirectMusicScript
, NULL
, CLSCTX_INPROC_SERVER
,
31 &IID_IDirectMusicScript
, (void**)&dms
);
33 if (hr
== S_OK
&& dms
)
35 IDirectMusicScript_Release(dms
);
41 /* Outer IUnknown for COM aggregation tests */
43 IUnknown IUnknown_iface
;
48 static inline struct unk_impl
*impl_from_IUnknown(IUnknown
*iface
)
50 return CONTAINING_RECORD(iface
, struct unk_impl
, IUnknown_iface
);
53 static HRESULT WINAPI
unk_QueryInterface(IUnknown
*iface
, REFIID riid
, void **ppv
)
55 struct unk_impl
*This
= impl_from_IUnknown(iface
);
57 return IUnknown_QueryInterface(This
->inner_unk
, riid
, ppv
);
60 static ULONG WINAPI
unk_AddRef(IUnknown
*iface
)
62 struct unk_impl
*This
= impl_from_IUnknown(iface
);
64 return InterlockedIncrement(&This
->ref
);
67 static ULONG WINAPI
unk_Release(IUnknown
*iface
)
69 struct unk_impl
*This
= impl_from_IUnknown(iface
);
71 return InterlockedDecrement(&This
->ref
);
74 static const IUnknownVtbl unk_vtbl
=
81 static void test_COM(void)
83 IDirectMusicScript
*dms
= NULL
;
84 IDirectMusicObject
*dmo
;
87 struct unk_impl unk_obj
= {{&unk_vtbl
}, 19, NULL
};
92 hr
= CoCreateInstance(&CLSID_DirectMusicScript
, (IUnknown
*)&dms
, CLSCTX_INPROC_SERVER
,
93 &IID_IUnknown
, (void**)&dms
);
94 todo_wine
ok(hr
== E_POINTER
, "DirectMusicScript create failed: %08x, expected E_POINTER\n", hr
);
95 /* An invalid non-NULL pUnkOuter crashes newer Windows versions */
96 hr
= CoCreateInstance(&CLSID_DirectMusicScript
, &unk_obj
.IUnknown_iface
, CLSCTX_INPROC_SERVER
,
97 &IID_IUnknown
, (void**)&unk_obj
.inner_unk
);
98 ok(hr
== CLASS_E_NOAGGREGATION
,
99 "DirectMusicScript create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
100 ok(!unk_obj
.inner_unk
, "unk_obj.inner_unk = %p\n", unk_obj
.inner_unk
);
103 hr
= CoCreateInstance(&CLSID_DirectMusicScript
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IClassFactory
,
105 ok(hr
== E_NOINTERFACE
, "DirectMusicScript create failed: %08x, expected E_NOINTERFACE\n", hr
);
107 /* Same refcount for all DirectMusicScript interfaces */
108 hr
= CoCreateInstance(&CLSID_DirectMusicScript
, NULL
, CLSCTX_INPROC_SERVER
,
109 &IID_IDirectMusicScript
, (void**)&dms
);
110 ok(hr
== S_OK
, "DirectMusicScript create failed: %08x, expected S_OK\n", hr
);
111 refcount
= IDirectMusicScript_AddRef(dms
);
112 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
114 hr
= IDirectMusicScript_QueryInterface(dms
, &IID_IDirectMusicObject
, (void**)&dmo
);
115 ok(hr
== S_OK
, "QueryInterface for IID_IDirectMusicObject failed: %08x\n", hr
);
116 refcount
= IDirectMusicObject_AddRef(dmo
);
117 ok(refcount
== 4, "refcount == %u, expected 4\n", refcount
);
118 refcount
= IDirectMusicObject_Release(dmo
);
120 hr
= IDirectMusicScript_QueryInterface(dms
, &IID_IPersistStream
, (void**)&ps
);
121 ok(hr
== S_OK
, "QueryInterface for IID_IPersistStream failed: %08x\n", hr
);
122 refcount
= IPersistStream_AddRef(ps
);
123 ok(refcount
== 5, "refcount == %u, expected 5\n", refcount
);
124 refcount
= IPersistStream_Release(ps
);
126 hr
= IDirectMusicScript_QueryInterface(dms
, &IID_IUnknown
, (void**)&unk
);
127 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
128 refcount
= IUnknown_AddRef(unk
);
129 ok(refcount
== 6, "refcount == %u, expected 6\n", refcount
);
130 refcount
= IUnknown_Release(unk
);
132 while (IDirectMusicScript_Release(dms
));
135 static void test_COM_scripttrack(void)
137 IDirectMusicTrack
*dmt
;
143 /* COM aggregation */
144 hr
= CoCreateInstance(&CLSID_DirectMusicScriptTrack
, (IUnknown
*)&dmt
, CLSCTX_INPROC_SERVER
,
145 &IID_IUnknown
, (void**)&dmt
);
146 ok(hr
== CLASS_E_NOAGGREGATION
,
147 "DirectMusicScriptTrack create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr
);
148 ok(!dmt
, "dmt = %p\n", dmt
);
151 hr
= CoCreateInstance(&CLSID_DirectMusicScriptTrack
, NULL
, CLSCTX_INPROC_SERVER
,
152 &IID_IDirectMusicObject
, (void**)&dmt
);
153 ok(hr
== E_NOINTERFACE
, "DirectMusicScriptTrack create failed: %08x, expected E_NOINTERFACE\n",
156 /* Same refcount for all DirectMusicScriptTrack interfaces */
157 hr
= CoCreateInstance(&CLSID_DirectMusicScriptTrack
, NULL
, CLSCTX_INPROC_SERVER
,
158 &IID_IDirectMusicTrack
, (void**)&dmt
);
159 ok(hr
== S_OK
, "DirectMusicScriptTrack create failed: %08x, expected S_OK\n", hr
);
160 refcount
= IDirectMusicTrack_AddRef(dmt
);
161 ok(refcount
== 2, "refcount == %u, expected 2\n", refcount
);
163 hr
= IDirectMusicTrack_QueryInterface(dmt
, &IID_IPersistStream
, (void**)&ps
);
164 ok(hr
== S_OK
, "QueryInterface for IID_IPersistStream failed: %08x\n", hr
);
165 refcount
= IPersistStream_AddRef(ps
);
166 ok(refcount
== 4, "refcount == %u, expected 4\n", refcount
);
167 refcount
= IPersistStream_Release(ps
);
169 hr
= IDirectMusicTrack_QueryInterface(dmt
, &IID_IUnknown
, (void**)&unk
);
170 ok(hr
== S_OK
, "QueryInterface for IID_IUnknown failed: %08x\n", hr
);
171 refcount
= IUnknown_AddRef(unk
);
172 ok(refcount
== 5, "refcount == %u, expected 5\n", refcount
);
173 refcount
= IUnknown_Release(unk
);
175 while (IDirectMusicTrack_Release(dmt
));
178 static void test_dmscript(void)
180 IDirectMusicScript
*dms
;
186 hr
= CoCreateInstance(&CLSID_DirectMusicScript
, NULL
, CLSCTX_INPROC_SERVER
,
187 &IID_IDirectMusicScript
, (void**)&dms
);
188 ok(hr
== S_OK
, "DirectMusicScript create failed: %08x, expected S_OK\n", hr
);
190 /* Unimplemented IPersistStream methods */
191 hr
= IDirectMusicScript_QueryInterface(dms
, &IID_IPersistStream
, (void**)&ps
);
192 ok(hr
== S_OK
, "QueryInterface for IID_IPersistStream failed: %08x\n", hr
);
193 hr
= IPersistStream_GetClassID(ps
, &class);
194 ok(hr
== E_NOTIMPL
, "IPersistStream_GetClassID failed: %08x\n", hr
);
195 hr
= IPersistStream_IsDirty(ps
);
196 ok(hr
== S_FALSE
, "IPersistStream_IsDirty failed: %08x\n", hr
);
197 hr
= IPersistStream_GetSizeMax(ps
, &size
);
198 ok(hr
== E_NOTIMPL
, "IPersistStream_GetSizeMax failed: %08x\n", hr
);
199 hr
= IPersistStream_Save(ps
, NULL
, TRUE
);
200 ok(hr
== E_NOTIMPL
, "IPersistStream_Save failed: %08x\n", hr
);
202 while (IDirectMusicScript_Release(dms
));
205 static void test_scripttrack(void)
207 IDirectMusicTrack
*dmt
;
213 hr
= CoCreateInstance(&CLSID_DirectMusicScriptTrack
, NULL
, CLSCTX_INPROC_SERVER
,
214 &IID_IDirectMusicTrack
, (void**)&dmt
);
215 ok(hr
== S_OK
, "DirectMusicScriptTrack create failed: %08x, expected S_OK\n", hr
);
218 hr
= IDirectMusicTrack_QueryInterface(dmt
, &IID_IPersistStream
, (void**)&ps
);
219 ok(hr
== S_OK
, "QueryInterface for IID_IPersistStream failed: %08x\n", hr
);
220 hr
= IPersistStream_GetClassID(ps
, &class);
221 todo_wine
ok(hr
== S_OK
, "IPersistStream_GetClassID failed: %08x\n", hr
);
222 todo_wine
ok(IsEqualGUID(&class, &CLSID_DirectMusicScriptTrack
),
223 "Expected class CLSID_DirectMusicScriptTrack got %s\n", wine_dbgstr_guid(&class));
225 /* Unimplemented IPersistStream methods */
226 hr
= IPersistStream_IsDirty(ps
);
227 todo_wine
ok(hr
== S_FALSE
, "IPersistStream_IsDirty failed: %08x\n", hr
);
228 hr
= IPersistStream_GetSizeMax(ps
, &size
);
229 ok(hr
== E_NOTIMPL
, "IPersistStream_GetSizeMax failed: %08x\n", hr
);
230 hr
= IPersistStream_Save(ps
, NULL
, TRUE
);
231 ok(hr
== E_NOTIMPL
, "IPersistStream_Save failed: %08x\n", hr
);
233 while (IDirectMusicTrack_Release(dmt
));
240 if (missing_dmscript())
242 skip("dmscript not available\n");
247 test_COM_scripttrack();