Author: akhaldi
Date: Wed Apr 30 12:16:47 2014
New Revision: 63059
URL:
http://svn.reactos.org/svn/reactos?rev=63059&view=rev
Log:
[IMM32_WINETEST]
* Sync with Wine 1.7.17.
CORE-8080
Modified:
trunk/rostests/winetests/imm32/imm32.c
Modified: trunk/rostests/winetests/imm32/imm32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/imm32/imm32.c?r…
==============================================================================
--- trunk/rostests/winetests/imm32/imm32.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/imm32/imm32.c [iso-8859-1] Wed Apr 30 12:16:47 2014
@@ -102,9 +102,9 @@
static void msg_spy_pump_msg_queue(void) {
MSG msg;
- while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
+ while(PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
- DispatchMessage(&msg);
+ DispatchMessageW(&msg);
}
return;
@@ -143,11 +143,11 @@
static void msg_spy_init(HWND hwnd) {
msg_spy.hwnd = hwnd;
msg_spy.get_msg_hook =
- SetWindowsHookEx(WH_GETMESSAGE, get_msg_filter, GetModuleHandle(0),
- GetCurrentThreadId());
+ SetWindowsHookExW(WH_GETMESSAGE, get_msg_filter, GetModuleHandleW(NULL),
+ GetCurrentThreadId());
msg_spy.call_wnd_proc_hook =
- SetWindowsHookEx(WH_CALLWNDPROC, call_wnd_proc_filter,
- GetModuleHandle(0), GetCurrentThreadId());
+ SetWindowsHookExW(WH_CALLWNDPROC, call_wnd_proc_filter,
+ GetModuleHandleW(NULL), GetCurrentThreadId());
msg_spy.i_msg = 0;
msg_spy_flush_msgs();
@@ -182,7 +182,7 @@
}
static BOOL init(void) {
- WNDCLASSEX wc;
+ WNDCLASSEXA wc;
HIMC imc;
HMODULE hmod,huser;
@@ -192,25 +192,25 @@
pImmIsUIMessageA = (void*)GetProcAddress(hmod, "ImmIsUIMessageA");
pSendInput = (void*)GetProcAddress(huser, "SendInput");
- wc.cbSize = sizeof(WNDCLASSEX);
+ wc.cbSize = sizeof(WNDCLASSEXA);
wc.style = 0;
wc.lpfnWndProc = wndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
- wc.hInstance = GetModuleHandle(0);
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hInstance = GetModuleHandleA(NULL);
+ wc.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
+ wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = wndcls;
- wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+ wc.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
if (!RegisterClassExA(&wc))
return FALSE;
- hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
- 240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+ hwnd = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL);
if (!hwnd)
return FALSE;
@@ -234,7 +234,7 @@
msg_spy_cleanup();
if (hwnd)
DestroyWindow(hwnd);
- UnregisterClass(wndcls, GetModuleHandle(0));
+ UnregisterClassA(wndcls, GetModuleHandleW(NULL));
}
static void test_ImmNotifyIME(void) {
@@ -254,14 +254,14 @@
"WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if "
"the composition string being canceled is empty.\n");
- ImmSetCompositionString(imc, SCS_SETSTR, string, sizeof(string), NULL, 0);
+ ImmSetCompositionStringA(imc, SCS_SETSTR, string, sizeof(string), NULL, 0);
msg_spy_flush_msgs();
ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
msg_spy_flush_msgs();
/* behavior differs between win9x and NT */
- ret = ImmGetCompositionString(imc, GCS_COMPSTR, resstr, sizeof(resstr));
+ ret = ImmGetCompositionStringA(imc, GCS_COMPSTR, resstr, sizeof(resstr));
ok(!ret, "After being cancelled the composition string is empty.\n");
msg_spy_flush_msgs();
@@ -276,6 +276,26 @@
msg_spy_flush_msgs();
ImmReleaseContext(hwnd, imc);
+
+ imc = ImmCreateContext();
+ ImmDestroyContext(imc);
+
+ SetLastError(0xdeadbeef);
+ ret = ImmNotifyIME((HIMC)0xdeadcafe, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
+ ok (ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmNotifyIME(0x00000000, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
+ ok (ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_SUCCESS, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
+ ok (ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
}
static void test_ImmGetCompositionString(void)
@@ -406,9 +426,9 @@
COMPOSITIONFORM cf;
POINT pt;
igc_threadinfo *info= (igc_threadinfo*)lpParam;
- info->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll
test",
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
- 240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+ info->hwnd = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll
test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL);
h1 = ImmGetContext(hwnd);
todo_wine ok(info->himc == h1, "hwnd context changed in new thread\n");
@@ -417,9 +437,9 @@
info->himc = h2;
ImmReleaseContext(hwnd,h1);
- hwnd2 = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
- 240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+ hwnd2 = CreateWindowExA(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL);
h1 = ImmGetContext(hwnd2);
ok(h1 == h2, "Windows in same thread should have same default context\n");
@@ -443,13 +463,14 @@
HANDLE hThread;
DWORD dwThreadId;
BOOL rc;
- LOGFONT lf;
+ LOGFONTA lf;
COMPOSITIONFORM cf;
+ CANDIDATEFORM cdf;
DWORD status, sentence;
POINT pt;
himc = ImmGetContext(hwnd);
- threadinfo.event = CreateEvent(NULL, TRUE, FALSE, NULL);
+ threadinfo.event = CreateEventA(NULL, TRUE, FALSE, NULL);
threadinfo.himc = himc;
hThread = CreateThread(NULL, 0, ImmGetContextThreadFunc, &threadinfo, 0,
&dwThreadId );
WaitForSingleObject(threadinfo.event, INFINITE);
@@ -489,14 +510,14 @@
ok(rc == 0, "ImmGetOpenStatus failed\n");
/* CompositionFont */
- rc = ImmGetCompositionFont(himc, &lf);
+ rc = ImmGetCompositionFontA(himc, &lf);
ok(rc != 0, "ImmGetCompositionFont failed\n");
- rc = ImmSetCompositionFont(himc, &lf);
+ rc = ImmSetCompositionFontA(himc, &lf);
ok(rc != 0, "ImmSetCompositionFont failed\n");
- rc = ImmGetCompositionFont(otherHimc, &lf);
+ rc = ImmGetCompositionFontA(otherHimc, &lf);
ok(rc != 0 || broken(rc == 0), "ImmGetCompositionFont failed\n");
- rc = ImmSetCompositionFont(otherHimc, &lf);
+ rc = ImmSetCompositionFontA(otherHimc, &lf);
todo_wine ok(rc == 0, "ImmSetCompositionFont should fail\n");
/* CompositionWindow */
@@ -531,6 +552,23 @@
todo_wine ok(rc == 0, "ImmSetStatusWindowPos should fail\n");
rc = ImmGetStatusWindowPos(otherHimc, &pt);
ok(rc != 0 || broken(rc == 0), "ImmGetStatusWindowPos failed\n");
+
+ /* Candidate Window */
+ rc = ImmGetCandidateWindow(himc, 0, &cdf);
+ ok (rc == 0, "ImmGetCandidateWindow should fail\n");
+ cdf.dwIndex = 0;
+ cdf.dwStyle = CFS_CANDIDATEPOS;
+ cdf.ptCurrentPos.x = 0;
+ cdf.ptCurrentPos.y = 0;
+ rc = ImmSetCandidateWindow(himc, &cdf);
+ ok (rc == 1, "ImmSetCandidateWindow should succeed\n");
+ rc = ImmGetCandidateWindow(himc, 0, &cdf);
+ ok (rc == 1, "ImmGetCandidateWindow should succeed\n");
+
+ rc = ImmGetCandidateWindow(otherHimc, 0, &cdf);
+ todo_wine ok (rc == 0, "ImmGetCandidateWindow should fail\n");
+ rc = ImmSetCandidateWindow(otherHimc, &cdf);
+ todo_wine ok (rc == 0, "ImmSetCandidateWindow should fail\n");
ImmReleaseContext(threadinfo.hwnd,otherHimc);
ImmReleaseContext(hwnd,himc);
@@ -609,18 +647,19 @@
static void test_ImmGetDescription(void)
{
HKL hkl;
- WCHAR japime[] = { 'E', '0', '0', '1', '0',
'4', '1', '1', 0 };
WCHAR descW[100];
CHAR descA[100];
UINT ret, lret;
/* FIXME: invalid keyboard layouts should not pass */
ret = ImmGetDescriptionW(NULL, NULL, 0);
- todo_wine ok(!ret, "ImmGetDescriptionW failed, expected 0 received %d.\n",
ret);
+ ok(!ret, "ImmGetDescriptionW failed, expected 0 received %d.\n", ret);
+ ret = ImmGetDescriptionA(NULL, NULL, 0);
+ ok(!ret, "ImmGetDescriptionA failed, expected 0 received %d.\n", ret);
/* load a language with valid IMM descriptions */
- hkl = LoadKeyboardLayoutW(japime, KLF_ACTIVATE);
- todo_wine ok(hkl != 0, "LoadKeyboardLayoutW failed, expected != 0.\n");
+ hkl = GetKeyboardLayout(0);
+ ok(hkl != 0, "GetKeyboardLayout failed, expected != 0.\n");
ret = ImmGetDescriptionW(hkl, NULL, 0);
if(!ret)
@@ -628,6 +667,12 @@
win_skip("ImmGetDescriptionW is not working for current loaded
keyboard.\n");
return;
}
+
+ SetLastError(0xdeadcafe);
+ ret = ImmGetDescriptionW(0, NULL, 100);
+ ok (ret == 0, "ImmGetDescriptionW with 0 hkl should return 0\n");
+ ret = GetLastError();
+ ok (ret == 0xdeadcafe, "Last Error should remain unchanged\n");
ret = ImmGetDescriptionW(hkl, descW, 0);
ok(ret, "ImmGetDescriptionW failed, expected != 0 received 0.\n");
@@ -638,13 +683,16 @@
lret = ImmGetDescriptionA(hkl, descA, ret + 1);
ok(lret, "ImmGetDescriptionA failed, expected != 0 received 0.\n");
- todo_wine ok(lret == ret, "ImmGetDescriptionA failed to return the correct
amount of data. Expected %d, got %d.\n", ret, lret);
+ ok(lret == ret, "ImmGetDescriptionA failed to return the correct amount of data.
Expected %d, got %d.\n", ret, lret);
ret /= 2; /* try to copy partially */
lret = ImmGetDescriptionW(hkl, descW, ret + 1);
ok(lret, "ImmGetDescriptionW failed, expected != 0 received 0.\n");
ok(lret == ret, "ImmGetDescriptionW failed to return the correct amount of data.
Expected %d, got %d.\n", ret, lret);
+ lret = ImmGetDescriptionA(hkl, descA, ret + 1);
+ ok(!lret, "ImmGetDescriptionA should fail\n");
+
ret = ImmGetDescriptionW(hkl, descW, 1);
ok(!ret, "ImmGetDescriptionW failed, expected 0 received %d.\n", ret);
@@ -657,9 +705,9 @@
HWND def1, def3;
HWND hwnd;
- hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll
test",
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
- 240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+ hwnd = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll
test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 240, 120, NULL, NULL, GetModuleHandleW(NULL), NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
@@ -693,6 +741,23 @@
HIMC imc;
DWORD count, ret, i;
INPUTCONTEXT *ic;
+
+ imc = ImmCreateContext();
+ ImmDestroyContext(imc);
+ SetLastError(0xdeadbeef);
+ count = ImmGetIMCLockCount((HIMC)0xdeadcafe);
+ ok(count == 0, "Invalid IMC should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ count = ImmGetIMCLockCount(0x00000000);
+ ok(count == 0, "NULL IMC should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "Last Error should remain unchangedi %08x\n",ret);
+ count = ImmGetIMCLockCount(imc);
+ ok(count == 0, "Destroyed IMC should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
imc = ImmCreateContext();
count = ImmGetIMCLockCount(imc);
@@ -732,7 +797,8 @@
static void test_ImmGetIMCCLockCount(void)
{
HIMCC imcc;
- DWORD count, g_count, ret, i;
+ DWORD count, g_count, i;
+ BOOL ret;
VOID *p;
imcc = ImmCreateIMCC(sizeof(CANDIDATEINFO));
@@ -790,16 +856,16 @@
ret = ImmDestroyContext(imc);
ok(ret == TRUE, "Destroy a locked IMC should success!\n");
ic = ImmLockIMC(imc);
- todo_wine ok(ic == NULL, "Lock a destroyed IMC should fail!\n");
+ ok(ic == NULL, "Lock a destroyed IMC should fail!\n");
ret = ImmUnlockIMC(imc);
- todo_wine ok(ret == FALSE, "Unlock a destroyed IMC should fail!\n");
+ ok(ret == FALSE, "Unlock a destroyed IMC should fail!\n");
count = ImmGetIMCLockCount(imc);
- todo_wine ok(count == 0, "Get lock count of a destroyed IMC should return
0!\n");
+ ok(count == 0, "Get lock count of a destroyed IMC should return 0!\n");
SetLastError(0xdeadbeef);
ret = ImmDestroyContext(imc);
- todo_wine ok(ret == FALSE, "Destroy a destroyed IMC should fail!\n");
- ret = GetLastError();
- todo_wine ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n",
ret);
+ ok(ret == FALSE, "Destroy a destroyed IMC should fail!\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
}
static void test_ImmDestroyIMCC(void)
@@ -842,9 +908,9 @@
HIMC imc;
UINT idx = 0;
- HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll
test",
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
- 240, 120, NULL, NULL, GetModuleHandle(0), NULL);
+ HWND hwnd = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll
test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 240, 120, NULL, NULL, GetModuleHandleA(NULL), NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
defwnd = ImmGetDefaultIMEWnd(hwnd);
@@ -852,7 +918,7 @@
ImmSetOpenStatus(imc, TRUE);
msg_spy_flush_msgs();
- SendMessage(defwnd, WM_IME_CONTROL, IMC_GETCANDIDATEPOS, (LPARAM)&cf );
+ SendMessageA(defwnd, WM_IME_CONTROL, IMC_GETCANDIDATEPOS, (LPARAM)&cf );
do
{
msg = msg_spy_find_next_msg(WM_IME_CONTROL,&idx);
@@ -887,8 +953,8 @@
wclass.style = CS_HREDRAW | CS_VREDRAW;
wclass.lpfnWndProc = processkey_wnd_proc;
wclass.hInstance = hInstance;
- wclass.hIcon = LoadIcon(0, IDI_APPLICATION);
- wclass.hCursor = LoadCursor( NULL, IDC_ARROW);
+ wclass.hIcon = LoadIconW(0, (LPCWSTR)IDI_APPLICATION);
+ wclass.hCursor = LoadCursorW( NULL, (LPCWSTR)IDC_ARROW);
wclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wclass.lpszMenuName = 0;
wclass.cbClsExtra = 0;
@@ -978,6 +1044,363 @@
ImmReleaseContext(hWndTest, imc);
ImmSetOpenStatus(imc, FALSE);
DestroyWindow(hWndTest);
+}
+
+static void test_InvalidIMC(void)
+{
+ HIMC imc_destroy;
+ HIMC imc_null = 0x00000000;
+ HIMC imc_bad = (HIMC)0xdeadcafe;
+
+ HIMC imc1, imc2, oldimc;
+ DWORD ret;
+ DWORD count;
+ CHAR buffer[1000];
+ INPUTCONTEXT *ic;
+ LOGFONTA lf;
+
+ memset(&lf, 0, sizeof(lf));
+
+ imc_destroy = ImmCreateContext();
+ ret = ImmDestroyContext(imc_destroy);
+ ok(ret == TRUE, "Destroy an IMC should success!\n");
+
+ /* Test associating destroyed imc */
+ imc1 = ImmGetContext(hwnd);
+ SetLastError(0xdeadbeef);
+ oldimc = ImmAssociateContext(hwnd, imc_destroy);
+ ok(!oldimc, "Associating to a destroyed imc should fail!\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ imc2 = ImmGetContext(hwnd);
+ ok(imc1 == imc2, "imc should not changed! imc1 %p, imc2 %p\n", imc1,
imc2);
+
+ /* Test associating NULL imc, which is different from an invalid imc */
+ oldimc = ImmAssociateContext(hwnd, imc_null);
+ ok(oldimc != NULL, "Associating to NULL imc should success!\n");
+ imc2 = ImmGetContext(hwnd);
+ ok(!imc2, "expect NULL, returned %p\n", imc2);
+ oldimc = ImmAssociateContext(hwnd, imc1);
+ ok(!oldimc, "expect NULL, returned %p\n", oldimc);
+ imc2 = ImmGetContext(hwnd);
+ ok(imc2 == imc1, "imc should not changed! imc2 %p, imc1 %p\n", imc2,
imc1);
+
+ /* Test associating invalid imc */
+ imc1 = ImmGetContext(hwnd);
+ SetLastError(0xdeadbeef);
+ oldimc = ImmAssociateContext(hwnd, imc_bad);
+ ok(!oldimc, "Associating to a destroyed imc should fail!\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ imc2 = ImmGetContext(hwnd);
+ ok(imc1 == imc2, "imc should not changed! imc1 %p, imc2 %p\n", imc1,
imc2);
+
+
+ /* Test ImmGetCandidateListA */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListA(imc_bad, 0, NULL, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListA(imc_null, 0, NULL, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListA(imc_destroy, 0, NULL, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetCandidateListCountA*/
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListCountA(imc_bad,&count);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListCountA(imc_null,&count);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateListCountA(imc_destroy,&count);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetCandidateWindow */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateWindow(imc_bad, 0, (LPCANDIDATEFORM)buffer);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateWindow(imc_null, 0, (LPCANDIDATEFORM)buffer);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCandidateWindow(imc_destroy, 0, (LPCANDIDATEFORM)buffer);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetCompositionFontA */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionFontA(imc_bad, (LPLOGFONTA)buffer);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionFontA(imc_null, (LPLOGFONTA)buffer);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionFontA(imc_destroy, (LPLOGFONTA)buffer);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetCompositionWindow */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionWindow(imc_bad, (LPCOMPOSITIONFORM)buffer);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionWindow(imc_null, (LPCOMPOSITIONFORM)buffer);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionWindow(imc_destroy, (LPCOMPOSITIONFORM)buffer);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetCompositionStringA */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionStringA(imc_bad, GCS_COMPSTR, NULL, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionStringA(imc_null, GCS_COMPSTR, NULL, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetCompositionStringA(imc_destroy, GCS_COMPSTR, NULL, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmSetOpenStatus */
+ SetLastError(0xdeadbeef);
+ ret = ImmSetOpenStatus(imc_bad, 1);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetOpenStatus(imc_null, 1);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetOpenStatus(imc_destroy, 1);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetOpenStatus */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetOpenStatus(imc_bad);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetOpenStatus(imc_null);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetOpenStatus(imc_destroy);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetStatusWindowPos */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetStatusWindowPos(imc_bad, NULL);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetStatusWindowPos(imc_null, NULL);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetStatusWindowPos(imc_destroy, NULL);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmRequestMessageA */
+ SetLastError(0xdeadbeef);
+ ret = ImmRequestMessageA(imc_bad, WM_CHAR, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmRequestMessageA(imc_null, WM_CHAR, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmRequestMessageA(imc_destroy, WM_CHAR, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmSetCompositionFontA */
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionFontA(imc_bad, &lf);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionFontA(imc_null, &lf);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionFontA(imc_destroy, &lf);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmSetCompositionWindow */
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionWindow(imc_bad, NULL);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionWindow(imc_null, NULL);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetCompositionWindow(imc_destroy, NULL);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmSetConversionStatus */
+ SetLastError(0xdeadbeef);
+ ret = ImmSetConversionStatus(imc_bad, 0, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetConversionStatus(imc_null, 0, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetConversionStatus(imc_destroy, 0, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmSetStatusWindowPos */
+ SetLastError(0xdeadbeef);
+ ret = ImmSetStatusWindowPos(imc_bad, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetStatusWindowPos(imc_null, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmSetStatusWindowPos(imc_destroy, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGetImeMenuItemsA */
+ SetLastError(0xdeadbeef);
+ ret = ImmGetImeMenuItemsA(imc_bad, 0, 0, NULL, NULL, 0);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetImeMenuItemsA(imc_null, 0, 0, NULL, NULL, 0);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGetImeMenuItemsA(imc_destroy, 0, 0, NULL, NULL, 0);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmLockIMC */
+ SetLastError(0xdeadbeef);
+ ic = ImmLockIMC(imc_bad);
+ ok(ic == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ic = ImmLockIMC(imc_null);
+ ok(ic == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ic = ImmLockIMC(imc_destroy);
+ ok(ic == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmUnlockIMC */
+ SetLastError(0xdeadbeef);
+ ret = ImmUnlockIMC(imc_bad);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmUnlockIMC(imc_null);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == 0xdeadbeef, "last error should remain unchanged %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmUnlockIMC(imc_destroy);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+
+ /* Test ImmGenerateMessage */
+ SetLastError(0xdeadbeef);
+ ret = ImmGenerateMessage(imc_bad);
+ ok(ret == 0, "Bad IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGenerateMessage(imc_null);
+ ok(ret == 0, "NULL IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
+ SetLastError(0xdeadbeef);
+ ret = ImmGenerateMessage(imc_destroy);
+ ok(ret == 0, "Destroyed IME should return 0\n");
+ ret = GetLastError();
+ ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret);
}
START_TEST(imm32) {
@@ -997,6 +1420,7 @@
test_ImmGetIMCCLockCount();
test_ImmDestroyContext();
test_ImmDestroyIMCC();
+ test_InvalidIMC();
msg_spy_cleanup();
/* Reinitialize the hooks to capture all windows */
msg_spy_init(NULL);