installed pty
[VSoRC/.git] / node_modules / node-pty / deps / winpty / misc / ScreenBufferFreezeInactive.cc
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
13 const int SC_CONSOLE_MARK = 0xFFF2;
14 const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
15
16 bool g_useMark = false;
17
18 CALLBACK 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
32 static 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
43 static 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
84 int 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 }