Jacek Caban : conhost/tests: Add more ReadConsoleA tests.

Alexandre Julliard julliard at winehq.org
Thu Nov 19 16:10:23 CST 2020


Module: wine
Branch: master
Commit: ee77a96daeca1e08bbe6596ad0de349d5fb484a5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ee77a96daeca1e08bbe6596ad0de349d5fb484a5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov 19 17:57:48 2020 +0100

conhost/tests: Add more ReadConsoleA tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/conhost/tests/tty.c | 121 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)

diff --git a/programs/conhost/tests/tty.c b/programs/conhost/tests/tty.c
index 9b1ab77dc0b..7cc37fa7fe1 100644
--- a/programs/conhost/tests/tty.c
+++ b/programs/conhost/tests/tty.c
@@ -150,9 +150,12 @@ enum req_type
     REQ_FILL_CHAR,
     REQ_GET_INPUT,
     REQ_READ_CONSOLE,
+    REQ_READ_CONSOLE_A,
+    REQ_READ_CONSOLE_FILE,
     REQ_SCROLL,
     REQ_SET_ACTIVE,
     REQ_SET_CURSOR,
+    REQ_SET_INPUT_CP,
     REQ_SET_INPUT_MODE,
     REQ_SET_OUTPUT_MODE,
     REQ_SET_TITLE,
@@ -170,6 +173,7 @@ struct pseudoconsole_req
         COORD coord;
         HANDLE handle;
         DWORD mode;
+        int cp;
         size_t size;
         struct
         {
@@ -362,6 +366,18 @@ static void child_set_output_mode(DWORD mode)
     ok(ret, "WriteFile failed: %u\n", GetLastError());
 }
 
+static void child_set_input_cp(int cp)
+{
+    struct pseudoconsole_req req;
+    DWORD count;
+    BOOL ret;
+
+    req.type = REQ_SET_INPUT_CP;
+    req.u.cp = cp;
+    ret = WriteFile(child_pipe, &req, sizeof(req), &count, NULL);
+    ok(ret, "WriteFile failed: %u\n", GetLastError());
+}
+
 static void child_read_console(HANDLE pipe, size_t size)
 {
     struct pseudoconsole_req req;
@@ -374,6 +390,30 @@ static void child_read_console(HANDLE pipe, size_t size)
     ok(ret, "WriteFile failed: %u\n", GetLastError());
 }
 
+static void child_read_console_a(HANDLE pipe, size_t size)
+{
+    struct pseudoconsole_req req;
+    DWORD count;
+    BOOL ret;
+
+    req.type = REQ_READ_CONSOLE_A;
+    req.u.size = size;
+    ret = WriteFile(pipe, &req, sizeof(req), &count, NULL);
+    ok(ret, "WriteFile failed: %u\n", GetLastError());
+}
+
+static void child_read_console_file(HANDLE pipe, size_t size)
+{
+    struct pseudoconsole_req req;
+    DWORD count;
+    BOOL ret;
+
+    req.type = REQ_READ_CONSOLE_FILE;
+    req.u.size = size;
+    ret = WriteFile(pipe, &req, sizeof(req), &count, NULL);
+    ok(ret, "WriteFile failed: %u\n", GetLastError());
+}
+
 #define child_expect_read_result(a,b) child_expect_read_result_(__LINE__,a,b)
 static void child_expect_read_result_(unsigned int line, HANDLE pipe, const WCHAR *expect)
 {
@@ -390,6 +430,22 @@ static void child_expect_read_result_(unsigned int line, HANDLE pipe, const WCHA
     ok_(__FILE__,line)(!memcmp(expect, buf, count), "unexpected data %s\n", wine_dbgstr_w(buf));
 }
 
+#define child_expect_read_result_a(a,b) child_expect_read_result_a_(__LINE__,a,b)
+static void child_expect_read_result_a_(unsigned int line, HANDLE pipe, const char *expect)
+{
+    size_t exlen = strlen(expect);
+    char buf[4096];
+    DWORD count;
+    BOOL ret;
+
+    ret = ReadFile(pipe, buf, sizeof(buf), &count, NULL);
+    ok_(__FILE__,line)(ret, "ReadFile failed: %u\n", GetLastError());
+    todo_wine_if(exlen && expect[exlen - 1] == '\xcc')
+    ok_(__FILE__,line)(count == exlen, "got %u, expected %u\n", count, exlen);
+    buf[count] = 0;
+    ok_(__FILE__,line)(!memcmp(expect, buf, count), "unexpected data %s\n", wine_dbgstr_a(buf));
+}
+
 static void expect_input(unsigned int event_type, INPUT_RECORD *record)
 {
     struct pseudoconsole_req req = { REQ_GET_INPUT };
@@ -1015,6 +1071,48 @@ static void test_read_console(void)
     child_expect_read_result(child_pipe, L"yz");
     expect_empty_output();
 
+    child_set_input_cp(932);
+
+    child_read_console_a(child_pipe, 2);
+    write_console_pipe("\xe3\x81\x81");
+    child_expect_read_result_a(child_pipe, "\x82\x9f");
+    expect_empty_output();
+
+    child_read_console_a(child_pipe, 1);
+    write_console_pipe("\xe3\x81\x81""a");
+    child_expect_read_result_a(child_pipe, "\x82\xcc");
+    child_read_console_a(child_pipe, 1);
+    child_expect_read_result_a(child_pipe, "a");
+    expect_empty_output();
+
+    child_read_console_a(child_pipe, 2);
+    write_console_pipe("a\xe3\x81\x81""b");
+    child_expect_read_result_a(child_pipe, "a\x82\xcc");
+    child_read_console_a(child_pipe, 1);
+    child_expect_read_result_a(child_pipe, "b");
+    expect_empty_output();
+
+    child_read_console_file(child_pipe, 2);
+    write_console_pipe("\xe3\x81\x81");
+    child_expect_read_result_a(child_pipe, "\x82\x9f");
+    expect_empty_output();
+
+    child_read_console_file(child_pipe, 1);
+    write_console_pipe("\xe3\x81\x81""a");
+    child_expect_read_result_a(child_pipe, "\x82\xcc");
+    child_read_console_file(child_pipe, 1);
+    child_expect_read_result_a(child_pipe, "a");
+    expect_empty_output();
+
+    child_read_console_file(child_pipe, 2);
+    write_console_pipe("a\xe3\x81\x81""b");
+    child_expect_read_result_a(child_pipe, "a\x82\xcc");
+    child_read_console_file(child_pipe, 1);
+    child_expect_read_result_a(child_pipe, "b");
+    expect_empty_output();
+
+    child_set_input_cp(437);
+
     child_set_input_mode(child_pipe, ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT |
                          ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT | ENABLE_INSERT_MODE |
                          ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS | ENABLE_AUTO_POSITION);
@@ -1209,6 +1307,24 @@ static void child_process(HANDLE pipe)
             ok(ret, "WriteFile failed: %u\n", GetLastError());
             break;
 
+        case REQ_READ_CONSOLE_A:
+            count = req->u.size;
+            memset(buf, 0xcc, sizeof(buf));
+            ret = ReadConsoleA(input, buf, count, &count, NULL );
+            ok(ret, "ReadConsoleA failed: %u\n", GetLastError());
+            ret = WriteFile(pipe, buf, count, NULL, NULL);
+            ok(ret, "WriteFile failed: %u\n", GetLastError());
+            break;
+
+        case REQ_READ_CONSOLE_FILE:
+            count = req->u.size;
+            memset(buf, 0xcc, sizeof(buf));
+            ret = ReadFile(input, buf, count, &count, NULL );
+            ok(ret, "ReadFile failed: %u\n", GetLastError());
+            ret = WriteFile(pipe, buf, count, NULL, NULL);
+            ok(ret, "WriteFile failed: %u\n", GetLastError());
+            break;
+
         case REQ_SCROLL:
             ret = ScrollConsoleScreenBufferW(output, &req->u.scroll.rect, NULL, req->u.scroll.dst, &req->u.scroll.fill);
             ok(ret, "ScrollConsoleScreenBuffer failed: %u\n", GetLastError());
@@ -1231,6 +1347,11 @@ static void child_process(HANDLE pipe)
             ok(ret, "SetConsoleCursorPosition failed: %u\n", GetLastError());
             break;
 
+        case REQ_SET_INPUT_CP:
+            ret = SetConsoleCP(req->u.cp);
+            ok(ret, "SetConsoleCP failed: %u\n", GetLastError());
+            break;
+
         case REQ_SET_INPUT_MODE:
             ret = SetConsoleMode(input, req->u.mode);
             ok(ret, "SetConsoleMode failed: %u\n", GetLastError());




More information about the wine-cvs mailing list