|
|
@@ -9,6 +9,11 @@
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
+#include "llvm/Support/Error.h"
|
|
|
+#include "llvm/Testing/Support/Error.h"
|
|
|
+
|
|
|
+using ::llvm::FailedWithMessage;
|
|
|
+using ::llvm::HasValue;
|
|
|
using ::testing::Eq;
|
|
|
using ::testing::Optional;
|
|
|
|
|
|
@@ -52,5 +57,139 @@ TEST(UnescapeStringLiteral, Nul) {
|
|
|
EXPECT_THAT((*str)[2], Eq('b'));
|
|
|
}
|
|
|
|
|
|
+TEST(ParseBlockStringLiteral, FailTooFewLines) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(""),
|
|
|
+ FailedWithMessage("Too few lines"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, FailNoLeadingTripleQuotes) {
|
|
|
+ EXPECT_THAT_EXPECTED(
|
|
|
+ ParseBlockStringLiteral("'a'\n"),
|
|
|
+ FailedWithMessage("Should start with triple quotes: 'a'"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, FailInvalideFiletypeIndicator) {
|
|
|
+ EXPECT_THAT_EXPECTED(
|
|
|
+ ParseBlockStringLiteral("\"\"\"carbon file\n"),
|
|
|
+ FailedWithMessage(
|
|
|
+ "Invalid characters in file type indicator: carbon file"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, FailEndingTripleQuotes) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral("\"\"\"\n"),
|
|
|
+ FailedWithMessage("Should end with triple quotes: "));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, FailWrongIndent) {
|
|
|
+ EXPECT_THAT_EXPECTED(
|
|
|
+ ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal
|
|
|
+ with wrong indent
|
|
|
+ """)"),
|
|
|
+ FailedWithMessage(
|
|
|
+ "Wrong indent for line: with wrong indent, expected 5"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, FailInvalidEscaping) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ \q
|
|
|
+ """)"),
|
|
|
+ FailedWithMessage("Invalid escaping in \\q"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkEmptyString) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+""")"),
|
|
|
+ HasValue(""));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkOneLineString) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkTwoLineString) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal
|
|
|
+ with indent.
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal
|
|
|
+ with indent.
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWithFileTypeIndicator) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""carbon
|
|
|
+ A block string literal
|
|
|
+ with file type indicator.
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal
|
|
|
+ with file type indicator.
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWhitespaceAfterOpeningQuotes) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWithEmptyLines) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal
|
|
|
+
|
|
|
+ with
|
|
|
+
|
|
|
+ empty
|
|
|
+
|
|
|
+ lines.
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal
|
|
|
+
|
|
|
+ with
|
|
|
+
|
|
|
+ empty
|
|
|
+
|
|
|
+ lines.
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWithSlashNewlineEscape) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal\
|
|
|
+ """)"),
|
|
|
+ HasValue("A block string literal"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWithDoubleSlashNewline) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal\\
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal\
|
|
|
+)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkWithTripleSlashNewline) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal\\\
|
|
|
+ """)"),
|
|
|
+ HasValue(R"(A block string literal\)"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParseBlockStringLiteral, OkMultipleSlashes) {
|
|
|
+ EXPECT_THAT_EXPECTED(ParseBlockStringLiteral(R"("""
|
|
|
+ A block string literal\
|
|
|
+ \
|
|
|
+ \
|
|
|
+ \
|
|
|
+ """)"),
|
|
|
+ HasValue("A block string literal"));
|
|
|
+}
|
|
|
+
|
|
|
} // namespace
|
|
|
} // namespace Carbon
|