Added unicode support (#2027)

Can parse Unicode literals following the format \u{HHHH...} in a string
This commit is contained in:
Vineeth B V
2022-08-19 13:39:11 -07:00
committed by GitHub
parent fd28f5f9a8
commit 8c85fa2744
3 changed files with 85 additions and 2 deletions
+27
View File
@@ -30,6 +30,9 @@ TEST(UnescapeStringLiteral, Valid) {
EXPECT_THAT(UnescapeStringLiteral("\\x12"), Optional(Eq("\x12")));
EXPECT_THAT(UnescapeStringLiteral("test", 1), Optional(Eq("test")));
EXPECT_THAT(UnescapeStringLiteral("test\\#n", 1), Optional(Eq("test\n")));
EXPECT_THAT(UnescapeStringLiteral(
"r\\u{000000E9}al \\u{2764}\\u{FE0F}\\u{1F50A}!\\u{10FFFF}"),
Optional(Eq("réal ❤️🔊!􏿿")));
}
TEST(UnescapeStringLiteral, Invalid) {
@@ -48,6 +51,30 @@ TEST(UnescapeStringLiteral, Invalid) {
EXPECT_THAT(UnescapeStringLiteral("\\#00", 1), Eq(std::nullopt));
}
TEST(UnescapeStringLiteral, InvalidUnicodes) {
// Various incomplete Unicode specifiers
EXPECT_THAT(UnescapeStringLiteral("\\u"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u1"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\uz"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u{"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u{z"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u{E9"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u{E9z"), Eq(std::nullopt));
EXPECT_THAT(UnescapeStringLiteral("\\u{}"), Eq(std::nullopt));
// invalid characters in unicode
EXPECT_THAT(UnescapeStringLiteral("\\u{z}"), Eq(std::nullopt));
// lowercase hexadecimal
EXPECT_THAT(UnescapeStringLiteral("\\u{e9}"), Eq(std::nullopt));
// Codepoint number too high
EXPECT_THAT(UnescapeStringLiteral("\\u{110000}"), Eq(std::nullopt));
// codepoint more than 8 hex digits
EXPECT_THAT(UnescapeStringLiteral("\\u{FF000000E9}"), Eq(std::nullopt));
}
TEST(UnescapeStringLiteral, Nul) {
std::optional<std::string> str = UnescapeStringLiteral("a\\0b");
ASSERT_NE(str, std::nullopt);