//===-- TestType.cpp --------------------------------------------*- C++ -*-===// // // // 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 "gtest/gtest.h" #include "lldb/Symbol/Type.h" using namespace lldb; using namespace lldb_private; namespace { void TestGetTypeScopeAndBasenameHelper(const char *full_type, bool expected_is_scoped, const char *expected_scope, const char *expected_name) { llvm::StringRef scope, name; lldb::TypeClass type_class; bool is_scoped = Type::GetTypeScopeAndBasename(full_type, scope, name, type_class); EXPECT_EQ(is_scoped, expected_is_scoped); if (expected_is_scoped) { EXPECT_EQ(scope, expected_scope); EXPECT_EQ(name, expected_name); } } } TEST(Type, GetTypeScopeAndBasename) { TestGetTypeScopeAndBasenameHelper("int", false, "", ""); TestGetTypeScopeAndBasenameHelper("std::string", true, "std::", "string"); TestGetTypeScopeAndBasenameHelper("std::set", true, "std::", "set"); TestGetTypeScopeAndBasenameHelper("std::set>", true, "std::", "set>"); TestGetTypeScopeAndBasenameHelper("std::string::iterator", true, "std::string::", "iterator"); TestGetTypeScopeAndBasenameHelper("std::set::iterator", true, "std::set::", "iterator"); TestGetTypeScopeAndBasenameHelper( "std::set>::iterator", true, "std::set>::", "iterator"); TestGetTypeScopeAndBasenameHelper( "std::set>::iterator", true, "std::set>::", "iterator"); } TEST(Type, CompilerContextPattern) { std::vector mms = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::Struct, ConstString("S")}}; EXPECT_TRUE(contextMatches(mms, mms)); std::vector mmc = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::Class, ConstString("S")}}; EXPECT_FALSE(contextMatches(mms, mmc)); std::vector ms = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Struct, ConstString("S")}}; std::vector mas = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::AnyModule, ConstString("*")}, {CompilerContextKind::Struct, ConstString("S")}}; EXPECT_TRUE(contextMatches(mms, mas)); EXPECT_TRUE(contextMatches(ms, mas)); EXPECT_FALSE(contextMatches(mas, ms)); std::vector mmms = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::Module, ConstString("C")}, {CompilerContextKind::Struct, ConstString("S")}}; EXPECT_TRUE(contextMatches(mmms, mas)); std::vector mme = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::Enum, ConstString("S")}}; std::vector mma = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::AnyType, ConstString("S")}}; EXPECT_TRUE(contextMatches(mme, mma)); EXPECT_TRUE(contextMatches(mms, mma)); std::vector mme2 = { {CompilerContextKind::Module, ConstString("A")}, {CompilerContextKind::Module, ConstString("B")}, {CompilerContextKind::Enum, ConstString("S2")}}; EXPECT_FALSE(contextMatches(mme2, mma)); }