blob: 50a4eda4823e184931e518df008ae3915c348f91 [file] [log] [blame] [edit]
// Copyright 2014 The Chromium OS 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 <brillo/type_name_undecorate.h>
#include <map>
#include <brillo/variant_dictionary.h>
#include <gtest/gtest.h>
namespace brillo {
// Tests using tags from the __PRETTY_FUNCTION__ don't work when using RTTI
// to get the type name.
#ifndef USE_RTTI_FOR_TYPE_TAGS
TEST(TypeTags, GetTypeTag) {
EXPECT_STREQ("const char *brillo::GetTypeTag() [T = int]", GetTypeTag<int>());
EXPECT_STREQ(
"const char *brillo::GetTypeTag() [T = std::__1::map<std::__1::"
"basic_string<char, std::__1::char_traits<char>, "
"std::__1::allocator<char> >, brillo::Any, std::__1::less<"
"std::__1::basic_string<char, std::__1::char_traits<char>, "
"std::__1::allocator<char> > >, std::__1::allocator<std::__1::"
"pair<const std::__1::basic_string<char, std::__1::char_traits"
"<char>, std::__1::allocator<char> >, brillo::Any> > >]",
GetTypeTag<VariantDictionary>());
EXPECT_STREQ("const char *brillo::GetTypeTag() [T = int []]",
GetTypeTag<int[]>());
}
#endif // USE_RTTI_FOR_TYPE_TAGS
TEST(TypeDecoration, UndecorateTypeName) {
EXPECT_EQ("int", UndecorateTypeName("i"));
EXPECT_EQ("char const* brillo::GetTypeTag<unsigned long long>()",
UndecorateTypeName("_ZN6brillo10GetTypeTagIyEEPKcv"));
EXPECT_EQ("std::__1::to_string(int)",
UndecorateTypeName("_ZNSt3__19to_stringEi"));
}
#ifndef USE_RTTI_FOR_TYPE_TAGS
TEST(TypeDecoration, GetUndecoratedTypeNameForTag) {
EXPECT_EQ("int", GetUndecoratedTypeNameForTag(
"const char *brillo::GetTypeTag() [T = int]"));
EXPECT_EQ("int []", GetUndecoratedTypeNameForTag(
"const char *brillo::GetTypeTag() [T = int []]"));
EXPECT_EQ("foo::bar<int []>()",
GetUndecoratedTypeNameForTag(
"const char *brillo::GetTypeTag() [T = foo::bar<int []>()]"));
}
TEST(TypeDecoration, GetUndecoratedTypeName) {
EXPECT_EQ("int", GetUndecoratedTypeName<int>());
EXPECT_EQ("int *", GetUndecoratedTypeName<int*>());
EXPECT_EQ("const int *", GetUndecoratedTypeName<const int*>());
EXPECT_EQ("int []", GetUndecoratedTypeName<int[]>());
EXPECT_EQ("bool", GetUndecoratedTypeName<bool>());
EXPECT_EQ("char", GetUndecoratedTypeName<char>());
EXPECT_EQ("float", GetUndecoratedTypeName<float>());
EXPECT_EQ("double", GetUndecoratedTypeName<double>());
EXPECT_EQ("long", GetUndecoratedTypeName<long>()); // NOLINT(runtime/int)
EXPECT_EQ(
"std::__1::map<int, double, std::__1::less<int>, "
"std::__1::allocator<std::__1::pair<const int, double> > >",
(GetUndecoratedTypeName<std::map<int, double>>()));
}
#endif // USE_RTTI_FOR_TYPE_TAGS
} // namespace brillo