| | |
| | |
| | |
| | |
| |
|
| | #include <windows.h> |
| | #include <stdio.h> |
| |
|
| | #include <string> |
| |
|
| | #include "TestUtil.cc" |
| |
|
| | const int SC_CONSOLE_MARK = 0xFFF2; |
| | const int SC_CONSOLE_SELECT_ALL = 0xFFF5; |
| |
|
| | bool g_useMark = false; |
| |
|
| | CALLBACK DWORD pausingThread(LPVOID dummy) |
| | { |
| | HWND hwnd = GetConsoleWindow(); |
| | trace("Sending selection to freeze"); |
| | SendMessage(hwnd, WM_SYSCOMMAND, |
| | g_useMark ? SC_CONSOLE_MARK : |
| | SC_CONSOLE_SELECT_ALL, |
| | 0); |
| | Sleep(1000); |
| | trace("Sending escape WM_CHAR to unfreeze"); |
| | SendMessage(hwnd, WM_CHAR, 27, 0x00010001); |
| | Sleep(1000); |
| | } |
| |
|
| | static HANDLE createBuffer() { |
| | HANDLE buf = CreateConsoleScreenBuffer( |
| | GENERIC_READ | GENERIC_WRITE, |
| | FILE_SHARE_READ | FILE_SHARE_WRITE, |
| | NULL, |
| | CONSOLE_TEXTMODE_BUFFER, |
| | NULL); |
| | ASSERT(buf != INVALID_HANDLE_VALUE); |
| | return buf; |
| | } |
| |
|
| | static void runTest(bool useMark, bool createEarly) { |
| | trace("======================================="); |
| | trace("useMark=%d createEarly=%d", useMark, createEarly); |
| | g_useMark = useMark; |
| | HANDLE buf = INVALID_HANDLE_VALUE; |
| |
|
| | if (createEarly) { |
| | buf = createBuffer(); |
| | } |
| |
|
| | CreateThread(NULL, 0, |
| | pausingThread, NULL, |
| | 0, NULL); |
| | Sleep(500); |
| |
|
| | if (!createEarly) { |
| | trace("Creating buffer"); |
| | TimeMeasurement tm1; |
| | buf = createBuffer(); |
| | const double elapsed1 = tm1.elapsed(); |
| | if (elapsed1 >= 0.250) { |
| | printf("!!! TEST FAILED !!!\n"); |
| | Sleep(2000); |
| | return; |
| | } |
| | } |
| |
|
| | trace("Writing to aux buffer"); |
| | TimeMeasurement tm2; |
| | DWORD actual = 0; |
| | BOOL ret = WriteConsoleW(buf, L"HI", 2, &actual, NULL); |
| | const double elapsed2 = tm2.elapsed(); |
| | trace("Writing to aux buffer: finished: ret=%d actual=%d (elapsed=%1.3f)", ret, actual, elapsed2); |
| | if (elapsed2 < 0.250) { |
| | printf("!!! TEST FAILED !!!\n"); |
| | } else { |
| | printf("TEST PASSED\n"); |
| | } |
| | Sleep(2000); |
| | } |
| |
|
| | int main(int argc, char **argv) { |
| | if (argc == 1) { |
| | startChildProcess(L"child"); |
| | return 0; |
| | } |
| |
|
| | std::string arg = argv[1]; |
| | if (arg == "child") { |
| | for (int useMark = 0; useMark <= 1; useMark++) { |
| | for (int createEarly = 0; createEarly <= 1; createEarly++) { |
| | runTest(useMark, createEarly); |
| | } |
| | } |
| | printf("done...\n"); |
| | Sleep(1000); |
| | } |
| | return 0; |
| | } |
| |
|