//===-- FormattersContainerTests.cpp --------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "lldb/DataFormatters/FormattersContainer.h" #include "gtest/gtest.h" using namespace lldb; using namespace lldb_private; // All the prefixes that the exact name matching will strip from the type. static const std::vector exact_name_prefixes = { "", // no prefix. "class ", "struct ", "union ", "enum ", }; // TypeMatcher that uses a exact type name string that needs to be matched. TEST(TypeMatcherTests, ExactName) { for (const std::string &prefix : exact_name_prefixes) { SCOPED_TRACE("Prefix: " + prefix); TypeMatcher matcher(ConstString(prefix + "Name")); EXPECT_TRUE(matcher.Matches(ConstString("class Name"))); EXPECT_TRUE(matcher.Matches(ConstString("struct Name"))); EXPECT_TRUE(matcher.Matches(ConstString("union Name"))); EXPECT_TRUE(matcher.Matches(ConstString("enum Name"))); EXPECT_TRUE(matcher.Matches(ConstString("Name"))); EXPECT_FALSE(matcher.Matches(ConstString("Name "))); EXPECT_FALSE(matcher.Matches(ConstString("ame"))); EXPECT_FALSE(matcher.Matches(ConstString("Nam"))); EXPECT_FALSE(matcher.Matches(ConstString("am"))); EXPECT_FALSE(matcher.Matches(ConstString("a"))); EXPECT_FALSE(matcher.Matches(ConstString(" "))); EXPECT_FALSE(matcher.Matches(ConstString("class N"))); EXPECT_FALSE(matcher.Matches(ConstString("class "))); EXPECT_FALSE(matcher.Matches(ConstString("class"))); } } // TypeMatcher that uses a regex to match a type name. TEST(TypeMatcherTests, RegexName) { TypeMatcher matcher(RegularExpression("^a[a-z]c$")); EXPECT_TRUE(matcher.Matches(ConstString("abc"))); EXPECT_TRUE(matcher.Matches(ConstString("azc"))); // FIXME: This isn't consistent with the 'exact' type name matches above. EXPECT_FALSE(matcher.Matches(ConstString("class abc"))); EXPECT_FALSE(matcher.Matches(ConstString("abbc"))); EXPECT_FALSE(matcher.Matches(ConstString(" abc"))); EXPECT_FALSE(matcher.Matches(ConstString("abc "))); EXPECT_FALSE(matcher.Matches(ConstString(" abc "))); EXPECT_FALSE(matcher.Matches(ConstString("XabcX"))); EXPECT_FALSE(matcher.Matches(ConstString("ac"))); EXPECT_FALSE(matcher.Matches(ConstString("a[a-z]c"))); EXPECT_FALSE(matcher.Matches(ConstString("aAc"))); EXPECT_FALSE(matcher.Matches(ConstString("ABC"))); EXPECT_FALSE(matcher.Matches(ConstString(""))); } // TypeMatcher that only searches the type name. TEST(TypeMatcherTests, RegexMatchPart) { TypeMatcher matcher(RegularExpression("a[a-z]c")); EXPECT_TRUE(matcher.Matches(ConstString("class abc"))); EXPECT_TRUE(matcher.Matches(ConstString("abc"))); EXPECT_TRUE(matcher.Matches(ConstString(" abc "))); EXPECT_TRUE(matcher.Matches(ConstString("azc"))); EXPECT_TRUE(matcher.Matches(ConstString("abc "))); EXPECT_TRUE(matcher.Matches(ConstString(" abc "))); EXPECT_TRUE(matcher.Matches(ConstString(" abc"))); EXPECT_TRUE(matcher.Matches(ConstString("XabcX"))); EXPECT_FALSE(matcher.Matches(ConstString("abbc"))); EXPECT_FALSE(matcher.Matches(ConstString("ac"))); EXPECT_FALSE(matcher.Matches(ConstString("a[a-z]c"))); EXPECT_FALSE(matcher.Matches(ConstString("aAc"))); EXPECT_FALSE(matcher.Matches(ConstString("ABC"))); EXPECT_FALSE(matcher.Matches(ConstString(""))); } // GetMatchString for exact type name matchers. TEST(TypeMatcherTests, GetMatchStringExactName) { EXPECT_EQ(TypeMatcher(ConstString("aa")).GetMatchString(), "aa"); EXPECT_EQ(TypeMatcher(ConstString("")).GetMatchString(), ""); EXPECT_EQ(TypeMatcher(ConstString("[a]")).GetMatchString(), "[a]"); } // GetMatchString for regex matchers. TEST(TypeMatcherTests, GetMatchStringRegex) { EXPECT_EQ(TypeMatcher(RegularExpression("aa")).GetMatchString(), "aa"); EXPECT_EQ(TypeMatcher(RegularExpression("")).GetMatchString(), ""); EXPECT_EQ(TypeMatcher(RegularExpression("[a]")).GetMatchString(), "[a]"); } // GetMatchString for regex matchers. 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 CreatedBySameMatchString with stripped exact name prefixes. 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)); } }