blob: e1e9473c6e5f17438820356bc70920c96f6ade27 [file] [log] [blame]
Patrick Williams4690d882020-10-08 11:09:58 -05001#include <sdbusplus/utility/dedup_variant.hpp>
Patrick Williams0c841a12016-07-20 12:34:24 -05002#include <sdbusplus/utility/type_traits.hpp>
Patrick Williams127b8ab2020-05-21 15:24:19 -05003
William A. Kennington III977d4d42018-06-23 00:33:08 -07004#include <type_traits>
Patrick Williams0c841a12016-07-20 12:34:24 -05005
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +02006#include <gmock/gmock.h>
Patrick Venture95269db2018-08-31 09:19:17 -07007
William A. Kennington III977d4d42018-06-23 00:33:08 -07008namespace
Patrick Williams0c841a12016-07-20 12:34:24 -05009{
Patrick Williams0c841a12016-07-20 12:34:24 -050010
William A. Kennington III977d4d42018-06-23 00:33:08 -070011using sdbusplus::utility::array_to_ptr_t;
12using std::is_same;
13
14TEST(TypeTraits, Basic)
15{
16
17 static_assert(is_same<char, array_to_ptr_t<char, char>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080018 "array_to_ptr_t<char, char> != char");
Patrick Williams0c841a12016-07-20 12:34:24 -050019
William A. Kennington III977d4d42018-06-23 00:33:08 -070020 static_assert(is_same<char*, array_to_ptr_t<char, char*>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080021 "array_to_ptr_t<char, char*> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050022
William A. Kennington III977d4d42018-06-23 00:33:08 -070023 static_assert(is_same<char*, array_to_ptr_t<char, char[100]>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080024 "array_to_ptr_t<char, char[100]> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050025
William A. Kennington III977d4d42018-06-23 00:33:08 -070026 static_assert(is_same<char[100], array_to_ptr_t<int, char[100]>>::value,
27 "array_to_ptr_t<int, char[100]> != char[100]");
Patrick Williams0c841a12016-07-20 12:34:24 -050028}
William A. Kennington III977d4d42018-06-23 00:33:08 -070029
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +020030TEST(TypeTraits, HasMemberFind)
31{
32 using sdbusplus::utility::has_member_find_v;
33 using namespace testing;
34
35 ASSERT_THAT((has_member_find_v<std::map<std::string, int>>), Eq(true));
36 ASSERT_THAT((has_member_find_v<std::vector<std::pair<std::string, int>>>),
37 Eq(false));
38
39 struct Foo
40 {
41 using value_type = std::pair<int, int>;
42
43 void find(std::tuple_element_t<0, value_type>)
44 {}
45 };
46
47 struct Bar
48 {};
49
50 ASSERT_THAT(has_member_find_v<Foo>, Eq(true));
51 ASSERT_THAT(has_member_find_v<Foo&>, Eq(true));
52 ASSERT_THAT(has_member_find_v<const Foo&>, Eq(true));
53
54 ASSERT_THAT(has_member_find_v<Bar>, Eq(false));
55}
56
57TEST(TypeTraits, HasMemberContains)
58{
59 using sdbusplus::utility::has_member_contains_v;
60 using namespace testing;
61
62 // std::map has member_contains from c++20
Patrick Williams2e988612021-04-14 14:49:25 -050063 ASSERT_THAT((has_member_contains_v<std::map<std::string, int>>), Eq(true));
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +020064 ASSERT_THAT(
65 (has_member_contains_v<std::vector<std::pair<std::string, int>>>),
66 Eq(false));
67
68 struct Foo
69 {
70 using value_type = std::pair<int, int>;
71
72 void contains(std::tuple_element_t<0, value_type>)
73 {}
74 };
75
76 struct Bar
77 {};
78
79 ASSERT_THAT(has_member_contains_v<Foo>, Eq(true));
80 ASSERT_THAT(has_member_contains_v<Foo&>, Eq(true));
81 ASSERT_THAT(has_member_contains_v<const Foo&>, Eq(true));
82
83 ASSERT_THAT(has_member_contains_v<Bar>, Eq(false));
84}
85
Patrick Williams4690d882020-10-08 11:09:58 -050086// Tests for dedup_variant.
87static_assert(std::is_same_v<std::variant<size_t>,
88 sdbusplus::utility::dedup_variant<size_t>>);
89static_assert(std::is_same_v<std::variant<char, size_t>,
90 sdbusplus::utility::dedup_variant<char, size_t>>);
91static_assert(std::is_same_v<
92 std::variant<uint32_t, uint64_t>,
93 sdbusplus::utility::dedup_variant<uint32_t, uint64_t, size_t>>);
94
William A. Kennington III977d4d42018-06-23 00:33:08 -070095} // namespace