21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/unique_ptr.hpp"
27 #include "core/deleter.hpp"
28 #include "core/thread_api_traits.hpp"
30 using namespace libjmmcg;
40 using lock_traits=api_lock_traits<platform_api, Mdl>;
43 virtual ~
base()
noexcept(
true) {}
46 deleter_t().operator()(
this);
49 bool __fastcall operator<(base
const &a)
const noexcept(
true) {
54 struct derived
final :
public base<Mdl> {
55 using base_t=base<Mdl>;
56 using lock_traits=
typename base_t::lock_traits;
57 using deleter_t=
typename base_t::deleter_t;
60 struct placement_dtor_test_t {
61 using lock_traits=api_lock_traits<platform_api, Mdl>;
71 deleter_t().operator()(
this);
74 bool __fastcall operator<(placement_dtor_test_t
const &a)
const noexcept(
true) {
81 using lock_traits=api_lock_traits<platform_api, Mdl>;
86 virtual int val()
const noexcept(
true)=0;
89 deleter_t().operator()(
this);
92 template<
class Mdl,
template<
class>
class Del>
93 struct derived_inh_t
final :
public base_inh_t<Mdl> {
95 using lock_traits=
typename base_t::lock_traits;
96 using deleter_t=Del<derived_inh_t>;
103 int val()
const noexcept(
true)
override {
108 deleter_t().operator()(
this);
111 bool __fastcall operator<(derived_inh_t
const &a)
const noexcept(
true) {
117 struct stack_test_t {
118 using lock_traits=api_lock_traits<platform_api, Mdl>;
128 deleter_t().operator()(
this);
132 BOOST_AUTO_TEST_SUITE(unique_ptr_tests)
134 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor_unique_ptr, Mdl, thread_types)
136 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
139 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
143 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_unique_ptr, Mdl, thread_types)
145 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
147 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
149 BOOST_CHECK_EQUAL(a.get(), ptr_a);
153 BOOST_AUTO_TEST_CASE_TEMPLATE(placement_new_ctor_unique_ptr, Mdl, thread_types)
155 typedef unique_ptr<placement_dtor_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
157 char buff[
sizeof(
typename ptr_t::value_type)];
158 typename ptr_t::value_type *ptr_a=
new (buff)
typename ptr_t::value_type;
160 BOOST_CHECK_EQUAL(a.get(), ptr_a);
162 BOOST_CHECK_EQUAL(a->val, 42);
165 BOOST_AUTO_TEST_CASE_TEMPLATE(mixed_dtors_placement_new_ctor_unique_ptr, Mdl, thread_types)
167 typedef derived_inh_t<Mdl, default_delete> def_del_t;
168 typedef derived_inh_t<Mdl, placement_dtor> plment_del_t;
171 char buff[
sizeof(plment_del_t)];
172 def_del_t *ptr_def_del=
new def_del_t(42);
173 plment_del_t *ptr_plment_del=
new (buff) plment_del_t(1066);
174 ptr_t sp_def_del(ptr_def_del);
175 ptr_t sp_plment_del(ptr_plment_del);
176 BOOST_CHECK_EQUAL(sp_def_del.get(), ptr_def_del);
177 BOOST_CHECK(!(!sp_def_del));
178 BOOST_CHECK_EQUAL(sp_def_del->val(), 42);
179 BOOST_CHECK_EQUAL(sp_plment_del.get(), ptr_plment_del);
180 BOOST_CHECK(!(!sp_plment_del));
181 BOOST_CHECK_EQUAL(sp_plment_del->val(), 1066);
184 BOOST_AUTO_TEST_CASE_TEMPLATE(move_ctor_unique_ptr, Mdl, thread_types)
186 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
188 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
190 ptr_t a1(
std::move(a));
191 BOOST_CHECK_EQUAL(a1.get(), ptr_a);
192 BOOST_CHECK_EQUAL(a.get(),
typename ptr_t::atomic_ptr_t());
195 BOOST_AUTO_TEST_CASE_TEMPLATE(unique_ptr_ctor_unique_ptr, Mdl, thread_types)
197 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
199 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
200 ptr_t a(
std::move(ptr_a));
201 BOOST_CHECK(a.get());
202 BOOST_CHECK_EQUAL(ptr_a.get(),
static_cast<
typename ptr_t::value_type *>(0));
205 BOOST_AUTO_TEST_CASE_TEMPLATE(unique_ptr_move_ctor_unique_ptr, Mdl, thread_types)
207 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
209 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
210 ptr_t a(
std::move(ptr_a));
211 BOOST_CHECK(
dynamic_cast<
typename ptr_t::value_type
const *>(a.get().get()));
214 BOOST_AUTO_TEST_CASE_TEMPLATE(reset_unique_ptr, Mdl, thread_types)
216 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
218 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
221 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
225 BOOST_AUTO_TEST_CASE_TEMPLATE(assign_move_unique_ptr, Mdl, thread_types)
227 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
229 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
233 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
234 BOOST_CHECK_EQUAL(a1.get(), ptr_a);
237 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_assign_unique_ptr, Mdl, thread_types)
239 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
242 a=ptr_t(
new typename ptr_t::value_type);
243 BOOST_CHECK(a.get());
246 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_assign_move_unique_ptr, Mdl, thread_types)
248 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
250 std::unique_ptr<
typename ptr_t::value_type,
typename ptr_t::value_type::deleter_t> ptr_a(
new typename ptr_t::value_type);
252 a=ptr_t(
std::move(ptr_a));
253 BOOST_CHECK(a.get());
254 BOOST_CHECK_EQUAL(ptr_a.get(),
static_cast<
typename ptr_t::value_type *>(0));
257 BOOST_AUTO_TEST_CASE_TEMPLATE(equals_move, Mdl, thread_types)
259 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
261 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
263 ptr_t a1(
std::move(a));
267 BOOST_AUTO_TEST_CASE_TEMPLATE(not_equals_unique_ptr, Mdl, thread_types)
269 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
271 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
272 typename ptr_t::value_type *ptr_a1=
new typename ptr_t::value_type;
276 BOOST_CHECK(!(a==a1));
279 BOOST_AUTO_TEST_CASE_TEMPLATE(equals_comparators_unique_ptr, Mdl, thread_types)
281 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
283 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
285 ptr_t a1(
std::move(a));
286 BOOST_CHECK(!(a<a1) && !(a>a1));
289 BOOST_AUTO_TEST_CASE_TEMPLATE(not_equals_comparators_unique_ptr, Mdl, thread_types)
291 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
293 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
294 typename ptr_t::value_type *ptr_a1=
new typename ptr_t::value_type;
297 BOOST_CHECK((a<a1) || (a>a1));
300 BOOST_AUTO_TEST_CASE_TEMPLATE(inheritance_wrapping, Mdl, thread_types)
302 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
303 typedef unique_ptr<derived<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_b_t;
305 typename ptr_b_t::value_type *ptr_b=
new typename ptr_b_t::value_type;
307 BOOST_CHECK(b.get()==ptr_b);
310 BOOST_AUTO_TEST_CASE_TEMPLATE(moves_the_ptr, Mdl, thread_types)
312 typedef unique_ptr<base<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
314 typename ptr_t::value_type *ptr_a=
new typename ptr_t::value_type;
317 ptr_t a1(
std::move(a));
318 BOOST_CHECK(a.get()!=a1.get());
321 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
324 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor_stack_test, Mdl, thread_types)
326 typedef unique_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
329 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
333 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor_stack_test, Mdl, thread_types)
335 typedef unique_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
337 typename ptr_t::value_type val_a;
339 BOOST_CHECK(a.get()==&val_a);
342 BOOST_AUTO_TEST_CASE_TEMPLATE(moves_stack_test, Mdl, thread_types)
344 typedef unique_ptr<stack_test_t<Mdl>, api_lock_traits<platform_api, Mdl>> ptr_t;
346 typename ptr_t::value_type val_a;
349 ptr_t a1(
std::move(a));
350 BOOST_CHECK(a.get()!=a1.get());
352 BOOST_CHECK_EQUAL(a1->val, 42);
354 BOOST_CHECK_EQUAL(a.get(),
static_cast<
typename ptr_t::value_type *>(0));
357 BOOST_AUTO_TEST_SUITE_END()