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     // ImeInfoExImeWindow
85     hOldKL = hKL;
86     FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
87     InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
88     ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExImeWindow, &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     // TODO: ImeInfoExImeFileName
107 
108     // 4
109     hOldKL = hKL;
110     FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
111     ret = fnImmGetImeInfoEx(&InfoEx, 4, &hKL);
112     ok_int(ret, FALSE);
113     bMatch = TRUE;
114     for (ib = 0; ib < sizeof(InfoEx); ++ib)
115     {
116         if (((LPBYTE)&InfoEx)[ib] != 0xCC)
117         {
118             bMatch = FALSE;
119             break;
120         }
121     }
122     ok_int(bMatch, TRUE);
123 }
124