diff --git a/llvm/unittests/Support/MustacheTest.cpp b/llvm/unittests/Support/MustacheTest.cpp
index 6ab3d4b01bc1b..ddc9efc035e17 100644
--- a/llvm/unittests/Support/MustacheTest.cpp
+++ b/llvm/unittests/Support/MustacheTest.cpp
@@ -1224,3 +1224,97 @@ TEST(MustacheComments, VariableNameCollision) {
T.render(D, OS);
EXPECT_EQ("comments never show: ><", Out);
}
+
+// XFAIL: The following tests for the Triple Mustache feature are expected to
+// fail. The assertions have been inverted from EXPECT_EQ to EXPECT_NE to allow
+// them to pass against the current implementation. Once Triple Mustache is
+// implemented, these assertions should be changed back to EXPECT_EQ.
+TEST(MustacheTripleMustache, Basic) {
+ Value D = Object{{"subject", "World"}};
+ auto T = Template("Hello, {{{subject}}}!");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("Hello, World!", Out);
+}
+
+TEST(MustacheTripleMustache, IntegerInterpolation) {
+ Value D = Object{{"mph", 85}};
+ auto T = Template("{{{mph}}} miles an hour!");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("85 miles an hour!", Out);
+}
+
+TEST(MustacheTripleMustache, DecimalInterpolation) {
+ Value D = Object{{"power", 1.21}};
+ auto T = Template("{{{power}}} jiggawatts!");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("1.21 jiggawatts!", Out);
+}
+
+TEST(MustacheTripleMustache, NullInterpolation) {
+ Value D = Object{{"cannot", nullptr}};
+ auto T = Template("I ({{{cannot}}}) be seen!");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("I () be seen!", Out);
+}
+
+TEST(MustacheTripleMustache, ContextMissInterpolation) {
+ Value D = Object{};
+ auto T = Template("I ({{{cannot}}}) be seen!");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("I () be seen!", Out);
+}
+
+TEST(MustacheTripleMustache, DottedNames) {
+ Value D = Object{{"person", Object{{"name", "Joe"}}}};
+ auto T = Template("{{{person.name}}}");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("Joe", Out);
+}
+
+TEST(MustacheTripleMustache, ImplicitIterator) {
+ Value D = Object{{"list", Array{"", ""}}};
+ auto T = Template("{{#list}}({{{.}}}){{/list}}");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("()()", Out);
+}
+
+TEST(MustacheTripleMustache, SurroundingWhitespace) {
+ Value D = Object{{"string", "---"}};
+ auto T = Template("| {{{string}}} |");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("| --- |", Out);
+}
+
+TEST(MustacheTripleMustache, Standalone) {
+ Value D = Object{{"string", "---"}};
+ auto T = Template(" {{{string}}}\n");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE(" ---\n", Out);
+}
+
+TEST(MustacheTripleMustache, WithPadding) {
+ Value D = Object{{"string", "---"}};
+ auto T = Template("|{{{ string }}}|");
+ std::string Out;
+ raw_string_ostream OS(Out);
+ T.render(D, OS);
+ EXPECT_NE("|---|", Out);
+}