mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 14:01:06 +01:00
Added unicode support (#2027)
Can parse Unicode literals following the format \u{HHHH...} in a string
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user