1*4d489e9fSRaphael Isemann //===-- FormattersContainerTests.cpp --------------------------------------===//
2*4d489e9fSRaphael Isemann //
3*4d489e9fSRaphael Isemann // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4d489e9fSRaphael Isemann // See https://llvm.org/LICENSE.txt for license information.
5*4d489e9fSRaphael Isemann // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4d489e9fSRaphael Isemann //
7*4d489e9fSRaphael Isemann //===----------------------------------------------------------------------===//
8*4d489e9fSRaphael Isemann 
9*4d489e9fSRaphael Isemann #include "lldb/DataFormatters/FormattersContainer.h"
10*4d489e9fSRaphael Isemann 
11*4d489e9fSRaphael Isemann #include "gtest/gtest.h"
12*4d489e9fSRaphael Isemann 
13*4d489e9fSRaphael Isemann using namespace lldb;
14*4d489e9fSRaphael Isemann using namespace lldb_private;
15*4d489e9fSRaphael Isemann 
16*4d489e9fSRaphael Isemann // All the prefixes that the exact name matching will strip from the type.
17*4d489e9fSRaphael Isemann static const std::vector<std::string> exact_name_prefixes = {
18*4d489e9fSRaphael Isemann     "", // no prefix.
19*4d489e9fSRaphael Isemann     "class ", "struct ", "union ", "enum ",
20*4d489e9fSRaphael Isemann };
21*4d489e9fSRaphael Isemann 
22*4d489e9fSRaphael Isemann // TypeMatcher that uses a exact type name string that needs to be matched.
TEST(TypeMatcherTests,ExactName)23*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, ExactName) {
24*4d489e9fSRaphael Isemann   for (const std::string &prefix : exact_name_prefixes) {
25*4d489e9fSRaphael Isemann     SCOPED_TRACE("Prefix: " + prefix);
26*4d489e9fSRaphael Isemann 
27*4d489e9fSRaphael Isemann     TypeMatcher matcher(ConstString(prefix + "Name"));
28*4d489e9fSRaphael Isemann     EXPECT_TRUE(matcher.Matches(ConstString("class Name")));
29*4d489e9fSRaphael Isemann     EXPECT_TRUE(matcher.Matches(ConstString("struct Name")));
30*4d489e9fSRaphael Isemann     EXPECT_TRUE(matcher.Matches(ConstString("union Name")));
31*4d489e9fSRaphael Isemann     EXPECT_TRUE(matcher.Matches(ConstString("enum Name")));
32*4d489e9fSRaphael Isemann     EXPECT_TRUE(matcher.Matches(ConstString("Name")));
33*4d489e9fSRaphael Isemann 
34*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("Name ")));
35*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("ame")));
36*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("Nam")));
37*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("am")));
38*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("a")));
39*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString(" ")));
40*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("class N")));
41*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("class ")));
42*4d489e9fSRaphael Isemann     EXPECT_FALSE(matcher.Matches(ConstString("class")));
43*4d489e9fSRaphael Isemann   }
44*4d489e9fSRaphael Isemann }
45*4d489e9fSRaphael Isemann 
46*4d489e9fSRaphael Isemann // TypeMatcher that uses a regex to match a type name.
TEST(TypeMatcherTests,RegexName)47*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, RegexName) {
48*4d489e9fSRaphael Isemann   TypeMatcher matcher(RegularExpression("^a[a-z]c$"));
49*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("abc")));
50*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("azc")));
51*4d489e9fSRaphael Isemann 
52*4d489e9fSRaphael Isemann   // FIXME: This isn't consistent with the 'exact' type name matches above.
53*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("class abc")));
54*4d489e9fSRaphael Isemann 
55*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("abbc")));
56*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString(" abc")));
57*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("abc ")));
58*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString(" abc ")));
59*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("XabcX")));
60*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("ac")));
61*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("a[a-z]c")));
62*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("aAc")));
63*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("ABC")));
64*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("")));
65*4d489e9fSRaphael Isemann }
66*4d489e9fSRaphael Isemann 
67*4d489e9fSRaphael Isemann // TypeMatcher that only searches the type name.
TEST(TypeMatcherTests,RegexMatchPart)68*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, RegexMatchPart) {
69*4d489e9fSRaphael Isemann   TypeMatcher matcher(RegularExpression("a[a-z]c"));
70*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("class abc")));
71*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("abc")));
72*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString(" abc ")));
73*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("azc")));
74*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("abc ")));
75*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString(" abc ")));
76*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString(" abc")));
77*4d489e9fSRaphael Isemann   EXPECT_TRUE(matcher.Matches(ConstString("XabcX")));
78*4d489e9fSRaphael Isemann 
79*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("abbc")));
80*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("ac")));
81*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("a[a-z]c")));
82*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("aAc")));
83*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("ABC")));
84*4d489e9fSRaphael Isemann   EXPECT_FALSE(matcher.Matches(ConstString("")));
85*4d489e9fSRaphael Isemann }
86*4d489e9fSRaphael Isemann 
87*4d489e9fSRaphael Isemann // GetMatchString for exact type name matchers.
TEST(TypeMatcherTests,GetMatchStringExactName)88*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, GetMatchStringExactName) {
89*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("aa")).GetMatchString(), "aa");
90*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("")).GetMatchString(), "");
91*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(ConstString("[a]")).GetMatchString(), "[a]");
92*4d489e9fSRaphael Isemann }
93*4d489e9fSRaphael Isemann 
94*4d489e9fSRaphael Isemann // GetMatchString for regex matchers.
TEST(TypeMatcherTests,GetMatchStringRegex)95*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, GetMatchStringRegex) {
96*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("aa")).GetMatchString(), "aa");
97*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("")).GetMatchString(), "");
98*4d489e9fSRaphael Isemann   EXPECT_EQ(TypeMatcher(RegularExpression("[a]")).GetMatchString(), "[a]");
99*4d489e9fSRaphael Isemann }
100*4d489e9fSRaphael Isemann 
101*4d489e9fSRaphael Isemann // GetMatchString for regex matchers.
TEST(TypeMatcherTests,CreatedBySameMatchString)102*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, CreatedBySameMatchString) {
103*4d489e9fSRaphael Isemann   TypeMatcher empty_str(ConstString(""));
104*4d489e9fSRaphael Isemann   TypeMatcher empty_regex(RegularExpression(""));
105*4d489e9fSRaphael Isemann   EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_str));
106*4d489e9fSRaphael Isemann   EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_regex));
107*4d489e9fSRaphael Isemann 
108*4d489e9fSRaphael Isemann   TypeMatcher a_str(ConstString("a"));
109*4d489e9fSRaphael Isemann   TypeMatcher a_regex(RegularExpression("a"));
110*4d489e9fSRaphael Isemann   EXPECT_TRUE(a_str.CreatedBySameMatchString(a_str));
111*4d489e9fSRaphael Isemann   EXPECT_TRUE(a_str.CreatedBySameMatchString(a_regex));
112*4d489e9fSRaphael Isemann 
113*4d489e9fSRaphael Isemann   TypeMatcher digit_str(ConstString("[0-9]"));
114*4d489e9fSRaphael Isemann   TypeMatcher digit_regex(RegularExpression("[0-9]"));
115*4d489e9fSRaphael Isemann   EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_str));
116*4d489e9fSRaphael Isemann   EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_regex));
117*4d489e9fSRaphael Isemann 
118*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_str));
119*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_regex));
120*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_str));
121*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_regex));
122*4d489e9fSRaphael Isemann 
123*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_str));
124*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_regex));
125*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_str));
126*4d489e9fSRaphael Isemann   EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_regex));
127*4d489e9fSRaphael Isemann 
128*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_str));
129*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_regex));
130*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_str));
131*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_regex));
132*4d489e9fSRaphael Isemann 
133*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_str));
134*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_regex));
135*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_str));
136*4d489e9fSRaphael Isemann   EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_regex));
137*4d489e9fSRaphael Isemann 
138*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_str));
139*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_regex));
140*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_str));
141*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_regex));
142*4d489e9fSRaphael Isemann 
143*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_str));
144*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_regex));
145*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_str));
146*4d489e9fSRaphael Isemann   EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_regex));
147*4d489e9fSRaphael Isemann }
148*4d489e9fSRaphael Isemann 
149*4d489e9fSRaphael Isemann // Test CreatedBySameMatchString with stripped exact name prefixes.
TEST(TypeMatcherTests,CreatedBySameMatchStringExactNamePrefixes)150*4d489e9fSRaphael Isemann TEST(TypeMatcherTests, CreatedBySameMatchStringExactNamePrefixes) {
151*4d489e9fSRaphael Isemann   for (const std::string &prefix : exact_name_prefixes) {
152*4d489e9fSRaphael Isemann     SCOPED_TRACE("Prefix: " + prefix);
153*4d489e9fSRaphael Isemann     TypeMatcher with_prefix(ConstString(prefix + "Name"));
154*4d489e9fSRaphael Isemann     TypeMatcher without_prefix(RegularExpression(""));
155*4d489e9fSRaphael Isemann 
156*4d489e9fSRaphael Isemann     EXPECT_TRUE(with_prefix.CreatedBySameMatchString(with_prefix));
157*4d489e9fSRaphael Isemann     EXPECT_TRUE(without_prefix.CreatedBySameMatchString(without_prefix));
158*4d489e9fSRaphael Isemann   }
159*4d489e9fSRaphael Isemann }
160