[PATCH 1/6] user32/tests: Add more registry display mode tests.

Zhiyi Zhang zzhang at codeweavers.com
Tue Aug 25 02:11:56 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/user32/tests/monitor.c | 102 ++++++++++++++++++++++++++++++------
 1 file changed, 87 insertions(+), 15 deletions(-)

diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index b151721533d..7cd41145ea1 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -298,34 +298,38 @@ static void _expect_dm(INT line, DEVMODEA expected, const CHAR *device, DWORD te
     ok_(__FILE__, line)((dm.dmFields & expected.dmFields) == expected.dmFields,
             "Device %s test %d expect dmFields to contain %#x, got %#x\n", device, test, expected.dmFields, dm.dmFields);
     /* Wine doesn't support changing color depth yet */
-    todo_wine_if(expected.dmBitsPerPel != 32 && expected.dmBitsPerPel != 24)
-    ok_(__FILE__, line)(dm.dmBitsPerPel == expected.dmBitsPerPel, "Device %s test %d expect dmBitsPerPel %d, got %d\n",
-            device, test, expected.dmBitsPerPel, dm.dmBitsPerPel);
-    ok_(__FILE__, line)(dm.dmPelsWidth == expected.dmPelsWidth, "Device %s test %d expect dmPelsWidth %d, got %d\n",
-            device, test, expected.dmPelsWidth, dm.dmPelsWidth);
-    ok_(__FILE__, line)(dm.dmPelsHeight == expected.dmPelsHeight, "Device %s test %d expect dmPelsHeight %d, got %d\n",
-            device, test, expected.dmPelsHeight, dm.dmPelsHeight);
-    ok_(__FILE__, line)(dm.dmPosition.x == expected.dmPosition.x, "Device %s test %d expect dmPosition.x %d, got %d\n",
-            device, test, expected.dmPosition.x, dm.dmPosition.x);
-    ok_(__FILE__, line)(dm.dmPosition.y == expected.dmPosition.y, "Device %s test %d expect dmPosition.y %d, got %d\n",
-            device, test, expected.dmPosition.y, dm.dmPosition.y);
-    ok_(__FILE__, line)(dm.dmDisplayFrequency == expected.dmDisplayFrequency,
-            "Device %s test %d expect dmDisplayFrequency %d, got %d\n", device, test, expected.dmDisplayFrequency,
+    todo_wine_if(expected.dmFields & DM_BITSPERPEL && expected.dmBitsPerPel != 32 && expected.dmBitsPerPel != 24)
+    ok_(__FILE__, line)(!(expected.dmFields & DM_BITSPERPEL) || dm.dmBitsPerPel == expected.dmBitsPerPel,
+            "Device %s test %d expect dmBitsPerPel %u, got %u\n", device, test, expected.dmBitsPerPel, dm.dmBitsPerPel);
+    ok_(__FILE__, line)(!(expected.dmFields & DM_PELSWIDTH) || dm.dmPelsWidth == expected.dmPelsWidth,
+            "Device %s test %d expect dmPelsWidth %u, got %u\n", device, test, expected.dmPelsWidth, dm.dmPelsWidth);
+    ok_(__FILE__, line)(!(expected.dmFields & DM_PELSHEIGHT) || dm.dmPelsHeight == expected.dmPelsHeight,
+            "Device %s test %d expect dmPelsHeight %u, got %u\n", device, test, expected.dmPelsHeight, dm.dmPelsHeight);
+    ok_(__FILE__, line)(!(expected.dmFields & DM_POSITION) || dm.dmPosition.x == expected.dmPosition.x,
+            "Device %s test %d expect dmPosition.x %d, got %d\n", device, test, expected.dmPosition.x, dm.dmPosition.x);
+    ok_(__FILE__, line)(!(expected.dmFields & DM_POSITION) || dm.dmPosition.y == expected.dmPosition.y,
+            "Device %s test %d expect dmPosition.y %d, got %d\n", device, test, expected.dmPosition.y, dm.dmPosition.y);
+    ok_(__FILE__, line)(!(expected.dmFields & DM_DISPLAYFREQUENCY) ||
+            dm.dmDisplayFrequency == expected.dmDisplayFrequency,
+            "Device %s test %d expect dmDisplayFrequency %u, got %u\n", device, test, expected.dmDisplayFrequency,
             dm.dmDisplayFrequency);
-    ok_(__FILE__, line)(dm.dmDisplayOrientation == expected.dmDisplayOrientation,
+    ok_(__FILE__, line)(!(expected.dmFields & DM_DISPLAYORIENTATION) ||
+            dm.dmDisplayOrientation == expected.dmDisplayOrientation,
             "Device %s test %d expect dmDisplayOrientation %d, got %d\n", device, test, expected.dmDisplayOrientation,
             dm.dmDisplayOrientation);
 }
 
 static void test_ChangeDisplaySettingsEx(void)
 {
+    static const DWORD registry_fields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT |
+            DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY | DM_POSITION;
     DPI_AWARENESS_CONTEXT context = NULL;
     UINT primary, device, test, mode;
     UINT device_size, device_count;
     struct device_info *devices;
+    DEVMODEA dm, dm2, dm3;
     INT count, old_count;
     DISPLAY_DEVICEA dd;
-    DEVMODEA dm, dm2;
     POINTL position;
     DEVMODEW dmW;
     LONG res;
@@ -672,10 +676,26 @@ static void test_ChangeDisplaySettingsEx(void)
     /* Test changing modes by saving settings to the registry first */
     for (device = 0; device < device_count; ++device)
     {
+        /* Place adapter to the right */
+        if (device == 0)
+        {
+            position.x = 0;
+            position.y = 0;
+        }
+        else
+        {
+            memset(&dm, 0, sizeof(dm));
+            dm.dmSize = sizeof(dm);
+            res = EnumDisplaySettingsA(devices[device - 1].name, ENUM_CURRENT_SETTINGS, &dm);
+            ok(res, "EnumDisplaySettingsA %s failed, error %#x.\n", devices[device - 1].name, GetLastError());
+            position.x = dm.dmPosition.x + dm.dmPelsWidth;
+        }
+
         memset(&dm, 0, sizeof(dm));
         dm.dmSize = sizeof(dm);
         res = EnumDisplaySettingsA(devices[device].name, ENUM_CURRENT_SETTINGS, &dm);
         ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
+        dm3 = dm;
 
         /* Find a mode that's different from the current mode */
         memset(&dm2, 0, sizeof(dm2));
@@ -687,6 +707,8 @@ static void test_ChangeDisplaySettingsEx(void)
         }
         ok(dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight, "Failed to find a different mode.\n");
 
+        /* Test normal operation */
+        dm.dmPosition = position;
         dm.dmPelsWidth = dm2.dmPelsWidth;
         dm.dmPelsHeight = dm2.dmPelsHeight;
         dm.dmDisplayFrequency = dm2.dmDisplayFrequency;
@@ -706,6 +728,56 @@ static void test_ChangeDisplaySettingsEx(void)
 
         flush_events();
         expect_dm(dm, devices[device].name, 0);
+
+        /* Test specifying only position, width and height */
+        memset(&dm, 0, sizeof(dm));
+        dm.dmSize = sizeof(dm);
+        dm.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
+        dm.dmPosition = position;
+        dm.dmPelsWidth = dm3.dmPelsWidth;
+        dm.dmPelsHeight = dm3.dmPelsHeight;
+        res = ChangeDisplaySettingsExA(devices[device].name, &dm, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+        ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+        res = EnumDisplaySettingsA(devices[device].name, ENUM_REGISTRY_SETTINGS, &dm);
+        /* Win10 either returns failure here or retrieves outdated display settings until they're applied */
+        if (res)
+        {
+            ok((dm.dmFields & registry_fields) == registry_fields, "Got unexpected dmFields %#x.\n", dm.dmFields);
+            ok(dm.dmPosition.x == position.x, "Expected dmPosition.x %d, got %d.\n", position.x, dm.dmPosition.x);
+            ok(dm.dmPosition.y == position.y, "Expected dmPosition.y %d, got %d.\n", position.y, dm.dmPosition.y);
+            ok(dm.dmPelsWidth == dm3.dmPelsWidth || broken(dm.dmPelsWidth == dm2.dmPelsWidth), /* Win10 */
+                    "Expected dmPelsWidth %u, got %u.\n", dm3.dmPelsWidth, dm.dmPelsWidth);
+            ok(dm.dmPelsHeight == dm3.dmPelsHeight || broken(dm.dmPelsHeight == dm2.dmPelsHeight), /* Win10 */
+                    "Expected dmPelsHeight %u, got %u.\n", dm3.dmPelsHeight, dm.dmPelsHeight);
+            todo_wine ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
+            todo_wine ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
+        }
+        else
+        {
+            win_skip("EnumDisplaySettingsA %s failed, error %#x.\n", devices[device].name, GetLastError());
+        }
+
+        res = ChangeDisplaySettingsExA(devices[device].name, NULL, NULL, 0, NULL);
+        todo_wine ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+        if (res != DISP_CHANGE_SUCCESSFUL)
+        {
+            skip("ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+            continue;
+        }
+        flush_events();
+
+        res = EnumDisplaySettingsA(devices[device].name, ENUM_REGISTRY_SETTINGS, &dm);
+        ok(res, "EnumDisplaySettingsA %s failed, error %#x.\n", devices[device].name, GetLastError());
+        ok((dm.dmFields & registry_fields) == registry_fields, "Got unexpected dmFields %#x.\n", dm.dmFields);
+        ok(dm.dmPosition.x == position.x, "Expected dmPosition.x %d, got %d.\n", position.x, dm.dmPosition.x);
+        ok(dm.dmPosition.y == position.y, "Expected dmPosition.y %d, got %d.\n", position.y, dm.dmPosition.y);
+        ok(dm.dmPelsWidth == dm3.dmPelsWidth, "Expected dmPelsWidth %u, got %u.\n", dm3.dmPelsWidth, dm.dmPelsWidth);
+        ok(dm.dmPelsHeight == dm3.dmPelsHeight, "Expected dmPelsHeight %u, got %u.\n", dm3.dmPelsHeight,
+                dm.dmPelsHeight);
+        ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
+        ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
+
+        expect_dm(dm, devices[device].name, 0);
     }
 
     /* Test dmPosition */
-- 
2.25.1




More information about the wine-devel mailing list