Qian Hong : user32/tests: Added tests for OpenInputDesktop and SwitchDesktop.

Alexandre Julliard julliard at winehq.org
Thu Oct 3 15:18:02 CDT 2013


Module: wine
Branch: master
Commit: b0cac343631f712f337d18516fef9e631770c27b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b0cac343631f712f337d18516fef9e631770c27b

Author: Qian Hong <qhong at codeweavers.com>
Date:   Fri Oct  4 00:29:55 2013 +0800

user32/tests: Added tests for OpenInputDesktop and SwitchDesktop.

---

 dlls/user32/tests/winstation.c |  175 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 175 insertions(+), 0 deletions(-)

diff --git a/dlls/user32/tests/winstation.c b/dlls/user32/tests/winstation.c
index 248b82e..7155b33 100644
--- a/dlls/user32/tests/winstation.c
+++ b/dlls/user32/tests/winstation.c
@@ -475,6 +475,180 @@ static void test_getuserobjectinformation(void)
     ok(CloseDesktop(desk), "CloseDesktop failed\n");
 }
 
+static void test_inputdesktop(void)
+{
+    HDESK input_desk, old_input_desk, thread_desk, old_thread_desk, new_desk;
+    DWORD ret;
+    CHAR name[1024];
+    INPUT inputs[1];
+
+    inputs[0].type = INPUT_KEYBOARD;
+    inputs[0].ki.wVk = 0;
+    inputs[0].ki.wScan = 0x3c0;
+    inputs[0].ki.dwFlags = KEYEVENTF_UNICODE;
+
+    /* OpenInputDesktop creates new handles for each calls */
+    old_input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS);
+todo_wine
+    ok(old_input_desk != NULL, "OpenInputDesktop failed!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(old_input_desk, UOI_NAME, name, 1024, NULL);
+todo_wine
+    ok(ret, "GetUserObjectInformation failed!\n");
+todo_wine
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS);
+todo_wine
+    ok(input_desk != NULL, "OpenInputDesktop failed!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL);
+todo_wine
+    ok(ret, "GetUserObjectInformation failed!\n");
+todo_wine
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+todo_wine
+    ok(old_input_desk != input_desk, "returned the same handle!\n");
+    ret = CloseDesktop(input_desk);
+todo_wine
+    ok(ret, "CloseDesktop failed!\n");
+
+    /* by default, GetThreadDesktop is the input desktop, SendInput should success. */
+    old_thread_desk = GetThreadDesktop(GetCurrentThreadId());
+    ok(old_thread_desk != NULL, "GetThreadDesktop faile!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(old_thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+    ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1, "unexpected return count %d\n", ret);
+
+    /* Set thread desktop to the new desktop, SendInput should failed. */
+    new_desk = CreateDesktopA("new_desk", NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL);
+    ok(new_desk != NULL, "CreateDesktop failed!\n");
+    ret = SetThreadDesktop(new_desk);
+    ok(ret, "SetThreadDesktop failed!\n");
+    thread_desk = GetThreadDesktop(GetCurrentThreadId());
+    ok(thread_desk == new_desk, "thread desktop doesn't match!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+todo_wine
+    ok(GetLastError() == ERROR_ACCESS_DENIED, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1 || broken(ret == 0) /* Win64 */, "unexpected return count %d\n", ret);
+
+    /* Set thread desktop back to the old thread desktop, SendInput should success. */
+    ret = SetThreadDesktop(old_thread_desk);
+    ok(ret, "SetThreadDesktop failed!\n");
+    thread_desk = GetThreadDesktop(GetCurrentThreadId());
+    ok(thread_desk == old_thread_desk, "thread desktop doesn't match!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+    ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1, "unexpected return count %d\n", ret);
+
+    /* Set thread desktop to the input desktop, SendInput should success. */
+    ret = SetThreadDesktop(old_input_desk);
+todo_wine
+    ok(ret, "SetThreadDesktop failed!\n");
+    thread_desk = GetThreadDesktop(GetCurrentThreadId());
+todo_wine
+    ok(thread_desk == old_input_desk, "thread desktop doesn't match!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+    ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1, "unexpected return count %d\n", ret);
+
+    /* Switch input desktop to the new desktop, SendInput should failed. */
+    ret = SwitchDesktop(new_desk);
+    ok(ret, "SwitchDesktop failed!\n");
+    input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS);
+todo_wine
+    ok(input_desk != NULL, "OpenInputDesktop failed!\n");
+    ok(input_desk != new_desk, "returned the same handle!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL);
+todo_wine
+    ok(ret, "GetUserObjectInformation failed!\n");
+todo_wine
+    ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name);
+    ret = CloseDesktop(input_desk);
+todo_wine
+    ok(ret, "CloseDesktop failed!\n");
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+todo_wine
+    ok(GetLastError() == ERROR_ACCESS_DENIED, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1 || broken(ret == 0) /* Win64 */, "unexpected return count %d\n", ret);
+
+    /* Set thread desktop to the new desktop, SendInput should success. */
+    ret = SetThreadDesktop(new_desk);
+    ok(ret, "SetThreadDesktop failed!\n");
+    thread_desk = GetThreadDesktop(GetCurrentThreadId());
+    ok(thread_desk == new_desk, "thread desktop doesn't match!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+    ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1, "unexpected return count %d\n", ret);
+
+    /* Switch input desktop to the old input desktop, set thread desktop to the old
+     * thread desktop, clean side effects. SendInput should success. */
+    ret = SwitchDesktop(old_input_desk);
+    input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS);
+todo_wine
+    ok(input_desk != NULL, "OpenInputDesktop failed!\n");
+todo_wine
+    ok(input_desk != old_input_desk, "returned the same handle!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL);
+todo_wine
+    ok(ret, "GetUserObjectInformation failed!\n");
+todo_wine
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    ret = SetThreadDesktop(old_thread_desk);
+    ok(ret, "SetThreadDesktop failed!\n");
+    thread_desk = GetThreadDesktop(GetCurrentThreadId());
+    ok(thread_desk == old_thread_desk, "thread desktop doesn't match!\n");
+    memset(name, 0, sizeof(name));
+    ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL);
+    ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name);
+
+    SetLastError(0xdeadbeef);
+    ret = SendInput(1, inputs, sizeof(INPUT));
+    ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError());
+    ok(ret == 1, "unexpected return count %d\n", ret);
+
+    /* free resources */
+    ret = CloseDesktop(input_desk);
+todo_wine
+    ok(ret, "CloseDesktop failed!\n");
+    ret = CloseDesktop(old_input_desk);
+todo_wine
+    ok(ret, "CloseDesktop failed!\n");
+    ret = CloseDesktop(new_desk);
+    ok(ret, "CloseDesktop failed!\n");
+}
+
 START_TEST(winstation)
 {
     /* Check whether this platform supports WindowStation calls */
@@ -487,6 +661,7 @@ START_TEST(winstation)
         return;
     }
 
+    test_inputdesktop();
     test_enumstations();
     test_enumdesktops();
     test_handles();




More information about the wine-cvs mailing list