From da389f5fccf682be379a3721add799b2a2394429 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Mon, 30 May 2016 01:08:12 +0900 Subject: [PATCH] imm32/tests: Add tests showing the IME window is created if the first window is a child. Signed-off-by: Akihiro Sagawa Signed-off-by: Alexandre Julliard --- dlls/imm32/tests/imm32.c | 61 +++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 1cd7c05c010..7bc0a9afc5f 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -912,17 +912,31 @@ static HWND get_ime_window(void) return ime_window; } +struct testcase_ime_window { + BOOL visible; + BOOL top_level_window; +}; + static DWORD WINAPI test_default_ime_window_cb(void *arg) { - DWORD visible = arg ? WS_VISIBLE : 0; + struct testcase_ime_window *testcase = (struct testcase_ime_window *)arg; + DWORD visible = testcase->visible ? WS_VISIBLE : 0; HWND hwnd1, hwnd2, default_ime_wnd, ime_wnd; ok(!get_ime_window(), "Expected no IME windows\n"); - test_phase = FIRST_WINDOW; - hwnd1 = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test", - WS_OVERLAPPEDWINDOW | visible, - CW_USEDEFAULT, CW_USEDEFAULT, - 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL); + if (testcase->top_level_window) { + test_phase = FIRST_WINDOW; + hwnd1 = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test", + WS_OVERLAPPEDWINDOW | visible, + CW_USEDEFAULT, CW_USEDEFAULT, + 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL); + } + else { + hwnd1 = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll test", + WS_CHILD | visible, + CW_USEDEFAULT, CW_USEDEFAULT, + 240, 24, hwnd, NULL, GetModuleHandleW(NULL), NULL); + } ime_wnd = get_ime_window(); todo_wine ok(ime_wnd != NULL, "Expected IME window existence\n"); default_ime_wnd = ImmGetDefaultIMEWnd(hwnd1); @@ -934,7 +948,10 @@ static DWORD WINAPI test_default_ime_window_cb(void *arg) CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL); DestroyWindow(hwnd2); - todo_wine ok(IsWindow(ime_wnd) || broken(/* Vista */ !visible), "Expected IME window existence\n"); + todo_wine ok(IsWindow(ime_wnd) || + broken(!testcase->visible /* Vista */) || + broken(!testcase->top_level_window /* Vista */) , + "Expected IME window existence\n"); DestroyWindow(hwnd1); ok(!IsWindow(ime_wnd), "Expected no IME windows\n"); return 1; @@ -943,14 +960,30 @@ static DWORD WINAPI test_default_ime_window_cb(void *arg) static void test_default_ime_window_creation(void) { HANDLE thread; + size_t i; + struct testcase_ime_window testcases[] = { + /* visible, top-level window */ + { TRUE, TRUE }, + { FALSE, TRUE }, + { TRUE, FALSE }, + { FALSE, FALSE } + }; - thread = CreateThread(NULL, 0, test_default_ime_window_cb, (LPVOID)FALSE, 0, NULL); - WaitForSingleObject(thread, INFINITE); - CloseHandle(thread); - - thread = CreateThread(NULL, 0, test_default_ime_window_cb, (LPVOID)TRUE, 0, NULL); - WaitForSingleObject(thread, INFINITE); - CloseHandle(thread); + for (i = 0; i < sizeof(testcases)/sizeof(testcases[0]); i++) + { + thread = CreateThread(NULL, 0, test_default_ime_window_cb, &testcases[i], 0, NULL); + ok(thread != NULL, "CreateThread failed with error %u\n", GetLastError()); + while (MsgWaitForMultipleObjects(1, &thread, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0 + 1) + { + MSG msg; + while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + } + CloseHandle(thread); + } test_phase = PHASE_UNKNOWN; }