1 // Copyright (C) 2014 Andrzej Krzemienski.
3 // Use, modification, and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/lib/optional for documentation.
9 // You are welcome to contact the author at: akrzemi1@gmail.com
11 #ifndef BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
12 #define BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
14 #include "boost/optional/optional.hpp"
20 #include "boost/core/addressof.hpp"
21 #include "testable_classes.hpp"
23 using boost::optional;
25 using boost::addressof;
28 void test_copy_assignment_for_const()
30 const typename concrete_type_of<T>::type v(2);
32 o = optional<const T&>(v);
35 BOOST_TEST(o != none);
36 BOOST_TEST(addressof(*o) == addressof(v));
37 BOOST_TEST(val(*o) == val(v));
38 BOOST_TEST(val(*o) == 2);
42 void test_copy_assignment_for_noconst_const()
44 typename concrete_type_of<T>::type v(2);
46 o = optional<const T&>(v);
49 BOOST_TEST(o != none);
50 BOOST_TEST(addressof(*o) == addressof(v));
51 BOOST_TEST(val(*o) == val(v));
52 BOOST_TEST(val(*o) == 2);
55 BOOST_TEST(addressof(*o) == addressof(v));
56 BOOST_TEST_EQ(val(*o), val(v));
57 BOOST_TEST_EQ(val(*o), 9);
58 BOOST_TEST_EQ(val(v), 9);
62 void test_copy_assignment_for()
64 typename concrete_type_of<T>::type v(2);
69 BOOST_TEST(o != none);
70 BOOST_TEST(addressof(*o) == addressof(v));
71 BOOST_TEST(val(*o) == val(v));
72 BOOST_TEST(val(*o) == 2);
75 BOOST_TEST(addressof(*o) == addressof(v));
76 BOOST_TEST_EQ(val(*o), val(v));
77 BOOST_TEST_EQ(val(*o), 9);
78 BOOST_TEST_EQ(val(v), 9);
81 BOOST_TEST(addressof(*o) == addressof(v));
82 BOOST_TEST_EQ(val(*o), val(v));
83 BOOST_TEST_EQ(val(*o), 7);
84 BOOST_TEST_EQ(val(v), 7);
88 void test_rebinding_assignment_semantics_const()
90 const typename concrete_type_of<T>::type v(2), w(7);
91 optional<const T&> o(v);
94 BOOST_TEST(addressof(*o) == addressof(v));
95 BOOST_TEST_EQ(val(*o), val(v));
96 BOOST_TEST_EQ(val(*o), 2);
98 o = optional<const T&>(w);
99 BOOST_TEST_EQ(val(v), 2);
102 BOOST_TEST(addressof(*o) != addressof(v));
103 BOOST_TEST_NE(val(*o), val(v));
104 BOOST_TEST_NE(val(*o), 2);
106 BOOST_TEST(addressof(*o) == addressof(w));
107 BOOST_TEST_EQ(val(*o), val(w));
108 BOOST_TEST_EQ(val(*o), 7);
111 template <typename T>
112 void test_rebinding_assignment_semantics_noconst_const()
114 typename concrete_type_of<T>::type v(2), w(7);
115 optional<const T&> o(v);
118 BOOST_TEST(addressof(*o) == addressof(v));
119 BOOST_TEST_EQ(val(*o), val(v));
120 BOOST_TEST_EQ(val(*o), 2);
122 o = optional<const T&>(w);
123 BOOST_TEST_EQ(val(v), 2);
126 BOOST_TEST(addressof(*o) != addressof(v));
127 BOOST_TEST_NE(val(*o), val(v));
128 BOOST_TEST_NE(val(*o), 2);
130 BOOST_TEST(addressof(*o) == addressof(w));
131 BOOST_TEST_EQ(val(*o), val(w));
132 BOOST_TEST_EQ(val(*o), 7);
135 template <typename T>
136 void test_rebinding_assignment_semantics()
138 typename concrete_type_of<T>::type v(2), w(7);
142 BOOST_TEST(addressof(*o) == addressof(v));
143 BOOST_TEST_EQ(val(*o), val(v));
144 BOOST_TEST_EQ(val(*o), 2);
147 BOOST_TEST_EQ(val(v), 2);
150 BOOST_TEST(addressof(*o) != addressof(v));
151 BOOST_TEST_NE(val(*o), val(v));
152 BOOST_TEST_NE(val(*o), 2);
154 BOOST_TEST(addressof(*o) == addressof(w));
155 BOOST_TEST_EQ(val(*o), val(w));
156 BOOST_TEST_EQ(val(*o), 7);
159 BOOST_TEST(addressof(*o) == addressof(w));
160 BOOST_TEST_EQ(val(*o), val(w));
161 BOOST_TEST_EQ(val(*o), 8);
162 BOOST_TEST_EQ(val(w), 8);
163 BOOST_TEST_EQ(val(v), 2);
166 template <typename T, typename U>
167 void test_converting_assignment()
169 typename concrete_type_of<T>::type v1(1), v2(2), v3(3);
170 optional<U&> oA(v1), oB(none);
174 BOOST_TEST(addressof(*oA) == addressof(v2));
178 BOOST_TEST(addressof(*oB) == addressof(v3));
181 #endif //BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP