xref: /llvm-project/llvm/unittests/DebugInfo/Symbolizer/MarkupTest.cpp (revision 2040b6df0a3f355076a363459f0d6c5ef187ac81)
1 
2 //===- unittest/DebugInfo/Symbolizer/MarkupTest.cpp - Markup parser tests -===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/DebugInfo/Symbolize/Markup.h"
11 
12 #include "llvm/ADT/Optional.h"
13 #include "llvm/ADT/SmallString.h"
14 #include "llvm/ADT/Twine.h"
15 #include "llvm/Support/FormatVariadic.h"
16 
17 #include "gmock/gmock.h"
18 #include "gtest/gtest.h"
19 
20 namespace {
21 
22 using namespace llvm;
23 using namespace llvm::symbolize;
24 using namespace testing;
25 
26 Matcher<MarkupNode> isNode(StringRef Text, StringRef Tag = "",
27                            Matcher<SmallVector<StringRef>> Fields = IsEmpty()) {
28   return AllOf(Field("Text", &MarkupNode::Text, Text),
29                Field("Tag", &MarkupNode::Tag, Tag),
30                Field("Fields", &MarkupNode::Fields, Fields));
31 }
32 
33 TEST(SymbolizerMarkup, NoLines) { EXPECT_EQ(MarkupParser{}.nextNode(), None); }
34 
35 TEST(SymbolizerMarkup, LinesWithoutMarkup) {
36   MarkupParser Parser;
37 
38   Parser.parseLine("text");
39   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("text")));
40   EXPECT_THAT(Parser.nextNode(), None);
41 
42   Parser.parseLine("discarded");
43   Parser.parseLine("kept");
44   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("kept")));
45   EXPECT_THAT(Parser.nextNode(), None);
46 
47   Parser.parseLine("{{{");
48   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{")));
49   EXPECT_THAT(Parser.nextNode(), None);
50 
51   Parser.parseLine("{{{}}");
52   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}")));
53   EXPECT_THAT(Parser.nextNode(), None);
54 
55   Parser.parseLine("{{}}}");
56   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{}}}")));
57   EXPECT_THAT(Parser.nextNode(), None);
58 
59   Parser.parseLine("{{{}}}");
60   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}}")));
61   EXPECT_THAT(Parser.nextNode(), None);
62 
63   Parser.parseLine("{{{:field}}}");
64   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{:field}}}")));
65   EXPECT_THAT(Parser.nextNode(), None);
66 
67   Parser.parseLine("{{{tag:");
68   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:")));
69   EXPECT_THAT(Parser.nextNode(), None);
70 
71   Parser.parseLine("{{{tag:field}}");
72   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:field}}")));
73   EXPECT_THAT(Parser.nextNode(), None);
74 
75   Parser.parseLine("a\033[2mb");
76   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[2mb")));
77   EXPECT_THAT(Parser.nextNode(), None);
78 
79   Parser.parseLine("a\033[38mb");
80   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[38mb")));
81   EXPECT_THAT(Parser.nextNode(), None);
82 
83   Parser.parseLine("a\033[4mb");
84   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a\033[4mb")));
85   EXPECT_THAT(Parser.nextNode(), None);
86 }
87 
88 TEST(SymbolizerMarkup, LinesWithMarkup) {
89   MarkupParser Parser;
90 
91   Parser.parseLine("{{{tag}}}");
92   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag}}}", "tag")));
93   EXPECT_THAT(Parser.nextNode(), None);
94 
95   Parser.parseLine("{{{tag:f1:f2:f3}}}");
96   EXPECT_THAT(Parser.nextNode(),
97               testing::Optional(isNode("{{{tag:f1:f2:f3}}}", "tag",
98                                        ElementsAre("f1", "f2", "f3"))));
99   EXPECT_THAT(Parser.nextNode(), None);
100 
101   Parser.parseLine("{{{tag:}}}");
102   EXPECT_THAT(Parser.nextNode(),
103               testing::Optional(isNode("{{{tag:}}}", "tag", ElementsAre(""))));
104   EXPECT_THAT(Parser.nextNode(), None);
105 
106   Parser.parseLine("{{{tag:}}");
107   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag:}}")));
108   EXPECT_THAT(Parser.nextNode(), None);
109 
110   Parser.parseLine("{{{t2g}}}");
111   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{t2g}}}", "t2g")));
112   EXPECT_THAT(Parser.nextNode(), None);
113 
114   Parser.parseLine("{{{tAg}}}");
115   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tAg}}}", "tAg")));
116   EXPECT_THAT(Parser.nextNode(), None);
117 
118   Parser.parseLine("a{{{b}}}c{{{d}}}e");
119   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("a")));
120   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{b}}}", "b")));
121   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("c")));
122   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{d}}}", "d")));
123   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("e")));
124   EXPECT_THAT(Parser.nextNode(), None);
125 
126   Parser.parseLine("{{{}}}{{{tag}}}");
127   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{}}}")));
128   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("{{{tag}}}", "tag")));
129   EXPECT_THAT(Parser.nextNode(), None);
130 
131   Parser.parseLine("\033[0mA\033[1mB\033[30mC\033[37m");
132   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[0m")));
133   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("A")));
134   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[1m")));
135   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("B")));
136   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[30m")));
137   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("C")));
138   EXPECT_THAT(Parser.nextNode(), testing::Optional(isNode("\033[37m")));
139   EXPECT_THAT(Parser.nextNode(), None);
140 
141   Parser.parseLine("{{{tag:\033[0m}}}");
142   EXPECT_THAT(Parser.nextNode(),
143               testing::Optional(
144                   isNode("{{{tag:\033[0m}}}", "tag", ElementsAre("\033[0m"))));
145   EXPECT_THAT(Parser.nextNode(), None);
146 }
147 
148 } // namespace
149