1 #include <sdbusplus/utility/dedup_variant.hpp> 2 #include <sdbusplus/utility/merge_variants.hpp> 3 #include <sdbusplus/utility/type_traits.hpp> 4 5 #include <type_traits> 6 7 #include <gmock/gmock.h> 8 9 namespace 10 { 11 12 using sdbusplus::utility::array_to_ptr_t; 13 using std::is_same_v; 14 15 TEST(TypeTraits, Basic) 16 { 17 static_assert(is_same_v<char, array_to_ptr_t<char, char>>, 18 "array_to_ptr_t<char, char> != char"); 19 20 static_assert(is_same_v<char*, array_to_ptr_t<char, char*>>, 21 "array_to_ptr_t<char, char*> != char*"); 22 23 static_assert(is_same_v<char*, array_to_ptr_t<char, char[100]>>, 24 "array_to_ptr_t<char, char[100]> != char*"); 25 26 static_assert(is_same_v<char[100], array_to_ptr_t<int, char[100]>>, 27 "array_to_ptr_t<int, char[100]> != char[100]"); 28 } 29 30 TEST(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 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 56 TEST(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(true)); 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 struct Bar 75 {}; 76 77 ASSERT_THAT(has_member_contains_v<Foo>, Eq(true)); 78 ASSERT_THAT(has_member_contains_v<Foo&>, Eq(true)); 79 ASSERT_THAT(has_member_contains_v<const Foo&>, Eq(true)); 80 81 ASSERT_THAT(has_member_contains_v<Bar>, Eq(false)); 82 } 83 84 TEST(TypeTraits, IsOptional) 85 { 86 using sdbusplus::utility::is_optional; 87 using sdbusplus::utility::is_optional_v; 88 89 ASSERT_TRUE(is_optional<std::optional<int>>::value); 90 ASSERT_TRUE(is_optional<std::optional<int>&>::value); 91 ASSERT_FALSE(is_optional<int>::value); 92 93 ASSERT_TRUE(is_optional_v<std::optional<int>>); 94 ASSERT_TRUE(is_optional_v<std::optional<int>&>); 95 ASSERT_FALSE(is_optional_v<int>); 96 } 97 98 // Tests for dedup_variant. 99 static_assert(std::is_same_v<std::variant<size_t>, 100 sdbusplus::utility::dedup_variant_t<size_t>>); 101 static_assert( 102 std::is_same_v<std::variant<char, size_t>, 103 sdbusplus::utility::dedup_variant_t<char, size_t>>); 104 static_assert(std::is_same_v< 105 std::variant<uint32_t, uint64_t>, 106 sdbusplus::utility::dedup_variant_t<uint32_t, uint64_t, size_t>>); 107 108 // Tests for merge_variants. 109 static_assert( 110 std::is_same_v<std::variant<size_t>, 111 sdbusplus::utility::merge_variants_t<std::variant<size_t>>>); 112 static_assert(std::is_same_v<std::variant<char, uint32_t, uint64_t>, 113 sdbusplus::utility::merge_variants_t< 114 std::variant<char, uint32_t>, 115 std::variant<uint32_t, uint64_t, size_t>>>); 116 117 } // namespace 118