Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- dlls/kernel32/tests/console.c | 162 ++++++++++++++++++++++++++++++++-- 1 file changed, 156 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index e4d9d43f4c4..12924719f16 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -3558,12 +3558,46 @@ static void test_GetCurrentConsoleFontEx(HANDLE std_output) ok(cfix.dwFontSize.Y == cfi.dwFontSize.Y, "expected values to match\n"); }
+static HANDLE console_event; + +static void CALLBACK console_event_hook_proc(HWINEVENTHOOK hook, DWORD event, HWND hwnd, + LONG object_id, LONG child_id, + DWORD thread_id, DWORD event_time) +{ + SetEvent(console_event); +} + +static DWORD WINAPI console_event_thread_proc(void *param) +{ + MSG msg; + HANDLE hthread_event = *(HANDLE *)param; + HWINEVENTHOOK hook; + + hook = SetWinEventHook(EVENT_CONSOLE_LAYOUT, EVENT_CONSOLE_LAYOUT, NULL, + console_event_hook_proc, 0, 0, WINEVENT_OUTOFCONTEXT); + ok(hook != 0, "SetWinEventHook failed\n"); + + SetEvent(hthread_event); + + while (GetMessageA(&msg, 0, 0, 0) > 0) + DispatchMessageA(&msg); + + ok(UnhookWinEvent(hook), "UnhookWinEvent failed\n"); + + return 0; +} + static void test_SetCurrentConsoleFontEx(HANDLE std_output) { - CONSOLE_FONT_INFOEX orig_cfix, cfix; + CONSOLE_FONT_INFOEX orig_cfix, cfix, tmp; BOOL ret; - HANDLE pipe1, pipe2; + HANDLE pipe1, pipe2, hthread, hthread_event; HANDLE std_input = GetStdHandle(STD_INPUT_HANDLE); + DWORD hthread_id, res; + HWND hwnd = GetConsoleWindow(); + RECT r; + CONSOLE_SCREEN_BUFFER_INFO csbi; + unsigned int font_height;
orig_cfix.cbSize = sizeof(CONSOLE_FONT_INFOEX);
@@ -3652,26 +3686,142 @@ static void test_SetCurrentConsoleFontEx(HANDLE std_output) ok(!ret, "got %d, expected 0\n", ret); todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "got %u, expected 6\n", GetLastError());
+ /* Font parameter tests */ + console_event = CreateEventA(NULL, FALSE, FALSE, "console_event"); + ok(console_event != NULL, "CreateEvent failed: %u\n", GetLastError()); + + hthread_event = CreateEventA(NULL, FALSE, FALSE, "hthread_event"); + ok(hthread_event != NULL, "CreateEvent failed: %u\n", GetLastError()); + + hthread = CreateThread(NULL, 0, console_event_thread_proc, &hthread_event, 0, &hthread_id); + ok(hthread != NULL, "CreateThread failed: %u\n", GetLastError()); + + res = WaitForSingleObject(hthread_event, INFINITE); + ok(res == WAIT_OBJECT_0, "got %u, expected WAIT_OBJECT_0\n", res); + + /* Try setting console font information for the current window size */ + cfix.cbSize = sizeof(cfix); + cfix.nFont = 0; + cfix.dwFontSize.X = 0; + cfix.FontFamily = TMPF_VECTOR | TMPF_TRUETYPE | FF_MODERN; + cfix.FontWeight = FW_NORMAL; + lstrcpyW(cfix.FaceName, L"Lucida Console"); + + tmp.cbSize = sizeof(tmp); + + /* Test font height 20 */ + cfix.dwFontSize.Y = 20; SetLastError(0xdeadbeef); - ret = SetCurrentConsoleFontEx(std_input, TRUE, &cfix); - ok(!ret, "got %d, expected 0\n", ret); - todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "got %u, expected 6\n", GetLastError()); + ret = SetCurrentConsoleFontEx(std_output, FALSE, &cfix); + todo_wine ok(ret, "got %d, expected non-zero\n", ret); + todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError()); + + res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(1) got %u, expected WAIT_OBJECT_0\n", res); + + ret = GetCurrentConsoleFontEx(std_output, FALSE, &tmp); + ok(ret, "GetCurrentConsoleFontEx failed: %u\n", GetLastError()); + GetClientRect(hwnd, &r); + GetConsoleScreenBufferInfo(std_output, &csbi); + font_height = (r.bottom - r.top) / (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); + ok(tmp.dwFontSize.Y == font_height, "got %u, expected %u\n", tmp.dwFontSize.Y, font_height); + todo_wine ok(tmp.FontFamily == cfix.FontFamily, "got %u, expected %u\n", tmp.FontFamily, cfix.FontFamily); + ok(tmp.FontWeight == cfix.FontWeight, "got %u, expected %u\n", tmp.FontWeight, cfix.FontWeight);
+ /* Test font height 12 */ + cfix.dwFontSize.Y = 12; SetLastError(0xdeadbeef); ret = SetCurrentConsoleFontEx(std_output, FALSE, &cfix); todo_wine ok(ret, "got %d, expected non-zero\n", ret); todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
+ res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(2) got %u, expected WAIT_OBJECT_0\n", res); + + ret = GetCurrentConsoleFontEx(std_output, FALSE, &tmp); + ok(ret, "GetCurrentConsoleFontEx failed: %u\n", GetLastError()); + GetClientRect(hwnd, &r); + GetConsoleScreenBufferInfo(std_output, &csbi); + font_height = (r.bottom - r.top) / (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); + ok(tmp.dwFontSize.Y == font_height, "got %u, expected %u\n", tmp.dwFontSize.Y, font_height); + todo_wine ok(tmp.FontFamily == cfix.FontFamily, "got %u, expected %u\n", tmp.FontFamily, cfix.FontFamily); + ok(tmp.FontWeight == cfix.FontWeight, "got %u, expected %u\n", tmp.FontWeight, cfix.FontWeight); + + /* Test font height 16 */ + cfix.dwFontSize.Y = 16; SetLastError(0xdeadbeef); - ret = SetCurrentConsoleFontEx(std_output, TRUE, &cfix); + ret = SetCurrentConsoleFontEx(std_output, FALSE, &cfix); + todo_wine ok(ret, "got %d, expected non-zero\n", ret); + todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError()); + + res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(3) got %u, expected WAIT_OBJECT_0\n", res); + + ret = GetCurrentConsoleFontEx(std_output, FALSE, &tmp); + ok(ret, "GetCurrentConsoleFontEx failed: %u\n", GetLastError()); + GetClientRect(hwnd, &r); + GetConsoleScreenBufferInfo(std_output, &csbi); + font_height = (r.bottom - r.top) / (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); + ok(tmp.dwFontSize.Y == font_height, "got %u, expected %u\n", tmp.dwFontSize.Y, font_height); + todo_wine ok(tmp.FontFamily == cfix.FontFamily, "got %u, expected %u\n", tmp.FontFamily, cfix.FontFamily); + ok(tmp.FontWeight == cfix.FontWeight, "got %u, expected %u\n", tmp.FontWeight, cfix.FontWeight); + + /* Test invalid font height */ + cfix.dwFontSize.Y = 0; + SetLastError(0xdeadbeef); + ret = SetCurrentConsoleFontEx(std_output, FALSE, &cfix); todo_wine ok(ret, "got %d, expected non-zero\n", ret); todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
+ res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(4) got %u, expected WAIT_OBJECT_0\n", res); + + ret = GetCurrentConsoleFontEx(std_output, FALSE, &tmp); + ok(ret, "GetCurrentConsoleFontEx failed: %u\n", GetLastError()); + GetClientRect(hwnd, &r); + GetConsoleScreenBufferInfo(std_output, &csbi); + font_height = (r.bottom - r.top) / (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); + ok(tmp.dwFontSize.Y == font_height, "got %u, expected %u\n", tmp.dwFontSize.Y, font_height); + todo_wine ok(font_height == 12, "got %u, expected 12\n", font_height); + todo_wine ok(tmp.FontFamily == cfix.FontFamily, "got %u, expected %u\n", tmp.FontFamily, cfix.FontFamily); + ok(tmp.FontWeight == cfix.FontWeight, "got %u, expected %u\n", tmp.FontWeight, cfix.FontWeight); + + /* Test invalid font weight */ + cfix.dwFontSize.Y = 16; + cfix.FontWeight = 0; + SetLastError(0xdeadbeef); + ret = SetCurrentConsoleFontEx(std_output, FALSE, &cfix); + todo_wine ok(ret, "got %d, expected non-zero\n", ret); + todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError()); + + res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(5) got %u, expected WAIT_OBJECT_0\n", res); + + ret = GetCurrentConsoleFontEx(std_output, FALSE, &tmp); + ok(ret, "GetCurrentConsoleFontEx failed: %u\n", GetLastError()); + GetClientRect(hwnd, &r); + GetConsoleScreenBufferInfo(std_output, &csbi); + font_height = (r.bottom - r.top) / (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); + ok(tmp.dwFontSize.Y == font_height, "got %u, expected %u\n", tmp.dwFontSize.Y, font_height); + todo_wine ok(tmp.FontFamily == cfix.FontFamily, "got %u, expected %u\n", tmp.FontFamily, cfix.FontFamily); + ok(tmp.FontWeight == FW_NORMAL, "got %u, expected %u\n", tmp.FontWeight, FW_NORMAL); + /* Restore original console font parameters */ SetLastError(0xdeadbeef); ret = SetCurrentConsoleFontEx(std_output, FALSE, &orig_cfix); todo_wine ok(ret, "got %d, expected non-zero\n", ret); todo_wine ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError()); + + res = WaitForSingleObject(console_event, 1000); + todo_wine ok(res == WAIT_OBJECT_0, "(5) got %u, expected WAIT_OBJECT_0\n", res); + + /* Clean up */ + PostThreadMessageA(hthread_id, WM_QUIT, 0, 0); + res = WaitForSingleObject(hthread, INFINITE); + ok(res == WAIT_OBJECT_0, "got %u, expected WAIT_OBJECT_0\n", res); + CloseHandle(hthread); + CloseHandle(hthread_event); + CloseHandle(console_event); }
static void test_GetConsoleFontSize(HANDLE std_output)