Akihiro Sagawa : imm32/tests: Add more composition string tests.
Alexandre Julliard
julliard at winehq.org
Tue Nov 14 16:18:47 CST 2017
Module: wine
Branch: master
Commit: 3955ce1e0a882cce7237920ad06d176a14da7a27
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3955ce1e0a882cce7237920ad06d176a14da7a27
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Wed Nov 15 00:18:49 2017 +0900
imm32/tests: Add more composition string tests.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/imm32/tests/imm32.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 141 insertions(+)
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c
index 99d95c1..bf0f4b2 100644
--- a/dlls/imm32/tests/imm32.c
+++ b/dlls/imm32/tests/imm32.c
@@ -355,6 +355,63 @@ static void test_ImmNotifyIME(void) {
}
+static struct {
+ WNDPROC old_wnd_proc;
+ BOOL catch_result_str;
+ BOOL catch_ime_char;
+ DWORD start;
+ DWORD timer_id;
+} ime_composition_test;
+
+static LRESULT WINAPI test_ime_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_IME_COMPOSITION:
+ if ((lParam & GCS_RESULTSTR) && !ime_composition_test.catch_result_str) {
+ WCHAR wstring[20];
+ HIMC imc;
+ LONG size;
+ LRESULT ret;
+
+ ret = CallWindowProcA(ime_composition_test.old_wnd_proc,
+ hWnd, msg, wParam, lParam);
+
+ imc = ImmGetContext(hWnd);
+ size = ImmGetCompositionStringW(imc, GCS_RESULTSTR,
+ wstring, sizeof(wstring));
+ todo_wine
+ ok(size > 0, "ImmGetCompositionString(GCS_RESULTSTR) is %d\n", size);
+ ImmReleaseContext(hwnd, imc);
+
+ ime_composition_test.catch_result_str = TRUE;
+ return ret;
+ }
+ break;
+ case WM_IME_CHAR:
+ if (!ime_composition_test.catch_ime_char)
+ ime_composition_test.catch_ime_char = TRUE;
+ break;
+ case WM_TIMER:
+ if (wParam == ime_composition_test.timer_id) {
+ HWND parent = GetParent(hWnd);
+ char title[64];
+ int left = 20 - (GetTickCount() - ime_composition_test.start) / 1000;
+ wsprintfA(title, "%sLeft %d sec. - IME composition test",
+ ime_composition_test.catch_result_str ? "[*] " : "", left);
+ SetWindowTextA(parent, title);
+ if (left <= 0)
+ DestroyWindow(parent);
+ else
+ SetTimer(hWnd, wParam, 100, NULL);
+ return TRUE;
+ }
+ break;
+ }
+ return CallWindowProcA(ime_composition_test.old_wnd_proc,
+ hWnd, msg, wParam, lParam);
+}
+
static void test_ImmGetCompositionString(void)
{
HIMC imc;
@@ -364,6 +421,7 @@ static void test_ImmGetCompositionString(void)
LONG len;
LONG alen,wlen;
BOOL ret;
+ DWORD prop;
imc = ImmGetContext(hwnd);
ret = ImmSetCompositionStringW(imc, SCS_SETSTR, string, sizeof(string), NULL,0);
@@ -388,6 +446,89 @@ static void test_ImmGetCompositionString(void)
win_skip("Composition string isn't available\n");
ImmReleaseContext(hwnd, imc);
+
+ /* Test composition results input by IMM API */
+ prop = ImmGetProperty(GetKeyboardLayout(0), IGP_SETCOMPSTR);
+ if (!(prop & SCS_CAP_COMPSTR)) {
+ /* Wine's IME doesn't support SCS_SETSTR in ImmSetCompositionString */
+ skip("This IME doesn't support SCS_SETSTR\n");
+ }
+ else {
+ ime_composition_test.old_wnd_proc =
+ (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC,
+ (LONG_PTR)test_ime_wnd_proc);
+ imc = ImmGetContext(hwnd);
+ msg_spy_flush_msgs();
+
+ ret = ImmSetCompositionStringW(imc, SCS_SETSTR,
+ string, sizeof(string), NULL,0);
+ ok(ret, "ImmSetCompositionStringW failed\n");
+ wlen = ImmGetCompositionStringW(imc, GCS_COMPSTR,
+ wstring, sizeof(wstring));
+ if (wlen > 0) {
+ ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);
+ ok(ret, "ImmNotifyIME(CPS_COMPLETE) failed\n");
+ msg_spy_flush_msgs();
+ ok(ime_composition_test.catch_result_str,
+ "WM_IME_COMPOSITION(GCS_RESULTSTR) isn't sent\n");
+ ok(ime_composition_test.catch_ime_char,
+ "WM_IME_CHAR isn't sent\n");
+ }
+ else
+ win_skip("Composition string isn't available\n");
+ ImmReleaseContext(hwnd, imc);
+ SetWindowLongPtrA(hwnd, GWLP_WNDPROC,
+ (LONG_PTR)ime_composition_test.old_wnd_proc);
+ msg_spy_flush_msgs();
+ }
+
+ /* Test composition results input by hand */
+ memset(&ime_composition_test, 0, sizeof(ime_composition_test));
+ if (winetest_interactive) {
+ HWND hwndMain, hwndChild;
+ MSG msg;
+ const DWORD MY_TIMER = 0xcaffe;
+
+ hwndMain = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls,
+ "IME composition test",
+ WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ CW_USEDEFAULT, CW_USEDEFAULT, 320, 160,
+ NULL, NULL, GetModuleHandleA(NULL), NULL);
+ hwndChild = CreateWindowExA(0, "static",
+ "Input a DBCS character here using IME.",
+ WS_CHILD | WS_VISIBLE | 0
+ /* ES_AUTOHSCROLL | ES_MULTILINE */,
+ 0, 0, 320, 100, hwndMain, NULL,
+ GetModuleHandleA(NULL), NULL);
+
+ ime_composition_test.old_wnd_proc =
+ (WNDPROC)SetWindowLongPtrA(hwndChild, GWLP_WNDPROC,
+ (LONG_PTR)test_ime_wnd_proc);
+
+ SetFocus(hwndChild);
+
+ /* FIXME: In wine, IME UI window is created in ImmSetOpenStatus().
+ So, we prepare it here to generate WM_IME_CHAR messages. */
+ imc = ImmGetContext(hwndChild);
+ ImmSetOpenStatus(imc, FALSE);
+ ImmReleaseContext(hwndChild, imc);
+
+ ime_composition_test.timer_id = MY_TIMER;
+ ime_composition_test.start = GetTickCount();
+ SetTimer(hwndChild, ime_composition_test.timer_id, 100, NULL);
+ while (GetMessageA(&msg, NULL, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessageA(&msg);
+ if (!IsWindow(hwndMain))
+ break;
+ }
+ if (!ime_composition_test.catch_result_str)
+ skip("WM_IME_COMPOSITION(GCS_RESULTSTR) isn't tested\n");
+ else
+ ok(ime_composition_test.catch_ime_char,
+ "WM_IME_CHAR isn't sent\n");
+ msg_spy_flush_msgs();
+ }
}
static void test_ImmSetCompositionString(void)
More information about the wine-cvs
mailing list