https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ce3a0af4f008dfba84fa86bd3ee348e49d7b2e8c

commit ce3a0af4f008dfba84fa86bd3ee348e49d7b2e8c
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Sun Feb 9 21:32:46 2020 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Sat Feb 22 19:50:12 2020 +0100

    [KERNEL32_APITEST] Add extra test cases for the 'ConsoleCP' test. (#2278)
---
 modules/rostests/apitests/kernel32/ConsoleCP.c | 321 +++++++++++++++++--------
 1 file changed, 226 insertions(+), 95 deletions(-)

diff --git a/modules/rostests/apitests/kernel32/ConsoleCP.c 
b/modules/rostests/apitests/kernel32/ConsoleCP.c
index ab5402f053d..6a997681ac5 100644
--- a/modules/rostests/apitests/kernel32/ConsoleCP.c
+++ b/modules/rostests/apitests/kernel32/ConsoleCP.c
@@ -1,13 +1,15 @@
 /*
- * PROJECT:         ReactOS api tests
- * LICENSE:         GPLv2+ - See COPYING in the top level directory
- * PURPOSE:         Test for i18n console test
- * PROGRAMMERS:     Katayama Hirofumi MZ
+ * PROJECT:     ReactOS api tests
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     Tests for i18n console.
+ * COPYRIGHT:   Copyright 2017-2020 Katayama Hirofumi MZ
+ *              Copyright 2020 Hermes Belusca-Maito
  */
 
 #include "precomp.h"
 
-#define okCURSOR(hCon, c) do { \
+#define okCURSOR(hCon, c) \
+do { \
   CONSOLE_SCREEN_BUFFER_INFO __sbi; \
   BOOL expect = GetConsoleScreenBufferInfo((hCon), &__sbi) && \
                 __sbi.dwCursorPosition.X == (c).X && __sbi.dwCursorPosition.Y 
== (c).Y; \
@@ -15,8 +17,7 @@
      (c).X, (c).Y, __sbi.dwCursorPosition.X, __sbi.dwCursorPosition.Y); \
 } while (0)
 
-#define ATTR \
-    (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
+#define ATTR    (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
 
 static const WCHAR u0414[] = {0x0414, 0}; /* Д */
 static const WCHAR u9580[] = {0x9580, 0}; /* 門 */
@@ -53,7 +54,7 @@ static void test_cp855(HANDLE hConOut)
     CONSOLE_SCREEN_BUFFER_INFO csbi;
     int count;
     WCHAR str[32];
-    WORD attr;
+    WORD attrs[16];
 
     if (!IsValidCodePage(855))
     {
@@ -99,10 +100,17 @@ static void test_cp855(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 6, "len was: %ld\n", len);
-        ok(str[0] == 0x414, "str[0] was: 0x%04X\n", str[0]);
-        ok(str[1] == 0x414, "str[1] was: 0x%04X\n", str[1]);
-        ok(str[2] == 0x414, "str[2] was: 0x%04X\n", str[2]);
+        ok_long(len, 6);
+        ok_int(str[0], 0x414);
+        ok_int(str[1], 0x414);
+        ok_int(str[2], 0x414);
+
+        /* Read attributes at (0,0) */
+        c.X = c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 6, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 6);
+        ok_int(attrs[0], ATTR);
 
         /* Check cursor */
         c.X = 1;
@@ -136,10 +144,10 @@ static void test_cp855(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 6, "len was: %ld\n", len);
-        ok(str[0] == L' ', "str[0] was: 0x%04X\n", str[0]);
-        ok(str[1] == 0x414, "str[1] was: 0x%04X\n", str[1]);
-        ok(str[2] == 0x414, "str[2] was: 0x%04X\n", str[2]);
+        ok_long(len, 6);
+        ok_int(str[0], L' ');
+        ok_int(str[1], 0x414);
+        ok_int(str[2], 0x414);
     }
 
     /* "\u9580" */
@@ -171,7 +179,7 @@ static void test_cp855(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = FillConsoleOutputCharacterW(hConOut, L' ', csbi.dwSize.X * 
csbi.dwSize.Y, c, &len);
         ok(ret, "FillConsoleOutputCharacterW failed\n");
-        ok(len == csbi.dwSize.X * csbi.dwSize.Y, "len was: %ld\n", len);
+        ok_long(len, csbi.dwSize.X * csbi.dwSize.Y);
 
         /* Output u9580 "count" times at (1,0) */
         c.X = 1;
@@ -194,30 +202,30 @@ static void test_cp855(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = FillConsoleOutputCharacterW(hConOut, ideograph_space, 
csbi.dwSize.X * csbi.dwSize.Y, c, &len);
         ok(ret, "FillConsoleOutputCharacterW failed\n");
-        ok(len == csbi.dwSize.X * csbi.dwSize.Y, "len was: %ld\n", len);
+        ok_long(len, csbi.dwSize.X * csbi.dwSize.Y);
 
         /* Read characters at (0,0) */
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 6, "len was: %ld\n", len);
+        ok_long(len, 6);
         ok(str[0] == ideograph_space || str[0] == L'?', "str[0] was: 
0x%04X\n", str[0]);
         ok(str[1] == ideograph_space || str[1] == L'?', "str[1] was: 
0x%04X\n", str[1]);
         ok(str[2] == ideograph_space || str[2] == L'?', "str[2] was: 
0x%04X\n", str[2]);
 
-        /* Read attr at (0,0) */
+        /* Read attributes at (0,0) */
         c.X = c.Y = 0;
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 6, c, &len);
         ok(ret, "ReadConsoleOutputAttribute failed\n");
-        ok(attr == ATTR, "attr was: %d\n", attr);
-        ok(len == 1, "len was %ld\n", len);
+        ok_long(len, 6);
+        ok_int(attrs[0], ATTR);
 
         /* Read characters at (1,0) */
         c.X = 1;
         c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 6, "len was: %ld\n", len);
+        ok_long(len, 6);
         ok(str[0] == ideograph_space || str[0] == L'?', "str[0] was: 
0x%04X\n", str[0]);
         ok(str[1] == ideograph_space || str[1] == L'?', "str[1] was: 
0x%04X\n", str[1]);
         ok(str[2] == ideograph_space || str[2] == L'?', "str[2] was: 
0x%04X\n", str[2]);
@@ -230,13 +238,13 @@ static void test_cp855(HANDLE hConOut)
         ret = WriteConsoleW(hConOut, u9580, lstrlenW(u9580), &len, NULL);
         ok(ret && len == lstrlenW(u9580), "WriteConsoleW failed\n");
 
-        /* Read attr (1,0) */
+        /* Read attributes at (1,0) */
         c.X = 1;
         c.Y = 0;
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 1, c, &len);
         ok(ret, "ReadConsoleOutputAttribute failed\n");
-        ok(attr == ATTR, "attr was: %d\n", attr);
-        ok(len == 1, "len was %ld\n", len);
+        ok_long(len, 1);
+        ok_int(attrs[0], ATTR);
 
         /* Check cursor */
         c.X = 2;
@@ -247,9 +255,9 @@ static void test_cp855(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 6, "len was: %ld\n", len);
+        ok_long(len, 6);
         ok(str[0] == ideograph_space || str[0] == L'?', "str[0] was: 
0x%04X\n", str[0]);
-        ok(str[1] == 0x9580 || str[1] == L'?', "str[1] was: 0x%04X\n", str[1]);
+        ok(str[1] == u9580[0] || str[1] == L'?', "str[1] was: 0x%04X\n", 
str[1]);
         ok(str[2] == ideograph_space || str[2] == L'?', "str[2] was: 
0x%04X\n", str[2]);
     }
 
@@ -268,7 +276,7 @@ static void test_cp932(HANDLE hConOut)
     CONSOLE_SCREEN_BUFFER_INFO csbi;
     int count;
     WCHAR str[32];
-    WORD attr, attrs[16];
+    WORD attrs[16];
     CHAR_INFO buff[16];
     SMALL_RECT sr;
 
@@ -317,10 +325,18 @@ static void test_cp932(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 3, "len was: %ld\n", len);
-        ok(str[0] == 0x414, "str[0] was: 0x%04X\n", str[0]);
-        ok(str[1] == 0x414, "str[1] was: 0x%04X\n", str[1]);
-        ok(str[2] == 0x414, "str[2] was: 0x%04X\n", str[2]);
+        ok_long(len, 3);
+        ok_int(str[0], 0x414);
+        ok_int(str[1], 0x414);
+        ok_int(str[2], 0x414);
+
+        /* Read attributes at (0,0) */
+        c.X = c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 6, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 6);
+        ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[1], ATTR | COMMON_LVB_TRAILING_BYTE);
 
         /* Check cursor */
         c.X = 1;
@@ -355,10 +371,10 @@ static void test_cp932(HANDLE hConOut)
         c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 4, "len was: %ld\n", len);
-        ok(str[0] == L' ', "str[0] was: 0x%04X\n", str[0]);
-        ok(str[1] == 0x414, "str[1] was: 0x%04X\n", str[1]);
-        ok(str[2] == 0x414, "str[2] was: 0x%04X\n", str[2]);
+        ok_long(len, 4);
+        ok_int(str[0], L' ');
+        ok_int(str[1], 0x414);
+        ok_int(str[2], 0x414);
     }
 
     /* "\u9580" */
@@ -390,7 +406,7 @@ static void test_cp932(HANDLE hConOut)
         c.X = c.Y = 0;
         ret = FillConsoleOutputCharacterW(hConOut, L' ', csbi.dwSize.X * 
csbi.dwSize.Y, c, &len);
         ok(ret, "FillConsoleOutputCharacterW failed\n");
-        ok(len == csbi.dwSize.X * csbi.dwSize.Y, "len was: %ld\n", len);
+        ok_long(len, csbi.dwSize.X * csbi.dwSize.Y);
 
         /* Output u9580 "count" times at (1,0) */
         c.X = 1;
@@ -414,24 +430,30 @@ static void test_cp932(HANDLE hConOut)
         ret = FillConsoleOutputCharacterW(hConOut, ideograph_space, 
csbi.dwSize.X * csbi.dwSize.Y, c, &len);
         ok(ret, "FillConsoleOutputCharacterW failed\n");
         if (s_bIs8Plus)
-            ok(len == csbi.dwSize.X * csbi.dwSize.Y / 2, "len was: %ld\n", 
len);
+            ok_long(len, csbi.dwSize.X * csbi.dwSize.Y / 2);
         else
-            ok(len == csbi.dwSize.X * csbi.dwSize.Y, "len was: %ld\n", len);
+            ok_long(len, csbi.dwSize.X * csbi.dwSize.Y);
 
         /* Read characters at (0,0) */
         c.X = c.Y = 0;
         ret = ReadConsoleOutputCharacterW(hConOut, str, 3 * sizeof(WCHAR), c, 
&len);
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
-        ok(len == 3, "len was: %ld\n", len);
-        ok(str[0] == ideograph_space, "str[0] was: 0x%04X\n", str[0]);
-        ok(str[1] == ideograph_space, "str[1] was: 0x%04X\n", str[1]);
-        ok(str[2] == ideograph_space, "str[2] was: 0x%04X\n", str[2]);
+        ok_long(len, 3);
+        ok_int(str[0], ideograph_space);
+        ok_int(str[1], ideograph_space);
+        ok_int(str[2], ideograph_space);
 
-        /* Read attr */
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        /* Read attributes at (0,0) */
+        c.X = c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 6, c, &len);
         ok(ret, "ReadConsoleOutputAttribute failed\n");
-        ok(attr == ATTR, "attr was: %d\n", attr);
-        ok(len == 1, "len was %ld\n", len);
+        ok_long(len, 6);
+        ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[1], ATTR | COMMON_LVB_TRAILING_BYTE);
+        ok_int(attrs[2], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[3], ATTR | COMMON_LVB_TRAILING_BYTE);
+        ok_int(attrs[4], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[5], ATTR | COMMON_LVB_TRAILING_BYTE);
 
         /* Output u9580 "count" once at (1,0) */
         c.X = 1;
@@ -441,11 +463,61 @@ static void test_cp932(HANDLE hConOut)
         ret = WriteConsoleW(hConOut, u9580, lstrlenW(u9580), &len, NULL);
         ok(ret && len == lstrlenW(u9580), "WriteConsoleW failed\n");
 
-        /* Read attr */
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        /*
+         * Read attributes at (1,0) -
+         * Note that if only one attribute of a fullwidth character
+         * is retrieved, no leading/trailing byte flag is set!
+         */
+        c.X = 1;
+        c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 1, c, &len);
         ok(ret, "ReadConsoleOutputAttribute failed\n");
-        ok(attr == ATTR, "attr was: %d\n", attr);
-        ok(len == 1, "len was %ld\n", len);
+        ok_long(len, 1);
+        ok_int(attrs[0], ATTR);
+
+        /* Check that the same problem happens for the trailing byte */
+        c.X = 2;
+        c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 1, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 1);
+        ok_int(attrs[0], ATTR);
+
+        /* Read attributes at (1,0) */
+        c.X = 1;
+        c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 2, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 2);
+        ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[1], ATTR | COMMON_LVB_TRAILING_BYTE);
+
+        /* Read attributes at (1,0) */
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 3, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 3);
+        ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[1], ATTR | COMMON_LVB_TRAILING_BYTE);
+        if (s_bIs8Plus)
+            ok_int(attrs[2], ATTR | COMMON_LVB_TRAILING_BYTE);
+        else
+            ok_int(attrs[2], ATTR);
+
+        /* Read attributes at (0,0) */
+        c.X = c.Y = 0;
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 4, c, &len);
+        ok(ret, "ReadConsoleOutputAttribute failed\n");
+        ok_long(len, 4);
+        if (s_bIs8Plus)
+            ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        else
+            ok_int(attrs[0], ATTR);
+        ok_int(attrs[1], ATTR | COMMON_LVB_LEADING_BYTE);
+        ok_int(attrs[2], ATTR | COMMON_LVB_TRAILING_BYTE);
+        if (s_bIs8Plus)
+            ok_int(attrs[3], ATTR | COMMON_LVB_TRAILING_BYTE);
+        else
+            ok_int(attrs[3], ATTR);
 
         /* Check cursor */
         c.X = 3;
@@ -458,17 +530,17 @@ static void test_cp932(HANDLE hConOut)
         ok(ret, "ReadConsoleOutputCharacterW failed\n");
         if (s_bIs8Plus)
         {
-            ok(len == 3, "len was: %ld\n", len);
-            ok(str[0] == 0x3000, "str[0] was: 0x%04X\n", str[0]);
-            ok(str[1] == 0x9580, "str[1] was: 0x%04X\n", str[1]);
-            ok(str[2] == 0x3000, "str[2] was: 0x%04X\n", str[2]);
+            ok_long(len, 3);
+            ok_int(str[0], ideograph_space);
+            ok_int(str[1], u9580[0]);
+            ok_int(str[2], ideograph_space);
         }
         else
         {
-            ok(len == 4, "len was: %ld\n", len);
-            ok(str[0] == L' ', "str[0] was: 0x%04X\n", str[0]);
-            ok(str[1] == 0x9580, "str[1] was: 0x%04X\n", str[1]);
-            ok(str[2] == L' ', "str[2] was: 0x%04X\n", str[2]);
+            ok_long(len, 4);
+            ok_int(str[0], L' ');
+            ok_int(str[1], u9580[0]);
+            ok_int(str[2], L' ');
         }
     }
 
@@ -505,16 +577,17 @@ static void test_cp932(HANDLE hConOut)
         ok_int(buff[0].Attributes, ATTR);
 
         /* read attr */
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 1, c, &len);
         ok_int(ret, 1);
-        ok_int(attr, ATTR);
         ok_long(len, 1);
+        ok_int(attrs[0], ATTR);
 
         /* read char */
         c.X = c.Y = 0;
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 4, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 4);
         ok_int(str[0], L'A');
         ok_int(str[1], L'A');
         ok_int(str[2], L'A');
@@ -580,6 +653,7 @@ static void test_cp932(HANDLE hConOut)
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 4, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 3);
         ok_int(str[0], 0x0414);
         ok_int(str[1], L'A');
         ok_int(str[2], L'A');
@@ -650,6 +724,7 @@ static void test_cp932(HANDLE hConOut)
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 4, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 3);
         if (s_bIs8Plus)
         {
             ok_int(str[0], 0x0414);
@@ -712,6 +787,7 @@ static void test_cp932(HANDLE hConOut)
         /* read char */
         ret = ReadConsoleOutputCharacterW(hConOut, str, 2, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 2);
         ok_int(str[0], L'A');
         ok_int(str[1], L'A');
 
@@ -748,7 +824,7 @@ static void test_cp932(HANDLE hConOut)
         ok_int(sr.Bottom, 0);
 
         /* check buff */
-        ok_int(buff[0].Char.UnicodeChar, 'A');
+        ok_int(buff[0].Char.UnicodeChar, L'A');
         ok_int(buff[0].Attributes, ATTR);
         if (s_bIs8Plus)
         {
@@ -761,12 +837,12 @@ static void test_cp932(HANDLE hConOut)
         {
             ok_int(buff[1].Char.UnicodeChar, L' ');
             ok_int(buff[1].Attributes, ATTR);
-            ok_int(buff[2].Char.UnicodeChar, 'A');
+            ok_int(buff[2].Char.UnicodeChar, L'A');
             ok_int(buff[2].Attributes, ATTR);
         }
-        ok_int(buff[3].Char.UnicodeChar, 'A');
+        ok_int(buff[3].Char.UnicodeChar, L'A');
         ok_int(buff[3].Attributes, ATTR);
-        ok_int(buff[4].Char.UnicodeChar, 'A');
+        ok_int(buff[4].Char.UnicodeChar, L'A');
         ok_int(buff[4].Attributes, ATTR);
 
         /* read attrs */
@@ -822,15 +898,16 @@ static void test_cp932(HANDLE hConOut)
         ok_int(buff[0].Attributes, ATTR);
 
         /* read attr */
-        ret = ReadConsoleOutputAttribute(hConOut, &attr, 1, c, &len);
+        ret = ReadConsoleOutputAttribute(hConOut, attrs, 1, c, &len);
         ok_int(ret, 1);
-        ok_int(attr, ATTR);
         ok_long(len, 1);
+        ok_int(attrs[0], ATTR);
 
         /* read char */
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 2, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 2);
         ok_int(str[0], L'A');
         ok_int(str[1], L'A');
 
@@ -864,14 +941,14 @@ static void test_cp932(HANDLE hConOut)
         /* check buff */
         if (s_bIs8Plus)
         {
-            ok_int(buff[0].Char.UnicodeChar, 0x9580);
+            ok_int(buff[0].Char.UnicodeChar, u9580[0]);
             ok_int(buff[0].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
-            ok_int(buff[1].Char.UnicodeChar, 0x9580);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
             ok_int(buff[1].Attributes, ATTR | COMMON_LVB_TRAILING_BYTE);
         }
         else
         {
-            ok_int(buff[0].Char.UnicodeChar, 0x9580);
+            ok_int(buff[0].Char.UnicodeChar, u9580[0]);
             ok_int(buff[0].Attributes, ATTR);
             ok_int(buff[1].Char.UnicodeChar, L'A');
             ok_int(buff[1].Attributes, ATTR);
@@ -896,7 +973,8 @@ static void test_cp932(HANDLE hConOut)
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 4, c, &len);
         ok_int(ret, 1);
-        ok_int(str[0], 0x9580);
+        ok_long(len, 3);
+        ok_int(str[0], u9580[0]);
         ok_int(str[1], L'A');
         ok_int(str[2], L'A');
         if (s_bIs8Plus)
@@ -929,18 +1007,18 @@ static void test_cp932(HANDLE hConOut)
         /* check buff */
         if (s_bIs8Plus)
         {
-            ok_int(buff[0].Char.UnicodeChar, 0x9580);
+            ok_int(buff[0].Char.UnicodeChar, u9580[0]);
             ok_int(buff[0].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
-            ok_int(buff[1].Char.UnicodeChar, 0x9580);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
             ok_int(buff[1].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
-            ok_int(buff[2].Char.UnicodeChar, 0x9580);
+            ok_int(buff[2].Char.UnicodeChar, u9580[0]);
             ok_int(buff[2].Attributes, ATTR | COMMON_LVB_TRAILING_BYTE);
         }
         else
         {
             ok_int(buff[0].Char.UnicodeChar, L' ');
             ok_int(buff[0].Attributes, ATTR);
-            ok_int(buff[1].Char.UnicodeChar, 0x9580);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
             ok_int(buff[1].Attributes, ATTR);
             ok_int(buff[2].Char.UnicodeChar, L'A');
             ok_int(buff[2].Attributes, ATTR);
@@ -996,9 +1074,9 @@ static void test_cp932(HANDLE hConOut)
         ok_int(sr.Bottom, 0);
 
         /* check buff */
-        ok_int(buff[0].Char.UnicodeChar, 'A');
+        ok_int(buff[0].Char.UnicodeChar, L'A');
         ok_int(buff[0].Attributes, ATTR);
-        ok_int(buff[1].Char.UnicodeChar, 'A');
+        ok_int(buff[1].Char.UnicodeChar, L'A');
         ok_int(buff[1].Attributes, ATTR);
 
         /* read attr */
@@ -1014,6 +1092,7 @@ static void test_cp932(HANDLE hConOut)
         memset(str, 0x7F, sizeof(str));
         ret = ReadConsoleOutputCharacterW(hConOut, str, 2, c, &len);
         ok_int(ret, 1);
+        ok_long(len, 2);
         ok_int(str[0], L'A');
         ok_int(str[1], L'A');
 
@@ -1026,7 +1105,7 @@ static void test_cp932(HANDLE hConOut)
         /* fill by u9580 */
         c.X = 1;
         c.Y = 0;
-        ret = FillConsoleOutputCharacterW(hConOut, 0x9580, 1, c, &len);
+        ret = FillConsoleOutputCharacterW(hConOut, u9580[0], 1, c, &len);
         c.X = c.Y = 0;
         ok_int(ret, 1);
         ok_long(len, 1);
@@ -1050,25 +1129,25 @@ static void test_cp932(HANDLE hConOut)
         ok_int(sr.Bottom, 0);
 
         /* check buff */
-        ok_int(buff[0].Char.UnicodeChar, 'A');
+        ok_int(buff[0].Char.UnicodeChar, L'A');
         ok_int(buff[0].Attributes, ATTR);
         if (s_bIs8Plus)
         {
-            ok_int(buff[1].Char.UnicodeChar, 0x9580);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
             ok_int(buff[1].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
-            ok_int(buff[2].Char.UnicodeChar, 0x9580);
+            ok_int(buff[2].Char.UnicodeChar, u9580[0]);
             ok_int(buff[2].Attributes, ATTR | COMMON_LVB_TRAILING_BYTE);
         }
         else
         {
             ok_int(buff[1].Char.UnicodeChar, L' ');
             ok_int(buff[1].Attributes, ATTR);
-            ok_int(buff[2].Char.UnicodeChar, 'A');
+            ok_int(buff[2].Char.UnicodeChar, L'A');
             ok_int(buff[2].Attributes, ATTR);
         }
-        ok_int(buff[3].Char.UnicodeChar, 'A');
+        ok_int(buff[3].Char.UnicodeChar, L'A');
         ok_int(buff[3].Attributes, ATTR);
-        ok_int(buff[4].Char.UnicodeChar, 'A');
+        ok_int(buff[4].Char.UnicodeChar, L'A');
         ok_int(buff[4].Attributes, ATTR);
 
         /* read attrs */
@@ -1142,11 +1221,12 @@ static void test_cp932(HANDLE hConOut)
         sr.Top = 0;
         sr.Right = 4;
         sr.Bottom = 0;
-        buff[0].Char.UnicodeChar = L' ';
-        buff[0].Attributes = ATTR;
-        buff[1].Char.UnicodeChar = 0x9580;
+        // Check how Read/WriteConsoleOutput() handle inconsistent DBCS flags.
+        buff[0].Char.UnicodeChar = u9580[0];
+        buff[0].Attributes = ATTR | COMMON_LVB_LEADING_BYTE;
+        buff[1].Char.UnicodeChar = u9580[0];
         buff[1].Attributes = ATTR | COMMON_LVB_LEADING_BYTE;
-        buff[2].Char.UnicodeChar = 0x9580;
+        buff[2].Char.UnicodeChar = u9580[0];
         buff[2].Attributes = ATTR | COMMON_LVB_TRAILING_BYTE;
         buff[3].Char.UnicodeChar = L'A';
         buff[3].Attributes = ATTR;
@@ -1161,15 +1241,66 @@ static void test_cp932(HANDLE hConOut)
         ok_int(sr.Right, 3);
         ok_int(sr.Bottom, 0);
 
+        /* read output */
+        sr.Left = 0;
+        sr.Top = 0;
+        sr.Right = 4;
+        sr.Bottom = 0;
+        memset(buff, 0x7F, sizeof(buff));
+        ret = ReadConsoleOutputW(hConOut, buff, buffSize, c, &sr);
+        ok_int(ret, 1);
+        ok_int(sr.Left, 0);
+        ok_int(sr.Top, 0);
+        ok_int(sr.Right, 3);
+        ok_int(sr.Bottom, 0);
+
+        /* check buff */
+        if (s_bIs8Plus)
+        {
+            ok_int(buff[0].Char.UnicodeChar, u9580[0]);
+            ok_int(buff[0].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
+            ok_int(buff[1].Attributes, ATTR | COMMON_LVB_LEADING_BYTE);
+            ok_int(buff[2].Char.UnicodeChar, u9580[0]);
+            ok_int(buff[2].Attributes, ATTR | COMMON_LVB_TRAILING_BYTE);
+            ok_int(buff[3].Char.UnicodeChar, L'A');
+            ok_int(buff[3].Attributes, ATTR);
+            ok_int(buff[4].Char.UnicodeChar, 0x7F7F);
+            ok_int(buff[4].Attributes, 0x7F7F);
+        }
+        else
+        {
+            ok_int(buff[0].Char.UnicodeChar, u9580[0]);
+            ok_int(buff[0].Attributes, ATTR);
+            ok_int(buff[1].Char.UnicodeChar, u9580[0]);
+            ok_int(buff[1].Attributes, ATTR);
+            ok_int(buff[2].Char.UnicodeChar, 0);
+            ok_int(buff[2].Attributes, 0);
+            ok_int(buff[3].Char.UnicodeChar, 0);
+            ok_int(buff[3].Attributes, 0);
+            ok_int(buff[4].Char.UnicodeChar, 0x7F7F);
+            ok_int(buff[4].Attributes, 0x7F7F);
+        }
+
         /* read attrs */
+        c.X = c.Y = 0;
         memset(attrs, 0x7F, sizeof(attrs));
         ret = ReadConsoleOutputAttribute(hConOut, attrs, 6, c, &len);
         ok_int(ret, 1);
         ok_long(len, 6);
-        ok_int(attrs[0], ATTR);
-        ok_int(attrs[1], ATTR | COMMON_LVB_LEADING_BYTE);
-        ok_int(attrs[2], ATTR | COMMON_LVB_TRAILING_BYTE);
-        ok_int(attrs[3], ATTR);
+        ok_int(attrs[0], ATTR | COMMON_LVB_LEADING_BYTE);
+        if (s_bIs8Plus)
+        {
+            ok_int(attrs[1], ATTR | COMMON_LVB_LEADING_BYTE);
+            ok_int(attrs[2], ATTR | COMMON_LVB_TRAILING_BYTE);
+            ok_int(attrs[3], ATTR);
+        }
+        else
+        {
+            ok_int(attrs[1], ATTR | COMMON_LVB_TRAILING_BYTE);
+            ok_int(attrs[2], ATTR | COMMON_LVB_LEADING_BYTE);
+            ok_int(attrs[3], ATTR | COMMON_LVB_TRAILING_BYTE);
+        }
         ok_int(attrs[4], ATTR);
         ok_int(attrs[5], ATTR);
     }

Reply via email to