Skip to content

Commit e684110

Browse files
committed
Fixing non-spacing and wide runes.
1 parent 1bbdd7c commit e684110

File tree

5 files changed

+108
-100
lines changed

5 files changed

+108
-100
lines changed

NStack/strings/ustring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ public int ConsoleWidth {
10731073
for (int i = 0; i < blen;) {
10741074
(var rune, var size) = Utf8.DecodeRune (this, i, i - blen);
10751075
i += size;
1076-
total += Rune.IsNonSpacingChar(rune, out int width) ? width : Rune.ColumnWidth(rune);
1076+
total += Rune.ColumnWidth(rune);
10771077
}
10781078
return total;
10791079
}

NStack/unicode/Rune.ColumnWidth.cs

Lines changed: 92 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -9,54 +9,52 @@ namespace System
99
public partial struct Rune
1010
{
1111
static uint[,] combining = new uint[,] {
12-
{ 0x0300, 0x036F, 0 }, { 0x0483, 0x0486, 0 }, { 0x0488, 0x0489, 0 },
13-
{ 0x0591, 0x05BD, 0 }, { 0x05BF, 0x05BF, 0 }, { 0x05C1, 0x05C2, 0 },
14-
{ 0x05C4, 0x05C5, 0 }, { 0x05C7, 0x05C7, 0 }, { 0x0600, 0x0603, 0 },
15-
{ 0x0610, 0x0615, 0 }, { 0x064B, 0x065E, 0 }, { 0x0670, 0x0670, 0 },
16-
{ 0x06D6, 0x06E4, 0 }, { 0x06E7, 0x06E8, 0 }, { 0x06EA, 0x06ED, 0 },
17-
{ 0x070F, 0x070F, 0 }, { 0x0711, 0x0711, 0 }, { 0x0730, 0x074A, 0 },
18-
{ 0x07A6, 0x07B0, 0 }, { 0x07EB, 0x07F3, 0 }, { 0x0901, 0x0902, 0 },
19-
{ 0x093C, 0x093C, 0 }, { 0x0941, 0x0948, 0 }, { 0x094D, 0x094D, 0 },
20-
{ 0x0951, 0x0954, 0 }, { 0x0962, 0x0963, 0 }, { 0x0981, 0x0981, 0 },
21-
{ 0x09BC, 0x09BC, 0 }, { 0x09C1, 0x09C4, 0 }, { 0x09CD, 0x09CD, 0 },
22-
{ 0x09E2, 0x09E3, 0 }, { 0x0A01, 0x0A02, 0 }, { 0x0A3C, 0x0A3C, 0 },
23-
{ 0x0A41, 0x0A42, 0 }, { 0x0A47, 0x0A48, 0 }, { 0x0A4B, 0x0A4D, 0 },
24-
{ 0x0A70, 0x0A71, 0 }, { 0x0A81, 0x0A82, 0 }, { 0x0ABC, 0x0ABC, 0 },
25-
{ 0x0AC1, 0x0AC5, 0 }, { 0x0AC7, 0x0AC8, 0 }, { 0x0ACD, 0x0ACD, 0 },
26-
{ 0x0AE2, 0x0AE3, 0 }, { 0x0B01, 0x0B01, 0 }, { 0x0B3C, 0x0B3C, 0 },
27-
{ 0x0B3F, 0x0B3F, 0 }, { 0x0B41, 0x0B43, 0 }, { 0x0B4D, 0x0B4D, 0 },
28-
{ 0x0B56, 0x0B56, 0 }, { 0x0B82, 0x0B82, 0 }, { 0x0BC0, 0x0BC0, 0 },
29-
{ 0x0BCD, 0x0BCD, 0 }, { 0x0C3E, 0x0C40, 0 }, { 0x0C46, 0x0C48, 0 },
30-
{ 0x0C4A, 0x0C4D, 0 }, { 0x0C55, 0x0C56, 0 }, { 0x0CBC, 0x0CBC, 0 },
31-
{ 0x0CBF, 0x0CBF, 0 }, { 0x0CC6, 0x0CC6, 0 }, { 0x0CCC, 0x0CCD, 0 },
32-
{ 0x0CE2, 0x0CE3, 0 }, { 0x0D41, 0x0D43, 0 }, { 0x0D4D, 0x0D4D, 0 },
33-
{ 0x0DCA, 0x0DCA, 0 }, { 0x0DD2, 0x0DD4, 0 }, { 0x0DD6, 0x0DD6, 0 },
34-
{ 0x0E31, 0x0E31, 0 }, { 0x0E34, 0x0E3A, 0 }, { 0x0E47, 0x0E4E, 0 },
35-
{ 0x0EB1, 0x0EB1, 0 }, { 0x0EB4, 0x0EB9, 0 }, { 0x0EBB, 0x0EBC, 0 },
36-
{ 0x0EC8, 0x0ECD, 0 }, { 0x0F18, 0x0F19, 0 }, { 0x0F35, 0x0F35, 0 },
37-
{ 0x0F37, 0x0F37, 0 }, { 0x0F39, 0x0F39, 0 }, { 0x0F71, 0x0F7E, 0 },
38-
{ 0x0F80, 0x0F84, 0 }, { 0x0F86, 0x0F87, 0 }, { 0x0F90, 0x0F97, 0 },
39-
{ 0x0F99, 0x0FBC, 0 }, { 0x0FC6, 0x0FC6, 0 }, { 0x102D, 0x1030, 0 },
40-
{ 0x1032, 0x1032, 0 }, { 0x1036, 0x1037, 0 }, { 0x1039, 0x1039, 0 },
41-
{ 0x1058, 0x1059, 0 }, { 0x1160, 0x11FF, 2 }, { 0x135F, 0x135F, 0 },
42-
{ 0x1712, 0x1714, 0 }, { 0x1732, 0x1734, 0 }, { 0x1752, 0x1753, 0 },
43-
{ 0x1772, 0x1773, 0 }, { 0x17B4, 0x17B5, 0 }, { 0x17B7, 0x17BD, 0 },
44-
{ 0x17C6, 0x17C6, 0 }, { 0x17C9, 0x17D3, 0 }, { 0x17DD, 0x17DD, 0 },
45-
{ 0x180B, 0x180D, 0 }, { 0x18A9, 0x18A9, 0 }, { 0x1920, 0x1922, 0 },
46-
{ 0x1927, 0x1928, 0 }, { 0x1932, 0x1932, 0 }, { 0x1939, 0x193B, 0 },
47-
{ 0x1A17, 0x1A18, 0 }, { 0x1B00, 0x1B03, 0 }, { 0x1B34, 0x1B34, 0 },
48-
{ 0x1B36, 0x1B3A, 0 }, { 0x1B3C, 0x1B3C, 0 }, { 0x1B42, 0x1B42, 0 },
49-
{ 0x1B6B, 0x1B73, 0 }, { 0x1DC0, 0x1DCA, 0 }, { 0x1DFE, 0x1DFF, 0 },
50-
{ 0x200B, 0x200F, 0 }, { 0x202A, 0x202E, 0 }, { 0x2060, 0x2063, 0 },
51-
{ 0x206A, 0x206F, 0 }, { 0x20D0, 0x20EF, 0 }, { 0x302A, 0x302F, 2 },
52-
{ 0x3099, 0x309A, 2 }, { 0xA806, 0xA806, 0 }, { 0xA80B, 0xA80B, 0 },
53-
{ 0xA825, 0xA826, 0 }, { 0xFB1E, 0xFB1E, 0 }, { 0xFE00, 0xFE0F, 0 },
54-
{ 0xFE20, 0xFE23, 0 }, { 0xFEFF, 0xFEFF, 0 }, { 0xFFF9, 0xFFFB, 0 },
55-
{ 0x10A01, 0x10A03, 0 }, { 0x10A05, 0x10A06, 0 }, { 0x10A0C, 0x10A0F, 0 },
56-
{ 0x10A38, 0x10A3A, 0 }, { 0x10A3F, 0x10A3F, 0 }, { 0x1D167, 0x1D169, 2 },
57-
{ 0x1D173, 0x1D182, 2 }, { 0x1D185, 0x1D18B, 2 }, { 0x1D1AA, 0x1D1AD, 2 },
58-
{ 0x1D242, 0x1D244, 2 }, { 0xE0001, 0xE0001, 0 }, { 0xE0020, 0xE007F, 0 },
59-
{ 0xE0100, 0xE01EF, 0 }
12+
{ 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
13+
{ 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
14+
{ 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
15+
{ 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
16+
{ 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
17+
{ 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
18+
{ 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
19+
{ 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
20+
{ 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
21+
{ 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
22+
{ 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
23+
{ 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
24+
{ 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
25+
{ 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
26+
{ 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
27+
{ 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
28+
{ 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
29+
{ 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
30+
{ 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
31+
{ 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
32+
{ 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
33+
{ 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
34+
{ 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
35+
{ 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
36+
{ 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
37+
{ 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
38+
{ 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
39+
{ 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
40+
{ 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
41+
{ 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
42+
{ 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
43+
{ 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
44+
{ 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
45+
{ 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
46+
{ 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
47+
{ 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
48+
{ 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
49+
{ 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
50+
{ 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
51+
{ 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x2e9a, 0x2e9a },
52+
{ 0x2ef4, 0x2eff }, { 0x2fd6, 0x2fef }, { 0x2ffc, 0x2fff },
53+
{ 0x31e4, 0x31ef }, { 0x321f, 0x321f }, { 0xA48D, 0xA48F },
54+
{ 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 },
55+
{ 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE1A, 0xFE1F },
56+
{ 0xFE20, 0xFE23 }, { 0xFE53, 0xFE53 }, { 0xFE67, 0xFE67 },
57+
{ 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
6058
};
6159

6260
static uint[,] combiningWideChars = new uint[,] {
@@ -70,12 +68,23 @@ public partial struct Rune
7068
/* Alphabetic Presentation Forms - 0xFB00, 0xFb4f */
7169
/* Chess Symbols - 0x1FA00, 0x1FA0f */
7270

73-
{ 0x1100, 0x115f, 2 }, { 0x231a, 0x231b, 2 }, { 0x2e80, 0x303e, 2 },
74-
{ 0x3041, 0x3096, 2 }, { 0x3099, 0x30ff, 2 }, { 0x3105, 0x312e, 2 },
75-
{ 0x3131, 0x318e, 2 }, { 0x3190, 0x3247, 2 }, { 0x3250, 0x4dbf, 2 },
76-
{ 0x4e00, 0xa4c6, 2 }, { 0xa960, 0xa97c, 2 }, { 0xac00 ,0xd7a3, 2 },
77-
{ 0xf900, 0xfaff, 2 }, { 0xfe10, 0xfe1f, 2 }, { 0xfe30 ,0xfe6b, 2 },
78-
{ 0xff01, 0xff60, 2 }, { 0xffe0, 0xffe6, 2 }
71+
{ 0x1100, 0x115f }, { 0x231a, 0x231b }, { 0x2329, 0x232a },
72+
{ 0x23e9, 0x23ec }, { 0x23f0, 0x23f0 }, { 0x23f3, 0x23f3 },
73+
{ 0x25fd, 0x25fe }, { 0x2614, 0x2615 }, { 0x2648, 0x2653 },
74+
{ 0x267f, 0x267f }, { 0x2693, 0x2693 }, { 0x26a1, 0x26a1 },
75+
{ 0x26aa, 0x26ab }, { 0x26bd, 0x26be }, { 0x26c4, 0x26c5 },
76+
{ 0x26ce, 0x26ce }, { 0x26d4, 0x26d4 }, { 0x26ea, 0x26ea },
77+
{ 0x26f2, 0x26f3 }, { 0x26f5, 0x26f5 }, { 0x26fa, 0x26fa },
78+
{ 0x26fd, 0x26fd }, { 0x2705, 0x2705 }, { 0x270a, 0x270b },
79+
{ 0x2728, 0x2728 }, { 0x274c, 0x274c }, { 0x274e, 0x274e },
80+
{ 0x2753, 0x2755 }, { 0x2757, 0x2757 }, { 0x2795, 0x2797 },
81+
{ 0x27b0, 0x27b0 }, { 0x27bf, 0x27bf }, { 0x2b1b, 0x2b1c },
82+
{ 0x2b50, 0x2b50 }, { 0x2b55, 0x2b55 }, { 0x2e80, 0x303e },
83+
{ 0x3041, 0x3096 }, { 0x3099, 0x30ff }, { 0x3105, 0x312f },
84+
{ 0x3131, 0x318e }, { 0x3190, 0x3247 }, { 0x3250, 0x4dbf },
85+
{ 0x4e00, 0xa4c6 }, { 0xa960, 0xa97c }, { 0xac00 ,0xd7a3 },
86+
{ 0xf900, 0xfaff }, { 0xfe10, 0xfe1f }, { 0xfe30 ,0xfe6b },
87+
{ 0xff01, 0xff60 }, { 0xffe0, 0xffe6 }
7988
};
8089

8190
static int bisearch(uint rune, uint[,] table, int max)
@@ -99,23 +108,24 @@ static int bisearch(uint rune, uint[,] table, int max)
99108
return 0;
100109
}
101110

102-
static bool bisearch(uint rune, uint[,] table, out int width)
103-
{
104-
width = 0;
105-
var length = table.GetLength(0);
106-
if (length == 0 || rune < table[0, 0] || rune > table[length - 1, 1])
107-
return false;
108-
109-
for (int i = 0; i < length; i++)
110-
{
111-
if (rune >= table[i, 0] && rune <= table[i, 1]) {
112-
width = (int)table[i, 2];
113-
return true;
114-
}
115-
}
116-
117-
return false;
118-
}
111+
//static bool bisearch(uint rune, uint[,] table, out int width)
112+
//{
113+
// width = 0;
114+
// var length = table.GetLength(0);
115+
// if (length == 0 || rune < table[0, 0] || rune > table[length - 1, 1])
116+
// return false;
117+
118+
// for (int i = 0; i < length; i++)
119+
// {
120+
// if (rune >= table[i, 0] && rune <= table[i, 1])
121+
// {
122+
// width = (int)table[i, 2];
123+
// return true;
124+
// }
125+
// }
126+
127+
// return false;
128+
//}
119129

120130
static uint gethexaformat(uint rune, int length)
121131
{
@@ -128,22 +138,21 @@ static uint gethexaformat(uint rune, int length)
128138
/// Check if the rune is a non-spacing character.
129139
/// </summary>
130140
/// <param name="rune">The rune.</param>
131-
/// <param name="width">The width.</param>
132141
/// <returns>True if is a non-spacing character, false otherwise.</returns>
133-
public static bool IsNonSpacingChar(uint rune, out int width)
134-
{
135-
return bisearch(rune, combining, out width);
136-
}
142+
public static bool IsNonSpacingChar(uint rune)
143+
{
144+
return bisearch(rune, combining, combining.GetLength(0) - 1) != 0;
145+
}
137146

138147
/// <summary>
139148
/// Check if the rune is a wide character.
140149
/// </summary>
141150
/// <param name="rune">The rune.</param>
142151
/// <returns>True if is a wide character, false otherwise.</returns>
143152
public static bool IsWideChar(uint rune)
144-
{
145-
return bisearch(gethexaformat(rune, 4), combiningWideChars, out _);
146-
}
153+
{
154+
return bisearch(gethexaformat(rune, 4), combiningWideChars, combiningWideChars.GetLength(0) - 1) != 0;
155+
}
147156

148157
static char firstSurrogatePairChar = '\0';
149158

@@ -162,12 +171,11 @@ public static int ColumnWidth(Rune rune)
162171
if (irune < 0x7f)
163172
return 1;
164173
/* binary search in table of non-spacing characters */
165-
if (bisearch(irune, combining, out int width))
166-
// if (bisearch(irune, combining, combining.GetLength(0) - 1) != 0)
167-
// return 0;
168-
return width;
174+
if (bisearch(gethexaformat(irune, 4), combining, combining.GetLength(0) - 1) != 0)
175+
return 0;
169176
/* if we arrive here, ucs is not a combining or C0/C1 control character */
170-
return bisearch(gethexaformat(irune, 4), combiningWideChars, out width) ? width : 1;
177+
return 1 +
178+
(bisearch(gethexaformat(irune, 4), combiningWideChars, combiningWideChars.GetLength(0) - 1) != 0 ? 1 : 0);
171179
}
172180

173181
/// <summary>

NStack/unicode/Rune.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public Rune (uint highSurrogate, uint lowSurrogate)
113113
/// Check if the rune is a non-spacing character.
114114
/// </summary>
115115
/// <returns>True if is a non-spacing character, false otherwise.</returns>
116-
public bool IsNonSpacing => IsNonSpacingChar(value, out _);
116+
public bool IsNonSpacing => IsNonSpacingChar(value);
117117

118118
// Code points in the surrogate range are not valid for UTF-8.
119119
const uint highSurrogateMin = 0xd800;

NStackTests/RuneTest.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void TestColumnWidth()
1616
Rune b = 'b';
1717
Rune c = 123;
1818
Rune d = '\u1150'; // 0x1150 ᅐ Unicode Technical Report #11
19-
Rune e = '\u1161'; // 0x1161 ᅡ Unicode Hangul Jamo with column width equal to 2 alone or joined.
19+
Rune e = '\u1161'; // 0x1161 ᅡ Unicode Hangul Jamo for join with column width equal to 0 alone.
2020
Rune f = 31; // non printable character
2121
Rune g = 127; // non printable character
2222
string h = "\U0001fa01";
@@ -50,10 +50,10 @@ public void TestColumnWidth()
5050
Assert.AreEqual("ᅐ", d.ToString());
5151
Assert.AreEqual(1, d.ToString().Length);
5252
Assert.AreEqual(3, Rune.RuneLen(d));
53-
Assert.AreEqual(2, Rune.ColumnWidth(e));
53+
Assert.AreEqual(0, Rune.ColumnWidth(e));
5454
string join = "\u1104\u1161";
5555
Assert.AreEqual("따", join);
56-
Assert.AreEqual(4, join.Sum(x => Rune.ColumnWidth(x)));
56+
Assert.AreEqual(2, join.Sum(x => Rune.ColumnWidth(x)));
5757
Assert.IsFalse(Rune.DecodeSurrogatePair(join, out _));
5858
Assert.AreEqual(2, ((ustring)join).RuneCount);
5959
Assert.AreEqual(2, join.Length);
@@ -194,14 +194,14 @@ public void TestColumnWidth()
194194
Assert.AreEqual('\u1100', (uint)rune);
195195
string str = "\u2615";
196196
Assert.AreEqual("☕", str);
197-
Assert.AreEqual(1, str.Sum(x => Rune.ColumnWidth(x)));
198-
Assert.AreEqual(1, ((ustring)str).ConsoleWidth);
197+
Assert.AreEqual(2, str.Sum(x => Rune.ColumnWidth(x)));
198+
Assert.AreEqual(2, ((ustring)str).ConsoleWidth);
199199
Assert.AreEqual(1, ((ustring)str).RuneCount());
200200
Assert.AreEqual(1, str.Length);
201201
str = "\u2615\ufe0f"; // Identical but \ufe0f forces it to be rendered as a colorful image as compared to a monochrome text variant.
202202
Assert.AreEqual("☕️", str);
203-
Assert.AreEqual(1, str.Sum(x => Rune.ColumnWidth(x)));
204-
Assert.AreEqual(1, ((ustring)str).ConsoleWidth);
203+
Assert.AreEqual(2, str.Sum(x => Rune.ColumnWidth(x)));
204+
Assert.AreEqual(2, ((ustring)str).ConsoleWidth);
205205
Assert.AreEqual(2, ((ustring)str).RuneCount());
206206
Assert.AreEqual(2, str.Length);
207207
str = "\u231a";
@@ -316,15 +316,15 @@ public void TestRune()
316316
Assert.AreEqual(2, o.ToString().Length);
317317
Assert.AreEqual("🔮", o.ToString());
318318
var p = new Rune('\u2329');
319-
Assert.AreEqual(1, Rune.ColumnWidth(p));
319+
Assert.AreEqual(2, Rune.ColumnWidth(p));
320320
Assert.AreEqual(1, p.ToString().Length);
321321
Assert.AreEqual("〈", p.ToString());
322322
var q = new Rune('\u232a');
323-
Assert.AreEqual(1, Rune.ColumnWidth(q));
323+
Assert.AreEqual(2, Rune.ColumnWidth(q));
324324
Assert.AreEqual(1, q.ToString().Length);
325325
Assert.AreEqual("〉", q.ToString());
326326
var r = ustring.Make("\U0000232a").DecodeRune().rune;
327-
Assert.AreEqual(1, Rune.ColumnWidth(r));
327+
Assert.AreEqual(2, Rune.ColumnWidth(r));
328328
Assert.AreEqual(1, r.ToString().Length);
329329
Assert.AreEqual("〉", r.ToString());
330330

@@ -508,11 +508,11 @@ public void TestValid()
508508
public void Test_IsNonSpacingChar()
509509
{
510510
Rune l = '\u0370';
511-
Assert.False(Rune.IsNonSpacingChar(l, out _));
511+
Assert.False(Rune.IsNonSpacingChar(l));
512512
Assert.AreEqual(1, Rune.ColumnWidth(l));
513513
Assert.AreEqual(1, ustring.Make(l).ConsoleWidth);
514514
Rune ns = '\u302a';
515-
Assert.True(Rune.IsNonSpacingChar(ns, out _));
515+
Assert.False(Rune.IsNonSpacingChar(ns));
516516
Assert.AreEqual(2, Rune.ColumnWidth(ns));
517517
Assert.AreEqual(2, ustring.Make(ns).ConsoleWidth);
518518
l = '\u006f';

NStackTests/ustringTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -721,10 +721,10 @@ public void TestConsoleWidth()
721721
var sc = new Rune(0xd83d);
722722
var r = new Rune(0xdd2e);
723723
Assert.AreEqual(1, Rune.ColumnWidth(sc));
724-
Assert.False(Rune.IsNonSpacingChar(r, out _));
724+
Assert.False(Rune.IsNonSpacingChar(r));
725725
Assert.AreEqual(1, Rune.ColumnWidth(r));
726726
var fr = new Rune(sc, r);
727-
Assert.False(Rune.IsNonSpacingChar(fr, out _));
727+
Assert.False(Rune.IsNonSpacingChar(fr));
728728
Assert.AreEqual(1, Rune.ColumnWidth(fr));
729729
var us = ustring.Make(fr);
730730
Assert.AreEqual(1, us.ConsoleWidth);

0 commit comments

Comments
 (0)