Dmitry Timoshkov : windowscodecs: Add some tests for IFD metadata reader.
Alexandre Julliard
julliard at winehq.org
Fri May 25 10:52:49 CDT 2012
Module: wine
Branch: master
Commit: 30fc8a553dd6aff5c1315af29d490860029f39b1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=30fc8a553dd6aff5c1315af29d490860029f39b1
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Fri May 25 19:14:05 2012 +0900
windowscodecs: Add some tests for IFD metadata reader.
---
dlls/windowscodecs/tests/metadata.c | 154 +++++++++++++++++++++++++++++++++++
1 files changed, 154 insertions(+), 0 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 09e26ca..d4249f42 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -1,5 +1,6 @@
/*
* Copyright 2011 Vincent Povirk for CodeWeavers
+ * Copyright 2012 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,6 +39,47 @@
} \
} while (0)
+#define IFD_SHORT 3
+#define IFD_LONG 4
+#define IFD_RATIONAL 5
+
+#include "pshpack2.h"
+struct IFD_entry
+{
+ SHORT id;
+ SHORT type;
+ ULONG length;
+ LONG value;
+};
+
+struct IFD_rational
+{
+ ULONG numerator;
+ ULONG denominator;
+};
+
+static const struct
+{
+ USHORT number_of_entries;
+ struct IFD_entry entry[6];
+ ULONG next_IFD;
+ struct IFD_rational rational;
+} IFD_data =
+{
+ 6,
+ {
+ { 0xfe, IFD_SHORT, 1, 1 },
+ { 0x100, IFD_LONG, 1, 222 },
+ { 0x101, IFD_LONG, 1, 333 },
+ { 0x102, IFD_SHORT, 1, 24 },
+ { 0x103, IFD_LONG, 1, 32773 },
+ { 0x11a, IFD_RATIONAL, 1, sizeof(USHORT) + sizeof(struct IFD_entry) * 6 + sizeof(ULONG) }
+ },
+ 0,
+ { 300, 1 }
+};
+#include "poppack.h"
+
static const char metadata_unknown[] = "lalala";
static const char metadata_tEXt[] = {
@@ -275,6 +317,117 @@ static void test_metadata_tEXt(void)
IWICMetadataReader_Release(reader);
}
+static void test_metadata_IFD(void)
+{
+ static const struct test_data
+ {
+ ULONG type, id, value;
+ } td[6] =
+ {
+ { VT_UI2, 0xfe, 1 },
+ { VT_UI4, 0x100, 222 },
+ { VT_UI4, 0x101, 333 },
+ { VT_UI2, 0x102, 24 },
+ { VT_UI4, 0x103, 32773 },
+ { VT_UI8, 0x11a, 300 }
+ };
+ HRESULT hr;
+ IWICMetadataReader *reader;
+ IWICEnumMetadataItem *enumerator;
+ PROPVARIANT schema, id, value;
+ ULONG items_returned, count, i;
+ GUID format;
+
+ PropVariantInit(&schema);
+ PropVariantInit(&id);
+ PropVariantInit(&value);
+
+ hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICMetadataReader, (void**)&reader);
+ todo_wine ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
+ if (FAILED(hr)) return;
+
+ hr = IWICMetadataReader_GetCount(reader, NULL);
+ ok(hr == E_INVALIDARG, "GetCount error %#x\n", hr);
+
+ hr = IWICMetadataReader_GetCount(reader, &count);
+ ok(hr == S_OK, "GetCount error %#x\n", hr);
+ ok(count == 0, "unexpected count %u\n", count);
+
+ load_stream((IUnknown*)reader, (const char *)&IFD_data, sizeof(IFD_data));
+
+ hr = IWICMetadataReader_GetCount(reader, &count);
+ ok(hr == S_OK, "GetCount error %#x\n", hr);
+ ok(count == 6, "unexpected count %u\n", count);
+
+ hr = IWICMetadataReader_GetEnumerator(reader, NULL);
+ ok(hr == E_INVALIDARG, "GetEnumerator error %#x\n", hr);
+
+ hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
+ ok(hr == S_OK, "GetEnumerator error %#x\n", hr);
+
+ for (i = 0; i < count; i++)
+ {
+ hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
+ ok(hr == S_OK, "Next error %#x\n", hr);
+ ok(items_returned == 1, "unexpected item count %u\n", items_returned);
+
+ ok(schema.vt == VT_EMPTY, "%u: unexpected vt: %u\n", i, schema.vt);
+ ok(id.vt == VT_UI2, "%u: unexpected vt: %u\n", i, id.vt);
+ ok(U(id).uiVal == td[i].id, "%u: unexpected id: %#x\n", i, U(id).uiVal);
+ ok(value.vt == td[i].type, "%u: unexpected vt: %u\n", i, value.vt);
+ ok(U(value).ulVal == td[i].value, "%u: unexpected id: %u\n", i, U(value).ulVal);
+
+ PropVariantClear(&schema);
+ PropVariantClear(&id);
+ PropVariantClear(&value);
+ }
+
+ hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
+ ok(hr == S_FALSE, "Next should fail\n");
+ ok(items_returned == 0, "unexpected item count %u\n", items_returned);
+
+ IWICEnumMetadataItem_Release(enumerator);
+
+ hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+ ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+ ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", debugstr_guid(&format));
+
+ hr = IWICMetadataReader_GetMetadataFormat(reader, NULL);
+ ok(hr == E_INVALIDARG, "GetMetadataFormat should fail\n");
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, NULL);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, count - 1, NULL, NULL, NULL);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, 0, &schema, NULL, NULL);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+ ok(schema.vt == VT_EMPTY, "unexpected vt: %u\n", schema.vt);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, count - 1, &schema, NULL, NULL);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+ ok(schema.vt == VT_EMPTY, "unexpected vt: %u\n", schema.vt);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, NULL);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+ ok(id.vt == VT_UI2, "unexpected vt: %u\n", id.vt);
+ ok(U(id).uiVal == 0xfe, "unexpected id: %#x\n", U(id).uiVal);
+ PropVariantClear(&id);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value);
+ ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
+ ok(value.vt == VT_UI2, "unexpected vt: %u\n", value.vt);
+ ok(U(value).ulVal == 1, "unexpected id: %u\n", U(value).ulVal);
+ PropVariantClear(&value);
+
+ hr = IWICMetadataReader_GetValueByIndex(reader, count, &schema, NULL, NULL);
+ ok(hr == E_INVALIDARG, "GetValueByIndex should fail\n");
+
+ IWICMetadataReader_Release(reader);
+}
+
static void test_create_reader(void)
{
HRESULT hr;
@@ -338,6 +491,7 @@ START_TEST(metadata)
test_metadata_unknown();
test_metadata_tEXt();
+ test_metadata_IFD();
test_create_reader();
CoUninitialize();
More information about the wine-cvs
mailing list