installed pty
[VSoRC/.git] / node_modules / node-pty / deps / winpty / misc / FreezePerfTest.cc
diff --git a/node_modules/node-pty/deps/winpty/misc/FreezePerfTest.cc b/node_modules/node-pty/deps/winpty/misc/FreezePerfTest.cc
new file mode 100644 (file)
index 0000000..2c0b008
--- /dev/null
@@ -0,0 +1,62 @@
+#include <windows.h>
+
+#include "TestUtil.cc"
+
+const int SC_CONSOLE_MARK = 0xFFF2;
+const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
+
+int main(int argc, char *argv[0]) {
+
+    if (argc != 2) {
+        printf("Usage: %s (mark|selectall|read)\n", argv[0]);
+        return 1;
+    }
+
+    enum class Test { Mark, SelectAll, Read } test;
+    if (!strcmp(argv[1], "mark")) {
+        test = Test::Mark;
+    } else if (!strcmp(argv[1], "selectall")) {
+        test = Test::SelectAll;
+    } else if (!strcmp(argv[1], "read")) {
+        test = Test::Read;
+    } else {
+        printf("Invalid test: %s\n", argv[1]);
+        return 1;
+    }
+
+    HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
+    TimeMeasurement tm;
+    HWND hwnd = GetConsoleWindow();
+
+    setWindowPos(0, 0, 1, 1);
+    setBufferSize(100, 3000);
+    system("cls");
+    setWindowPos(0, 2975, 100, 25);
+    setCursorPos(0, 2999);
+
+    ShowWindow(hwnd, SW_HIDE);
+
+    for (int i = 0; i < 1000; ++i) {
+        // CONSOLE_SCREEN_BUFFER_INFO info = {};
+        // GetConsoleScreenBufferInfo(conout, &info);
+
+        if (test == Test::Mark) {
+            SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0);
+            SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
+        } else if (test == Test::SelectAll) {
+            SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0);
+            SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
+        } else if (test == Test::Read) {
+            static CHAR_INFO buffer[100 * 3000];
+            const SMALL_RECT readRegion = {0, 0, 99, 2999};
+            SMALL_RECT tmp = readRegion;
+            BOOL ret = ReadConsoleOutput(conout, buffer, {100, 3000}, {0, 0}, &tmp);
+            ASSERT(ret && !memcmp(&tmp, &readRegion, sizeof(tmp)));
+        }
+    }
+
+    ShowWindow(hwnd, SW_SHOW);
+
+    printf("elapsed: %f\n", tm.elapsed());
+    return 0;
+}