2 // Verify that console selection blocks writes to an inactive console screen
3 // buffer. Writes TEST PASSED or TEST FAILED to the popup console window.
11 #include "TestUtil.cc"
13 const int SC_CONSOLE_MARK = 0xFFF2;
14 const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
16 bool g_useMark = false;
18 CALLBACK DWORD pausingThread(LPVOID dummy)
20 HWND hwnd = GetConsoleWindow();
21 trace("Sending selection to freeze");
22 SendMessage(hwnd, WM_SYSCOMMAND,
23 g_useMark ? SC_CONSOLE_MARK :
24 SC_CONSOLE_SELECT_ALL,
27 trace("Sending escape WM_CHAR to unfreeze");
28 SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
32 static HANDLE createBuffer() {
33 HANDLE buf = CreateConsoleScreenBuffer(
34 GENERIC_READ | GENERIC_WRITE,
35 FILE_SHARE_READ | FILE_SHARE_WRITE,
37 CONSOLE_TEXTMODE_BUFFER,
39 ASSERT(buf != INVALID_HANDLE_VALUE);
43 static void runTest(bool useMark, bool createEarly) {
44 trace("=======================================");
45 trace("useMark=%d createEarly=%d", useMark, createEarly);
47 HANDLE buf = INVALID_HANDLE_VALUE;
59 trace("Creating buffer");
62 const double elapsed1 = tm1.elapsed();
63 if (elapsed1 >= 0.250) {
64 printf("!!! TEST FAILED !!!\n");
70 trace("Writing to aux buffer");
73 BOOL ret = WriteConsoleW(buf, L"HI", 2, &actual, NULL);
74 const double elapsed2 = tm2.elapsed();
75 trace("Writing to aux buffer: finished: ret=%d actual=%d (elapsed=%1.3f)", ret, actual, elapsed2);
76 if (elapsed2 < 0.250) {
77 printf("!!! TEST FAILED !!!\n");
79 printf("TEST PASSED\n");
84 int main(int argc, char **argv) {
86 startChildProcess(L"child");
90 std::string arg = argv[1];
92 for (int useMark = 0; useMark <= 1; useMark++) {
93 for (int createEarly = 0; createEarly <= 1; createEarly++) {
94 runTest(useMark, createEarly);