windowscodecs: Add some tests for IFD metadata reader.
This commit is contained in:
parent
02dff390ee
commit
30fc8a553d
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Vincent Povirk for CodeWeavers
|
* Copyright 2011 Vincent Povirk for CodeWeavers
|
||||||
|
* Copyright 2012 Dmitry Timoshkov
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -38,6 +39,47 @@
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} 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_unknown[] = "lalala";
|
||||||
|
|
||||||
static const char metadata_tEXt[] = {
|
static const char metadata_tEXt[] = {
|
||||||
|
@ -275,6 +317,117 @@ static void test_metadata_tEXt(void)
|
||||||
IWICMetadataReader_Release(reader);
|
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)
|
static void test_create_reader(void)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -338,6 +491,7 @@ START_TEST(metadata)
|
||||||
|
|
||||||
test_metadata_unknown();
|
test_metadata_unknown();
|
||||||
test_metadata_tEXt();
|
test_metadata_tEXt();
|
||||||
|
test_metadata_IFD();
|
||||||
test_create_reader();
|
test_create_reader();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
|
Loading…
Reference in New Issue