Aric Stewart : imm32: Test cases for HIMCs and threads.

Alexandre Julliard julliard at winehq.org
Wed Sep 1 11:08:56 CDT 2010


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Aug 31 13:35:58 2010 -0500

imm32: Test cases for HIMCs and threads.

---

 dlls/imm32/tests/imm32.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c
index e35ef89..06b12f3 100644
--- a/dlls/imm32/tests/imm32.c
+++ b/dlls/imm32/tests/imm32.c
@@ -345,6 +345,81 @@ static void test_ImmAssociateContextEx(void)
     ImmReleaseContext(hwnd,imc);
 }
 
+typedef struct _igc_threadinfo {
+    HWND hwnd;
+    HANDLE event;
+    HIMC himc;
+} igc_threadinfo;
+
+
+static DWORD WINAPI ImmGetContextThreadFunc( LPVOID lpParam)
+{
+    HIMC h1,h2;
+    HWND hwnd2;
+    igc_threadinfo *info= (igc_threadinfo*)lpParam;
+    info->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
+                          WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+                          240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+
+    h1 = ImmGetContext(hwnd);
+    todo_wine ok(info->himc == h1, "hwnd context changed in new thread\n");
+    h2 = ImmGetContext(info->hwnd);
+    todo_wine ok(h2 != h1, "new hwnd in new thread should have different context\n");
+    info->himc = h2;
+    ImmReleaseContext(hwnd,h1);
+
+    hwnd2 = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
+                          WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+                          240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+    h1 = ImmGetContext(hwnd2);
+
+    ok(h1 == h2, "Windows in same thread should have same default context\n");
+    ImmReleaseContext(hwnd2,h1);
+    ImmReleaseContext(info->hwnd,h2);
+    DestroyWindow(hwnd2);
+
+    SetEvent(info->event);
+    Sleep(INFINITE);
+    return 1;
+}
+
+static void test_ImmThreads(void)
+{
+    HIMC himc, otherHimc, h1;
+    igc_threadinfo threadinfo;
+    HANDLE hThread;
+    DWORD dwThreadId;
+
+    himc = ImmGetContext(hwnd);
+    threadinfo.event = CreateEvent(NULL, TRUE, FALSE, NULL);
+    threadinfo.himc = himc;
+    hThread = CreateThread(NULL, 0, ImmGetContextThreadFunc, &threadinfo, 0, &dwThreadId );
+    WaitForSingleObject(threadinfo.event, INFINITE);
+
+    otherHimc = ImmGetContext(threadinfo.hwnd);
+
+    todo_wine ok(himc != otherHimc, "Windows from other threads should have different himc\n");
+    todo_wine ok(otherHimc == threadinfo.himc, "Context from other thread should not change in main thread\n");
+
+    if (0) /* FIXME: Causes wine to hang */
+    {
+    h1 = ImmAssociateContext(hwnd,otherHimc);
+    ok(h1 == NULL, "Should fail to be able to Associate a default context from a different thread\n");
+    h1 = ImmGetContext(hwnd);
+    ok(h1 == himc, "Context for window should remain unchanged\n");
+    ImmReleaseContext(hwnd,h1);
+    }
+
+    ImmReleaseContext(threadinfo.hwnd,otherHimc);
+    ImmReleaseContext(hwnd,himc);
+
+    DestroyWindow(threadinfo.hwnd);
+    TerminateThread(hThread, 1);
+
+    himc = ImmGetContext(GetDesktopWindow());
+    todo_wine ok(himc == NULL, "Should not be able to get himc from other process window\n");
+}
+
 START_TEST(imm32) {
     if (init())
     {
@@ -353,6 +428,7 @@ START_TEST(imm32) {
         test_ImmSetCompositionString();
         test_ImmIME();
         test_ImmAssociateContextEx();
+        test_ImmThreads();
     }
     cleanup();
 }




More information about the wine-cvs mailing list