1d6a0299eSKatayama Hirofumi MZ /*
2d6a0299eSKatayama Hirofumi MZ * PROJECT: ReactOS api tests
3d6a0299eSKatayama Hirofumi MZ * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4d6a0299eSKatayama Hirofumi MZ * PURPOSE: Test for imm32 HIMC
5d6a0299eSKatayama Hirofumi MZ * COPYRIGHT: Copyright 2021 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6d6a0299eSKatayama Hirofumi MZ */
7d6a0299eSKatayama Hirofumi MZ
8d6a0299eSKatayama Hirofumi MZ #include "precomp.h"
9d6a0299eSKatayama Hirofumi MZ
Test1(void)103820744aSKatayama Hirofumi MZ static void Test1(void)
11d6a0299eSKatayama Hirofumi MZ {
12d6a0299eSKatayama Hirofumi MZ DWORD style;
13d6a0299eSKatayama Hirofumi MZ HWND hwndEdit, hwndStatic;
14d6a0299eSKatayama Hirofumi MZ HIMC hNewIMC, hOldIMC, hIMC, hIMC1, hIMC2;
15d6a0299eSKatayama Hirofumi MZ LPINPUTCONTEXT pIC;
16d6a0299eSKatayama Hirofumi MZ
17d6a0299eSKatayama Hirofumi MZ /* ImmCreateContext/ImmDestroyContext and ImmLockIMC/ImmUnlockIMC */
18d6a0299eSKatayama Hirofumi MZ hNewIMC = ImmCreateContext();
197c3902e5SThomas Faber ok(hNewIMC != NULL, "ImmCreateContext failed\n");
20d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hNewIMC);
217c3902e5SThomas Faber ok(pIC == NULL, "ImmLockIMC succeeded unexpectedly\n");
22d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
237c3902e5SThomas Faber ok(ImmDestroyContext(hNewIMC), "ImmDestroyContext failed\n");
24d6a0299eSKatayama Hirofumi MZ
25d6a0299eSKatayama Hirofumi MZ /* ImmGetContext against NULL */
26d6a0299eSKatayama Hirofumi MZ hIMC = ImmGetContext(NULL);
277c3902e5SThomas Faber ok(hIMC == NULL, "ImmGetContext failed\n");
28d6a0299eSKatayama Hirofumi MZ
29d6a0299eSKatayama Hirofumi MZ /* Create EDIT control */
30d6a0299eSKatayama Hirofumi MZ style = ES_MULTILINE | ES_LEFT;
31d6a0299eSKatayama Hirofumi MZ hwndEdit = CreateWindowW(L"EDIT", NULL, style, 0, 0, 100, 20, NULL, NULL,
32d6a0299eSKatayama Hirofumi MZ GetModuleHandleW(NULL), NULL);
337c3902e5SThomas Faber ok(hwndEdit != NULL, "CreateWindowW failed\n");
34d6a0299eSKatayama Hirofumi MZ
35d6a0299eSKatayama Hirofumi MZ /* Create STATIC control */
36d6a0299eSKatayama Hirofumi MZ style = SS_LEFT;
37d6a0299eSKatayama Hirofumi MZ hwndStatic = CreateWindowW(L"STATIC", NULL, style, 0, 30, 100, 20, NULL, NULL,
38d6a0299eSKatayama Hirofumi MZ GetModuleHandleW(NULL), NULL);
397c3902e5SThomas Faber ok(hwndStatic != NULL, "CreateWindowW failed\n");
40d6a0299eSKatayama Hirofumi MZ
41d6a0299eSKatayama Hirofumi MZ /* ImmGetContext/ImmReleaseContext and ImmLockIMC/ImmUnlockIMC */
42d6a0299eSKatayama Hirofumi MZ hIMC1 = hIMC = ImmGetContext(hwndEdit);
437c3902e5SThomas Faber ok(hIMC != NULL, "ImmGetContext failed\n");
44d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hIMC);
457c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
467c3902e5SThomas Faber if (pIC != NULL)
477c3902e5SThomas Faber {
487c3902e5SThomas Faber ok(pIC->hWnd == NULL, "pIC->hWnd = %p\n", pIC->hWnd);
497c3902e5SThomas Faber ok(!pIC->fOpen, "pIC->fOpen = %d\n", pIC->fOpen);
507c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCompStr) != 0, "hCompStr size is 0\n");
517c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCandInfo) != 0, "hCandInfo size is 0\n");
527c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hGuideLine) != 0, "hGuideLine size is 0\n");
537c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hPrivate) != 0, "hPrivate size is 0\n");
547c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hMsgBuf) != 0, "hMsgBuf size is 0\n");
557c3902e5SThomas Faber }
567c3902e5SThomas Faber else
577c3902e5SThomas Faber {
587c3902e5SThomas Faber skip("No pIC\n");
597c3902e5SThomas Faber }
60d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
61d6a0299eSKatayama Hirofumi MZ SetFocus(hwndEdit);
62d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hIMC);
637c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
647c3902e5SThomas Faber if (pIC != NULL)
657c3902e5SThomas Faber {
667c3902e5SThomas Faber ok(pIC->hWnd == hwndEdit, "pIC->hWnd = %p, expected %p\n", pIC->hWnd, hwndEdit);
677c3902e5SThomas Faber ok(!pIC->fOpen, "pIC->fOpen = %d\n", pIC->fOpen);
687c3902e5SThomas Faber }
697c3902e5SThomas Faber else
707c3902e5SThomas Faber {
717c3902e5SThomas Faber skip("No pIC\n");
727c3902e5SThomas Faber }
73d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
74d6a0299eSKatayama Hirofumi MZ SetFocus(NULL);
75d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hIMC);
767c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
777c3902e5SThomas Faber if (pIC != NULL)
787c3902e5SThomas Faber {
797c3902e5SThomas Faber ok(pIC->hWnd == hwndEdit, "pIC->hWnd = %p, expected %p\n", pIC->hWnd, hwndEdit);
807c3902e5SThomas Faber }
817c3902e5SThomas Faber else
827c3902e5SThomas Faber {
837c3902e5SThomas Faber skip("No pIC\n");
847c3902e5SThomas Faber }
85d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
867c3902e5SThomas Faber ok(ImmSetOpenStatus(hIMC, TRUE), "ImmSetOpenStatus failed\n");
87d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hIMC);
887c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
897c3902e5SThomas Faber if (pIC != NULL)
907c3902e5SThomas Faber {
917c3902e5SThomas Faber ok(pIC->fOpen, "pIC->fOpen = %d\n", pIC->fOpen);
927c3902e5SThomas Faber }
937c3902e5SThomas Faber else
947c3902e5SThomas Faber {
957c3902e5SThomas Faber skip("No pIC\n");
967c3902e5SThomas Faber }
97d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
987c3902e5SThomas Faber ok(ImmReleaseContext(hwndEdit, hIMC), "ImmReleaseContext failed\n");
99d6a0299eSKatayama Hirofumi MZ
100d6a0299eSKatayama Hirofumi MZ hIMC2 = hIMC = ImmGetContext(hwndStatic);
1017c3902e5SThomas Faber ok(hIMC != NULL, "ImmGetContext failed\n");
102d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hIMC);
1037c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
1047c3902e5SThomas Faber if (pIC != NULL)
1057c3902e5SThomas Faber {
1067c3902e5SThomas Faber ok(pIC->hWnd == hwndEdit, "pIC->hWnd = %p, expected %p\n", pIC->hWnd, hwndEdit);
1077c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCompStr) != 0, "hCompStr size is 0\n");
1087c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCandInfo) != 0, "hCandInfo size is 0\n");
1097c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hGuideLine) != 0, "hGuideLine size is 0\n");
1107c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hPrivate) != 0, "hPrivate size is 0\n");
1117c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hMsgBuf) != 0, "hMsgBuf size is 0\n");
1127c3902e5SThomas Faber }
1137c3902e5SThomas Faber else
1147c3902e5SThomas Faber {
1157c3902e5SThomas Faber skip("No pIC\n");
1167c3902e5SThomas Faber }
117d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
1187c3902e5SThomas Faber ok(ImmReleaseContext(hwndEdit, hIMC), "ImmReleaseContext failed\n");
119d6a0299eSKatayama Hirofumi MZ
1207c3902e5SThomas Faber ok(hIMC1 == hIMC2, "hIMC1 = %p, expected %p\n", hIMC1, hIMC2);
121d6a0299eSKatayama Hirofumi MZ
122d6a0299eSKatayama Hirofumi MZ /* ImmAssociateContext */
123d6a0299eSKatayama Hirofumi MZ hNewIMC = ImmCreateContext();
1247c3902e5SThomas Faber ok(hNewIMC != NULL, "ImmCreateContext failed \n");
125d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hNewIMC);
1267c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
127d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
128d6a0299eSKatayama Hirofumi MZ hOldIMC = ImmAssociateContext(hwndEdit, hNewIMC);
1297c3902e5SThomas Faber ok(hNewIMC != hOldIMC, "hNewIMC = %p, expected not %p\n", hNewIMC, hOldIMC);
130d6a0299eSKatayama Hirofumi MZ hIMC = ImmGetContext(hwndEdit);
1317c3902e5SThomas Faber ok(hIMC == hNewIMC, "hIMC = %p, expected %p\n", hIMC, hNewIMC);
1327c3902e5SThomas Faber ok(hIMC != hOldIMC, "hIMC = %p, expected not %p\n", hIMC, hOldIMC);
133d6a0299eSKatayama Hirofumi MZ pIC = ImmLockIMC(hNewIMC);
1347c3902e5SThomas Faber ok(pIC != NULL, "ImmLockIMC failed\n");
1357c3902e5SThomas Faber if (pIC != NULL)
1367c3902e5SThomas Faber {
1377c3902e5SThomas Faber ok(pIC->hWnd == NULL, "pIC->hWnd = %p\n", pIC->hWnd);
1387c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCompStr) != 0, "hCompStr size is 0\n");
1397c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hCandInfo) != 0, "hCandInfo size is 0\n");
1407c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hGuideLine) != 0, "hGuideLine size is 0\n");
1417c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hPrivate) != 0, "hPrivate size is 0\n");
1427c3902e5SThomas Faber ok(ImmGetIMCCSize(pIC->hMsgBuf) != 0, "hMsgBuf size is 0\n");
1437c3902e5SThomas Faber }
1447c3902e5SThomas Faber else
1457c3902e5SThomas Faber {
1467c3902e5SThomas Faber skip("No pIC\n");
1477c3902e5SThomas Faber }
148d6a0299eSKatayama Hirofumi MZ ImmUnlockIMC(hNewIMC);
1497c3902e5SThomas Faber ok(ImmReleaseContext(hwndEdit, hIMC), "ImmReleaseContext failed\n");
1507c3902e5SThomas Faber ok(ImmDestroyContext(hNewIMC), "ImmDestroyContext failed\n");
151d6a0299eSKatayama Hirofumi MZ
152d6a0299eSKatayama Hirofumi MZ DestroyWindow(hwndEdit);
153d6a0299eSKatayama Hirofumi MZ DestroyWindow(hwndStatic);
154d6a0299eSKatayama Hirofumi MZ }
1553820744aSKatayama Hirofumi MZ
Test2(void)1563820744aSKatayama Hirofumi MZ static void Test2(void)
1573820744aSKatayama Hirofumi MZ {
1583820744aSKatayama Hirofumi MZ static const LPCSTR apszClasses[] =
1593820744aSKatayama Hirofumi MZ {
1603820744aSKatayama Hirofumi MZ "BUTTON",
1613820744aSKatayama Hirofumi MZ "COMBOBOX",
1623820744aSKatayama Hirofumi MZ "EDIT",
1633820744aSKatayama Hirofumi MZ "LISTBOX",
1643820744aSKatayama Hirofumi MZ "SCROLLBAR",
1653820744aSKatayama Hirofumi MZ "STATIC"
1663820744aSKatayama Hirofumi MZ };
1673820744aSKatayama Hirofumi MZ size_t i;
1683820744aSKatayama Hirofumi MZ HIMC hIMC;
1693820744aSKatayama Hirofumi MZ HWND hwnd;
1703820744aSKatayama Hirofumi MZ
1713820744aSKatayama Hirofumi MZ for (i = 0; i < _countof(apszClasses); ++i)
1723820744aSKatayama Hirofumi MZ {
1733820744aSKatayama Hirofumi MZ LPCSTR pszClass = apszClasses[i];
1743820744aSKatayama Hirofumi MZ hwnd = CreateWindowA(pszClass, NULL, WS_VISIBLE, 0, 0, 0, 0, NULL, NULL,
1753820744aSKatayama Hirofumi MZ GetModuleHandle(NULL), NULL);
176*e9df3176SKatayama Hirofumi MZ ok(hwnd != NULL, "CreateWindow(%s) failed\n", pszClass);
1773820744aSKatayama Hirofumi MZ
1783820744aSKatayama Hirofumi MZ hIMC = ImmGetContext(hwnd);
1793820744aSKatayama Hirofumi MZ
1803820744aSKatayama Hirofumi MZ if (lstrcmpiA(pszClass, "BUTTON") == 0)
1813820744aSKatayama Hirofumi MZ ok(hIMC == NULL, "hIMC was %p\n", hIMC);
1823820744aSKatayama Hirofumi MZ else
1833820744aSKatayama Hirofumi MZ ok(hIMC != NULL, "hIMC was NULL\n");
1843820744aSKatayama Hirofumi MZ
1853820744aSKatayama Hirofumi MZ ImmReleaseContext(hwnd, hIMC);
1863820744aSKatayama Hirofumi MZ
1873820744aSKatayama Hirofumi MZ DestroyWindow(hwnd);
1883820744aSKatayama Hirofumi MZ }
1893820744aSKatayama Hirofumi MZ }
1903820744aSKatayama Hirofumi MZ
START_TEST(himc)1913820744aSKatayama Hirofumi MZ START_TEST(himc)
1923820744aSKatayama Hirofumi MZ {
1933820744aSKatayama Hirofumi MZ Test1();
1943820744aSKatayama Hirofumi MZ Test2();
1953820744aSKatayama Hirofumi MZ }
196