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 
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 
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