blob: 79201d6ba2e59cdcdb57b3337fffeb9eb75e1751 [file] [log] [blame]
//===-- TestType.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 "gtest/gtest.h"
#include "lldb/Symbol/Type.h"
#include "lldb/lldb-enumerations.h"
using namespace lldb;
using namespace lldb_private;
TEST(Type, GetTypeScopeAndBasename) {
EXPECT_EQ(Type::GetTypeScopeAndBasename("int"),
(Type::ParsedName{eTypeClassAny, {}, "int"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("std::string"),
(Type::ParsedName{eTypeClassAny, {"std"}, "string"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("::std::string"),
(Type::ParsedName{eTypeClassAny, {"::", "std"}, "string"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("struct std::string"),
(Type::ParsedName{eTypeClassStruct, {"std"}, "string"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("std::set<int>"),
(Type::ParsedName{eTypeClassAny, {"std"}, "set<int>"}));
EXPECT_EQ(
Type::GetTypeScopeAndBasename("std::set<int, std::less<int>>"),
(Type::ParsedName{eTypeClassAny, {"std"}, "set<int, std::less<int>>"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("std::string::iterator"),
(Type::ParsedName{eTypeClassAny, {"std", "string"}, "iterator"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("std::set<int>::iterator"),
(Type::ParsedName{eTypeClassAny, {"std", "set<int>"}, "iterator"}));
EXPECT_EQ(
Type::GetTypeScopeAndBasename("std::set<int, std::less<int>>::iterator"),
(Type::ParsedName{
eTypeClassAny, {"std", "set<int, std::less<int>>"}, "iterator"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename(
"std::set<int, std::less<int>>::iterator<bool>"),
(Type::ParsedName{eTypeClassAny,
{"std", "set<int, std::less<int>>"},
"iterator<bool>"}));
EXPECT_EQ(Type::GetTypeScopeAndBasename("std::"), std::nullopt);
EXPECT_EQ(Type::GetTypeScopeAndBasename("foo<::bar"), std::nullopt);
}
TEST(Type, CompilerContextPattern) {
std::vector<CompilerContext> mmc = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::Module, ConstString("B")},
{CompilerContextKind::ClassOrStruct, ConstString("S")}};
std::vector<CompilerContext> mc = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::ClassOrStruct, ConstString("S")}};
std::vector<CompilerContext> mac = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::AnyModule, ConstString("*")},
{CompilerContextKind::ClassOrStruct, ConstString("S")}};
EXPECT_TRUE(contextMatches(mmc, mac));
EXPECT_TRUE(contextMatches(mc, mac));
EXPECT_FALSE(contextMatches(mac, mc));
std::vector<CompilerContext> mmmc = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::Module, ConstString("B")},
{CompilerContextKind::Module, ConstString("C")},
{CompilerContextKind::ClassOrStruct, ConstString("S")}};
EXPECT_TRUE(contextMatches(mmmc, mac));
std::vector<CompilerContext> mme = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::Module, ConstString("B")},
{CompilerContextKind::Enum, ConstString("S")}};
std::vector<CompilerContext> mma = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::Module, ConstString("B")},
{CompilerContextKind::AnyType, ConstString("S")}};
EXPECT_TRUE(contextMatches(mme, mma));
EXPECT_TRUE(contextMatches(mmc, mma));
std::vector<CompilerContext> mme2 = {
{CompilerContextKind::Module, ConstString("A")},
{CompilerContextKind::Module, ConstString("B")},
{CompilerContextKind::Enum, ConstString("S2")}};
EXPECT_FALSE(contextMatches(mme2, mma));
}