blob: 8526f29973cbc6c9271f2c5a91fa8308545b3ee4 [file] [log] [blame]
Patrick Williams4690d882020-10-08 11:09:58 -05001#include <sdbusplus/utility/dedup_variant.hpp>
Paul Fertser5770f512022-01-10 11:05:41 +00002#include <sdbusplus/utility/merge_variants.hpp>
Patrick Williams0c841a12016-07-20 12:34:24 -05003#include <sdbusplus/utility/type_traits.hpp>
Patrick Williams127b8ab2020-05-21 15:24:19 -05004
William A. Kennington III977d4d42018-06-23 00:33:08 -07005#include <type_traits>
Patrick Williams0c841a12016-07-20 12:34:24 -05006
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +02007#include <gmock/gmock.h>
Patrick Venture95269db2018-08-31 09:19:17 -07008
William A. Kennington III977d4d42018-06-23 00:33:08 -07009namespace
Patrick Williams0c841a12016-07-20 12:34:24 -050010{
Patrick Williams0c841a12016-07-20 12:34:24 -050011
William A. Kennington III977d4d42018-06-23 00:33:08 -070012using sdbusplus::utility::array_to_ptr_t;
Patrick Williams64f01222021-07-14 10:14:51 -050013using std::is_same_v;
William A. Kennington III977d4d42018-06-23 00:33:08 -070014
15TEST(TypeTraits, Basic)
16{
17
Patrick Williams64f01222021-07-14 10:14:51 -050018 static_assert(is_same_v<char, array_to_ptr_t<char, char>>,
Andrew Geissler072da3e2018-01-18 07:21:42 -080019 "array_to_ptr_t<char, char> != char");
Patrick Williams0c841a12016-07-20 12:34:24 -050020
Patrick Williams64f01222021-07-14 10:14:51 -050021 static_assert(is_same_v<char*, array_to_ptr_t<char, char*>>,
Andrew Geissler072da3e2018-01-18 07:21:42 -080022 "array_to_ptr_t<char, char*> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050023
Patrick Williams64f01222021-07-14 10:14:51 -050024 static_assert(is_same_v<char*, array_to_ptr_t<char, char[100]>>,
Andrew Geissler072da3e2018-01-18 07:21:42 -080025 "array_to_ptr_t<char, char[100]> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050026
Patrick Williams64f01222021-07-14 10:14:51 -050027 static_assert(is_same_v<char[100], array_to_ptr_t<int, char[100]>>,
William A. Kennington III977d4d42018-06-23 00:33:08 -070028 "array_to_ptr_t<int, char[100]> != char[100]");
Patrick Williams0c841a12016-07-20 12:34:24 -050029}
William A. Kennington III977d4d42018-06-23 00:33:08 -070030
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +020031TEST(TypeTraits, HasMemberFind)
32{
33 using sdbusplus::utility::has_member_find_v;
34 using namespace testing;
35
36 ASSERT_THAT((has_member_find_v<std::map<std::string, int>>), Eq(true));
37 ASSERT_THAT((has_member_find_v<std::vector<std::pair<std::string, int>>>),
38 Eq(false));
39
40 struct Foo
41 {
42 using value_type = std::pair<int, int>;
43
44 void find(std::tuple_element_t<0, value_type>)
45 {}
46 };
47
48 struct Bar
49 {};
50
51 ASSERT_THAT(has_member_find_v<Foo>, Eq(true));
52 ASSERT_THAT(has_member_find_v<Foo&>, Eq(true));
53 ASSERT_THAT(has_member_find_v<const Foo&>, Eq(true));
54
55 ASSERT_THAT(has_member_find_v<Bar>, Eq(false));
56}
57
58TEST(TypeTraits, HasMemberContains)
59{
60 using sdbusplus::utility::has_member_contains_v;
61 using namespace testing;
62
63 // std::map has member_contains from c++20
Patrick Williams2e988612021-04-14 14:49:25 -050064 ASSERT_THAT((has_member_contains_v<std::map<std::string, int>>), Eq(true));
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +020065 ASSERT_THAT(
66 (has_member_contains_v<std::vector<std::pair<std::string, int>>>),
67 Eq(false));
68
69 struct Foo
70 {
71 using value_type = std::pair<int, int>;
72
73 void contains(std::tuple_element_t<0, value_type>)
74 {}
75 };
76
77 struct Bar
78 {};
79
80 ASSERT_THAT(has_member_contains_v<Foo>, Eq(true));
81 ASSERT_THAT(has_member_contains_v<Foo&>, Eq(true));
82 ASSERT_THAT(has_member_contains_v<const Foo&>, Eq(true));
83
84 ASSERT_THAT(has_member_contains_v<Bar>, Eq(false));
85}
86
Patrick Williams4690d882020-10-08 11:09:58 -050087// Tests for dedup_variant.
88static_assert(std::is_same_v<std::variant<size_t>,
Patrick Williams34cf6932021-07-14 09:46:31 -050089 sdbusplus::utility::dedup_variant_t<size_t>>);
90static_assert(
91 std::is_same_v<std::variant<char, size_t>,
92 sdbusplus::utility::dedup_variant_t<char, size_t>>);
Patrick Williams4690d882020-10-08 11:09:58 -050093static_assert(std::is_same_v<
94 std::variant<uint32_t, uint64_t>,
Patrick Williams34cf6932021-07-14 09:46:31 -050095 sdbusplus::utility::dedup_variant_t<uint32_t, uint64_t, size_t>>);
Patrick Williams4690d882020-10-08 11:09:58 -050096
Paul Fertser5770f512022-01-10 11:05:41 +000097// Tests for merge_variants.
98static_assert(
99 std::is_same_v<std::variant<size_t>,
100 sdbusplus::utility::merge_variants_t<std::variant<size_t>>>);
101static_assert(std::is_same_v<std::variant<char, uint32_t, uint64_t>,
102 sdbusplus::utility::merge_variants_t<
103 std::variant<char, uint32_t>,
104 std::variant<uint32_t, uint64_t, size_t>>>);
105
William A. Kennington III977d4d42018-06-23 00:33:08 -0700106} // namespace