xref: /llvm-project/llvm/unittests/DebugInfo/Symbolizer/MarkupTest.cpp (revision 3b7bfeb483e78d355ec3527aa31786e2545470ea)
12040b6dfSDaniel Thornburgh 
22040b6dfSDaniel Thornburgh //===- unittest/DebugInfo/Symbolizer/MarkupTest.cpp - Markup parser tests -===//
32040b6dfSDaniel Thornburgh //
42040b6dfSDaniel Thornburgh // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
52040b6dfSDaniel Thornburgh // See https://llvm.org/LICENSE.txt for license information.
62040b6dfSDaniel Thornburgh // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
72040b6dfSDaniel Thornburgh //
82040b6dfSDaniel Thornburgh //===----------------------------------------------------------------------===//
92040b6dfSDaniel Thornburgh 
102040b6dfSDaniel Thornburgh #include "llvm/DebugInfo/Symbolize/Markup.h"
112040b6dfSDaniel Thornburgh 
122040b6dfSDaniel Thornburgh #include "llvm/ADT/Twine.h"
132040b6dfSDaniel Thornburgh #include "llvm/Support/FormatVariadic.h"
142040b6dfSDaniel Thornburgh 
152040b6dfSDaniel Thornburgh #include "gmock/gmock.h"
162040b6dfSDaniel Thornburgh #include "gtest/gtest.h"
172040b6dfSDaniel Thornburgh 
182040b6dfSDaniel Thornburgh namespace {
192040b6dfSDaniel Thornburgh 
202040b6dfSDaniel Thornburgh using namespace llvm;
212040b6dfSDaniel Thornburgh using namespace llvm::symbolize;
222040b6dfSDaniel Thornburgh using namespace testing;
232040b6dfSDaniel Thornburgh 
isNode(StringRef Text,StringRef Tag="",Matcher<SmallVector<StringRef>> Fields=IsEmpty ())242040b6dfSDaniel Thornburgh Matcher<MarkupNode> isNode(StringRef Text, StringRef Tag = "",
252040b6dfSDaniel Thornburgh                            Matcher<SmallVector<StringRef>> Fields = IsEmpty()) {
262040b6dfSDaniel Thornburgh   return AllOf(Field("Text", &MarkupNode::Text, Text),
272040b6dfSDaniel Thornburgh                Field("Tag", &MarkupNode::Tag, Tag),
282040b6dfSDaniel Thornburgh                Field("Fields", &MarkupNode::Fields, Fields));
292040b6dfSDaniel Thornburgh }
302040b6dfSDaniel Thornburgh 
TEST(SymbolizerMarkup,NoLines)31*b6a01caaSKazu Hirata TEST(SymbolizerMarkup, NoLines) {
32*b6a01caaSKazu Hirata   EXPECT_EQ(MarkupParser{}.nextNode(), std::nullopt);
33*b6a01caaSKazu Hirata }
342040b6dfSDaniel Thornburgh 
TEST(SymbolizerMarkup,LinesWithoutMarkup)352040b6dfSDaniel Thornburgh TEST(SymbolizerMarkup, LinesWithoutMarkup) {
362040b6dfSDaniel Thornburgh   MarkupParser Parser;
372040b6dfSDaniel Thornburgh 
382040b6dfSDaniel Thornburgh   Parser.parseLine("text");
392040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("text")));
40*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
412040b6dfSDaniel Thornburgh 
422040b6dfSDaniel Thornburgh   Parser.parseLine("discarded");
432040b6dfSDaniel Thornburgh   Parser.parseLine("kept");
442040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("kept")));
45*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
462040b6dfSDaniel Thornburgh 
478bd078b5SDaniel Thornburgh   Parser.parseLine("text\n");
488bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("text\n")));
49*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
508bd078b5SDaniel Thornburgh 
518bd078b5SDaniel Thornburgh   Parser.parseLine("text\r\n");
528bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("text\r\n")));
53*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
548bd078b5SDaniel Thornburgh 
552040b6dfSDaniel Thornburgh   Parser.parseLine("{{{");
562040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{")));
57*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
582040b6dfSDaniel Thornburgh 
592040b6dfSDaniel Thornburgh   Parser.parseLine("{{{}}");
602040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}")));
61*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
622040b6dfSDaniel Thornburgh 
632040b6dfSDaniel Thornburgh   Parser.parseLine("{{}}}");
642040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{}}}")));
65*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
662040b6dfSDaniel Thornburgh 
672040b6dfSDaniel Thornburgh   Parser.parseLine("{{{}}}");
682040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}}")));
69*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
702040b6dfSDaniel Thornburgh 
712040b6dfSDaniel Thornburgh   Parser.parseLine("{{{:field}}}");
722040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{:field}}}")));
73*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
742040b6dfSDaniel Thornburgh 
752040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:");
762040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:")));
77*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
782040b6dfSDaniel Thornburgh 
792040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:field}}");
802040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:field}}")));
81*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
822040b6dfSDaniel Thornburgh 
832040b6dfSDaniel Thornburgh   Parser.parseLine("a\033[2mb");
842040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[2mb")));
85*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
862040b6dfSDaniel Thornburgh 
872040b6dfSDaniel Thornburgh   Parser.parseLine("a\033[38mb");
882040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[38mb")));
89*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
902040b6dfSDaniel Thornburgh 
912040b6dfSDaniel Thornburgh   Parser.parseLine("a\033[4mb");
922040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[4mb")));
93*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
942040b6dfSDaniel Thornburgh }
952040b6dfSDaniel Thornburgh 
TEST(SymbolizerMarkup,LinesWithMarkup)962040b6dfSDaniel Thornburgh TEST(SymbolizerMarkup, LinesWithMarkup) {
972040b6dfSDaniel Thornburgh   MarkupParser Parser;
982040b6dfSDaniel Thornburgh 
992040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag}}}");
1002040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag}}}", "tag")));
101*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1022040b6dfSDaniel Thornburgh 
1032040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:f1:f2:f3}}}");
1042040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
1052040b6dfSDaniel Thornburgh               testing::Optional(isNode("{{{tag:f1:f2:f3}}}", "tag",
1062040b6dfSDaniel Thornburgh                                        ElementsAre("f1", "f2", "f3"))));
107*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1082040b6dfSDaniel Thornburgh 
1092040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:}}}");
1102040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
1112040b6dfSDaniel Thornburgh               testing::Optional(isNode("{{{tag:}}}", "tag", ElementsAre(""))));
112*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1132040b6dfSDaniel Thornburgh 
1142040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:}}");
1152040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:}}")));
116*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1172040b6dfSDaniel Thornburgh 
1182040b6dfSDaniel Thornburgh   Parser.parseLine("{{{t2g}}}");
1192040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{t2g}}}", "t2g")));
120*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1212040b6dfSDaniel Thornburgh 
1222040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tAg}}}");
1232040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tAg}}}", "tAg")));
124*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1252040b6dfSDaniel Thornburgh 
1262040b6dfSDaniel Thornburgh   Parser.parseLine("a{{{b}}}c{{{d}}}e");
1272040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a")));
1282040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{b}}}", "b")));
1292040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("c")));
1302040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{d}}}", "d")));
1312040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("e")));
132*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1332040b6dfSDaniel Thornburgh 
1342040b6dfSDaniel Thornburgh   Parser.parseLine("{{{}}}{{{tag}}}");
1352040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}}")));
1362040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag}}}", "tag")));
137*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1382040b6dfSDaniel Thornburgh 
1392040b6dfSDaniel Thornburgh   Parser.parseLine("\033[0mA\033[1mB\033[30mC\033[37m");
1402040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[0m")));
1412040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("A")));
1422040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[1m")));
1432040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("B")));
1442040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[30m")));
1452040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("C")));
1462040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[37m")));
147*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1482040b6dfSDaniel Thornburgh 
1492040b6dfSDaniel Thornburgh   Parser.parseLine("{{{tag:\033[0m}}}");
1502040b6dfSDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
1512040b6dfSDaniel Thornburgh               testing::Optional(
1522040b6dfSDaniel Thornburgh                   isNode("{{{tag:\033[0m}}}", "tag", ElementsAre("\033[0m"))));
153*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1542040b6dfSDaniel Thornburgh }
1552040b6dfSDaniel Thornburgh 
TEST(SymbolizerMarkup,MultilineElements)1568bd078b5SDaniel Thornburgh TEST(SymbolizerMarkup, MultilineElements) {
1578bd078b5SDaniel Thornburgh   MarkupParser Parser(/*MultilineTags=*/{"first", "second"});
1588bd078b5SDaniel Thornburgh 
1598bd078b5SDaniel Thornburgh   Parser.parseLine("{{{tag:");
1608bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:")));
161*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1628bd078b5SDaniel Thornburgh 
1638bd078b5SDaniel Thornburgh   Parser.parseLine("{{{first:");
164*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1658bd078b5SDaniel Thornburgh   Parser.parseLine("}}}{{{second:");
1668bd078b5SDaniel Thornburgh   EXPECT_THAT(
1678bd078b5SDaniel Thornburgh       Parser.nextNode(),
1688bd078b5SDaniel Thornburgh       testing::Optional(isNode("{{{first:}}}", "first", ElementsAre(""))));
169*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1708bd078b5SDaniel Thornburgh   Parser.parseLine("}}}");
1718bd078b5SDaniel Thornburgh   EXPECT_THAT(
1728bd078b5SDaniel Thornburgh       Parser.nextNode(),
1738bd078b5SDaniel Thornburgh       testing::Optional(isNode("{{{second:}}}", "second", ElementsAre(""))));
174*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1758bd078b5SDaniel Thornburgh 
1768bd078b5SDaniel Thornburgh   Parser.parseLine("{{{before{{{first:");
1778bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{before")));
178*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1798bd078b5SDaniel Thornburgh   Parser.parseLine("line");
180*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1818bd078b5SDaniel Thornburgh   Parser.parseLine("}}}after");
1828bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
1838bd078b5SDaniel Thornburgh               testing::Optional(
1848bd078b5SDaniel Thornburgh                   isNode("{{{first:line}}}", "first", ElementsAre("line"))));
1858bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("after")));
186*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1878bd078b5SDaniel Thornburgh 
1888bd078b5SDaniel Thornburgh   Parser.parseLine("{{{first:");
189*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1908bd078b5SDaniel Thornburgh   Parser.flush();
1918bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{first:")));
192*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1938bd078b5SDaniel Thornburgh 
1948bd078b5SDaniel Thornburgh   Parser.parseLine("{{{first:\n");
195*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
1968bd078b5SDaniel Thornburgh   Parser.parseLine("}}}\n");
1978bd078b5SDaniel Thornburgh   EXPECT_THAT(
1988bd078b5SDaniel Thornburgh       Parser.nextNode(),
1998bd078b5SDaniel Thornburgh       testing::Optional(isNode("{{{first:\n}}}", "first", ElementsAre("\n"))));
2008bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\n")));
201*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
2028bd078b5SDaniel Thornburgh 
2038bd078b5SDaniel Thornburgh   Parser.parseLine("{{{first:\r\n");
204*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
2058bd078b5SDaniel Thornburgh   Parser.parseLine("}}}\r\n");
2068bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
2078bd078b5SDaniel Thornburgh               testing::Optional(
2088bd078b5SDaniel Thornburgh                   isNode("{{{first:\r\n}}}", "first", ElementsAre("\r\n"))));
2098bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\r\n")));
210*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
2118bd078b5SDaniel Thornburgh 
2128bd078b5SDaniel Thornburgh   Parser.parseLine("{{{first:");
213*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
2148bd078b5SDaniel Thornburgh   Parser.parseLine("\033[0m}}}");
2158bd078b5SDaniel Thornburgh   EXPECT_THAT(Parser.nextNode(),
2168bd078b5SDaniel Thornburgh               testing::Optional(isNode("{{{first:\033[0m}}}", "first",
2178bd078b5SDaniel Thornburgh                                        ElementsAre("\033[0m"))));
218*b6a01caaSKazu Hirata   EXPECT_THAT(Parser.nextNode(), std::nullopt);
2198bd078b5SDaniel Thornburgh }
2208bd078b5SDaniel Thornburgh 
2212040b6dfSDaniel Thornburgh } // namespace
222