Bugfix Input use std::string (#279)

Use std::string by default for the implementation of FTXUI's input
component.

Along the way:
- Give a correct implementation for fullwidth characters.
- Add tests
- Modify the way the cursor is drawn.
This commit is contained in:
Arthur Sonzogni
2021-12-12 21:31:54 +01:00
committed by GitHub
parent 602392c43d
commit 52276c8a2b
6 changed files with 425 additions and 62 deletions

View File

@@ -42,6 +42,85 @@ TEST(StringTest, Utf8ToGlyphs) {
EXPECT_EQ(Utf8ToGlyphs("a\1a"), T({"a", "a"}));
}
TEST(StringTest, GlyphCount) {
// Basic:
EXPECT_EQ(GlyphCount(""), 0);
EXPECT_EQ(GlyphCount("a"), 1);
EXPECT_EQ(GlyphCount("ab"), 2);
// Fullwidth glyphs:
EXPECT_EQ(GlyphCount(""), 1);
EXPECT_EQ(GlyphCount("测试"), 2);
// Combining characters:
EXPECT_EQ(GlyphCount(""), 1);
EXPECT_EQ(GlyphCount("a⃒"), 1);
EXPECT_EQ(GlyphCount(""), 1);
// Control characters:
EXPECT_EQ(GlyphCount("\1"), 0);
EXPECT_EQ(GlyphCount("a\1a"), 2);
}
TEST(StringTest, GlyphPosition) {
// Basic:
EXPECT_EQ(GlyphPosition("", -1), 0);
EXPECT_EQ(GlyphPosition("", 0), 0);
EXPECT_EQ(GlyphPosition("", 1), 0);
EXPECT_EQ(GlyphPosition("a", 0), 0);
EXPECT_EQ(GlyphPosition("a", 1), 1);
EXPECT_EQ(GlyphPosition("ab", 0), 0);
EXPECT_EQ(GlyphPosition("ab", 1), 1);
EXPECT_EQ(GlyphPosition("ab", 2), 2);
EXPECT_EQ(GlyphPosition("abc", 0), 0);
EXPECT_EQ(GlyphPosition("abc", 1), 1);
EXPECT_EQ(GlyphPosition("abc", 2), 2);
EXPECT_EQ(GlyphPosition("abc", 3), 3);
// Fullwidth glyphs:
EXPECT_EQ(GlyphPosition("", 0), 0);
EXPECT_EQ(GlyphPosition("", 1), 3);
EXPECT_EQ(GlyphPosition("测试", 0), 0);
EXPECT_EQ(GlyphPosition("测试", 1), 3);
EXPECT_EQ(GlyphPosition("测试", 2), 6);
EXPECT_EQ(GlyphPosition("测试", 1, 3), 6);
EXPECT_EQ(GlyphPosition("测试", 1, 0), 3);
// Combining characters:
EXPECT_EQ(GlyphPosition("", 0), 0);
EXPECT_EQ(GlyphPosition("", 1), 3);
EXPECT_EQ(GlyphPosition("a⃒a̗ā", 0), 0);
EXPECT_EQ(GlyphPosition("a⃒a̗ā", 1), 4);
EXPECT_EQ(GlyphPosition("a⃒a̗ā", 2), 7);
EXPECT_EQ(GlyphPosition("a⃒a̗ā", 3), 10);
// Control characters:
EXPECT_EQ(GlyphPosition("\1", 0), 0);
EXPECT_EQ(GlyphPosition("\1", 1), 1);
EXPECT_EQ(GlyphPosition("a\1a", 0), 0);
EXPECT_EQ(GlyphPosition("a\1a", 1), 2);
EXPECT_EQ(GlyphPosition("a\1a", 2), 3);
}
TEST(StringTest, CellToGlyphIndex) {
// Basic:
auto basic = CellToGlyphIndex("abc");
ASSERT_EQ(basic.size(), 3);
EXPECT_EQ(basic[0], 0);
EXPECT_EQ(basic[1], 1);
EXPECT_EQ(basic[2], 2);
// Fullwidth glyphs:
auto fullwidth = CellToGlyphIndex("测试");
ASSERT_EQ(fullwidth.size(), 4);
EXPECT_EQ(fullwidth[0], 0);
EXPECT_EQ(fullwidth[1], 0);
EXPECT_EQ(fullwidth[2], 1);
EXPECT_EQ(fullwidth[3], 1);
// Combining characters:
auto combining = CellToGlyphIndex("a⃒a̗ā");
ASSERT_EQ(combining.size(), 3);
EXPECT_EQ(combining[0], 0);
EXPECT_EQ(combining[1], 1);
EXPECT_EQ(combining[2], 2);
}
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.