[PATCH v2 6/8] qedit/tests: Add tests for WriteBitmapBits.

Gabriel Ivăncescu gabrielopcode at gmail.com
Fri Oct 23 10:18:56 CDT 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/qedit/tests/mediadet.c | 92 +++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index 9e88d0a..dba9d56 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -768,6 +768,45 @@ static void check_bitmap_(unsigned line, void *buffer, LONG width, LONG height,
     free(img);
 }
 
+#define check_bitmap_file(filename, buffer, width, height, seek_time) check_bitmap_file_(__LINE__, filename, buffer, width, height, seek_time)
+static void check_bitmap_file_(unsigned line, const WCHAR *filename, void *buffer, LONG width, LONG height, double seek_time)
+{
+    DWORD size_high, read, expected;
+    BITMAPFILEHEADER *hdr;
+    DWORD64 size;
+    HANDLE file;
+
+    /* WriteBitmapBits rounds the width up to a multiple of 4 */
+    width = (width + 3) & ~3;
+    expected = sizeof(BITMAPINFOHEADER) + width * 3 * height;
+
+    file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    ok_(__FILE__,line)(file != INVALID_HANDLE_VALUE, "CreateFile failed, error: %#x.\n", GetLastError());
+    if (file == INVALID_HANDLE_VALUE) return;
+
+    size = GetFileSize(file, &size_high);
+    size |= (DWORD64)size_high << 32;
+    ok_(__FILE__,line)(GetLastError() == NO_ERROR, "GetFileSize failed, error: %#x.\n", GetLastError());
+    ok_(__FILE__,line)(size == expected + sizeof(BITMAPFILEHEADER), "Wrong size 0x%s (expected 0x%x).\n",
+                       wine_dbgstr_longlong(size), expected);
+
+    ok_(__FILE__,line)(ReadFile(file, buffer, sizeof(BITMAPFILEHEADER), &read, NULL),
+                       "ReadFile failed, error: %#x.\n", GetLastError());
+    ok_(__FILE__,line)(read == sizeof(BITMAPFILEHEADER), "ReadFile read %u bytes (expected %u).\n",
+                       read, sizeof(BITMAPFILEHEADER));
+    hdr = (BITMAPFILEHEADER*)buffer;
+    ok_(__FILE__,line)(hdr->bfType == 0x4d42, "Got bfType %04x.\n", hdr->bfType);
+    ok_(__FILE__,line)(hdr->bfSize == expected + sizeof(BITMAPFILEHEADER), "Got bfSize %u.\n", hdr->bfSize);
+    ok_(__FILE__,line)(hdr->bfOffBits == sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),
+                       "Got bfOffBits %u.\n", hdr->bfOffBits);
+
+    ok_(__FILE__,line)(ReadFile(file, buffer, expected, &read, NULL), "ReadFile failed, error: %#x.\n", GetLastError());
+    ok_(__FILE__,line)(read == expected, "ReadFile read %u bytes (expected %u).\n", read, expected);
+
+    CloseHandle(file);
+    check_bitmap_(line, buffer, width, height, seek_time);
+}
+
 static BOOL init_tests(void)
 {
     return unpack_avi_file(TEST_AVI_RES, test_avi_filename)
@@ -1460,6 +1499,7 @@ static void test_bitmap_grab_mode(void)
         &TIME_FORMAT_MEDIA_TIME
     };
     char *buf = malloc(sizeof(BITMAPINFOHEADER) + 960 * 720 * 3);
+    WCHAR temp_path[MAX_PATH], filename[MAX_PATH];
     struct testfilter testfilter;
     FILTER_INFO filter_info;
     IReferenceClock *clock;
@@ -1480,6 +1520,10 @@ static void test_bitmap_grab_mode(void)
     GUID guid;
     BSTR str;
 
+    ok(GetTempPathW(MAX_PATH, temp_path), "GetTempPath failed, error: %#x.\n", GetLastError());
+    ok(GetTempFileNameW(temp_path, L"DES", 0, filename), "GetTempFileName failed, error: %#x.\n", GetLastError());
+    DeleteFileW(filename);
+
     hr = CoCreateInstance(&CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
                           &IID_IMediaDet, (void **)&detector);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -1489,6 +1533,8 @@ static void test_bitmap_grab_mode(void)
     size = sizeof(BITMAPINFOHEADER) + 640 * 480 * 3;
     hr = IMediaDet_GetBitmapBits(detector, 0.0, &size, buf, 640, 480);
     ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+    hr = IMediaDet_WriteBitmapBits(detector, 0.0, 640, 480, filename);
+    todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
     hr = IMediaDet_GetSampleGrabber(detector, &sg);
     ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr);
 
@@ -1704,6 +1750,24 @@ static void test_bitmap_grab_mode(void)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_bitmap(buf, 960, 720, 3.25);
 
+    hr = IMediaDet_WriteBitmapBits(detector, 0.0, 640, 480, NULL);
+    todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "Got hr %#x.\n", hr);
+    hr = IMediaDet_WriteBitmapBits(detector, 1.6, 640, 480, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine check_bitmap_file(filename, buf, 640, 480, 1.6);
+    hr = IMediaDet_WriteBitmapBits(detector, 3.08, 487, 337, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine check_bitmap_file(filename, buf, 487, 337, 3.08);
+    hr = IMediaDet_WriteBitmapBits(detector, 2.68, 11, 250, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine check_bitmap_file(filename, buf, 11, 250, 2.68);
+    hr = IMediaDet_WriteBitmapBits(detector, 0.44, 441, 363, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine check_bitmap_file(filename, buf, 441, 363, 0.44);
+    hr = IMediaDet_WriteBitmapBits(detector, 4.04, 809, 701, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine check_bitmap_file(filename, buf, 809, 701, 4.04);
+
     /* Changing filter resets bitmap grab mode */
     testfilter.bitmap_grab_mode = FALSE;
     hr = IMediaDet_put_Filter(detector, &testfilter.filter.IUnknown_inner);
@@ -1732,6 +1796,34 @@ static void test_bitmap_grab_mode(void)
     hr = IMediaDet_get_OutputStreams(detector, &count);
     ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
 
+    testfilter.bitmap_grab_mode = FALSE;
+    hr = IMediaDet_put_Filter(detector, &testfilter.filter.IUnknown_inner);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMediaDet_GetSampleGrabber(detector, &sg);
+    ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr);
+    hr = IMediaDet_get_OutputStreams(detector, &count);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(count == 1, "Got %d streams.\n", count);
+
+    /* As does WriteBitmapBits */
+    testfilter.bitmap_grab_mode = TRUE;
+    hr = IMediaDet_WriteBitmapBits(detector, 1.75, 640, 480, NULL);
+    todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "Got hr %#x.\n", hr);
+    hr = IMediaDet_GetSampleGrabber(detector, &sg);
+    ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr);
+    hr = IMediaDet_get_OutputStreams(detector, &count);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(count == 1, "Got %d streams.\n", count);
+
+    hr = IMediaDet_WriteBitmapBits(detector, 1.75, 640, 480, filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IMediaDet_GetSampleGrabber(detector, &sg);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (SUCCEEDED(hr)) ISampleGrabber_Release(sg);
+    hr = IMediaDet_get_OutputStreams(detector, &count);
+    todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+    DeleteFileW(filename);
     ref = IMediaDet_Release(detector);
     ok(!ref, "Got outstanding refcount %d.\n", ref);
     ref = IBaseFilter_Release(&testfilter.filter.IBaseFilter_iface);
-- 
2.21.0




More information about the wine-devel mailing list