#include "lldb/DataFormatters/FormattersContainer.h"
#include "lldb/DataFormatters/FormatClasses.h"
#include "gtest/gtest.h"
using namespace lldb;
using namespace lldb_private;
FormattersMatchCandidate CandidateFromTypeName(const char *type_name) {
return FormattersMatchCandidate(ConstString(type_name), nullptr, TypeImpl(),
FormattersMatchCandidate::Flags());
}
static const std::vector<std::string> exact_name_prefixes = {
"",
"class ", "struct ", "union ", "enum ",
};
TEST(TypeMatcherTests, ExactName) {
for (const std::string &prefix : exact_name_prefixes) {
SCOPED_TRACE("Prefix: " + prefix);
TypeMatcher matcher(ConstString(prefix + "Name"));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("class Name")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("struct Name")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("union Name")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("enum Name")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("Name")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("Name ")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ame")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("Nam")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("am")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" ")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class N")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class ")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class")));
}
}
TEST(TypeMatcherTests, RegexName) {
TypeMatcher matcher(RegularExpression("^a[a-z]c$"));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("azc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("class abc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abbc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" abc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abc ")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName(" abc ")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("XabcX")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ac")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a[a-z]c")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("aAc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ABC")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("")));
}
TEST(TypeMatcherTests, RegexMatchPart) {
TypeMatcher matcher(RegularExpression("a[a-z]c"));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("class abc")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc ")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("azc")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("abc ")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc ")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName(" abc")));
EXPECT_TRUE(matcher.Matches(CandidateFromTypeName("XabcX")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("abbc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ac")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("a[a-z]c")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("aAc")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("ABC")));
EXPECT_FALSE(matcher.Matches(CandidateFromTypeName("")));
}
TEST(TypeMatcherTests, GetMatchStringExactName) {
EXPECT_EQ(TypeMatcher(ConstString("aa")).GetMatchString(), "aa");
EXPECT_EQ(TypeMatcher(ConstString("")).GetMatchString(), "");
EXPECT_EQ(TypeMatcher(ConstString("[a]")).GetMatchString(), "[a]");
}
TEST(TypeMatcherTests, GetMatchStringRegex) {
EXPECT_EQ(TypeMatcher(RegularExpression("aa")).GetMatchString(), "aa");
EXPECT_EQ(TypeMatcher(RegularExpression("")).GetMatchString(), "");
EXPECT_EQ(TypeMatcher(RegularExpression("[a]")).GetMatchString(), "[a]");
}
TEST(TypeMatcherTests, CreatedBySameMatchString) {
TypeMatcher empty_str(ConstString(""));
TypeMatcher empty_regex(RegularExpression(""));
EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_str));
EXPECT_TRUE(empty_str.CreatedBySameMatchString(empty_regex));
TypeMatcher a_str(ConstString("a"));
TypeMatcher a_regex(RegularExpression("a"));
EXPECT_TRUE(a_str.CreatedBySameMatchString(a_str));
EXPECT_TRUE(a_str.CreatedBySameMatchString(a_regex));
TypeMatcher digit_str(ConstString("[0-9]"));
TypeMatcher digit_regex(RegularExpression("[0-9]"));
EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_str));
EXPECT_TRUE(digit_str.CreatedBySameMatchString(digit_regex));
EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_str));
EXPECT_FALSE(empty_str.CreatedBySameMatchString(a_regex));
EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_str));
EXPECT_FALSE(empty_str.CreatedBySameMatchString(digit_regex));
EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_str));
EXPECT_FALSE(empty_regex.CreatedBySameMatchString(a_regex));
EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_str));
EXPECT_FALSE(empty_regex.CreatedBySameMatchString(digit_regex));
EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_str));
EXPECT_FALSE(a_str.CreatedBySameMatchString(empty_regex));
EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_str));
EXPECT_FALSE(a_str.CreatedBySameMatchString(digit_regex));
EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_str));
EXPECT_FALSE(a_regex.CreatedBySameMatchString(empty_regex));
EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_str));
EXPECT_FALSE(a_regex.CreatedBySameMatchString(digit_regex));
EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_str));
EXPECT_FALSE(digit_str.CreatedBySameMatchString(empty_regex));
EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_str));
EXPECT_FALSE(digit_str.CreatedBySameMatchString(a_regex));
EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_str));
EXPECT_FALSE(digit_regex.CreatedBySameMatchString(empty_regex));
EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_str));
EXPECT_FALSE(digit_regex.CreatedBySameMatchString(a_regex));
}
TEST(TypeMatcherTests, CreatedBySameMatchStringExactNamePrefixes) {
for (const std::string &prefix : exact_name_prefixes) {
SCOPED_TRACE("Prefix: " + prefix);
TypeMatcher with_prefix(ConstString(prefix + "Name"));
TypeMatcher without_prefix(RegularExpression(""));
EXPECT_TRUE(with_prefix.CreatedBySameMatchString(with_prefix));
EXPECT_TRUE(without_prefix.CreatedBySameMatchString(without_prefix));
}
}