16namespace sequoia::testing
20 template<
class CheckType, test_mode Mode,
class PartitionedData>
21 void check_details(CheckType flavour, test_logger<Mode>& logger,
const PartitionedData& data,
const PartitionedData& prediction)
23 check(equality,
"Emptiness incorrect", logger, data.empty(), prediction.empty());
25 check(equality,
"Size incorrect", logger, data.size(), prediction.size());
27 if(
check(equality,
"Number of partitions incorrect", logger, data.num_partitions(), prediction.num_partitions()))
29 for(std::size_t i{}; i<prediction.num_partitions(); ++i)
31 const auto message{std::string{
"Partition "}.append(std::to_string(i))};
32 check(equality, append_lines(message,
"size_of_partition"), logger, data.size_of_partition(i), prediction.size_of_partition(i));
34 if(
check(flavour, append_lines(message,
"iterator (const)"), logger, data.begin_partition(i), data.end_partition(i), prediction.begin_partition(i), prediction.end_partition(i)))
36 for(int64_t j{}; j<std::ranges::distance(prediction.partition(i)); ++j)
38 check(flavour, append_lines(message,
"[] (const)"), logger, data[i][j], prediction[i][j]);
42 check(flavour, append_lines(message,
"r_iterator (const)"), logger, data.rbegin_partition(i), data.rend_partition(i), prediction.rbegin_partition(i), prediction.rend_partition(i));
43 check(flavour, append_lines(message,
"c_iterator"), logger, data.cbegin_partition(i), data.cend_partition(i), prediction.cbegin_partition(i), prediction.cend_partition(i));
44 check(flavour, append_lines(message,
"cr_iterator"), logger, data.crbegin_partition(i), data.crend_partition(i), prediction.crbegin_partition(i), prediction.crend_partition(i));
47 check(flavour, append_lines(message,
"subrange (const)"), logger, data.partition(i).begin(), data.partition(i).end(), prediction.partition(i).begin(), prediction.partition(i).end());
49 auto& r{
const_cast<PartitionedData&
>(prediction)};
50 auto& d{
const_cast<PartitionedData&
>(data)};
51 if(
check(flavour, append_lines(message,
"iterator"), logger, d.begin_partition(i), d.end_partition(i), r.begin_partition(i), r.end_partition(i)))
53 for(int64_t j{}; j<std::ranges::distance(r.partition(i)); ++j)
55 check(flavour, append_lines(message,
"[]"), logger, d[i][j], r[i][j]);
59 check(flavour, append_lines(message,
"r_iterator"), logger, d.rbegin_partition(i), d.rend_partition(i), r.rbegin_partition(i), r.rend_partition(i));
62 check(flavour, append_lines(message,
"subrange"), logger, d.partition(i).begin(), d.partition(i).end(), r.partition(i).begin(), r.partition(i).end());
67 template<test_mode Mode,
class PartitionedData,
class T=
typename PartitionedData::value_type>
68 void check(equivalence_check_t, test_logger<Mode>& logger,
const PartitionedData& data, std::initializer_list<std::initializer_list<T>> prediction)
70 const auto numElements{std::accumulate(prediction.begin(), prediction.end(), std::size_t{},
71 [](std::size_t val, std::initializer_list<T> partition) { return val += partition.size();})};
73 check(equality,
"Number of elements incorrect", logger, data.size(), numElements);
75 if(
check(equality,
"Number of partitions incorrect", logger, data.num_partitions(), prediction.size()))
77 for(std::size_t i{}; i<prediction.size(); ++i)
79 const auto message{std::string{
"Partition "}.append(std::to_string(i))};
80 check(equality, append_lines(message,
"size_of_partition"), logger, data.size_of_partition(i), (prediction.begin() + i)->size());
82 check(with_best_available, message +
": iterator", logger, data.begin_partition(i), data.end_partition(i), (prediction.begin() + i)->begin(), (prediction.begin() + i)->end());
83 check(with_best_available, message +
": riterator", logger, data.rbegin_partition(i), data.rend_partition(i), std::rbegin(*(prediction.begin() + i)), std::rend(*(prediction.begin() + i)));
89 template<
class T,
class Container>
94 template<
class CheckType, test_mode Mode>
97 impl::check_details(flavour, logger, data, prediction);
100 template<test_mode Mode>
103 impl::check(equivalence, logger, data, prediction);
107 template<
class T,
class Container,
class Partitions>
111 using equivalent_type = std::initializer_list<std::initializer_list<T>>;
113 template<
class CheckType, test_mode Mode>
116 impl::check_details(flavour, logger, data, prediction);
119 template<test_mode Mode>
122 impl::check(equivalence, logger, data, prediction);
126 template<
class T, std::
size_t Npartitions, std::
size_t Nelements, std::
integral IndexType>
131 template<
class CheckType, test_mode Mode>
134 impl::check_details(flavour, logger, data, prediction);
137 template<test_mode Mode>
140 impl::check(equivalence, logger, data, prediction);
144 template<std::input_or_output_iterator I,
class DerefPolicy>
150 template<test_mode Mode>
153 const auto dist{std::ranges::distance(data, prediction)};
154 using dist_t =
decltype(dist);
155 check(equality,
"Distance from prediction", logger, dist, dist_t{});
156 check(equality,
"Partition Index", logger, data.partition_index(), prediction.partition_index());
bool check(CheckType flavour, std::string description, test_logger< Mode > &logger, Iter first, Sentinel last, PredictionIter predictionFirst, PredictionSentinel predictionLast, tutor< Advisor > advisor={})
The workhorse for comparing the contents of ranges.
Definition: FreeCheckers.hpp:377
Classes implementing the concept of a sequence of data which is divided into partitions.
Utilities for checking regular semantics.
Storage for partitioned data such that data within each partition is contiguous.
Definition: PartitionedData.hpp:63
Definition: PartitionedData.hpp:991
Definition: PartitionedData.hpp:1099
Definition: TestLogger.hpp:183
An iterator with policies controlling dereferencing and auxiliary data.
Definition: Iterator.hpp:234
Definition: FreeCheckers.hpp:82
Definition: FreeCheckers.hpp:87
class template, specializations of which implement various comparisons for the specified type.
Definition: FreeCheckers.hpp:78