blob: 36450ebc21beb9bc3d7edbfa90f6dac7ea4446c6 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/symbols/identifier.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/common/err.h"
namespace zxdb {
TEST(Identifier, GetName) {
// Empty.
Identifier unqualified;
EXPECT_EQ("", unqualified.GetFullName());
// Single name with no "::" at the beginning.
unqualified.AppendComponent(IdentifierComponent("First"));
EXPECT_EQ("First", unqualified.GetFullName());
std::vector<std::string> expected_index = {"First"};
// Single name with a "::" at the beginning.
Identifier qualified(IdentifierQualification::kGlobal, IdentifierComponent("First"));
EXPECT_EQ("::First", qualified.GetFullName());
// Append some template stuff (not parsed in any way).
qualified.AppendComponent(IdentifierComponent("Second<int, Foo>"));
EXPECT_EQ("::First::Second<int, Foo>", qualified.GetFullName());
// One with an anoynymous name in it.
Identifier anon(IdentifierQualification::kGlobal, IdentifierComponent(std::string()));
EXPECT_EQ("::$anon", anon.GetFullName());
anon.AppendComponent(IdentifierComponent("SomeFunction"));
EXPECT_EQ("::$anon::SomeFunction", anon.GetFullName());
// ELF function.
Identifier elf(IdentifierQualification::kRelative,
IdentifierComponent(SpecialIdentifier::kElf, "pthread_key_create"));
EXPECT_EQ("$elf(pthread_key_create)", elf.GetFullName());
// PLT function.
Identifier plt(IdentifierQualification::kRelative,
IdentifierComponent(SpecialIdentifier::kPlt, "zx_foo_bar"));
EXPECT_EQ("$plt(zx_foo_bar)", plt.GetFullName());
// Main function.
Identifier main(IdentifierQualification::kRelative,
IdentifierComponent(SpecialIdentifier::kMain));
EXPECT_EQ("$main", main.GetFullName());
}
TEST(Identifier, GetScope) {
std::string name1("Name1");
std::string name2("Name2");
std::string name3("Name3");
// "" -> "".
Identifier empty;
EXPECT_EQ("", empty.GetScope().GetDebugName());
// "::" -> "::".
Identifier scope_only(IdentifierQualification::kGlobal);
EXPECT_EQ("::", scope_only.GetScope().GetDebugName());
// "Name1" -> "".
Identifier name_only(IdentifierQualification::kRelative, IdentifierComponent(name1));
EXPECT_EQ("", name_only.GetScope().GetDebugName());
// ::Name1" -> "::".
Identifier scoped_name(IdentifierQualification::kGlobal, IdentifierComponent(name1));
EXPECT_EQ("::", scoped_name.GetScope().GetDebugName());
// "Name1::Name2" -> "Name1".
Identifier two_names(IdentifierQualification::kRelative, IdentifierComponent(name1));
two_names.AppendComponent(IdentifierComponent(name2));
EXPECT_EQ("\"Name1\"", two_names.GetScope().GetDebugName());
// "::Name1::Name2" -> "::Name1".
Identifier two_scoped_names(IdentifierQualification::kGlobal, IdentifierComponent(name1));
two_scoped_names.AppendComponent(IdentifierComponent(name2));
EXPECT_EQ("::\"Name1\"", two_scoped_names.GetScope().GetDebugName());
// "Name1::Name2::Name3" -> "Name1::Name2".
Identifier three_scoped_names(IdentifierQualification::kRelative, IdentifierComponent(name1));
three_scoped_names.AppendComponent(IdentifierComponent(name2));
three_scoped_names.AppendComponent(IdentifierComponent(name3));
EXPECT_EQ("\"Name1\"; ::\"Name2\"", three_scoped_names.GetScope().GetDebugName());
}
} // namespace zxdb