21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/shared_ptr.hpp"
28 using namespace libjmmcg;
37 struct base :
public sp_counter_type<
long, api_lock_traits<platform_api, Mdl>> {
40 bool __fastcall operator<(base
const &a)
const noexcept(
true) {
45 struct derived
final :
public base<Mdl> {
49 struct placement_dtor_test_t
final :
public sp_counter_type<
long, api_lock_traits<platform_api, Mdl>, placement_dtor, api_lock_traits<platform_api, Mdl>::
template atomic_counter_type> {
62 bool __fastcall operator<(placement_dtor_test_t
const &a)
const noexcept(
true) {
75 virtual int val()
const noexcept(
true)=0;
77 template<
class Mdl,
template<
class>
class Del>
78 struct derived_inh_t
final :
public base_inh_t<Mdl>,
public sp_counter_type<
long, api_lock_traits<platform_api, Mdl>, Del, api_lock_traits<platform_api, Mdl>::
template atomic_counter_type> {
87 int val()
const noexcept(
true)
override {
95 bool __fastcall operator<(derived_inh_t
const &a)
const noexcept(
true) {
101 struct stack_test_t
final :
public sp_counter_type<
long, api_lock_traits<platform_api, Mdl>, noop_dtor, api_lock_traits<platform_api, Mdl>::
template noop_atomic_ctr> {
109 BOOST_AUTO_TEST_SUITE(shared_ptr_tests)
111 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor_shared_ptr, Mdl, thread_types)
113 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
116 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
120 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_shared_ptr, Mdl, thread_types)
122 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
124 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
126 BOOST_CHECK_EQUAL(a.get(), ptr_a);
128 BOOST_CHECK(a.get().get()->sp_count()>0);
129 BOOST_CHECK(a.get().get()->sp_count()<2);
132 BOOST_AUTO_TEST_CASE_TEMPLATE(placement_new_ctor_shared_ptr, Mdl, thread_types)
134 typedef shared_ptr<placement_dtor_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
136 char buff[
sizeof(
typename ptr_t::value_type)];
137 typename ptr_t::value_type *ptr_a=
new (buff)
typename ptr_t::value_type;
139 BOOST_CHECK_EQUAL(a.get(), ptr_a);
141 BOOST_CHECK_EQUAL(a->val, 42);
144 BOOST_AUTO_TEST_CASE_TEMPLATE(mixed_dtors_placement_new_ctor_shared_ptr, Mdl, thread_types)
146 typedef derived_inh_t<Mdl, default_delete> def_del_t;
147 typedef derived_inh_t<Mdl, placement_dtor> plment_del_t;
150 char buff[
sizeof(plment_del_t)];
151 def_del_t *ptr_def_del=
new def_del_t(42);
152 plment_del_t *ptr_plment_del=
new (buff) plment_del_t(1066);
153 ptr_t sp_def_del(ptr_def_del);
154 ptr_t sp_plment_del(ptr_plment_del);
155 BOOST_CHECK_EQUAL(sp_def_del.get(), ptr_def_del);
156 BOOST_CHECK(!(!sp_def_del));
157 BOOST_CHECK_EQUAL(sp_def_del->val(), 42);
158 BOOST_CHECK_EQUAL(sp_plment_del.get(), ptr_plment_del);
159 BOOST_CHECK(!(!sp_plment_del));
160 BOOST_CHECK_EQUAL(sp_plment_del->val(), 1066);
163 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_shared_ptr, Mdl, thread_types)
165 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
167 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
170 BOOST_CHECK_EQUAL(a.get(), a1.get());
171 BOOST_CHECK(a.get().get()->sp_count()>1);
172 BOOST_CHECK(a.get().get()->sp_count()<3);
173 BOOST_CHECK(a1.get().get()->sp_count()>1);
174 BOOST_CHECK(a1.get().get()->sp_count()<3);
177 BOOST_AUTO_TEST_CASE_TEMPLATE(move_ctor_shared_ptr, Mdl, thread_types)
179 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
181 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
183 ptr_t a1(
std::move(a));
184 BOOST_CHECK_EQUAL(a1.get(), ptr_a);
185 BOOST_CHECK(a1.get().get()->sp_count()>0);
186 BOOST_CHECK(a1.get().get()->sp_count()<2);
187 BOOST_CHECK_EQUAL(a.get(),
typename ptr_t::atomic_ptr_t());
190 BOOST_AUTO_TEST_CASE_TEMPLATE(unique_ptr_ctor_shared_ptr, Mdl, thread_types)
192 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
194 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
196 BOOST_CHECK(a.get());
197 BOOST_CHECK_EQUAL(ptr_a.get(),
static_cast<
typename ptr_t::value_type *>(0));
200 BOOST_AUTO_TEST_CASE_TEMPLATE(unique_ptr_move_ctor_shared_ptr, Mdl, thread_types)
202 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
204 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
205 ptr_t a(
std::move(ptr_a));
206 BOOST_CHECK(
dynamic_cast<
typename ptr_t::value_type
const *>(a.get().get()));
209 BOOST_AUTO_TEST_CASE_TEMPLATE(reset_shared_ptr, Mdl, thread_types)
211 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
213 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
216 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
220 BOOST_AUTO_TEST_CASE_TEMPLATE(assign_shared_ptr, Mdl, thread_types)
222 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
224 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
228 BOOST_CHECK_EQUAL(a.get(), a1.get());
231 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_assign_shared_ptr, Mdl, thread_types)
233 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
236 a=ptr_t(
new typename ptr_t::value_type);
237 BOOST_CHECK(a.get());
240 BOOST_AUTO_TEST_CASE_TEMPLATE(unique_ptr_ctor_assign_shared_ptr, Mdl, thread_types)
242 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
244 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
247 BOOST_CHECK(a.get());
248 BOOST_CHECK_EQUAL(ptr_a.get(),
static_cast<
typename ptr_t::value_type *>(0));
251 BOOST_AUTO_TEST_CASE_TEMPLATE(equals_shared_ptr, Mdl, thread_types)
253 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
255 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
259 BOOST_CHECK(!(a!=a1));
262 BOOST_AUTO_TEST_CASE_TEMPLATE(not_equals_shared_ptr, Mdl, thread_types)
264 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
266 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
267 typename ptr_t::value_type *ptr_a1=
new typename ptr_t::value_type;
271 BOOST_CHECK(!(a==a1));
274 BOOST_AUTO_TEST_CASE_TEMPLATE(equals_comparators_shared_ptr, Mdl, thread_types)
276 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
278 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
281 BOOST_CHECK(!(a<a1) && !(a>a1));
284 BOOST_AUTO_TEST_CASE_TEMPLATE(not_equals_comparators_shared_ptr, Mdl, thread_types)
286 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
288 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
289 typename ptr_t::value_type *ptr_a1=
new typename ptr_t::value_type;
292 BOOST_CHECK((a<a1) || (a>a1));
295 BOOST_AUTO_TEST_CASE_TEMPLATE(inheritance_wrapping, Mdl, thread_types)
297 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
298 typedef shared_ptr<derived<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_b_t;
300 typename ptr_b_t::value_type *ptr_b=
new typename ptr_b_t::value_type;
302 BOOST_CHECK(b.get()==ptr_b);
305 BOOST_AUTO_TEST_CASE_TEMPLATE(shares_the_ptr, Mdl, thread_types)
307 typedef shared_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
309 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
313 BOOST_CHECK(a.get()==a1.get());
316 BOOST_CHECK(a.get()==ptr_a);
319 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor_stack_test, Mdl, thread_types)
321 typedef shared_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
324 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
328 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_stack_test, Mdl, thread_types)
330 typedef shared_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
332 typename ptr_t::value_type val_a;
334 BOOST_CHECK(a.get()==&val_a);
337 BOOST_AUTO_TEST_CASE_TEMPLATE(shares_stack_test, Mdl, thread_types)
339 typedef shared_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
341 typename ptr_t::value_type val_a;
345 BOOST_CHECK(a.get()==a1.get());
347 BOOST_CHECK_EQUAL(a1->val, 42);
349 BOOST_CHECK(a.get()==&val_a);
350 BOOST_CHECK_EQUAL(a->val, 42);
353 BOOST_AUTO_TEST_SUITE_END()