libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
factory.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2002 by J.M.a_cacheGuiness, coder@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include <boost/mpl/list.hpp>
25 
26 #include "core/factory.hpp"
27 
28 using namespace libjmmcg;
29 
31 
32 BOOST_AUTO_TEST_SUITE(factory_creator_tests)
33 
34 struct A {
35  const int i;
36 
37  explicit inline A(const int j)
38  : i(j) {
39  }
40 
41  void operator=(A const &)=delete;
42 };
43 
44 template<class T> typename T::created_type __fastcall
46  return typename T::created_type(new A(1));
47 }
48 
49 template<class T> typename T::created_type __fastcall
51  return typename T::created_type(new A(2));
52 }
53 
54 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, thread_types) {
55  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
56 
57  factory_t c;
58  BOOST_CHECK(c.empty());
59  BOOST_CHECK_EQUAL(c.size(),0U);
60 }
61 
62 BOOST_AUTO_TEST_CASE_TEMPLATE(fail_to_find_item, Mdl, thread_types) {
63  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
64 
65  factory_t c;
66  BOOST_CHECK_EQUAL(c.find(1),false);
67 }
68 
69 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_and_find_it, Mdl, thread_types) {
70  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
71 
72  factory_t c;
73  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1,&create_1<factory_t>)),true);
74  BOOST_CHECK(!c.empty());
75  BOOST_CHECK_EQUAL(c.size(),1U);
76  BOOST_CHECK_EQUAL(c.find(1),true);
77 }
78 
79 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_and_erase_it, Mdl, thread_types) {
80  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
81 
82  factory_t c;
83  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, &create_1<factory_t>)), true);
84  BOOST_CHECK(!c.empty());
85  BOOST_CHECK_EQUAL(c.size(),1U);
86  BOOST_CHECK_EQUAL(c.find(1),true);
87  BOOST_CHECK_EQUAL(c.erase(1),1U);
88  BOOST_CHECK(c.empty());
89  BOOST_CHECK_EQUAL(c.size(),0U);
90  BOOST_CHECK_EQUAL(c.find(1),false);
91 }
92 
93 BOOST_AUTO_TEST_CASE_TEMPLATE(add_2_items_and_find_them, Mdl, thread_types) {
94  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
95 
96  factory_t c;
97  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, &create_1<factory_t>)), true);
98  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(2, &create_2<factory_t>)), true);
99  BOOST_CHECK(!c.empty());
100  BOOST_CHECK_EQUAL(c.size(),2U);
101  BOOST_CHECK_EQUAL(c.find(1),true);
102  BOOST_CHECK_EQUAL(c.find(2),true);
103 }
104 
105 BOOST_AUTO_TEST_CASE_TEMPLATE(add_2_items_and_erase_one, Mdl, thread_types) {
106  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
107 
108  factory_t c;
109  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, &create_1<factory_t>)), true);
110  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(2, &create_2<factory_t>)), true);
111  BOOST_CHECK_EQUAL(c.erase(1),1U);
112  BOOST_CHECK(!c.empty());
113  BOOST_CHECK_EQUAL(c.size(),1U);
114  BOOST_CHECK_EQUAL(c.find(1),false);
115  BOOST_CHECK_EQUAL(c.find(2),true);
116 }
117 
118 BOOST_AUTO_TEST_CASE_TEMPLATE(make_an_item, Mdl, thread_types) {
119  typedef typename factory::creator<int, A, crt_exception<ppd::platform_api, Mdl> > factory_t;
120 
121  factory_t c;
122  c.insert(typename factory_t::value_type(1, &create_1<factory_t>));
123  BOOST_CHECK_EQUAL(c.make(1)->i,1);
124 }
125 
126 BOOST_AUTO_TEST_SUITE_END()
127 
128 BOOST_AUTO_TEST_SUITE(factory_clone_tests)
129 
130 template<class Mdl>
131 struct A final : public sp_counter_type<long, ppd::api_lock_traits<ppd::platform_api, Mdl>> {
133 
134  const int i;
135 
136  explicit A(const int j)
137  : base_t(), i(j) {
138  }
139  A(A const &j)
140  : base_t(), i(j.i) {
141  }
142  ~A() noexcept(true) {}
143 
144  void operator=(A const &)=delete;
145 };
146 
147 template<class T, class Mdl> typename T::created_type __fastcall
148 clone_it(const typename T::mapped_type::first_type::element_type &a) {
149  return typename T::created_type(new A<Mdl>(a));
150 }
151 
152 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, thread_types) {
153  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
154 
155  factory_t c;
156  BOOST_CHECK(c.empty());
157  BOOST_CHECK_EQUAL(c.size(),0U);
158 }
159 
160 BOOST_AUTO_TEST_CASE_TEMPLATE(fail_to_find_item, Mdl, thread_types) {
161  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
162 
163  factory_t c;
164  BOOST_CHECK_EQUAL(c.find(1),false);
165 }
166 
167 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_and_find_it, Mdl, thread_types) {
168  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
169 
170  factory_t c;
171  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(1)), &clone_it<factory_t, Mdl>))), true);
172  BOOST_CHECK(!c.empty());
173  BOOST_CHECK_EQUAL(c.size(),1U);
174  BOOST_CHECK_EQUAL(c.find(1),true);
175 }
176 
177 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_and_erase_it, Mdl, thread_types) {
178  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
179 
180  factory_t c;
181  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(1)), &clone_it<factory_t, Mdl>))), true);
182  BOOST_CHECK(!c.empty());
183  BOOST_CHECK_EQUAL(c.size(),1U);
184  BOOST_CHECK_EQUAL(c.find(1),true);
185  BOOST_CHECK_EQUAL(c.erase(1),1U);
186  BOOST_CHECK(c.empty());
187  BOOST_CHECK_EQUAL(c.size(),0U);
188  BOOST_CHECK_EQUAL(c.find(1),false);
189 }
190 
191 BOOST_AUTO_TEST_CASE_TEMPLATE(add_2_items_and_find_them, Mdl, thread_types) {
192  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
193 
194  factory_t c;
195  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(1)), &clone_it<factory_t, Mdl>))), true);
196  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(2, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(2)), &clone_it<factory_t, Mdl>))), true);
197  BOOST_CHECK(!c.empty());
198  BOOST_CHECK_EQUAL(c.size(),2U);
199  BOOST_CHECK_EQUAL(c.find(1),true);
200  BOOST_CHECK_EQUAL(c.find(2),true);
201 }
202 
203 BOOST_AUTO_TEST_CASE_TEMPLATE(add_2_items_and_erase_one, Mdl, thread_types) {
204  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
205 
206  factory_t c;
207  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(1, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(1)), &clone_it<factory_t, Mdl>))), true);
208  BOOST_CHECK_EQUAL(c.insert(typename factory_t::value_type(2, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(2)), &clone_it<factory_t, Mdl>))), true);
209  BOOST_CHECK_EQUAL(c.erase(1), 1U);
210  BOOST_CHECK(!c.empty());
211  BOOST_CHECK_EQUAL(c.size(), 1U);
212  BOOST_CHECK_EQUAL(c.find(1),false);
213  BOOST_CHECK_EQUAL(c.find(2),true);
214 }
215 
216 BOOST_AUTO_TEST_CASE_TEMPLATE(make_an_item, Mdl, thread_types) {
217  typedef typename factory::clone<int, A<Mdl>, crt_exception<ppd::platform_api, Mdl> > factory_t;
218 
219  factory_t c;
220  c.insert(typename factory_t::value_type(1, typename factory_t::mapped_type(typename factory_t::mapped_type::first_type(new A<Mdl>(1)), &clone_it<factory_t, Mdl>)));
221  BOOST_CHECK_EQUAL(c.make(1)->i, 1);
222 }
223 
224 BOOST_AUTO_TEST_SUITE_END()