diff options
Diffstat (limited to 'libs/optional/test/optional_ref_assign_test_defs.hpp')
-rw-r--r-- | libs/optional/test/optional_ref_assign_test_defs.hpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/libs/optional/test/optional_ref_assign_test_defs.hpp b/libs/optional/test/optional_ref_assign_test_defs.hpp new file mode 100644 index 000000000..292d0fc35 --- /dev/null +++ b/libs/optional/test/optional_ref_assign_test_defs.hpp @@ -0,0 +1,197 @@ +// Copyright (C) 2014 Andrzej Krzemienski. +// +// Use, modification, and distribution is subject to the Boost Software +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// See http://www.boost.org/lib/optional for documentation. +// +// You are welcome to contact the author at: akrzemi1@gmail.com + +#ifndef BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP +#define BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP + +#include "boost/optional/optional.hpp" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#include "boost/core/addressof.hpp" +#include "testable_classes.hpp" + +using boost::optional; +using boost::none; +using boost::addressof; + +template <typename T> +void test_copy_assignment_for_const() +{ + const typename concrete_type_of<T>::type v(2); + optional<const T&> o; + o = optional<const T&>(v); + + BOOST_TEST(o); + BOOST_TEST(o != none); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST(val(*o) == val(v)); + BOOST_TEST(val(*o) == 2); +} + +template <typename T> +void test_copy_assignment_for_noconst_const() +{ + typename concrete_type_of<T>::type v(2); + optional<const T&> o; + o = optional<const T&>(v); + + BOOST_TEST(o); + BOOST_TEST(o != none); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST(val(*o) == val(v)); + BOOST_TEST(val(*o) == 2); + + val(v) = 9; + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 9); + BOOST_TEST_EQ(val(v), 9); +} + +template <typename T> +void test_copy_assignment_for() +{ + typename concrete_type_of<T>::type v(2); + optional<T&> o; + o = optional<T&>(v); + + BOOST_TEST(o); + BOOST_TEST(o != none); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST(val(*o) == val(v)); + BOOST_TEST(val(*o) == 2); + + val(v) = 9; + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 9); + BOOST_TEST_EQ(val(v), 9); + + val(*o) = 7; + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 7); + BOOST_TEST_EQ(val(v), 7); +} + +template <typename T> +void test_rebinding_assignment_semantics_const() +{ + const typename concrete_type_of<T>::type v(2), w(7); + optional<const T&> o(v); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 2); + + o = optional<const T&>(w); + BOOST_TEST_EQ(val(v), 2); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) != addressof(v)); + BOOST_TEST_NE(val(*o), val(v)); + BOOST_TEST_NE(val(*o), 2); + + BOOST_TEST(addressof(*o) == addressof(w)); + BOOST_TEST_EQ(val(*o), val(w)); + BOOST_TEST_EQ(val(*o), 7); +} + +template <typename T> +void test_rebinding_assignment_semantics_noconst_const() +{ + typename concrete_type_of<T>::type v(2), w(7); + optional<const T&> o(v); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 2); + + o = optional<const T&>(w); + BOOST_TEST_EQ(val(v), 2); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) != addressof(v)); + BOOST_TEST_NE(val(*o), val(v)); + BOOST_TEST_NE(val(*o), 2); + + BOOST_TEST(addressof(*o) == addressof(w)); + BOOST_TEST_EQ(val(*o), val(w)); + BOOST_TEST_EQ(val(*o), 7); +} + +template <typename T> +void test_rebinding_assignment_semantics() +{ + typename concrete_type_of<T>::type v(2), w(7); + optional<T&> o(v); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) == addressof(v)); + BOOST_TEST_EQ(val(*o), val(v)); + BOOST_TEST_EQ(val(*o), 2); + + o = optional<T&>(w); + BOOST_TEST_EQ(val(v), 2); + + BOOST_TEST(o); + BOOST_TEST(addressof(*o) != addressof(v)); + BOOST_TEST_NE(val(*o), val(v)); + BOOST_TEST_NE(val(*o), 2); + + BOOST_TEST(addressof(*o) == addressof(w)); + BOOST_TEST_EQ(val(*o), val(w)); + BOOST_TEST_EQ(val(*o), 7); + + val(*o) = 8; + BOOST_TEST(addressof(*o) == addressof(w)); + BOOST_TEST_EQ(val(*o), val(w)); + BOOST_TEST_EQ(val(*o), 8); + BOOST_TEST_EQ(val(w), 8); + BOOST_TEST_EQ(val(v), 2); +} + +template <typename T> +void test_converting_assignment() +{ + typename concrete_type_of<T>::type v1(1), v2(2), v3(3); + optional<T&> oA(v1), oB(none); + + oA = v2; + BOOST_TEST(oA); + BOOST_TEST(addressof(*oA) == addressof(v2)); + + oB = v3; + BOOST_TEST(oB); + BOOST_TEST(addressof(*oB) == addressof(v3)); +} + +template <typename T> +void test_converting_assignment_for_noconst_const() +{ + typename concrete_type_of<T>::type v1(1), v2(2), v3(3); + optional<const T&> oA(v1), oB(none); + + oA = v2; + BOOST_TEST(oA); + BOOST_TEST(addressof(*oA) == addressof(v2)); + + oB = v3; + BOOST_TEST(oB); + BOOST_TEST(addressof(*oB) == addressof(v3)); +} + +#endif //BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP + |