/** * * \section COPYRIGHT * * Copyright 2013-2020 Software Radio Systems Limited * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the distribution. * */ #include "srslte/srslog/detail/support/any.h" #include "testing_helpers.h" using namespace srslog; static bool when_default_constructed_then_any_is_empty() { detail::any a; ASSERT_EQ(a.has_value(), false); ASSERT_EQ(detail::any_cast(&a), nullptr); const detail::any b; ASSERT_EQ(b.has_value(), false); ASSERT_EQ(detail::any_cast(&b), nullptr); return true; } namespace { struct copyable_object { explicit copyable_object(int x) : x(x) {} copyable_object(const copyable_object&) = default; int x; }; struct movable_object { explicit movable_object(int x) : x(x) {} movable_object(movable_object&&) = default; int x; }; } // namespace static bool when_constructed_with_lvalue_then_any_has_value() { copyable_object value(5); detail::any a(value); ASSERT_EQ(a.has_value(), true); const copyable_object* p = detail::any_cast(&a); ASSERT_NE(p, nullptr); ASSERT_EQ(p->x, 5); ASSERT_EQ(detail::any_cast(&a), nullptr); return true; } static bool when_constructed_with_rvalue_then_any_has_value() { movable_object value(5); detail::any a(std::move(value)); ASSERT_EQ(a.has_value(), true); const movable_object* p = detail::any_cast(&a); ASSERT_NE(p, nullptr); ASSERT_EQ(p->x, 5); ASSERT_EQ(detail::any_cast(&a), nullptr); return true; } static bool when_constructed_with_make_any_then_any_has_int() { int value = 5; auto a = detail::make_any(value); ASSERT_EQ(a.has_value(), true); const int* p = detail::any_cast(&a); ASSERT_NE(p, nullptr); ASSERT_EQ(*p, value); ASSERT_EQ(detail::any_cast(&a), nullptr); return true; } static bool when_move_constructing_from_any_then_contents_are_transferred() { int value = 5; detail::any a(value); detail::any b(std::move(a)); ASSERT_EQ(a.has_value(), false); ASSERT_EQ(b.has_value(), true); const int* p = detail::any_cast(&b); ASSERT_NE(p, nullptr); ASSERT_EQ(*p, value); ASSERT_EQ(detail::any_cast(&b), nullptr); return true; } static bool when_move_assigning_from_any_then_contents_are_transferred() { int value = 5; detail::any a(value); detail::any b(3.0); b = std::move(a); ASSERT_EQ(a.has_value(), false); ASSERT_EQ(b.has_value(), true); const int* p = detail::any_cast(&b); ASSERT_NE(p, nullptr); ASSERT_EQ(*p, value); ASSERT_EQ(detail::any_cast(&b), nullptr); return true; } static bool when_any_is_reset_then_value_is_lost() { detail::any a(1); a.reset(); ASSERT_EQ(a.has_value(), false); return true; } static bool when_swapping_any_then_values_are_exchanged() { int i = 5; detail::any a(i); double d = 3.14; detail::any b(d); swap(a, b); ASSERT_EQ(*detail::any_cast(&a), d); ASSERT_EQ(*detail::any_cast(&b), i); return true; } static bool when_null_is_passed_to_any_cast_then_null_is_returned() { detail::any* p = nullptr; const detail::any* cp = nullptr; ASSERT_EQ(detail::any_cast(p), nullptr); ASSERT_EQ(detail::any_cast(cp), nullptr); return true; } static bool when_empty_any_is_passed_to_any_cast_then_null_is_returned() { detail::any a; const detail::any b; ASSERT_EQ(detail::any_cast(&a), nullptr); ASSERT_EQ(detail::any_cast(&b), nullptr); return true; } int main() { TEST_FUNCTION(when_default_constructed_then_any_is_empty); TEST_FUNCTION(when_constructed_with_lvalue_then_any_has_value); TEST_FUNCTION(when_constructed_with_rvalue_then_any_has_value); TEST_FUNCTION(when_constructed_with_make_any_then_any_has_int); TEST_FUNCTION(when_move_constructing_from_any_then_contents_are_transferred); TEST_FUNCTION(when_move_assigning_from_any_then_contents_are_transferred); TEST_FUNCTION(when_any_is_reset_then_value_is_lost); TEST_FUNCTION(when_swapping_any_then_values_are_exchanged); TEST_FUNCTION(when_null_is_passed_to_any_cast_then_null_is_returned); TEST_FUNCTION(when_empty_any_is_passed_to_any_cast_then_null_is_returned); return 0; }