xref: /llvm-project/lldb/unittests/DataFormatter/FormattersContainerTest.cpp (revision d76566417e592cfac9c710f82575473b1b4a9285)
14d489e9fSRaphael Isemann //===-- FormattersContainerTests.cpp --------------------------------------===//
24d489e9fSRaphael Isemann //
34d489e9fSRaphael Isemann // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44d489e9fSRaphael Isemann // See https://llvm.org/LICENSE.txt for license information.
54d489e9fSRaphael Isemann // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64d489e9fSRaphael Isemann //
74d489e9fSRaphael Isemann //===----------------------------------------------------------------------===//
84d489e9fSRaphael Isemann 
94d489e9fSRaphael Isemann #include "lldb/DataFormatters/FormattersContainer.h"
10*d7656641SJorge Gorbe Moya #include "lldb/DataFormatters/FormatClasses.h"
114d489e9fSRaphael Isemann 
124d489e9fSRaphael Isemann #include "gtest/gtest.h"
134d489e9fSRaphael Isemann 
144d489e9fSRaphael Isemann using namespace lldb;
154d489e9fSRaphael Isemann using namespace lldb_private;
164d489e9fSRaphael Isemann 
17*d7656641SJorge Gorbe Moya // Creates a dummy candidate with just a type name in order to test the string
18*d7656641SJorge Gorbe Moya // matching (exact name match and regex match) paths.
CandidateFromTypeName(const char * type_name)19*d7656641SJorge Gorbe Moya FormattersMatchCandidate CandidateFromTypeName(const char *type_name) {
20*d7656641SJorge Gorbe Moya   return FormattersMatchCandidate(ConstString(type_name), nullptr, TypeImpl(),
21*d7656641SJorge Gorbe Moya                                   FormattersMatchCandidate::Flags());
22*d7656641SJorge Gorbe Moya }
23*d7656641SJorge Gorbe Moya 
244d489e9fSRaphael Isemann // All the prefixes that the exact name matching will strip from the type.
254d489e9fSRaphael Isemann static const std::vector<std::string> exact_name_prefixes = {
264d489e9fSRaphael Isemann     "", // no prefix.
274d489e9fSRaphael Isemann     "class ", "struct ", "union ", "enum ",
284d489e9fSRaphael Isemann };
294d489e9fSRaphael Isemann 
304d489e9fSRaphael Isemann // TypeMatcher that uses a exact type name string that needs to be matched.
TEST(TypeMatcherTests,ExactName)314d489e9fSRaphael Isemann TEST(TypeMatcherTests, ExactName) {
324d489e9fSRaphael Isemann   for (const std::string &prefix : exact_name_prefixes) {
334d489e9fSRaphael Isemann     SCOPED_TRACE("Prefix: " + prefix);
344d489e9fSRaphael Isemann 
354d489e9fSRaphael Isemann     TypeMatcher matcher(ConstString(prefix + "Name"));
36*d7656641SJorge Gorbe Moya     EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("class Name")));
37*d7656641SJorge Gorbe Moya     EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("struct Name")));
38*d7656641SJorge Gorbe Moya     EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("union Name")));
39*d7656641SJorge Gorbe Moya     EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("enum Name")));
40*d7656641SJorge Gorbe Moya     EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("Name")));
414d489e9fSRaphael Isemann 
42*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("Name ")));
43*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ame")));
44*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("Nam")));
45*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("am")));
46*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a")));
47*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" ")));
48*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class N")));
49*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class ")));
50*d7656641SJorge Gorbe Moya     EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class")));
514d489e9fSRaphael Isemann   }
524d489e9fSRaphael Isemann }
534d489e9fSRaphael Isemann 
544d489e9fSRaphael Isemann // TypeMatcher that uses a regex to match a type name.
TEST(TypeMatcherTests,RegexName)554d489e9fSRaphael Isemann TEST(TypeMatcherTests, RegexName) {
564d489e9fSRaphael Isemann   TypeMatcher matcher(RegularExpression("^a[a-z]c$"));
57*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc")));
58*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("azc")));
594d489e9fSRaphael Isemann 
604d489e9fSRaphael Isemann   // FIXME: This isn't consistent with the 'exact' type name matches above.
61*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class abc")));
624d489e9fSRaphael Isemann 
63*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abbc")));
64*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" abc")));
65*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abc ")));
66*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" abc ")));
67*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("XabcX")));
68*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ac")));
69*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a[a-z]c")));
70*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("aAc")));
71*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ABC")));
72*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("")));
734d489e9fSRaphael Isemann }
744d489e9fSRaphael Isemann 
754d489e9fSRaphael Isemann // TypeMatcher that only searches the type name.
TEST(TypeMatcherTests,RegexMatchPart)764d489e9fSRaphael Isemann TEST(TypeMatcherTests, RegexMatchPart) {
774d489e9fSRaphael Isemann   TypeMatcher matcher(RegularExpression("a[a-z]c"));
78*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("class abc")));
79*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc")));
80*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc ")));
81*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("azc")));
82*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc ")));
83*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc ")));
84*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc")));
85*d7656641SJorge Gorbe Moya   EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("XabcX")));
864d489e9fSRaphael Isemann 
87*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abbc")));
88*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ac")));
89*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a[a-z]c")));
90*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("aAc")));
91*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ABC")));
92*d7656641SJorge Gorbe Moya   EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("")));
934d489e9fSRaphael Isemann }
944d489e9fSRaphael Isemann 
954d489e9fSRaphael Isemann // GetMatchString for exact type name matchers.
TEST(TypeMatcherTests,GetMatchStringExactName)964d489e9fSRaphael Isemann TEST(TypeMatcherTests, GetMatchStringExactName) {
974d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("aa")).GetMatchString(), "aa");
984d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("")).GetMatchString(), "");
994d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("[a]")).GetMatchString(), "[a]");
1004d489e9fSRaphael Isemann }
1014d489e9fSRaphael Isemann 
1024d489e9fSRaphael Isemann // GetMatchString for regex matchers.
TEST(TypeMatcherTests,GetMatchStringRegex)1034d489e9fSRaphael Isemann TEST(TypeMatcherTests, GetMatchStringRegex) {
1044d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("aa")).GetMatchString(), "aa");
1054d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("")).GetMatchString(), "");
1064d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("[a]")).GetMatchString(), "[a]");
1074d489e9fSRaphael Isemann }
1084d489e9fSRaphael Isemann 
1094d489e9fSRaphael Isemann // GetMatchString for regex matchers.
TEST(TypeMatcherTests,CreatedBySameMatchString)1104d489e9fSRaphael Isemann TEST(TypeMatcherTests, CreatedBySameMatchString) {
1114d489e9fSRaphael Isemann   TypeMatcher empty_str(ConstString(""));
1124d489e9fSRaphael Isemann   TypeMatcher empty_regex(RegularExpression(""));
1134d489e9fSRaphael Isemann   EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_str));
1144d489e9fSRaphael Isemann   EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_regex));
1154d489e9fSRaphael Isemann 
1164d489e9fSRaphael Isemann   TypeMatcher a_str(ConstString("a"));
1174d489e9fSRaphael Isemann   TypeMatcher a_regex(RegularExpression("a"));
1184d489e9fSRaphael Isemann   EXPECT_TRUE(a_str.CreatedBySameMatchString(a_str));
1194d489e9fSRaphael Isemann   EXPECT_TRUE(a_str.CreatedBySameMatchString(a_regex));
1204d489e9fSRaphael Isemann 
1214d489e9fSRaphael Isemann   TypeMatcher digit_str(ConstString("[0-9]"));
1224d489e9fSRaphael Isemann   TypeMatcher digit_regex(RegularExpression("[0-9]"));
1234d489e9fSRaphael Isemann   EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_str));
1244d489e9fSRaphael Isemann   EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_regex));
1254d489e9fSRaphael Isemann 
1264d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_str));
1274d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_regex));
1284d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_str));
1294d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_regex));
1304d489e9fSRaphael Isemann 
1314d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_str));
1324d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_regex));
1334d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_str));
1344d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_regex));
1354d489e9fSRaphael Isemann 
1364d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_str));
1374d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_regex));
1384d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_str));
1394d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_regex));
1404d489e9fSRaphael Isemann 
1414d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_str));
1424d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_regex));
1434d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_str));
1444d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_regex));
1454d489e9fSRaphael Isemann 
1464d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_str));
1474d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_regex));
1484d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_str));
1494d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_regex));
1504d489e9fSRaphael Isemann 
1514d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_str));
1524d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_regex));
1534d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_str));
1544d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_regex));
1554d489e9fSRaphael Isemann }
1564d489e9fSRaphael Isemann 
1574d489e9fSRaphael Isemann // Test CreatedBySameMatchString with stripped exact name prefixes.
TEST(TypeMatcherTests,CreatedBySameMatchStringExactNamePrefixes)1584d489e9fSRaphael Isemann TEST(TypeMatcherTests, CreatedBySameMatchStringExactNamePrefixes) {
1594d489e9fSRaphael Isemann   for (const std::string &prefix : exact_name_prefixes) {
1604d489e9fSRaphael Isemann     SCOPED_TRACE("Prefix: " + prefix);
1614d489e9fSRaphael Isemann     TypeMatcher with_prefix(ConstString(prefix + "Name"));
1624d489e9fSRaphael Isemann     TypeMatcher without_prefix(RegularExpression(""));
1634d489e9fSRaphael Isemann 
1644d489e9fSRaphael Isemann     EXPECT_TRUE(with_prefix.CreatedBySameMatchString(with_prefix));
1654d489e9fSRaphael Isemann     EXPECT_TRUE(without_prefix.CreatedBySameMatchString(without_prefix));
1664d489e9fSRaphael Isemann   }
1674d489e9fSRaphael Isemann }
168