reactos/modules/rostests/apitests/imm32/ImmGetImeInfoEx.c
2022-03-03 10:10:46 +09:00

151 lines
4.7 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Test for ImmGetImeInfoEx
* COPYRIGHT: Copyright 2021 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "precomp.h"
//#define DO_PRINT
static VOID PrintInfoEx(PIMEINFOEX pInfoEx)
{
#ifdef DO_PRINT
trace("---\n");
trace("hkl: %p\n", pInfoEx->hkl);
trace("ImeInfo.dwPrivateDataSize: 0x%lX\n", pInfoEx->ImeInfo.dwPrivateDataSize);
trace("ImeInfo.fdwProperty: 0x%lX\n", pInfoEx->ImeInfo.fdwProperty);
trace("ImeInfo.fdwConversionCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwConversionCaps);
trace("ImeInfo.fdwSentenceCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSentenceCaps);
trace("ImeInfo.fdwUICaps: 0x%lX\n", pInfoEx->ImeInfo.fdwUICaps);
trace("ImeInfo.fdwSCSCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSCSCaps);
trace("ImeInfo.fdwSelectCaps: 0x%lX\n", pInfoEx->ImeInfo.fdwSelectCaps);
trace("wszUIClass: '%ls'\n", pInfoEx->wszUIClass);
trace("fdwInitConvMode: 0x%lX\n", pInfoEx->fdwInitConvMode);
trace("fInitOpen: %d\n", pInfoEx->fInitOpen);
trace("fLoadFlag: %d\n", pInfoEx->fLoadFlag);
trace("dwProdVersion: 0x%lX\n", pInfoEx->dwProdVersion);
trace("dwImeWinVersion: 0x%lX\n", pInfoEx->dwImeWinVersion);
trace("wszImeDescription: '%ls'\n", pInfoEx->wszImeDescription);
trace("wszImeFile: '%ls'\n", pInfoEx->wszImeFile);
trace("fInitOpen: %d\n", pInfoEx->fInitOpen);
#endif
}
typedef BOOL (WINAPI *FN_ImmGetImeInfoEx)(PIMEINFOEX, IMEINFOEXCLASS, PVOID);
START_TEST(ImmGetImeInfoEx)
{
IMEINFOEX InfoEx;
BOOL ret, bMatch;
size_t ib;
LANGID LangID = GetSystemDefaultLangID();
HKL hKL = GetKeyboardLayout(0), hOldKL;
HMODULE hImm32 = GetModuleHandleA("imm32");
FN_ImmGetImeInfoEx fnImmGetImeInfoEx =
(FN_ImmGetImeInfoEx)GetProcAddress(hImm32, "ImmGetImeInfoEx");
if (!fnImmGetImeInfoEx)
{
skip("ImmGetImeInfoEx not found\n");
return;
}
if (!GetSystemMetrics(SM_IMMENABLED))
{
skip("IME is not available\n");
return;
}
// ImeInfoExKeyboardLayout
hOldKL = hKL;
FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExKeyboardLayout, &hKL);
PrintInfoEx(&InfoEx);
ok_int(ret, TRUE);
ok_long((DWORD)(DWORD_PTR)hOldKL, (DWORD)(DWORD_PTR)hKL);
if (IS_IME_HKL(InfoEx.hkl))
{
ok_long(LOWORD(InfoEx.hkl), LangID);
}
else
{
ok_int(LOWORD(InfoEx.hkl), LangID);
ok_int(HIWORD(InfoEx.hkl), LangID);
}
ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
ok(InfoEx.wszUIClass[0] != 0, "wszUIClass was empty\n");
ok_long(InfoEx.dwImeWinVersion, 0x40000);
ok(InfoEx.wszImeFile[0] != 0, "wszImeFile was empty\n");
hKL = hOldKL;
// ImeInfoExKeyboardLayoutTFS
hOldKL = hKL;
FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExKeyboardLayoutTFS, &hKL);
PrintInfoEx(&InfoEx);
ok_int(ret, TRUE);
if (IS_IME_HKL(InfoEx.hkl))
{
ok_long(LOWORD(InfoEx.hkl), LangID);
}
else
{
ok_int(LOWORD(InfoEx.hkl), LangID);
ok_int(HIWORD(InfoEx.hkl), LangID);
}
ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
ok(InfoEx.wszUIClass[0] != 0, "wszUIClass was empty\n");
ok_long(InfoEx.dwImeWinVersion, 0x40000);
ok(InfoEx.wszImeFile[0] != 0, "wszImeFile was empty\n");
hKL = hOldKL;
// ImeInfoExImeWindow
hOldKL = hKL;
FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExImeWindow, &hKL);
ok_int(ret, FALSE);
bMatch = TRUE;
for (ib = 0; ib < sizeof(InfoEx); ++ib)
{
if (((LPBYTE)&InfoEx)[ib] != 0xCC)
{
bMatch = FALSE;
break;
}
}
ok_int(bMatch, TRUE);
// ImeInfoExImeFileName
hOldKL = hKL;
FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
InfoEx.wszUIClass[0] = InfoEx.wszImeFile[0] = 0;
ret = fnImmGetImeInfoEx(&InfoEx, ImeInfoExImeFileName, L"THISISTEST");
PrintInfoEx(&InfoEx);
ok_int(ret, FALSE);
ok(InfoEx.ImeInfo.dwPrivateDataSize >= 4, "\n");
ok_wstr(InfoEx.wszUIClass, L"");
ok_long(InfoEx.dwImeWinVersion, 0xCCCCCCCC);
ok_wstr(InfoEx.wszImeFile, L"THISISTEST");
hKL = hOldKL;
// 4
hOldKL = hKL;
FillMemory(&InfoEx, sizeof(InfoEx), 0xCC);
ret = fnImmGetImeInfoEx(&InfoEx, 4, &hKL);
ok_int(ret, FALSE);
bMatch = TRUE;
for (ib = 0; ib < sizeof(InfoEx); ++ib)
{
if (((LPBYTE)&InfoEx)[ib] != 0xCC)
{
bMatch = FALSE;
break;
}
}
ok_int(bMatch, TRUE);
}