Zhiyi Zhang : user32/tests: Add display DC tests.
Alexandre Julliard
julliard at winehq.org
Wed Jan 27 15:35:04 CST 2021
Module: wine
Branch: master
Commit: 640f7081db10e53f6d3eaf27890bcce256836bb2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=640f7081db10e53f6d3eaf27890bcce256836bb2
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Sun Jan 24 12:14:05 2021 +0800
user32/tests: Add display DC tests.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/monitor.c | 156 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 156 insertions(+)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 5e4cc9d154f..ee435a4faf4 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -1992,6 +1992,161 @@ static void test_handles(void)
ok(ret, "EnumDisplayMonitors failed, error %#x.\n", GetLastError());
}
+#define check_display_dc(a, b, c) _check_display_dc(__LINE__, a, b, c)
+static void _check_display_dc(INT line, HDC hdc, const DEVMODEA *dm, BOOL allow_todo)
+{
+ INT value;
+
+ value = GetDeviceCaps(hdc, HORZRES);
+ todo_wine_if(allow_todo && dm->dmPelsWidth != GetSystemMetrics(SM_CXSCREEN))
+ ok_(__FILE__, line)(value == dm->dmPelsWidth, "Expected HORZRES %d, got %d.\n",
+ dm->dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ todo_wine_if(allow_todo && dm->dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
+ ok_(__FILE__, line)(value == dm->dmPelsHeight, "Expected VERTRES %d, got %d.\n",
+ dm->dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm->dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok_(__FILE__, line)(value == dm->dmPelsWidth, "Expected DESKTOPHORZRES %d, got %d.\n",
+ dm->dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm->dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok_(__FILE__, line)(value == dm->dmPelsHeight, "Expected DESKTOPVERTRES %d, got %d.\n",
+ dm->dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm->dmDisplayFrequency && value == 1)
+ ok_(__FILE__, line)(value == dm->dmDisplayFrequency, "Expected VREFRESH %d, got %d.\n",
+ dm->dmDisplayFrequency, value);
+}
+
+static void test_display_dc(void)
+{
+ DWORD device_idx, mode_idx;
+ DEVMODEA dm, dm2, dm3;
+ INT count, old_count;
+ DISPLAY_DEVICEA dd;
+ BOOL ret;
+ LONG res;
+ HDC hdc;
+
+ /* Test DCs covering the entire virtual screen */
+ hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
+ ok(!!hdc, "CreateDCA failed.\n");
+
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ ret = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &dm);
+ ok(ret, "EnumDisplaySettingsA failed.\n");
+
+ check_display_dc(hdc, &dm, FALSE);
+
+ /* Tests after mode changes */
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode_idx = 0; EnumDisplaySettingsA(NULL, mode_idx, &dm2); ++mode_idx)
+ {
+ if (dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight)
+ break;
+ }
+ ok(dm2.dmPelsWidth && dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight,
+ "Failed to find a different resolution.\n");
+
+ res = ChangeDisplaySettingsExA(NULL, &dm2, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL || broken(res == DISP_CHANGE_FAILED), /* Win8 TestBots */
+ "ChangeDisplaySettingsExA returned unexpected %d.\n", res);
+ if (res == DISP_CHANGE_SUCCESSFUL)
+ {
+ check_display_dc(hdc, &dm2, FALSE);
+
+ res = ChangeDisplaySettingsExA(NULL, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA returned unexpected %d.\n", res);
+ }
+
+ DeleteDC(hdc);
+
+ /* Test DCs covering a specific monitor */
+ dd.cb = sizeof(dd);
+ for (device_idx = 0; EnumDisplayDevicesA(NULL, device_idx, &dd, 0); ++device_idx)
+ {
+ if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
+ continue;
+
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ ret = EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm);
+ ok(ret, "EnumDisplaySettingsA %s failed.\n", dd.DeviceName);
+
+ hdc = CreateDCA(dd.DeviceName, NULL, NULL, NULL);
+ ok(!!hdc, "CreateDCA %s failed.\n", dd.DeviceName);
+
+ check_display_dc(hdc, &dm, TRUE);
+
+ /* Tests after mode changes */
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode_idx = 0; EnumDisplaySettingsA(dd.DeviceName, mode_idx, &dm2); ++mode_idx)
+ {
+ if (dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight)
+ break;
+ }
+ ok(dm2.dmPelsWidth && dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight,
+ "Failed to find a different resolution for %s.\n", dd.DeviceName);
+
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm2, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL || broken(res == DISP_CHANGE_FAILED), /* Win8 TestBots */
+ "ChangeDisplaySettingsExA %s returned unexpected %d.\n", dd.DeviceName, res);
+ if (res != DISP_CHANGE_SUCCESSFUL)
+ {
+ win_skip("Failed to change display mode for %s.\n", dd.DeviceName);
+ DeleteDC(hdc);
+ continue;
+ }
+
+ check_display_dc(hdc, &dm2, TRUE);
+
+ /* Tests after monitor detach */
+ if (!(dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
+ {
+ old_count = GetSystemMetrics(SM_CMONITORS);
+
+ memset(&dm3, 0, sizeof(dm3));
+ dm3.dmSize = sizeof(dm3);
+ ret = EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm3);
+ ok(ret, "EnumDisplaySettingsA %s failed.\n", dd.DeviceName);
+
+ dm3.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
+ dm3.dmPelsWidth = 0;
+ dm3.dmPelsHeight = 0;
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm3, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ res = ChangeDisplaySettingsExA(dd.DeviceName, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+
+ count = GetSystemMetrics(SM_CMONITORS);
+ ok(count == old_count - 1, "Expected monitor count %d, got %d.\n", old_count - 1, count);
+
+ /* Should report the same values before detach */
+ check_display_dc(hdc, &dm2, TRUE);
+ }
+
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ res = ChangeDisplaySettingsExA(NULL, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ DeleteDC(hdc);
+ }
+}
+
START_TEST(monitor)
{
init_function_pointers();
@@ -2002,4 +2157,5 @@ START_TEST(monitor)
test_work_area();
test_display_config();
test_handles();
+ test_display_dc();
}
More information about the wine-cvs
mailing list