Release 1.4.1.
[wine] / dlls / d3drm / tests / d3drm.c
1 /*
2  * Copyright 2010 Christian Costa
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #define COBJMACROS
20 #include <d3drm.h>
21 #include <initguid.h>
22
23 #include "wine/test.h"
24
25 static HMODULE d3drm_handle = 0;
26
27 static HRESULT (WINAPI * pDirect3DRMCreate)(LPDIRECT3DRM* ppDirect3DRM);
28
29 #define CHECK_REFCOUNT(obj,rc) \
30     { \
31         int rc_new = rc; \
32         int count = get_refcount( (IUnknown *)obj ); \
33         ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
34     }
35
36 #define D3DRM_GET_PROC(func) \
37     p ## func = (void*)GetProcAddress(d3drm_handle, #func); \
38     if(!p ## func) { \
39       trace("GetProcAddress(%s) failed\n", #func); \
40       FreeLibrary(d3drm_handle); \
41       return FALSE; \
42     }
43
44 static BOOL InitFunctionPtrs(void)
45 {
46     d3drm_handle = LoadLibraryA("d3drm.dll");
47
48     if(!d3drm_handle)
49     {
50         skip("Could not load d3drm.dll\n");
51         return FALSE;
52     }
53
54     D3DRM_GET_PROC(Direct3DRMCreate)
55
56     return TRUE;
57 }
58
59 static int get_refcount(IUnknown *object)
60 {
61     IUnknown_AddRef( object );
62     return IUnknown_Release( object );
63 }
64
65 static char data_bad_version[] =
66 "xof 0302txt 0064\n"
67 "Header Object\n"
68 "{\n"
69 "1; 2; 3;\n"
70 "}\n";
71
72 static char data_no_mesh[] =
73 "xof 0302txt 0064\n"
74 "Header Object\n"
75 "{\n"
76 "1; 0; 1;\n"
77 "}\n";
78
79 static char data_ok[] =
80 "xof 0302txt 0064\n"
81 "Header Object\n"
82 "{\n"
83 "1; 0; 1;\n"
84 "}\n"
85 "Mesh Object\n"
86 "{\n"
87 "4;\n"
88 "1.0; 0.0; 0.0;,\n"
89 "0.0; 1.0; 0.0;,\n"
90 "0.0; 0.0; 1.0;,\n"
91 "1.0; 1.0; 1.0;;\n"
92 "3;\n"
93 "3; 0, 1, 2;,\n"
94 "3; 1, 2, 3;,\n"
95 "3; 3, 1, 2;;\n"
96 "}\n";
97
98 static void test_MeshBuilder(void)
99 {
100     HRESULT hr;
101     LPDIRECT3DRM pD3DRM;
102     LPDIRECT3DRMMESHBUILDER pMeshBuilder;
103     D3DRMLOADMEMORY info;
104     int val;
105     DWORD val1, val2, val3;
106     D3DVALUE valu, valv;
107
108     hr = pDirect3DRMCreate(&pD3DRM);
109     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
110
111     hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
112     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
113
114     info.lpMemory = data_bad_version;
115     info.dSize = strlen(data_bad_version);
116     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
117     ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
118
119     info.lpMemory = data_no_mesh;
120     info.dSize = strlen(data_no_mesh);
121     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
122     ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
123
124     info.lpMemory = data_ok;
125     info.dSize = strlen(data_ok);
126     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
127     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
128
129     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
130     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
131
132     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
133     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
134
135     hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, NULL, &val2, NULL, &val3, NULL);
136     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
137     ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
138     todo_wine ok(val2 == 4, "Wrong number of normals %d (must be 4)\n", val2);
139     todo_wine ok(val3 == 22, "Wrong number of face data bytes %d (must be 22)\n", val3);
140
141     valu = 1.23f;
142     valv = 3.21f;
143     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv);
144     todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
145     todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
146     todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
147
148     valu = 1.23f;
149     valv = 3.21f;
150     hr = IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder, 1, valu, valv);
151     todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
152
153     valu = 0.0f;
154     valv = 0.0f;
155     hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv);
156     todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
157     todo_wine ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
158     todo_wine ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
159
160     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
161
162     IDirect3DRM_Release(pD3DRM);
163 }
164
165 static void test_MeshBuilder3(void)
166 {
167     HRESULT hr;
168     LPDIRECT3DRM pD3DRM;
169     LPDIRECT3DRM3 pD3DRM3;
170     LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3;
171     D3DRMLOADMEMORY info;
172     int val;
173     DWORD val1;
174     D3DVALUE valu, valv;
175
176     hr = pDirect3DRMCreate(&pD3DRM);
177     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
178
179     hr = IDirect3DRM_QueryInterface(pD3DRM, &IID_IDirect3DRM3, (LPVOID*)&pD3DRM3);
180     if (FAILED(hr))
181     {
182         win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
183         IDirect3DRM_Release(pD3DRM);
184         return;
185     }
186
187     hr = IDirect3DRM3_CreateMeshBuilder(pD3DRM3, &pMeshBuilder3);
188     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr);
189
190     info.lpMemory = data_bad_version;
191     info.dSize = strlen(data_bad_version);
192     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
193     ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
194
195     info.lpMemory = data_no_mesh;
196     info.dSize = strlen(data_no_mesh);
197     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
198     ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
199
200     info.lpMemory = data_ok;
201     info.dSize = strlen(data_ok);
202     hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
203     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
204
205     val = IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3);
206     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
207
208     val = IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3);
209     ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
210
211     hr = IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3, 0, &val1, NULL);
212     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
213     ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
214
215     valu = 1.23f;
216     valv = 3.21f;
217     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv);
218     todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
219     todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
220     todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
221
222     valu = 1.23f;
223     valv = 3.21f;
224     hr = IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3, 1, valu, valv);
225     todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
226
227     valu = 0.0f;
228     valv = 0.0f;
229     hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv);
230     todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
231     todo_wine ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
232     todo_wine ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
233
234     IDirect3DRMMeshBuilder3_Release(pMeshBuilder3);
235     IDirect3DRM3_Release(pD3DRM3);
236     IDirect3DRM_Release(pD3DRM);
237 }
238
239 static void test_Frame(void)
240 {
241     HRESULT hr;
242     LPDIRECT3DRM pD3DRM;
243     LPDIRECT3DRMFRAME pFrameC;
244     LPDIRECT3DRMFRAME pFrameP1;
245     LPDIRECT3DRMFRAME pFrameP2;
246     LPDIRECT3DRMFRAME pFrameTmp;
247     LPDIRECT3DRMFRAMEARRAY pArray;
248     DWORD count;
249
250     hr = pDirect3DRMCreate(&pD3DRM);
251     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
252
253     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameC);
254     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
255     CHECK_REFCOUNT(pFrameC, 1);
256
257     pFrameTmp = (void*)0xdeadbeef;
258     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
259     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
260     todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
261     CHECK_REFCOUNT(pFrameC, 1);
262
263     pArray = NULL;
264     hr = IDirect3DRMFrame_GetChildren(pFrameC, &pArray);
265     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
266     todo_wine ok(pArray != NULL, "pArray = %p\n", pArray);
267     if (pArray)
268     {
269         count = IDirect3DRMFrameArray_GetSize(pArray);
270         ok(count == 0, "count = %u\n", count);
271         IDirect3DRMFrameArray_Release(pArray);
272     }
273
274     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP1);
275     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
276
277     /* [Add/Delete]Child with NULL pointer */
278     hr = IDirect3DRMFrame_AddChild(pFrameP1, NULL);
279     todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
280     CHECK_REFCOUNT(pFrameP1, 1);
281
282     hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
283     todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
284     CHECK_REFCOUNT(pFrameP1, 1);
285
286     /* Add child to first parent */
287     pFrameTmp = (void*)0xdeadbeef;
288     hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
289     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
290     todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
291
292     hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
293     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
294     CHECK_REFCOUNT(pFrameP1, 1);
295     todo_wine CHECK_REFCOUNT(pFrameC, 2);
296
297     pArray = NULL;
298     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
299     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
300     if (pArray)
301     {
302         count = IDirect3DRMFrameArray_GetSize(pArray);
303         ok(count == 1, "count = %u\n", count);
304         IDirect3DRMFrameArray_Release(pArray);
305     }
306
307     pFrameTmp = (void*)0xdeadbeef;
308     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
309     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
310     todo_wine ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
311     todo_wine CHECK_REFCOUNT(pFrameP1, 2);
312
313     /* Add child to second parent */
314     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
315     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
316
317     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
318     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
319     todo_wine CHECK_REFCOUNT(pFrameC, 2);
320
321     pArray = NULL;
322     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
323     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
324     if (pArray)
325     {
326         count = IDirect3DRMFrameArray_GetSize(pArray);
327         ok(count == 1, "count = %u\n", count);
328         IDirect3DRMFrameArray_Release(pArray);
329     }
330
331     pArray = NULL;
332     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
333     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
334     if (pArray)
335     {
336         count = IDirect3DRMFrameArray_GetSize(pArray);
337         ok(count == 0, "count = %u\n", count);
338         IDirect3DRMFrameArray_Release(pArray);
339     }
340
341     pFrameTmp = (void*)0xdeadbeef;
342     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
343     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
344     todo_wine ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
345     todo_wine CHECK_REFCOUNT(pFrameP2, 2);
346     todo_wine CHECK_REFCOUNT(pFrameC, 2);
347
348     /* Add child again */
349     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
350     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
351     todo_wine CHECK_REFCOUNT(pFrameC, 2);
352
353     pArray = NULL;
354     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
355     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
356     if (pArray)
357     {
358         count = IDirect3DRMFrameArray_GetSize(pArray);
359         ok(count == 1, "count = %u\n", count);
360         IDirect3DRMFrameArray_Release(pArray);
361     }
362
363     /* Delete child */
364     hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
365     todo_wine ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
366     CHECK_REFCOUNT(pFrameC, 1);
367
368     pArray = NULL;
369     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
370     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
371     if (pArray)
372     {
373         count = IDirect3DRMFrameArray_GetSize(pArray);
374         ok(count == 0, "count = %u\n", count);
375         IDirect3DRMFrameArray_Release(pArray);
376     }
377
378     pFrameTmp = (void*)0xdeadbeef;
379     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
380     todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
381     todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
382
383     /* Add two children */
384     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
385     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
386     todo_wine CHECK_REFCOUNT(pFrameC, 2);
387
388     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameP1);
389     todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
390     todo_wine CHECK_REFCOUNT(pFrameP1, 3);
391
392     pArray = NULL;
393     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
394     todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
395     if (pArray)
396     {
397         count = IDirect3DRMFrameArray_GetSize(pArray);
398         ok(count == 2, "count = %u\n", count);
399         IDirect3DRMFrameArray_Release(pArray);
400     }
401
402     IDirect3DRMMeshBuilder_Release(pFrameP2);
403     todo_wine CHECK_REFCOUNT(pFrameC, 2);
404     todo_wine CHECK_REFCOUNT(pFrameP1, 3);
405
406     IDirect3DRMMeshBuilder_Release(pFrameC);
407     IDirect3DRMMeshBuilder_Release(pFrameP1);
408
409     IDirect3DRM_Release(pD3DRM);
410 }
411
412 START_TEST(d3drm)
413 {
414     if (!InitFunctionPtrs())
415         return;
416
417     test_MeshBuilder();
418     test_MeshBuilder3();
419     test_Frame();
420
421     FreeLibrary(d3drm_handle);
422 }