1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Howard Hinnant 2009 4 // (C) Copyright Ion Gaztanaga 2014-2014. 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // (See accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt) 9 // 10 // See http://www.boost.org/libs/move for documentation. 11 // 12 ////////////////////////////////////////////////////////////////////////////// 13 #include <boost/move/utility_core.hpp> 14 #include <boost/move/unique_ptr.hpp> 15 #include <boost/static_assert.hpp> 16 #include <boost/core/lightweight_test.hpp> 17 18 ////////////////////////////////////////////// 19 // 20 // The initial implementation of these tests 21 // was written by Howard Hinnant. 22 // 23 // These test were later refactored grouping 24 // and porting them to Boost.Move. 25 // 26 // Many thanks to Howard for releasing his C++03 27 // unique_ptr implementation with such detailed 28 // test cases. 29 // 30 ////////////////////////////////////////////// 31 32 #include "unique_ptr_test_utils_beg.hpp" 33 34 namespace bml = ::boost::movelib; 35 36 //////////////////////////////// 37 // unique_ptr_observers_dereference 38 //////////////////////////////// 39 40 namespace unique_ptr_observers_dereference{ 41 test()42void test() 43 { 44 //Single unique_ptr 45 { 46 bml::unique_ptr<int> p(new int(3)); 47 BOOST_TEST(*p == 3); 48 } 49 //Unbounded array unique_ptr 50 { 51 int *pi = new int[2]; 52 pi[0] = 3; 53 pi[1] = 4; 54 bml::unique_ptr<int[]> p(pi); 55 BOOST_TEST(p[0] == 3); 56 BOOST_TEST(p[1] == 4); 57 } 58 //Bounded array unique_ptr 59 { 60 int *pi = new int[2]; 61 pi[0] = 3; 62 pi[1] = 4; 63 bml::unique_ptr<int[2]> p(pi); 64 BOOST_TEST(p[0] == 3); 65 BOOST_TEST(p[1] == 4); 66 } 67 } 68 69 } //namespace unique_ptr_observers_dereference{ 70 71 //////////////////////////////// 72 // unique_ptr_observers_dereference 73 //////////////////////////////// 74 75 namespace unique_ptr_observers_explicit_bool{ 76 test()77void test() 78 { 79 //Single unique_ptr 80 { 81 bml::unique_ptr<int> p(new int(3)); 82 if (p) 83 ; 84 else 85 BOOST_TEST(false); 86 if (!p) 87 BOOST_TEST(false); 88 } 89 { 90 bml::unique_ptr<int> p; 91 if (!p) 92 ; 93 else 94 BOOST_TEST(false); 95 if (p) 96 BOOST_TEST(false); 97 } 98 //Unbounded array unique_ptr 99 { 100 bml::unique_ptr<int[]> p(new int[2]); 101 if (p) 102 ; 103 else 104 BOOST_TEST(false); 105 if (!p) 106 BOOST_TEST(false); 107 } 108 { 109 bml::unique_ptr<int[]> p; 110 if (!p) 111 ; 112 else 113 BOOST_TEST(false); 114 if (p) 115 BOOST_TEST(false); 116 } 117 //Bounded array unique_ptr 118 { 119 bml::unique_ptr<int[2]> p(new int[2]); 120 if (p) 121 ; 122 else 123 BOOST_TEST(false); 124 if (!p) 125 BOOST_TEST(false); 126 } 127 { 128 bml::unique_ptr<int[2]> p; 129 if (!p) 130 ; 131 else 132 BOOST_TEST(false); 133 if (p) 134 BOOST_TEST(false); 135 } 136 } 137 138 } //namespace unique_ptr_observers_explicit_bool{ 139 140 //////////////////////////////// 141 // unique_ptr_observers_get 142 //////////////////////////////// 143 144 namespace unique_ptr_observers_get{ 145 test()146void test() 147 { 148 //Single unique_ptr 149 { 150 int* p = new int; 151 bml::unique_ptr<int> s(p); 152 BOOST_TEST(s.get() == p); 153 } 154 //Unbounded array unique_ptr 155 { 156 int* p = new int[2]; 157 bml::unique_ptr<int[]> s(p); 158 BOOST_TEST(s.get() == p); 159 } 160 { 161 int* p = new int[2]; 162 bml::unique_ptr<int[2]> s(p); 163 BOOST_TEST(s.get() == p); 164 } 165 //Bounded array unique_ptr 166 { 167 int *pi = new int[2]; 168 pi[0] = 3; 169 pi[1] = 4; 170 bml::unique_ptr<int[2]> p(pi); 171 BOOST_TEST(p[0] == 3); 172 BOOST_TEST(p[1] == 4); 173 } 174 } 175 176 } //namespace unique_ptr_observers_get{ 177 178 //////////////////////////////// 179 // unique_ptr_observers_get_deleter 180 //////////////////////////////// 181 182 namespace unique_ptr_observers_get_deleter{ 183 184 struct Deleter 185 { operator ()unique_ptr_observers_get_deleter::Deleter186 void operator()(void*) {} 187 testunique_ptr_observers_get_deleter::Deleter188 int test() {return 5;} testunique_ptr_observers_get_deleter::Deleter189 int test() const {return 6;} 190 }; 191 test()192void test() 193 { 194 //Single unique_ptr 195 { 196 bml::unique_ptr<int, Deleter> p; 197 BOOST_TEST(p.get_deleter().test() == 5); 198 } 199 { 200 const bml::unique_ptr<int, Deleter> p; 201 BOOST_TEST(p.get_deleter().test() == 6); 202 } 203 //Unbounded array unique_ptr 204 { 205 bml::unique_ptr<int[], Deleter> p; 206 BOOST_TEST(p.get_deleter().test() == 5); 207 } 208 { 209 const bml::unique_ptr<int[], Deleter> p; 210 BOOST_TEST(p.get_deleter().test() == 6); 211 } 212 //Bounded array unique_ptr 213 { 214 bml::unique_ptr<int[2], Deleter> p; 215 BOOST_TEST(p.get_deleter().test() == 5); 216 } 217 { 218 const bml::unique_ptr<int[2], Deleter> p; 219 BOOST_TEST(p.get_deleter().test() == 6); 220 } 221 } 222 223 } //namespace unique_ptr_observers_get_deleter{ 224 225 //////////////////////////////// 226 // unique_ptr_observers_op_arrow 227 //////////////////////////////// 228 229 namespace unique_ptr_observers_op_arrow{ 230 test()231void test() 232 { 233 //Single unique_ptr 234 { 235 bml::unique_ptr<A> p(new A); 236 BOOST_TEST(p->state_ == 999); 237 } 238 } 239 240 } //namespace unique_ptr_observers_op_arrow{ 241 242 243 namespace unique_ptr_observers_op_index{ 244 test()245void test() 246 { 247 //Unbounded array unique_ptr 248 { 249 A *pa = new A[2]; 250 //pa[0] is left default constructed 251 pa[1].set(888); 252 bml::unique_ptr<A[]> p(pa); 253 BOOST_TEST(p[0].state_ == 999); 254 BOOST_TEST(p[1].state_ == 888); 255 } 256 //Bounded array unique_ptr 257 { 258 A *pa = new A[2]; 259 //pa[0] is left default constructed 260 pa[1].set(888); 261 bml::unique_ptr<A[2]> p(pa); 262 BOOST_TEST(p[0].state_ == 999); 263 BOOST_TEST(p[1].state_ == 888); 264 } 265 } 266 267 } //namespace unique_ptr_observers_op_index{ 268 269 //////////////////////////////// 270 // main 271 //////////////////////////////// main()272int main() 273 { 274 //Observers 275 unique_ptr_observers_dereference::test(); 276 unique_ptr_observers_explicit_bool::test(); 277 unique_ptr_observers_get::test(); 278 unique_ptr_observers_get_deleter::test(); 279 unique_ptr_observers_op_arrow::test(); 280 unique_ptr_observers_op_index::test(); 281 282 //Test results 283 return boost::report_errors(); 284 285 } 286 287 #include "unique_ptr_test_utils_end.hpp" 288