Release 1.5.29.
[wine] / dlls / windowscodecs / tests / info.c
1 /*
2  * Copyright 2009 Vincent Povirk for CodeWeavers
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 #include <stdio.h>
20 #include <stdarg.h>
21 #include <math.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "objbase.h"
27 #include "wincodec.h"
28 #include "wincodecsdk.h"
29 #include "wine/test.h"
30
31 #include "initguid.h"
32 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
33
34 static const char *debugstr_guid(GUID *guid)
35 {
36     static char buf[50];
37
38     if(!guid)
39         return "(null)";
40
41     sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
42             guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
43             guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
44             guid->Data4[5], guid->Data4[6], guid->Data4[7]);
45
46     return buf;
47 }
48
49 static HRESULT get_component_info(const GUID *clsid, IWICComponentInfo **result)
50 {
51     IWICImagingFactory *factory;
52     HRESULT hr;
53
54     hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
55         &IID_IWICImagingFactory, (void**)&factory);
56     ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
57     if (FAILED(hr)) return hr;
58
59     hr = IWICImagingFactory_CreateComponentInfo(factory, clsid, result);
60
61     IWICImagingFactory_Release(factory);
62
63     return hr;
64 }
65
66 static int is_pixelformat(GUID *format)
67 {
68     IWICComponentInfo *info;
69     HRESULT hr;
70     WICComponentType componenttype;
71
72     hr = get_component_info(format, &info);
73     if (FAILED(hr))
74         return FALSE;
75
76     hr = IWICComponentInfo_GetComponentType(info, &componenttype);
77
78     IWICComponentInfo_Release(info);
79
80     return SUCCEEDED(hr) && componenttype == WICPixelFormat;
81 }
82
83 static void test_decoder_info(void)
84 {
85     IWICComponentInfo *info;
86     IWICBitmapDecoderInfo *decoder_info;
87     HRESULT hr;
88     ULONG len;
89     WCHAR value[256];
90     const WCHAR expected_mimetype[] = {'i','m','a','g','e','/','b','m','p',0};
91     const WCHAR expected_extensions[] = {'.','b','m','p',',','.','d','i','b',',','.','r','l','e',0};
92     CLSID clsid;
93     GUID pixelformats[20];
94     UINT num_formats, count;
95     int i;
96
97     hr = get_component_info(&CLSID_WICBmpDecoder, &info);
98
99     hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void**)&decoder_info);
100     ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
101
102     hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, NULL);
103     ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
104
105     hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, &clsid);
106     ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
107     ok(IsEqualGUID(&CLSID_WICBmpDecoder, &clsid), "GetCLSID returned wrong result\n");
108
109     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, NULL);
110     ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
111
112     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, NULL, &len);
113     ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
114     ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len);
115
116     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, NULL);
117     ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
118
119     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, &len);
120     ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
121     ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len);
122
123     value[0] = 0;
124     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, &len);
125     ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
126     ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value));
127     ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len);
128
129     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, value, &len);
130     ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetMimeType failed, hr=%x\n", hr);
131     ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len);
132
133     hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 256, value, &len);
134     ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
135     ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value));
136     ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len);
137
138     num_formats = 0xdeadbeef;
139     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, &num_formats);
140     ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
141     ok(num_formats < 20 && num_formats > 1, "got %d formats\n", num_formats);
142
143     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, NULL);
144     ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr);
145
146     count = 0xdeadbeef;
147     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, pixelformats, &count);
148     ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
149     ok(count == 0, "got %d formats\n", count);
150
151     count = 0xdeadbeef;
152     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 1, pixelformats, &count);
153     ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
154     ok(count == 1, "got %d formats\n", count);
155     ok(is_pixelformat(&pixelformats[0]), "got invalid pixel format\n");
156
157     count = 0xdeadbeef;
158     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, &count);
159     ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
160     ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats);
161     for (i=0; i<num_formats; i++)
162         ok(is_pixelformat(&pixelformats[i]), "got invalid pixel format\n");
163
164     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, NULL);
165     ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr);
166
167     count = 0xdeadbeef;
168     hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 20, pixelformats, &count);
169     ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
170     ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats);
171
172     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, NULL);
173     ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
174
175     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, NULL, &len);
176     ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
177     ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len);
178
179     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, NULL);
180     ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
181
182     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, &len);
183     ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
184     ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len);
185
186     value[0] = 0;
187     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, &len);
188     ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
189     ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value));
190     ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len);
191
192     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, value, &len);
193     ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetFileExtensions failed, hr=%x\n", hr);
194     ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len);
195
196     hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 256, value, &len);
197     ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
198     ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value));
199     ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len);
200
201     IWICBitmapDecoderInfo_Release(decoder_info);
202
203     IWICComponentInfo_Release(info);
204 }
205
206 static void test_pixelformat_info(void)
207 {
208     IWICComponentInfo *info;
209     IWICPixelFormatInfo *pixelformat_info;
210     IWICPixelFormatInfo2 *pixelformat_info2;
211     HRESULT hr;
212     ULONG len, known_len;
213     WCHAR value[256];
214     GUID guid;
215     WICComponentType componenttype;
216     WICPixelFormatNumericRepresentation numericrepresentation;
217     DWORD signing;
218     UINT uiresult;
219     BYTE abbuffer[256];
220     BOOL supportstransparency;
221
222     hr = get_component_info(&GUID_WICPixelFormat32bppBGRA, &info);
223     ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
224
225     if (FAILED(hr))
226         return;
227
228     hr = IWICComponentInfo_GetAuthor(info, 0, NULL, 0);
229     ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr);
230
231     len = 0xdeadbeef;
232     hr = IWICComponentInfo_GetAuthor(info, 0, NULL, &len);
233     ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
234     ok(len < 255 && len > 0, "invalid length 0x%x\n", len);
235     known_len = len;
236
237     memset(value, 0xaa, 256 * sizeof(WCHAR));
238     hr = IWICComponentInfo_GetAuthor(info, len-1, value, NULL);
239     ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr);
240     ok(value[0] = 0xaaaa, "string modified\n");
241
242     len = 0xdeadbeef;
243     memset(value, 0xaa, 256 * sizeof(WCHAR));
244     hr = IWICComponentInfo_GetAuthor(info, known_len-1, value, &len);
245     ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetAuthor failed, hr=%x\n", hr);
246     ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
247     ok(value[known_len-1] == 0xaaaa, "string modified past given length\n");
248     ok(value[0] == 0xaaaa, "string modified\n");
249
250     len = 0xdeadbeef;
251     memset(value, 0xaa, 256 * sizeof(WCHAR));
252     hr = IWICComponentInfo_GetAuthor(info, known_len, value, &len);
253     ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
254     ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
255     ok(value[known_len-1] == 0, "string not terminated at expected length\n");
256     ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n");
257
258     len = 0xdeadbeef;
259     memset(value, 0xaa, 256 * sizeof(WCHAR));
260     hr = IWICComponentInfo_GetAuthor(info, known_len+1, value, &len);
261     ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
262     ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
263     ok(value[known_len] == 0xaaaa, "string modified past end\n");
264     ok(value[known_len-1] == 0, "string not terminated at expected length\n");
265     ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n");
266
267     hr = IWICComponentInfo_GetCLSID(info, NULL);
268     ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
269
270     memset(&guid, 0xaa, sizeof(guid));
271     hr = IWICComponentInfo_GetCLSID(info, &guid);
272     ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
273     ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected CLSID %s\n", debugstr_guid(&guid));
274
275     hr = IWICComponentInfo_GetComponentType(info, NULL);
276     ok(hr == E_INVALIDARG, "GetComponentType failed, hr=%x\n", hr);
277
278     hr = IWICComponentInfo_GetComponentType(info, &componenttype);
279     ok(hr == S_OK, "GetComponentType failed, hr=%x\n", hr);
280     ok(componenttype == WICPixelFormat, "unexpected component type 0x%x\n", componenttype);
281
282     len = 0xdeadbeef;
283     hr = IWICComponentInfo_GetFriendlyName(info, 0, NULL, &len);
284     ok(hr == S_OK, "GetFriendlyName failed, hr=%x\n", hr);
285     ok(len < 255 && len > 0, "invalid length 0x%x\n", len);
286
287     hr = IWICComponentInfo_GetSigningStatus(info, NULL);
288     ok(hr == E_INVALIDARG, "GetSigningStatus failed, hr=%x\n", hr);
289
290     hr = IWICComponentInfo_GetSigningStatus(info, &signing);
291     ok(hr == S_OK, "GetSigningStatus failed, hr=%x\n", hr);
292     ok(signing == WICComponentSigned, "unexpected signing status 0x%x\n", signing);
293
294     len = 0xdeadbeef;
295     hr = IWICComponentInfo_GetSpecVersion(info, 0, NULL, &len);
296     ok(hr == S_OK, "GetSpecVersion failed, hr=%x\n", hr);
297     ok(len == 0, "invalid length 0x%x\n", len); /* spec version does not apply to pixel formats */
298
299     memset(&guid, 0xaa, sizeof(guid));
300     hr = IWICComponentInfo_GetVendorGUID(info, &guid);
301     ok(hr == S_OK, "GetVendorGUID failed, hr=%x\n", hr);
302     ok(IsEqualGUID(&guid, &GUID_VendorMicrosoft) ||
303        broken(IsEqualGUID(&guid, &GUID_NULL)) /* XP */, "unexpected GUID %s\n", debugstr_guid(&guid));
304
305     len = 0xdeadbeef;
306     hr = IWICComponentInfo_GetVersion(info, 0, NULL, &len);
307     ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
308     ok(len == 0, "invalid length 0x%x\n", len); /* version does not apply to pixel formats */
309
310     hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo, (void**)&pixelformat_info);
311     ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
312
313     if (SUCCEEDED(hr))
314     {
315         hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, NULL);
316         ok(hr == E_INVALIDARG, "GetBitsPerPixel failed, hr=%x\n", hr);
317
318         hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, &uiresult);
319         ok(hr == S_OK, "GetBitsPerPixel failed, hr=%x\n", hr);
320         ok(uiresult == 32, "unexpected bpp %i\n", uiresult);
321
322         hr = IWICPixelFormatInfo_GetChannelCount(pixelformat_info, &uiresult);
323         ok(hr == S_OK, "GetChannelCount failed, hr=%x\n", hr);
324         ok(uiresult == 4, "unexpected channel count %i\n", uiresult);
325
326         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, NULL);
327         ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
328
329         uiresult = 0xdeadbeef;
330         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, &uiresult);
331         ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
332         ok(uiresult == 4, "unexpected length %i\n", uiresult);
333
334         memset(abbuffer, 0xaa, sizeof(abbuffer));
335         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, known_len, abbuffer, NULL);
336         ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
337         ok(abbuffer[0] == 0xaa, "buffer modified\n");
338
339         uiresult = 0xdeadbeef;
340         memset(abbuffer, 0xaa, sizeof(abbuffer));
341         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 3, abbuffer, &uiresult);
342         ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
343         ok(abbuffer[0] == 0xaa, "buffer modified\n");
344         ok(uiresult == 4, "unexpected length %i\n", uiresult);
345
346         memset(abbuffer, 0xaa, sizeof(abbuffer));
347         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 4, abbuffer, &uiresult);
348         ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
349         ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer));
350         ok(uiresult == 4, "unexpected length %i\n", uiresult);
351
352         memset(abbuffer, 0xaa, sizeof(abbuffer));
353         hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 5, abbuffer, &uiresult);
354         ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
355         ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer));
356         ok(abbuffer[4] == 0xaa, "buffer modified past actual length\n");
357         ok(uiresult == 4, "unexpected length %i\n", uiresult);
358
359         memset(&guid, 0xaa, sizeof(guid));
360         hr = IWICPixelFormatInfo_GetFormatGUID(pixelformat_info, &guid);
361         ok(hr == S_OK, "GetFormatGUID failed, hr=%x\n", hr);
362         ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected GUID %s\n", debugstr_guid(&guid));
363
364         IWICPixelFormatInfo_Release(pixelformat_info);
365     }
366
367     hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo2, (void**)&pixelformat_info2);
368
369     if (FAILED(hr))
370         win_skip("IWICPixelFormatInfo2 not supported\n");
371     else
372     {
373         hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, NULL);
374         ok(hr == E_INVALIDARG, "GetNumericRepresentation failed, hr=%x\n", hr);
375
376         numericrepresentation = 0xdeadbeef;
377         hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, &numericrepresentation);
378         ok(hr == S_OK, "GetNumericRepresentation failed, hr=%x\n", hr);
379         ok(numericrepresentation == WICPixelFormatNumericRepresentationUnsignedInteger, "unexpected numeric representation %i\n", numericrepresentation);
380
381         hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, NULL);
382         ok(hr == E_INVALIDARG, "SupportsTransparency failed, hr=%x\n", hr);
383
384         supportstransparency = 0xdeadbeef;
385         hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, &supportstransparency);
386         ok(hr == S_OK, "SupportsTransparency failed, hr=%x\n", hr);
387         ok(supportstransparency == 1, "unexpected value %i\n", supportstransparency);
388
389         IWICPixelFormatInfo2_Release(pixelformat_info2);
390     }
391
392     IWICComponentInfo_Release(info);
393 }
394
395 static void test_reader_info(void)
396 {
397     IWICImagingFactory *factory;
398     IWICComponentInfo *info;
399     IWICMetadataReaderInfo *reader_info;
400     HRESULT hr;
401     CLSID clsid;
402     GUID container_formats[10];
403     UINT count, size;
404     WICMetadataPattern *patterns;
405
406     hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
407         &IID_IWICImagingFactory, (void**)&factory);
408     ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
409     if (FAILED(hr)) return;
410
411     hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICUnknownMetadataReader, &info);
412     ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
413
414     hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info);
415     ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
416
417     hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL);
418     ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
419
420     hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid);
421     ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
422     ok(IsEqualGUID(&CLSID_WICUnknownMetadataReader, &clsid), "GetCLSID returned wrong result\n");
423
424     hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid);
425     ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
426     ok(IsEqualGUID(&GUID_MetadataFormatUnknown, &clsid), "GetMetadataFormat returned wrong result\n");
427
428     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL);
429     ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr);
430
431     count = 0xdeadbeef;
432     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count);
433 todo_wine
434     ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
435 todo_wine
436     ok(count == 0, "unexpected count %d\n", count);
437
438     hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
439         0, NULL, NULL, NULL);
440     ok(hr == E_INVALIDARG, "GetPatterns failed, hr=%x\n", hr);
441
442     count = size = 0xdeadbeef;
443     hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
444         0, NULL, &count, &size);
445 todo_wine
446     ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */,
447         "GetPatterns failed, hr=%x\n", hr);
448     ok(count == 0xdeadbeef, "unexpected count %d\n", count);
449     ok(size == 0xdeadbeef, "unexpected size %d\n", size);
450
451     IWICMetadataReaderInfo_Release(reader_info);
452
453     IWICComponentInfo_Release(info);
454
455     hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICXMPStructMetadataReader, &info);
456 todo_wine
457     ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
458
459     if (FAILED(hr))
460     {
461         IWICImagingFactory_Release(factory);
462         return;
463     }
464
465     hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info);
466     ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
467
468     hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL);
469     ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
470
471     hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid);
472     ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
473     ok(IsEqualGUID(&CLSID_WICXMPStructMetadataReader, &clsid), "GetCLSID returned wrong result\n");
474
475     hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid);
476     ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
477     ok(IsEqualGUID(&GUID_MetadataFormatXMPStruct, &clsid), "GetMetadataFormat returned wrong result\n");
478
479     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL);
480     ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr);
481
482     count = 0xdeadbeef;
483     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count);
484     ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
485     ok(count >= 2, "unexpected count %d\n", count);
486
487     count = 0xdeadbeef;
488     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 1, container_formats, &count);
489     ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
490     ok(count == 1, "unexpected count %d\n", count);
491
492     count = 0xdeadbeef;
493     hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 10, container_formats, &count);
494     ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
495     ok(count == min(count, 10), "unexpected count %d\n", count);
496
497     count = size = 0xdeadbeef;
498     hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
499         0, NULL, &count, &size);
500     ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */,
501         "GetPatterns failed, hr=%x\n", hr);
502     ok(count == 0xdeadbeef, "unexpected count %d\n", count);
503     ok(size == 0xdeadbeef, "unexpected size %d\n", size);
504
505     count = size = 0xdeadbeef;
506     hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
507         0, NULL, &count, &size);
508     ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
509     ok(count == 1, "unexpected count %d\n", count);
510     ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size);
511
512     if (hr == S_OK)
513     {
514         patterns = HeapAlloc(GetProcessHeap(), 0, size);
515
516         count = size = 0xdeadbeef;
517         hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
518             size-1, patterns, &count, &size);
519         ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
520         ok(count == 1, "unexpected count %d\n", count);
521         ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size);
522
523         count = size = 0xdeadbeef;
524         hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
525             size, patterns, &count, &size);
526         ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
527         ok(count == 1, "unexpected count %d\n", count);
528         ok(size == sizeof(WICMetadataPattern) + patterns->Length * 2, "unexpected size %d\n", size);
529
530         HeapFree(GetProcessHeap(), 0, patterns);
531     }
532
533     IWICMetadataReaderInfo_Release(reader_info);
534
535     IWICComponentInfo_Release(info);
536
537     IWICImagingFactory_Release(factory);
538 }
539
540 START_TEST(info)
541 {
542     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
543
544     test_decoder_info();
545     test_reader_info();
546     test_pixelformat_info();
547
548     CoUninitialize();
549 }