d3d11/tests: Add test for 3D texture interfaces.
[wine.git] / dlls / dmscript / tests / dmscript.c
blob82e874cc06e7ecec0e97344f628058179489f53b
1 /*
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
19 #define COBJMACROS
21 #include <stdarg.h>
22 #include <windef.h>
23 #include <initguid.h>
24 #include <wine/test.h>
25 #include <dmusici.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);
36 return FALSE;
38 return TRUE;
41 /* Outer IUnknown for COM aggregation tests */
42 struct unk_impl {
43 IUnknown IUnknown_iface;
44 LONG ref;
45 IUnknown *inner_unk;
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 =
76 unk_QueryInterface,
77 unk_AddRef,
78 unk_Release
81 static void test_COM(void)
83 IDirectMusicScript *dms = NULL;
84 IDirectMusicObject *dmo;
85 IPersistStream *ps;
86 IUnknown *unk;
87 struct unk_impl unk_obj = {{&unk_vtbl}, 19, NULL};
88 ULONG refcount;
89 HRESULT hr;
91 /* COM aggregation */
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);
102 /* Invalid RIID */
103 hr = CoCreateInstance(&CLSID_DirectMusicScript, NULL, CLSCTX_INPROC_SERVER, &IID_IClassFactory,
104 (void**)&dms);
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;
138 IPersistStream *ps;
139 IUnknown *unk;
140 ULONG refcount;
141 HRESULT hr;
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);
150 /* Invalid RIID */
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",
154 hr);
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 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;
181 IPersistStream *ps;
182 CLSID class;
183 ULARGE_INTEGER size;
184 HRESULT hr;
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;
208 IPersistStream *ps;
209 CLSID class;
210 ULARGE_INTEGER size;
211 HRESULT hr;
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);
217 /* IPersistStream */
218 hr = IDirectMusicTrack_QueryInterface(dmt, &IID_IPersistStream, (void**)&ps);
219 ok(hr == S_OK, "QueryInterface for IID_IPersistStream failed: %08x\n", hr);
221 hr = IPersistStream_GetClassID(ps, NULL);
222 ok(hr == E_POINTER, "got 0x%08x\n", hr);
224 hr = IPersistStream_GetClassID(ps, &class);
225 ok(hr == S_OK, "IPersistStream_GetClassID failed: %08x\n", hr);
226 ok(IsEqualGUID(&class, &CLSID_DirectMusicScriptTrack),
227 "Expected class CLSID_DirectMusicScriptTrack got %s\n", wine_dbgstr_guid(&class));
229 /* Unimplemented IPersistStream methods */
230 hr = IPersistStream_IsDirty(ps);
231 todo_wine ok(hr == S_FALSE, "IPersistStream_IsDirty failed: %08x\n", hr);
232 hr = IPersistStream_GetSizeMax(ps, &size);
233 ok(hr == E_NOTIMPL, "IPersistStream_GetSizeMax failed: %08x\n", hr);
234 hr = IPersistStream_Save(ps, NULL, TRUE);
235 ok(hr == E_NOTIMPL, "IPersistStream_Save failed: %08x\n", hr);
237 while (IDirectMusicTrack_Release(dmt));
240 START_TEST(dmscript)
242 CoInitialize(NULL);
244 if (missing_dmscript())
246 skip("dmscript not available\n");
247 CoUninitialize();
248 return;
250 test_COM();
251 test_COM_scripttrack();
252 test_dmscript();
253 test_scripttrack();
255 CoUninitialize();