blob: 33bf8c15abfddf60da268c6709513b6f57e08dbb [file] [log] [blame]
Patrick Williams0c841a12016-07-20 12:34:24 -05001#include <sdbusplus/utility/type_traits.hpp>
Patrick Williams127b8ab2020-05-21 15:24:19 -05002
William A. Kennington III977d4d42018-06-23 00:33:08 -07003#include <type_traits>
Patrick Williams0c841a12016-07-20 12:34:24 -05004
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +02005#include <gmock/gmock.h>
Patrick Venture95269db2018-08-31 09:19:17 -07006
William A. Kennington III977d4d42018-06-23 00:33:08 -07007namespace
Patrick Williams0c841a12016-07-20 12:34:24 -05008{
Patrick Williams0c841a12016-07-20 12:34:24 -05009
William A. Kennington III977d4d42018-06-23 00:33:08 -070010using sdbusplus::utility::array_to_ptr_t;
11using std::is_same;
12
13TEST(TypeTraits, Basic)
14{
15
16 static_assert(is_same<char, array_to_ptr_t<char, char>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080017 "array_to_ptr_t<char, char> != char");
Patrick Williams0c841a12016-07-20 12:34:24 -050018
William A. Kennington III977d4d42018-06-23 00:33:08 -070019 static_assert(is_same<char*, array_to_ptr_t<char, char*>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080020 "array_to_ptr_t<char, char*> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050021
William A. Kennington III977d4d42018-06-23 00:33:08 -070022 static_assert(is_same<char*, array_to_ptr_t<char, char[100]>>::value,
Andrew Geissler072da3e2018-01-18 07:21:42 -080023 "array_to_ptr_t<char, char[100]> != char*");
Patrick Williams0c841a12016-07-20 12:34:24 -050024
William A. Kennington III977d4d42018-06-23 00:33:08 -070025 static_assert(is_same<char[100], array_to_ptr_t<int, char[100]>>::value,
26 "array_to_ptr_t<int, char[100]> != char[100]");
Patrick Williams0c841a12016-07-20 12:34:24 -050027}
William A. Kennington III977d4d42018-06-23 00:33:08 -070028
Krzysztof Grobelny09b88f22020-09-02 14:49:01 +020029TEST(TypeTraits, HasMemberFind)
30{
31 using sdbusplus::utility::has_member_find_v;
32 using namespace testing;
33
34 ASSERT_THAT((has_member_find_v<std::map<std::string, int>>), Eq(true));
35 ASSERT_THAT((has_member_find_v<std::vector<std::pair<std::string, int>>>),
36 Eq(false));
37
38 struct Foo
39 {
40 using value_type = std::pair<int, int>;
41
42 void find(std::tuple_element_t<0, value_type>)
43 {}
44 };
45
46 struct Bar
47 {};
48
49 ASSERT_THAT(has_member_find_v<Foo>, Eq(true));
50 ASSERT_THAT(has_member_find_v<Foo&>, Eq(true));
51 ASSERT_THAT(has_member_find_v<const Foo&>, Eq(true));
52
53 ASSERT_THAT(has_member_find_v<Bar>, Eq(false));
54}
55
56TEST(TypeTraits, HasMemberContains)
57{
58 using sdbusplus::utility::has_member_contains_v;
59 using namespace testing;
60
61 // std::map has member_contains from c++20
62 ASSERT_THAT((has_member_contains_v<std::map<std::string, int>>), Eq(false));
63 ASSERT_THAT(
64 (has_member_contains_v<std::vector<std::pair<std::string, int>>>),
65 Eq(false));
66
67 struct Foo
68 {
69 using value_type = std::pair<int, int>;
70
71 void contains(std::tuple_element_t<0, value_type>)
72 {}
73 };
74
75 struct Bar
76 {};
77
78 ASSERT_THAT(has_member_contains_v<Foo>, Eq(true));
79 ASSERT_THAT(has_member_contains_v<Foo&>, Eq(true));
80 ASSERT_THAT(has_member_contains_v<const Foo&>, Eq(true));
81
82 ASSERT_THAT(has_member_contains_v<Bar>, Eq(false));
83}
84
William A. Kennington III977d4d42018-06-23 00:33:08 -070085} // namespace