[PATCH] comctl32/tests: Use HGLOBAL stream to Read/Write tests on imagelists
Nikolay Sivov
nsivov at codeweavers.com
Tue Jan 31 23:08:12 CST 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/comctl32/tests/imagelist.c | 120 ++++++++++++++++++----------------------
1 file changed, 53 insertions(+), 67 deletions(-)
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index b5445c5c08..2b68b6366f 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -675,16 +675,15 @@ static void test_merge(void)
#define BMP_CX 48
-struct my_IStream
+struct memstream
{
IStream IStream_iface;
- char *iml_data; /* written imagelist data */
- ULONG iml_data_size;
+ IStream *stream;
};
-static struct my_IStream *impl_from_IStream(IStream *iface)
+static struct memstream *impl_from_IStream(IStream *iface)
{
- return CONTAINING_RECORD(iface, struct my_IStream, IStream_iface);
+ return CONTAINING_RECORD(iface, struct memstream, IStream_iface);
}
static HRESULT STDMETHODCALLTYPE Test_Stream_QueryInterface(IStream *iface, REFIID riid,
@@ -709,34 +708,15 @@ static ULONG STDMETHODCALLTYPE Test_Stream_Release(IStream *iface)
static HRESULT STDMETHODCALLTYPE Test_Stream_Read(IStream *iface, void *pv, ULONG cb,
ULONG *pcbRead)
{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static BOOL allocate_storage(struct my_IStream *my_is, ULONG add)
-{
- my_is->iml_data_size += add;
-
- if (!my_is->iml_data)
- my_is->iml_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, my_is->iml_data_size);
- else
- my_is->iml_data = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, my_is->iml_data, my_is->iml_data_size);
-
- return my_is->iml_data != NULL;
+ struct memstream *stream = impl_from_IStream(iface);
+ return IStream_Read(stream->stream, pv, cb, pcbRead);
}
static HRESULT STDMETHODCALLTYPE Test_Stream_Write(IStream *iface, const void *pv, ULONG cb,
ULONG *pcbWritten)
{
- struct my_IStream *my_is = impl_from_IStream(iface);
- ULONG current_iml_data_size = my_is->iml_data_size;
-
- if (!allocate_storage(my_is, cb)) return E_FAIL;
-
- memcpy(my_is->iml_data + current_iml_data_size, pv, cb);
- if (pcbWritten) *pcbWritten = cb;
-
- return S_OK;
+ struct memstream *stream = impl_from_IStream(iface);
+ return IStream_Write(stream->stream, pv, cb, pcbWritten);
}
static HRESULT STDMETHODCALLTYPE Test_Stream_Seek(IStream *iface, LARGE_INTEGER dlibMove,
@@ -817,7 +797,17 @@ static const IStreamVtbl Test_Stream_Vtbl =
Test_Stream_Clone
};
-static struct my_IStream Test_Stream = { { &Test_Stream_Vtbl }, 0, 0 };
+static void init_memstream(struct memstream *stream)
+{
+ stream->IStream_iface.lpVtbl = &Test_Stream_Vtbl;
+ CreateStreamOnHGlobal(NULL, TRUE, &stream->stream);
+}
+
+static void cleanup_memstream(struct memstream *stream)
+{
+ IStream_Release(stream->stream);
+}
+
static INT DIB_GetWidthBytes( int width, int bpp )
{
@@ -916,15 +906,17 @@ static HBITMAP create_bitmap(INT cx, INT cy, COLORREF color, const char *comment
return hbmp;
}
-#define iml_clear_stream_data() \
- HeapFree(GetProcessHeap(), 0, Test_Stream.iml_data); \
- Test_Stream.iml_data = NULL; \
- Test_Stream.iml_data_size = 0;
-
static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, INT grow,
INT width, INT height, INT flags, const char *comment)
{
INT ret, cxx, cyy, size;
+ struct memstream stream;
+ LARGE_INTEGER mv;
+ HIMAGELIST himl2;
+ HGLOBAL hglobal;
+ STATSTG stat;
+ char *data;
+ HRESULT hr;
trace("%s\n", comment);
@@ -936,25 +928,39 @@ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, IN
ok(cxx == cx, "wrong cx %d (expected %d)\n", cxx, cx);
ok(cyy == cy, "wrong cy %d (expected %d)\n", cyy, cy);
- iml_clear_stream_data();
- ret = ImageList_Write(himl, &Test_Stream.IStream_iface);
+ init_memstream(&stream);
+ ret = ImageList_Write(himl, &stream.IStream_iface);
ok(ret, "ImageList_Write failed\n");
- ok(Test_Stream.iml_data != 0, "ImageList_Write didn't write any data\n");
- ok(Test_Stream.iml_data_size > sizeof(ILHEAD), "ImageList_Write wrote not enough data\n");
+ hr = GetHGlobalFromStream(stream.stream, &hglobal);
+ ok(hr == S_OK, "Failed to get hglobal, %#x\n", hr);
+
+ IStream_Stat(stream.stream, &stat, STATFLAG_NONAME);
- check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow, flags);
- size = check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD),
- Test_Stream.iml_data_size - sizeof(ILHEAD),
- width, height, flags & 0xfe, comment);
- if (size < Test_Stream.iml_data_size - sizeof(ILHEAD)) /* mask is present */
+ data = GlobalLock(hglobal);
+
+ ok(data != 0, "ImageList_Write didn't write any data\n");
+ ok(stat.cbSize.LowPart > sizeof(ILHEAD), "ImageList_Write wrote not enough data\n");
+
+ check_ilhead_data(data, cx, cy, cur, max, grow, flags);
+ size = check_bitmap_data(data + sizeof(ILHEAD), stat.cbSize.LowPart - sizeof(ILHEAD),
+ width, height, flags & 0xfe, comment);
+ if (size < stat.cbSize.LowPart - sizeof(ILHEAD)) /* mask is present */
{
- ok( flags & ILC_MASK, "extra data %u/%u but mask not expected\n",
- Test_Stream.iml_data_size, size );
- check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD) + size,
- Test_Stream.iml_data_size - sizeof(ILHEAD) - size,
+ ok( flags & ILC_MASK, "extra data %u/%u but mask not expected\n", stat.cbSize.LowPart, size );
+ check_bitmap_data(data + sizeof(ILHEAD) + size, stat.cbSize.LowPart - sizeof(ILHEAD) - size,
width, height, 1, comment);
}
+
+ /* rewind and reconstruct from stream */
+ mv.QuadPart = 0;
+ IStream_Seek(stream.stream, mv, STREAM_SEEK_SET, NULL);
+ himl2 = ImageList_Read(&stream.IStream_iface);
+ ok(himl2 != NULL, "Failed to deserialize imagelist\n");
+ ImageList_Destroy(himl2);
+
+ GlobalUnlock(hglobal);
+ cleanup_memstream(&stream);
}
static void image_list_init(HIMAGELIST himl)
@@ -1059,8 +1065,6 @@ static void test_imagelist_storage(void)
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
-
/* test ImageList_Create storage allocation */
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 0, 32);
@@ -1073,7 +1077,6 @@ static void test_imagelist_storage(void)
DeleteObject(hbm);
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 4);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1088,70 +1091,60 @@ static void test_imagelist_storage(void)
DeleteObject(hbm);
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 207, 209);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, ILC_COLOR24, "init 207 grow 209");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 209, 207);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, ILC_COLOR24, "init 209 grow 207");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 14, 4);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, ILC_COLOR24, "init 14 grow 4");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 5, 9);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 5 grow 9");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 9, 5);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, ILC_COLOR24, "init 9 grow 5");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 2, 4);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "init 2 grow 4");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 4 grow 2");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR8, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR8, "bpp 8");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp 4");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, 0, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1163,7 +1156,6 @@ static void test_imagelist_storage(void)
check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp default");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24|ILC_MASK, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1177,7 +1169,6 @@ static void test_imagelist_storage(void)
"bpp 24 + mask");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 4, 2);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1191,7 +1182,6 @@ static void test_imagelist_storage(void)
"bpp 4 + mask");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 99);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1220,7 +1210,6 @@ static void test_imagelist_storage(void)
"init 2 grow 99 set count 42");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65536+12);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1228,7 +1217,6 @@ static void test_imagelist_storage(void)
"init 2 grow 65536+12");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65535);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1236,7 +1224,6 @@ static void test_imagelist_storage(void)
"init 2 grow 65535");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, -20);
ok(himl != 0, "ImageList_Create failed\n");
@@ -1244,7 +1231,6 @@ static void test_imagelist_storage(void)
"init 2 grow -20");
ret = ImageList_Destroy(himl);
ok(ret, "ImageList_Destroy failed\n");
- iml_clear_stream_data();
}
static void test_shell_imagelist(void)
--
2.11.0
More information about the wine-patches
mailing list