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