1 //===-- FormatEntityTest.cpp ---------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Core/FormatEntity.h" 10 #include "lldb/Utility/Status.h" 11 12 #include "llvm/ADT/StringRef.h" 13 #include "gtest/gtest.h" 14 15 using namespace lldb_private; 16 17 using Definition = FormatEntity::Entry::Definition; 18 using Entry = FormatEntity::Entry; 19 20 TEST(FormatEntityTest, DefinitionConstructionNameAndType) { 21 Definition d("foo", FormatEntity::Entry::Type::Invalid); 22 23 EXPECT_STREQ(d.name, "foo"); 24 EXPECT_EQ(d.string, nullptr); 25 EXPECT_EQ(d.type, FormatEntity::Entry::Type::Invalid); 26 EXPECT_EQ(d.data, 0UL); 27 EXPECT_EQ(d.num_children, 0UL); 28 EXPECT_EQ(d.children, nullptr); 29 EXPECT_FALSE(d.keep_separator); 30 } 31 32 TEST(FormatEntityTest, DefinitionConstructionNameAndString) { 33 Definition d("foo", "string"); 34 35 EXPECT_STREQ(d.name, "foo"); 36 EXPECT_STREQ(d.string, "string"); 37 EXPECT_EQ(d.type, FormatEntity::Entry::Type::EscapeCode); 38 EXPECT_EQ(d.data, 0UL); 39 EXPECT_EQ(d.num_children, 0UL); 40 EXPECT_EQ(d.children, nullptr); 41 EXPECT_FALSE(d.keep_separator); 42 } 43 44 TEST(FormatEntityTest, DefinitionConstructionNameTypeData) { 45 Definition d("foo", FormatEntity::Entry::Type::Invalid, 33); 46 47 EXPECT_STREQ(d.name, "foo"); 48 EXPECT_EQ(d.string, nullptr); 49 EXPECT_EQ(d.type, FormatEntity::Entry::Type::Invalid); 50 EXPECT_EQ(d.data, 33UL); 51 EXPECT_EQ(d.num_children, 0UL); 52 EXPECT_EQ(d.children, nullptr); 53 EXPECT_FALSE(d.keep_separator); 54 } 55 56 TEST(FormatEntityTest, DefinitionConstructionNameTypeChildren) { 57 Definition d("foo", FormatEntity::Entry::Type::Invalid, 33); 58 Definition parent("parent", FormatEntity::Entry::Type::Invalid, 1, &d); 59 EXPECT_STREQ(parent.name, "parent"); 60 EXPECT_STREQ(parent.string, nullptr); 61 EXPECT_EQ(parent.type, FormatEntity::Entry::Type::Invalid); 62 EXPECT_EQ(parent.num_children, 1UL); 63 EXPECT_EQ(parent.children, &d); 64 EXPECT_FALSE(parent.keep_separator); 65 66 EXPECT_STREQ(parent.children[0].name, "foo"); 67 EXPECT_EQ(parent.children[0].string, nullptr); 68 EXPECT_EQ(parent.children[0].type, FormatEntity::Entry::Type::Invalid); 69 EXPECT_EQ(parent.children[0].data, 33UL); 70 EXPECT_EQ(parent.children[0].num_children, 0UL); 71 EXPECT_EQ(parent.children[0].children, nullptr); 72 EXPECT_FALSE(d.keep_separator); 73 } 74 75 constexpr llvm::StringRef lookupStrings[] = { 76 "${addr.load}", 77 "${addr.file}", 78 "${ansi.fg.black}", 79 "${ansi.fg.red}", 80 "${ansi.fg.green}", 81 "${ansi.fg.yellow}", 82 "${ansi.fg.blue}", 83 "${ansi.fg.purple}", 84 "${ansi.fg.cyan}", 85 "${ansi.fg.white}", 86 "${ansi.bg.black}", 87 "${ansi.bg.red}", 88 "${ansi.bg.green}", 89 "${ansi.bg.yellow}", 90 "${ansi.bg.blue}", 91 "${ansi.bg.purple}", 92 "${ansi.bg.cyan}", 93 "${ansi.bg.white}", 94 "${file.basename}", 95 "${file.dirname}", 96 "${file.fullpath}", 97 "${frame.index}", 98 "${frame.pc}", 99 "${frame.fp}", 100 "${frame.sp}", 101 "${frame.flags}", 102 "${frame.no-debug}", 103 "${frame.reg.*}", 104 "${frame.is-artificial}", 105 "${function.id}", 106 "${function.name}", 107 "${function.name-without-args}", 108 "${function.name-with-args}", 109 "${function.mangled-name}", 110 "${function.addr-offset}", 111 "${function.concrete-only-addr-offset-no-padding}", 112 "${function.line-offset}", 113 "${function.pc-offset}", 114 "${function.initial-function}", 115 "${function.changed}", 116 "${function.is-optimized}", 117 "${line.file.basename}", 118 "${line.file.dirname}", 119 "${line.file.fullpath}", 120 "${line.number}", 121 "${line.column}", 122 "${line.start-addr}", 123 "${line.end-addr}", 124 "${module.file.basename}", 125 "${module.file.dirname}", 126 "${module.file.fullpath}", 127 "${process.id}", 128 "${process.name}", 129 "${process.file.basename}", 130 "${process.file.dirname}", 131 "${process.file.fullpath}", 132 "${script.frame}", 133 "${script.process}", 134 "${script.target}", 135 "${script.thread}", 136 "${script.var}", 137 "${script.svar}", 138 "${script.thread}", 139 "${svar.dummy-svar-to-test-wildcard}", 140 "${thread.id}", 141 "${thread.protocol_id}", 142 "${thread.index}", 143 "${thread.info.*}", 144 "${thread.queue}", 145 "${thread.name}", 146 "${thread.stop-reason}", 147 "${thread.stop-reason-raw}", 148 "${thread.return-value}", 149 "${thread.completed-expression}", 150 "${target.arch}", 151 "${target.file.basename}", 152 "${target.file.dirname}", 153 "${target.file.fullpath}", 154 "${var.dummy-var-to-test-wildcard}"}; 155 156 TEST(FormatEntity, LookupAllEntriesInTree) { 157 for (const llvm::StringRef testString : lookupStrings) { 158 Entry e; 159 EXPECT_TRUE(FormatEntity::Parse(testString, e).Success()) 160 << "Formatting " << testString << " did not succeed"; 161 } 162 } 163