123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Howard Hinnant 2009
- // (C) Copyright Ion Gaztanaga 2014-2014.
- //
- // Distributed under 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/libs/move for documentation.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include <boost/move/utility_core.hpp>
- #include <boost/move/unique_ptr.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/core/lightweight_test.hpp>
- //////////////////////////////////////////////
- //
- // The initial implementation of these tests
- // was written by Howard Hinnant.
- //
- // These test were later refactored grouping
- // and porting them to Boost.Move.
- //
- // Many thanks to Howard for releasing his C++03
- // unique_ptr implementation with such detailed
- // test cases.
- //
- //////////////////////////////////////////////
- #include "unique_ptr_test_utils_beg.hpp"
- namespace bml = ::boost::movelib;
- ////////////////////////////////
- // unique_ptr_observers_dereference
- ////////////////////////////////
- namespace unique_ptr_observers_dereference{
- void test()
- {
- //Single unique_ptr
- {
- bml::unique_ptr<int> p(new int(3));
- BOOST_TEST(*p == 3);
- }
- //Unbounded array unique_ptr
- {
- int *pi = new int[2];
- pi[0] = 3;
- pi[1] = 4;
- bml::unique_ptr<int[]> p(pi);
- BOOST_TEST(p[0] == 3);
- BOOST_TEST(p[1] == 4);
- }
- //Bounded array unique_ptr
- {
- int *pi = new int[2];
- pi[0] = 3;
- pi[1] = 4;
- bml::unique_ptr<int[2]> p(pi);
- BOOST_TEST(p[0] == 3);
- BOOST_TEST(p[1] == 4);
- }
- }
- } //namespace unique_ptr_observers_dereference{
- ////////////////////////////////
- // unique_ptr_observers_dereference
- ////////////////////////////////
- namespace unique_ptr_observers_explicit_bool{
- void test()
- {
- //Single unique_ptr
- {
- bml::unique_ptr<int> p(new int(3));
- if (p)
- ;
- else
- BOOST_TEST(false);
- if (!p)
- BOOST_TEST(false);
- }
- {
- bml::unique_ptr<int> p;
- if (!p)
- ;
- else
- BOOST_TEST(false);
- if (p)
- BOOST_TEST(false);
- }
- //Unbounded array unique_ptr
- {
- bml::unique_ptr<int[]> p(new int[2]);
- if (p)
- ;
- else
- BOOST_TEST(false);
- if (!p)
- BOOST_TEST(false);
- }
- {
- bml::unique_ptr<int[]> p;
- if (!p)
- ;
- else
- BOOST_TEST(false);
- if (p)
- BOOST_TEST(false);
- }
- //Bounded array unique_ptr
- {
- bml::unique_ptr<int[2]> p(new int[2]);
- if (p)
- ;
- else
- BOOST_TEST(false);
- if (!p)
- BOOST_TEST(false);
- }
- {
- bml::unique_ptr<int[2]> p;
- if (!p)
- ;
- else
- BOOST_TEST(false);
- if (p)
- BOOST_TEST(false);
- }
- }
- } //namespace unique_ptr_observers_explicit_bool{
- ////////////////////////////////
- // unique_ptr_observers_get
- ////////////////////////////////
- namespace unique_ptr_observers_get{
- void test()
- {
- //Single unique_ptr
- {
- int* p = new int;
- bml::unique_ptr<int> s(p);
- BOOST_TEST(s.get() == p);
- }
- //Unbounded array unique_ptr
- {
- int* p = new int[2];
- bml::unique_ptr<int[]> s(p);
- BOOST_TEST(s.get() == p);
- }
- {
- int* p = new int[2];
- bml::unique_ptr<int[2]> s(p);
- BOOST_TEST(s.get() == p);
- }
- //Bounded array unique_ptr
- {
- int *pi = new int[2];
- pi[0] = 3;
- pi[1] = 4;
- bml::unique_ptr<int[2]> p(pi);
- BOOST_TEST(p[0] == 3);
- BOOST_TEST(p[1] == 4);
- }
- }
- } //namespace unique_ptr_observers_get{
- ////////////////////////////////
- // unique_ptr_observers_get_deleter
- ////////////////////////////////
- namespace unique_ptr_observers_get_deleter{
- struct Deleter
- {
- void operator()(void*) {}
- int test() {return 5;}
- int test() const {return 6;}
- };
- void test()
- {
- //Single unique_ptr
- {
- bml::unique_ptr<int, Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 5);
- }
- {
- const bml::unique_ptr<int, Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 6);
- }
- //Unbounded array unique_ptr
- {
- bml::unique_ptr<int[], Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 5);
- }
- {
- const bml::unique_ptr<int[], Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 6);
- }
- //Bounded array unique_ptr
- {
- bml::unique_ptr<int[2], Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 5);
- }
- {
- const bml::unique_ptr<int[2], Deleter> p;
- BOOST_TEST(p.get_deleter().test() == 6);
- }
- }
- } //namespace unique_ptr_observers_get_deleter{
- ////////////////////////////////
- // unique_ptr_observers_op_arrow
- ////////////////////////////////
- namespace unique_ptr_observers_op_arrow{
- void test()
- {
- //Single unique_ptr
- {
- bml::unique_ptr<A> p(new A);
- BOOST_TEST(p->state_ == 999);
- }
- }
- } //namespace unique_ptr_observers_op_arrow{
- namespace unique_ptr_observers_op_index{
- void test()
- {
- //Unbounded array unique_ptr
- {
- A *pa = new A[2];
- //pa[0] is left default constructed
- pa[1].set(888);
- bml::unique_ptr<A[]> p(pa);
- BOOST_TEST(p[0].state_ == 999);
- BOOST_TEST(p[1].state_ == 888);
- }
- //Bounded array unique_ptr
- {
- A *pa = new A[2];
- //pa[0] is left default constructed
- pa[1].set(888);
- bml::unique_ptr<A[2]> p(pa);
- BOOST_TEST(p[0].state_ == 999);
- BOOST_TEST(p[1].state_ == 888);
- }
- }
- } //namespace unique_ptr_observers_op_index{
- ////////////////////////////////
- // main
- ////////////////////////////////
- int main()
- {
- //Observers
- unique_ptr_observers_dereference::test();
- unique_ptr_observers_explicit_bool::test();
- unique_ptr_observers_get::test();
- unique_ptr_observers_get_deleter::test();
- unique_ptr_observers_op_arrow::test();
- unique_ptr_observers_op_index::test();
- //Test results
- return boost::report_errors();
- }
- #include "unique_ptr_test_utils_end.hpp"
|