1 |
|
2 |
|
3 |
|
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 | }
|