brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.6 KiB · e3bb2cf Raw
171 lines · cpp
1//===-- TestType.cpp ------------------------------------------------------===//2//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#include "gmock/gmock.h"11#include "gtest/gtest.h"12 13#include "lldb/Symbol/Type.h"14#include "lldb/lldb-enumerations.h"15#include "lldb/lldb-private-enumerations.h"16 17using namespace lldb;18using namespace lldb_private;19using testing::ElementsAre;20using testing::Not;21 22TEST(Type, GetTypeScopeAndBasename) {23  EXPECT_EQ(Type::GetTypeScopeAndBasename("int"),24            (Type::ParsedName{eTypeClassAny, {}, "int"}));25  EXPECT_EQ(Type::GetTypeScopeAndBasename("std::string"),26            (Type::ParsedName{eTypeClassAny, {"std"}, "string"}));27  EXPECT_EQ(Type::GetTypeScopeAndBasename("::std::string"),28            (Type::ParsedName{eTypeClassAny, {"::", "std"}, "string"}));29  EXPECT_EQ(Type::GetTypeScopeAndBasename("struct std::string"),30            (Type::ParsedName{eTypeClassStruct, {"std"}, "string"}));31  EXPECT_EQ(Type::GetTypeScopeAndBasename("std::set<int>"),32            (Type::ParsedName{eTypeClassAny, {"std"}, "set<int>"}));33  EXPECT_EQ(34      Type::GetTypeScopeAndBasename("std::set<int, std::less<int>>"),35      (Type::ParsedName{eTypeClassAny, {"std"}, "set<int, std::less<int>>"}));36  EXPECT_EQ(Type::GetTypeScopeAndBasename("std::string::iterator"),37            (Type::ParsedName{eTypeClassAny, {"std", "string"}, "iterator"}));38  EXPECT_EQ(Type::GetTypeScopeAndBasename("std::set<int>::iterator"),39            (Type::ParsedName{eTypeClassAny, {"std", "set<int>"}, "iterator"}));40  EXPECT_EQ(41      Type::GetTypeScopeAndBasename("std::set<int, std::less<int>>::iterator"),42      (Type::ParsedName{43          eTypeClassAny, {"std", "set<int, std::less<int>>"}, "iterator"}));44  EXPECT_EQ(Type::GetTypeScopeAndBasename(45                "std::set<int, std::less<int>>::iterator<bool>"),46            (Type::ParsedName{eTypeClassAny,47                              {"std", "set<int, std::less<int>>"},48                              "iterator<bool>"}));49 50  EXPECT_EQ(Type::GetTypeScopeAndBasename("std::"), std::nullopt);51  EXPECT_EQ(Type::GetTypeScopeAndBasename("foo<::bar"), std::nullopt);52}53 54namespace {55MATCHER_P(Matches, pattern, "") {56  TypeQuery query(pattern, TypeQueryOptions::e_none);57  return query.ContextMatches(arg);58}59MATCHER_P(MatchesIgnoringModules, pattern, "") {60  TypeQuery query(pattern, TypeQueryOptions::e_ignore_modules);61  return query.ContextMatches(arg);62}63MATCHER_P(MatchesWithStrictNamespaces, pattern, "") {64  TypeQuery query(pattern, TypeQueryOptions::e_strict_namespaces);65  return query.ContextMatches(arg);66}67} // namespace68 69TEST(Type, TypeQueryFlags) {70  TypeQuery q("foo", e_none);71  auto get = [](const TypeQuery &q) -> std::vector<bool> {72    return {q.GetFindOne(), q.GetExactMatch(), q.GetModuleSearch(),73            q.GetIgnoreModules(), q.GetStrictNamespaces()};74  };75  EXPECT_THAT(get(q), ElementsAre(false, false, false, false, false));76 77  q.SetFindOne(true);78  EXPECT_THAT(get(q), ElementsAre(true, false, false, false, false));79 80  q.SetIgnoreModules(true);81  EXPECT_THAT(get(q), ElementsAre(true, false, false, true, false));82 83  q.SetStrictNamespaces(true);84  EXPECT_THAT(get(q), ElementsAre(true, false, false, true, true));85 86  q.SetIgnoreModules(false);87  EXPECT_THAT(get(q), ElementsAre(true, false, false, false, true));88}89 90TEST(Type, CompilerContextPattern) {91  auto make_module = [](llvm::StringRef name) {92    return CompilerContext(CompilerContextKind::Module, ConstString(name));93  };94  auto make_class = [](llvm::StringRef name) {95    return CompilerContext(CompilerContextKind::ClassOrStruct,96                           ConstString(name));97  };98  auto make_any_type = [](llvm::StringRef name) {99    return CompilerContext(CompilerContextKind::AnyType, ConstString(name));100  };101  auto make_enum = [](llvm::StringRef name) {102    return CompilerContext(CompilerContextKind::Enum, ConstString(name));103  };104  auto make_namespace = [](llvm::StringRef name) {105    return CompilerContext(CompilerContextKind::Namespace, ConstString(name));106  };107 108  EXPECT_THAT(109      (std::vector{make_module("A"), make_module("B"), make_class("C")}),110      Matches(111          std::vector{make_module("A"), make_module("B"), make_class("C")}));112  EXPECT_THAT(113      (std::vector{make_module("A"), make_module("B"), make_class("C")}),114      Not(Matches(std::vector{make_class("C")})));115  EXPECT_THAT(116      (std::vector{make_module("A"), make_module("B"), make_class("C")}),117      MatchesIgnoringModules(std::vector{make_class("C")}));118  EXPECT_THAT(119      (std::vector{make_module("A"), make_module("B"), make_class("C")}),120      MatchesIgnoringModules(std::vector{make_module("B"), make_class("C")}));121  EXPECT_THAT(122      (std::vector{make_module("A"), make_module("B"), make_class("C")}),123      Not(MatchesIgnoringModules(124          std::vector{make_module("A"), make_class("C")})));125  EXPECT_THAT((std::vector{make_module("A"), make_module("B"), make_enum("C")}),126              Matches(std::vector{make_module("A"), make_module("B"),127                                  make_any_type("C")}));128  EXPECT_THAT(129      (std::vector{make_module("A"), make_module("B"), make_class("C")}),130      Matches(131          std::vector{make_module("A"), make_module("B"), make_any_type("C")}));132  EXPECT_THAT((std::vector{make_module("A"), make_module("B"),133                           make_namespace(""), make_class("C")}),134              Matches(std::vector{make_module("A"), make_module("B"),135                                  make_any_type("C")}));136  EXPECT_THAT(137      (std::vector{make_module("A"), make_module("B"), make_enum("C2")}),138      Not(Matches(std::vector{make_module("A"), make_module("B"),139                              make_any_type("C")})));140  EXPECT_THAT((std::vector{make_class("C")}),141              Matches(std::vector{make_class("C")}));142  EXPECT_THAT((std::vector{make_namespace("NS"), make_class("C")}),143              Not(Matches(std::vector{make_any_type("C")})));144 145  EXPECT_THAT((std::vector{make_namespace(""), make_class("C")}),146              Matches(std::vector{make_class("C")}));147  EXPECT_THAT((std::vector{make_namespace(""), make_class("C")}),148              Not(MatchesWithStrictNamespaces(std::vector{make_class("C")})));149  EXPECT_THAT((std::vector{make_namespace(""), make_class("C")}),150              Matches(std::vector{make_namespace(""), make_class("C")}));151  EXPECT_THAT((std::vector{make_namespace(""), make_class("C")}),152              MatchesWithStrictNamespaces(153                  std::vector{make_namespace(""), make_class("C")}));154  EXPECT_THAT((std::vector{make_class("C")}),155              Not(Matches(std::vector{make_namespace(""), make_class("C")})));156  EXPECT_THAT((std::vector{make_class("C")}),157              Not(MatchesWithStrictNamespaces(158                  std::vector{make_namespace(""), make_class("C")})));159  EXPECT_THAT((std::vector{make_namespace(""), make_namespace("NS"),160                           make_namespace(""), make_class("C")}),161              Matches(std::vector{make_namespace("NS"), make_class("C")}));162  EXPECT_THAT(163      (std::vector{make_namespace(""), make_namespace(""), make_namespace("NS"),164                   make_namespace(""), make_namespace(""), make_class("C")}),165      Matches(std::vector{make_namespace("NS"), make_class("C")}));166  EXPECT_THAT((std::vector{make_module("A"), make_namespace("NS"),167                           make_namespace(""), make_class("C")}),168              MatchesIgnoringModules(169                  std::vector{make_namespace("NS"), make_class("C")}));170}171