1 #include "../gintenlib/clonable_ptr.hpp"
4 #include <boost/test/minimal.hpp>
8 void test_pointer( const gintenlib::clonable_ptr<T>& p )
10 // まず get() と get_pointer() のチェック
11 BOOST_CHECK( p.get() == get_pointer(p) );
17 BOOST_CHECK( !p == false );
19 // operator*, operator-> のチェック
20 BOOST_CHECK( p.get() == &*p );
21 BOOST_CHECK( p.get() == p.operator->() );
23 // use_count と unique のチェック
24 BOOST_CHECK( ( p.use_count() == 1 ) == p.unique() );
29 BOOST_CHECK( p.get() == 0 );
34 BOOST_CHECK( p.use_count() == 0 );
36 BOOST_CHECK( !p.unique() );
43 void test1( const gintenlib::clonable_ptr<T>& p0 )
45 using gintenlib::clonable_ptr;
63 int count = p0.use_count();
66 clonable_ptr<T> p1 = p0;
69 // アドレスと参照カウントの両面で等しいことを確認
70 BOOST_CHECK( p0 == p1 );
71 BOOST_CHECK( p0.use_count() == p1.use_count() );
73 // また、コピーが出来た分、参照カウントは増えているはず
76 BOOST_CHECK( p0.use_count() == count+1 );
80 // NULL の場合は参照カウントはゼロになる
81 BOOST_CHECK( count == 0 );
82 BOOST_CHECK( p0.use_count() == 0 );
87 BOOST_CHECK( p1 == 0 );
92 BOOST_CHECK( p0.use_count() == count );
98 int count = p0.use_count();
106 // clone() しても参照カウントは変わらない
107 BOOST_CHECK( p0.use_count() == count );
111 // clone で作られたオブジェクトは unique
112 BOOST_CHECK( p1.unique() );
113 // clone したため、別のオブジェクトが格納されてるはず
114 BOOST_CHECK( p0 != p1 );
118 // NULL の場合は p1 もゼロのはず
122 // 生ポインタで to_unique の確認
124 // これまでの過程で p1 は null か unique のはず
125 BOOST_CHECK( !p1 || p1.unique() );
126 // unique のときは to_unique() を呼んでも何もしないはず
128 BOOST_CHECK( p_ == p1.get() );
132 // 次に p1 にふたたび p0 の値を入れる
138 // これにより、NULL であるかユニークじゃないかの状態になった
139 BOOST_CHECK( !p1 || !p1.unique() );
140 // unique を呼ぶと p0 は変化せず p1 が変化するはず
142 BOOST_CHECK( p_ == p0.get() );
143 BOOST_CHECK( !p1 || p_ != p1.get() );
151 int count = p0.use_count();
153 boost::shared_ptr<T> p1 = to_shared( p0 );
155 BOOST_CHECK( p0.get() == p1.get() );
157 BOOST_CHECK( !p0 || p0.use_count() == count+1 );
159 // shared_ptr がリセットされた場合、ちゃんと参照カウントは減る?
161 BOOST_CHECK( p0.use_count() == count );
167 clonable_ptr<const T> p1 = p0;
170 // アドレスとカウントが等しいことを確認
171 BOOST_CHECK( p0 == p1 );
172 BOOST_CHECK( p0.use_count() == p1.use_count() );
174 // const T 型のポインタで reset してみる
175 p1.reset( static_cast<const T*>( new T() ) );
176 // reset 後は当然 unique()
177 BOOST_CHECK( p1 && p1.unique() );
181 // const T => T の変換( clone すれば可能 )
182 clonable_ptr<T> p2 = p1.clone();
184 // clonable_ptr<T> p2 = p1;
188 // clone() 後なので当然 unique
189 BOOST_CHECK( p2 && p2.unique() );
190 BOOST_CHECK( p1 != p2 );
196 int test_main( int argc, char* argv[] )
198 test1( gintenlib::clonable_ptr<int>( new int() ) );
199 test1( gintenlib::clonable_ptr<int>( static_cast<int*>(0) ) );