|
|
@@ -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);
|