|
|
|
|
|
|
|
|
|
|
|
#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; |
|
} |
|
|