15 #ifndef _PASL_DATA_TEST_PROPERTIES_H_
16 #define _PASL_DATA_TEST_PROPERTIES_H_
26 template <
class Bag_pair>
31 using trusted_type =
typename bag_pair_type::trusted_container_type;
40 size_t nb_items = _nb_items;
48 size_t split_position) {
49 assert(items_src.ok());
50 assert(split_position <= items_src.trusted.size());
51 items_src.trusted.split(split_position, items_dst.trusted);
52 items_src.untrusted.split(split_position, items_dst.untrusted);
53 bool ok_src_sz = items_src.trusted.size() == items_src.untrusted.size();
54 bool ok_dst_sz = items_dst.trusted.size() == items_dst.untrusted.size();
55 items_src.trusted.concat(items_dst.trusted);
56 items_src.untrusted.concat(items_dst.untrusted);
58 bool all_ok = ok_src_sz && ok_dst_sz && ok;
63 class split_same :
public quickcheck::Property<bag_pair_type> {
66 size_t sz = _items.trusted.size();
67 size_t split_position = quickcheck::generateInRange(
size_t(0), sz);
70 assert(items_dst.trusted.empty());
71 assert(items_dst.untrusted.empty());
77 class concat_same :
public quickcheck::Property<bag_pair_type, bag_pair_type> {
82 items1.trusted.concat(items2.trusted);
83 items1.untrusted.concat(items2.untrusted);
86 return items1_ok && items2_ok;
96 if (items.trusted.size() == 0)
99 assert(items.untrusted.begin().size() == 1);
100 assert(items.untrusted.size() + 1 == items.untrusted.end().size());
103 std::cout <<
"" << std::endl;
104 typename bag_pair_type::trusted_container_type t;
105 typename bag_pair_type::trusted_container_type u;
106 bool go_forward = flip_coin();
108 for (
auto it = items.trusted.begin(); it != items.trusted.end(); it++)
110 for (
auto it = items.untrusted.begin(); it != items.untrusted.end(); it++)
113 for (
auto it = items.trusted.end() - 1; it != items.trusted.begin(); it--)
115 for (
auto it = items.untrusted.end() - 1; it != items.untrusted.begin(); it--)
117 t.push_back(*items.trusted.begin());
118 u.push_back(*items.untrusted.begin());
120 bool ok = bag_pair_type::trusted_same::same(t, u);
122 std::cout <<
"t.size=" <<t.size() <<
"u.size=" << u.size() << std::endl;
123 std::cout << t << std::endl;
124 std::cout << u << std::endl;
135 for (
size_t i = 0; i < items.trusted.size(); i++)
138 for (value_type* p = lo; p != hi; p++)
151 size_t sz_items = items.trusted.size();
152 std::vector<int> trusted_vec(_vec);
153 std::vector<int> untrusted_vec(_vec);
154 size_t sz_vec = _vec.size();
155 int* trusted_data_vec = trusted_vec.data();
156 int* untrusted_data_vec = untrusted_vec.data();
157 bool should_push = flip_coin();
160 items.trusted.pushn_back(trusted_data_vec, sz_vec);
161 items.untrusted.pushn_back(untrusted_data_vec, sz_vec);
164 size_t nb_to_pop = std::min(sz_items, sz_vec);
165 trusted_vec.resize(nb_to_pop);
166 untrusted_vec.resize(nb_to_pop);
167 items.trusted.popn_back(trusted_data_vec, nb_to_pop);
168 items.untrusted.popn_back(untrusted_data_vec, nb_to_pop);
169 ok1 = items.trusted.size() == items.untrusted.size();
171 bool ok2 = trusted_vec.size() == untrusted_vec.size();
173 std::cout <<
" trusted vec:" << trusted_vec << std::endl;
174 std::cout <<
"untrusted vec:" << untrusted_vec << std::endl;
184 size_t sz_items = items.trusted.size();
185 size_t nb = (size_t)quickcheck::generateInRange(0, (
int)sz_items);
186 std::vector<int> trusted_vec(nb, -1);
187 std::vector<int> untrusted_vec(nb, -1);
188 bool act_on_front = flip_coin();
190 items.trusted.frontn(trusted_vec.data(), nb);
191 items.untrusted.frontn(untrusted_vec.data(), nb);
193 items.trusted.backn(trusted_vec.data(), nb);
194 items.untrusted.backn(untrusted_vec.data(), nb);
196 bool ok = trusted_vec.size() == untrusted_vec.size();
198 std::cout <<
" trusted vec:" << trusted_vec << std::endl;
199 std::cout <<
"untrusted vec:" << untrusted_vec << std::endl;
210 template <
class Container_pair>
215 using trusted_type =
typename container_pair_type::trusted_container_type;
224 size_t nb_items = _nb_items;
232 size_t split_position) {
233 assert(items_src.ok());
234 assert(split_position <= items_src.trusted.size());
235 items_src.trusted.split(split_position, items_dst.trusted);
236 items_src.untrusted.split(split_position, items_dst.untrusted);
239 bool all_ok = src_ok && dst_ok;
241 std::cout <<
"split position is " << split_position << std::endl;
247 class split_same :
public quickcheck::Property<container_pair_type> {
250 size_t sz = _items.trusted.size();
251 size_t split_position = quickcheck::generateInRange(
size_t(0), sz);
254 assert(items_dst.trusted.empty());
255 assert(items_dst.untrusted.empty());
264 size_t sz = _items.trusted.size();
265 size_t start = quickcheck::generateInRange(
size_t(0), sz);
266 size_t end = std::min(sz, start + 10);
267 for (
size_t split_position = start; split_position <= end; split_position++) {
278 class concat_same :
public quickcheck::Property<container_pair_type, container_pair_type> {
283 items1.trusted.concat(items2.trusted);
284 items1.untrusted.concat(items2.untrusted);
287 return items1_ok && items2_ok;
296 size_t sz = items.trusted.size();
297 size_t i = quickcheck::generateInRange(
size_t(0), sz-1);
302 std::cout <<
"trusted[" << i <<
"]=" << t << std::endl;
303 std::cout <<
"untrusted[" << i <<
"]=" << u << std::endl;
315 if (items.trusted.size() == 0)
318 assert(items.untrusted.begin().size() == 1);
319 assert(items.untrusted.size() + 1 == items.untrusted.end().size());
322 std::cout <<
"" << std::endl;
323 typename container_pair_type::trusted_container_type t;
324 typename container_pair_type::trusted_container_type u;
325 bool go_forward = flip_coin();
327 for (
auto it = items.trusted.begin(); it != items.trusted.end(); it++)
329 for (
auto it = items.untrusted.begin(); it != items.untrusted.end(); it++)
332 for (
auto it = items.trusted.end() - 1; it != items.trusted.begin(); it--)
334 for (
auto it = items.untrusted.end() - 1; it != items.untrusted.begin(); it--)
339 std::cout <<
"t.size=" <<t.size() <<
"u.size=" << u.size() << std::endl;
340 std::cout << t << std::endl;
341 std::cout << u << std::endl;
353 static void print(
int x) {
358 size_t sz = items.trusted.size();
359 typename container_pair_type::trusted_container_type::iterator it_t = items.trusted.begin();
360 typename container_pair_type::untrusted_container_type::iterator it_u = items.untrusted.begin();
362 for (
int i = 0; i < nb; i++) {
363 int cur = (int)it_u.size() - 1;
364 int k = quickcheck::generateInRange(0, (
int)sz-1);
374 size_t it_u_sz = it_u.size();
375 if (it_u_sz != k + 1)
377 int sz_t = int(it_t - items.trusted.begin());
378 int sz_u = int(it_u.size() - items.untrusted.begin().size());
392 class insert_same :
public quickcheck::Property<container_pair_type> {
397 int nb_to_insert = quickcheck::generateInRange(1, 20);
398 for (
int i = 0; i < nb_to_insert; i++) {
404 int sz = (int)items.trusted.size();
405 size_t pos = quickcheck::generateInRange(0, sz-1);
407 items.trusted.insert(items.trusted.begin() + pos, x);
408 items.untrusted.insert(items.untrusted.begin() + pos, x);
410 std::cout <<
"insert at pos=" << pos << std::endl;
411 std::cout <<
"val=" << x << std::endl;
422 class erase_same :
public quickcheck::Property<container_pair_type> {
426 int target_nb_calls_to_erase = quickcheck::generateInRange(1, 100);
427 for (
int i = 0; i < target_nb_calls_to_erase; i++) {
428 int sz = items.trusted.size();
431 size_t first = (size_t)quickcheck::generateInRange(0, sz-1);
432 size_t nb_rem = sz - first;
433 size_t last = (size_t)quickcheck::generateInRange(first, first + nb_rem - 1);
435 assert(first <= last);
436 items.trusted.erase(items.trusted.begin() + first, items.trusted.begin() + last);
437 items.untrusted.erase(items.untrusted.begin() + first, items.untrusted.begin() + last);
439 std::cout <<
"first=" << first <<
" last=" << last << std::endl;
453 for (
size_t i = 0; i < items.trusted.size(); i++)
456 for (value_type* p = lo; p != hi; p++)
469 int sz = items.trusted.size();
470 size_t first = (size_t)quickcheck::generateInRange(0, sz-1);
471 size_t nb_rem = sz - first;
472 size_t last = (size_t)quickcheck::generateInRange(first, first + nb_rem - 1);
473 for (
size_t i = first; i <= last; i++)
475 auto beg = items.untrusted.begin() + first;
476 auto end = items.untrusted.begin() + last + 1;
477 items.untrusted.for_each(beg, end, [&] (
value_type& p) { p++; });
488 size_t sz_items = items.trusted.size();
489 std::vector<int> trusted_vec(_vec);
490 std::vector<int> untrusted_vec(_vec);
491 size_t sz_vec = _vec.size();
492 int* trusted_data_vec = trusted_vec.data();
493 int* untrusted_data_vec = untrusted_vec.data();
494 bool should_push = flip_coin();
495 bool act_on_front = flip_coin();
498 items.trusted.pushn_front(trusted_data_vec, sz_vec);
499 items.untrusted.pushn_front(untrusted_data_vec, sz_vec);
501 items.trusted.pushn_back(trusted_data_vec, sz_vec);
502 items.untrusted.pushn_back(untrusted_data_vec, sz_vec);
505 size_t nb_to_pop = std::min(sz_items, sz_vec);
506 trusted_vec.resize(nb_to_pop);
507 untrusted_vec.resize(nb_to_pop);
509 items.trusted.popn_front(trusted_data_vec, nb_to_pop);
510 items.untrusted.popn_front(untrusted_data_vec, nb_to_pop);
512 items.trusted.popn_back(trusted_data_vec, nb_to_pop);
513 items.untrusted.popn_back(untrusted_data_vec, nb_to_pop);
517 bool ok2 = trusted_vec == untrusted_vec;
519 std::cout <<
" trusted vec:" << trusted_vec << std::endl;
520 std::cout <<
"untrusted vec:" << untrusted_vec << std::endl;
530 size_t sz_items = items.trusted.size();
531 size_t nb = (size_t)quickcheck::generateInRange(0, (
int)sz_items);
532 std::vector<int> trusted_vec(nb, -1);
533 std::vector<int> untrusted_vec(nb, -1);
534 bool act_on_front = flip_coin();
536 items.trusted.frontn(trusted_vec.data(), nb);
537 items.untrusted.frontn(untrusted_vec.data(), nb);
539 items.trusted.backn(trusted_vec.data(), nb);
540 items.untrusted.backn(untrusted_vec.data(), nb);
542 bool ok = trusted_vec == untrusted_vec;
544 std::cout <<
" trusted vec:" << trusted_vec << std::endl;
545 std::cout <<
"untrusted vec:" << untrusted_vec << std::endl;
555 template <
class Container_pair>
560 using trusted_type =
typename container_pair_type::trusted_container_type;
565 class map_same :
public quickcheck::Property<container_pair_type> {
571 int nb_new = quickcheck::generateInRange(0, 100);
572 static constexpr
int lo = 0;
573 static constexpr
int hi = 1<<15;
574 for (
int i = 0; i < nb_new; i++) {
575 int key = quickcheck::generateInRange(lo, hi);
576 int val = generate_value<int>();
577 if (map.trusted.find(key) != map.trusted.end()) {
580 auto it1 = map.trusted.find(key);
581 auto it2 = map.untrusted.find(key);
582 if (it2 == map.untrusted.end())
584 bool ok2 = (*it1).second == (*it2).second;
586 std::cout <<
"trusted=" << (*it1).first <<
" " << (*it1).second <<
" untrusted=" << (*it2).first <<
" " << (*it2).second << std::endl;
588 std::cout << map << std::endl;
593 map.trusted[key] = val;
594 map.untrusted[key] = val;
bool holdsFor(const bag_pair_type &_items)
typename trusted_type::value_type value_type
typename container_pair_type::trusted_container_type trusted_type
bool holdsFor(const container_pair_type &_map)
typename container_pair_type::untrusted_container_type untrusted_type
bool holdsFor(const container_pair_type &_items)
bool holdsFor(const container_pair_type &_items, const std::vector< int > &_vec)
bool holdsFor(const container_pair_type &_items)
typename container_pair_type::trusted_container_type trusted_type
bool holdsFor(const container_pair_type &_items1, const container_pair_type &_items2)
bool holdsFor(const container_pair_type &_items)
bool holdsFor(const container_pair_type &_items)
bool holdsFor(const size_t &_nb_items, const bag_pair_type &_items)
bool holdsFor(const bag_pair_type &_items)
bool holdsFor(const container_pair_type &_items)
Data generation for randomize unit testing.
typename trusted_type::value_type value_type
typename bag_pair_type::trusted_container_type trusted_type
typename container_pair_type::untrusted_container_type untrusted_type
bool holdsFor(const bag_pair_type &_items)
bool holdsFor(const container_pair_type &_items)
bool holdsFor(const container_pair_type &_items)
void random_push_pop_sequence(size_t nb_items, container_pair< T, U, C, S > &dst)
bool holdsFor(const container_pair_type &_items)
typename trusted_type::value_type value_type
Container_pair container_pair_type
bool holdsFor(const bag_pair_type &_items1, const bag_pair_type &_items2)
bool check_and_print_container_pair(const container_pair< T, U, C, S > &cp, std::string msg="")
bool holdsFor(const container_pair_type &_items)
Container_pair container_pair_type
bool holdsFor(const bag_pair_type &_items, const std::vector< int > &_vec)
bool holdsFor(const size_t &_nb_items, const container_pair_type &_items)
bool holdsFor(const bag_pair_type &_items)
static bool split_and_check(container_pair_type &items_src, container_pair_type &items_dst, size_t split_position)
static bool split_and_check(bag_pair_type &items_src, bag_pair_type &items_dst, size_t split_position)
bool holdsFor(const container_pair_type &_items)
typename bag_pair_type::untrusted_container_type untrusted_type