1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Test for ImmGetImeInfoEx
5 * COPYRIGHT: Copyright 2021 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8 #include "precomp.h"
9
10 //#define DO_PRINT
11
PrintInfoEx(PIMEINFOEX pInfoEx)12 static VOID PrintInfoEx(PIMEINFOEX pInfoEx)
13 {
14 #ifdef DO_PRINT
15 trace("---\n");
16 trace("hkl: %p\n", pInfoEx->hkl);
17 trace("ImeInfo.dwPrivateDataSize: 0x%lX\n", pInfoEx->ImeInfo.dwPrivateDataSize);
18 trace("ImeInfo.fdwProperty: 0x%lX\n", pInfoEx->ImeInfo.fdwProperty);
19 trace("ImeInfo.fdwConversionCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwConversionCaps);
20 trace("ImeInfo.fdwSentenceCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSentenceCaps);
21 trace("ImeInfo.fdwUICaps: 0x%lX\n", pInfoEx->ImeInfo.fdwUICaps);
22 trace("ImeInfo.fdwSCSCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSCSCaps);
23 trace("ImeInfo.fdwSelectCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSelectCaps);
24 trace("wszUIClass: '%ls'\n", pInfoEx->wszUIClass);
25 trace("fdwInitConvMode: 0x%lX\n", pInfoEx->fdwInitConvMode);
26 trace("fInitOpen: %d\n", pInfoEx->fInitOpen);
27 trace("fLoadFlag: %d\n", pInfoEx->fLoadFlag);
28 trace("dwProdVersion: 0x%lX\n", pInfoEx->dwProdVersion);
29 trace("dwImeWinVersion: 0x%lX\n", pInfoEx->dwImeWinVersion);
30 trace("wszImeDescription: '%ls'\n", pInfoEx->wszImeDescription);
31 trace("wszImeFile: '%ls'\n", pInfoEx->wszImeFile);
32 trace("fInitOpen: %d\n", pInfoEx->fInitOpen);
33 #endif
34 }
35
36 typedef BOOL (WINAPI *FN_ImmGetImeInfoEx)(PIMEINFOEX, IMEINFOEXCLASS, PVOID);
37
START_TEST(ImmGetImeInfoEx)38 START_TEST(ImmGetImeInfoEx)
39 {
40 IMEINFOEX InfoEx;
41 BOOL ret, bMatch;
42 size_t ib;
43 LANGID LangID = GetSystemDefaultLangID();
44 HKL hKL = GetKeyboardLayout(0), hOldKL;
45
46 HMODULE hImm32 = GetModuleHandleA("imm32");
47 FN_ImmGetImeInfoEx fnImmGetImeInfoEx =
48 (FN_ImmGetImeInfoEx)GetProcAddress(hImm32, "ImmGetImeInfoEx");
49 if (!fnImmGetImeInfoEx)
50 {
51 skip("ImmGetImeInfoEx not found\n");
52 return;
53 }
54
55 if (!GetSystemMetrics(SM_IMMENABLED))
56 {
57 skip("IME is not available\n");
58 return;
59 }
60
61 // ImeInfoExKeyboardLayout
62 hOldKL = hKL;
63 FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
64 InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
65 ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExKeyboardLayout, &hKL);
66 PrintInfoEx(&InfoEx);
67 ok_int(ret, TRUE);
68 ok_long((DWORD)(DWORD_PTR)hOldKL, (DWORD)(DWORD_PTR)hKL);
69 if (IS_IME_HKL(InfoEx.hkl))
70 {
71 ok_long(LOWORD(InfoEx.hkl), LangID);
72 }
73 else
74 {
75 ok_int(LOWORD(InfoEx.hkl), LangID);
76 ok_int(HIWORD(InfoEx.hkl), LangID);
77 }
78 ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
79 ok(InfoEx.wszUIClass[0] != 0, "wszUIClass was empty\n");
80 ok_long(InfoEx.dwImeWinVersion, 0x40000);
81 ok(InfoEx.wszImeFile[0] != 0, "wszImeFile was empty\n");
82 hKL = hOldKL;
83
84 // ImeInfoExKeyboardLayoutTFS
85 hOldKL = hKL;
86 FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
87 InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
88 ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExKeyboardLayoutTFS, &hKL);
89 PrintInfoEx(&InfoEx);
90 ok_int(ret, TRUE);
91 if (IS_IME_HKL(InfoEx.hkl))
92 {
93 ok_long(LOWORD(InfoEx.hkl), LangID);
94 }
95 else
96 {
97 ok_int(LOWORD(InfoEx.hkl), LangID);
98 ok_int(HIWORD(InfoEx.hkl), LangID);
99 }
100 ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
101 ok(InfoEx.wszUIClass[0] != 0, "wszUIClass was empty\n");
102 ok_long(InfoEx.dwImeWinVersion, 0x40000);
103 ok(InfoEx.wszImeFile[0] != 0, "wszImeFile was empty\n");
104 hKL = hOldKL;
105
106 // ImeInfoExImeWindow
107 hOldKL = hKL;
108 FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
109 ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExImeWindow, &hKL);
110 ok_int(ret, FALSE);
111 bMatch = TRUE;
112 for (ib = 0; ib < sizeof(InfoEx); ++ib)
113 {
114 if (((LPBYTE)&InfoEx)[ib] != 0xCC)
115 {
116 bMatch = FALSE;
117 break;
118 }
119 }
120 ok_int(bMatch, TRUE);
121
122 // ImeInfoExImeFileName
123 hOldKL = hKL;
124 FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
125 InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
126 ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExImeFileName, L"THISISTEST");
127 PrintInfoEx(&InfoEx);
128 ok_int(ret, FALSE);
129 ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
130 ok_wstr(InfoEx.wszUIClass, L"");
131 ok_long(InfoEx.dwImeWinVersion, 0xCCCCCCCC);
132 ok_wstr(InfoEx.wszImeFile, L"THISISTEST");
133 hKL = hOldKL;
134
135 // 4
136 hOldKL = hKL;
137 FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
138 ret = fnImmGetImeInfoEx(&InfoEx, 4, &hKL);
139 ok_int(ret, FALSE);
140 bMatch = TRUE;
141 for (ib = 0; ib < sizeof(InfoEx); ++ib)
142 {
143 if (((LPBYTE)&InfoEx)[ib] != 0xCC)
144 {
145 bMatch = FALSE;
146 break;
147 }
148 }
149 ok_int(bMatch, TRUE);
150 }
151