UNPKG

2.58 kBtext/x-cView Raw
1//
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.
4//
5
6#include <windows.h>
7#include <stdio.h>
8
9#include <string>
10
11#include "TestUtil.cc"
12
13const int SC_CONSOLE_MARK = 0xFFF2;
14const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
15
16bool g_useMark = false;
17
18CALLBACK DWORD pausingThread(LPVOID dummy)
19{
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,
25 0);
26 Sleep(1000);
27 trace("Sending escape WM_CHAR to unfreeze");
28 SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
29 Sleep(1000);
30}
31
32static HANDLE createBuffer() {
33 HANDLE buf = CreateConsoleScreenBuffer(
34 GENERIC_READ | GENERIC_WRITE,
35 FILE_SHARE_READ | FILE_SHARE_WRITE,
36 NULL,
37 CONSOLE_TEXTMODE_BUFFER,
38 NULL);
39 ASSERT(buf != INVALID_HANDLE_VALUE);
40 return buf;
41}
42
43static void runTest(bool useMark, bool createEarly) {
44 trace("=======================================");
45 trace("useMark=%d createEarly=%d", useMark, createEarly);
46 g_useMark = useMark;
47 HANDLE buf = INVALID_HANDLE_VALUE;
48
49 if (createEarly) {
50 buf = createBuffer();
51 }
52
53 CreateThread(NULL, 0,
54 pausingThread, NULL,
55 0, NULL);
56 Sleep(500);
57
58 if (!createEarly) {
59 trace("Creating buffer");
60 TimeMeasurement tm1;
61 buf = createBuffer();
62 const double elapsed1 = tm1.elapsed();
63 if (elapsed1 >= 0.250) {
64 printf("!!! TEST FAILED !!!\n");
65 Sleep(2000);
66 return;
67 }
68 }
69
70 trace("Writing to aux buffer");
71 TimeMeasurement tm2;
72 DWORD actual = 0;
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");
78 } else {
79 printf("TEST PASSED\n");
80 }
81 Sleep(2000);
82}
83
84int main(int argc, char **argv) {
85 if (argc == 1) {
86 startChildProcess(L"child");
87 return 0;
88 }
89
90 std::string arg = argv[1];
91 if (arg == "child") {
92 for (int useMark = 0; useMark <= 1; useMark++) {
93 for (int createEarly = 0; createEarly <= 1; createEarly++) {
94 runTest(useMark, createEarly);
95 }
96 }
97 printf("done...\n");
98 Sleep(1000);
99 }
100 return 0;
101}