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