16namespace sequoia::testing
20 template<test_mode Mode,
class T>
21 void check(test_logger<Mode>& logger,
const T& sequence,
const T& prediction)
23 check(equality,
"Emptiness incorrect", logger, sequence.empty(), prediction.empty());
25 if(
check(equality,
"Size incorrect", logger, sequence.size(), prediction.size()))
27 if(!prediction.empty())
29 check(equality,
"Back element wrong", logger, sequence.back(), prediction.back());
30 check(equality,
"Front element wrong", logger, sequence.front(), prediction.front());
33 auto i_prediction{prediction.begin()}, i{sequence.begin()};
34 auto ci_prediction{prediction.cbegin()}, ci{sequence.cbegin()};
35 auto ri_prediction{prediction.rbegin()}, ri{sequence.rbegin()};
36 auto cri_prediction{prediction.crbegin()}, cri{sequence.crbegin()};
38 for(;i_prediction != prediction.end(); ++i_prediction, ++i, ++ci_prediction, ++ci, ++ri_prediction, ++ri, ++cri_prediction, ++cri)
40 const auto d{std::ranges::distance(prediction.begin(), i_prediction)};
41 const auto mess{std::string{
" for index "}.append(std::to_string(d))};
43 check(equality, std::string{
"Dereferenced iterator wrong"}.append(mess), logger, *i, *i_prediction);
44 check(equality, std::string{
"Dereferenced citerator wrong"}.append(mess), logger, *ci, *ci_prediction);
46 check(equality, std::string{
"operator[] wrong"}.append(mess), logger, sequence[d], prediction[d]);
48 const auto shift{
static_cast<int64_t
>(prediction.size()) - d - 1};
49 check(equality, std::string{
"Dereferenced riterator wrong"}.append(mess), logger, *(ri + shift), *(ri_prediction + shift));
50 check(equality, std::string{
"Dereferenced criterator wrong"}.append(mess), logger, *(cri + shift), *(cri_prediction + shift));
53 testing::check(
"iterator location wrong", logger, i_prediction == prediction.end());
54 testing::check(
"citerator location wrong", logger, ci_prediction == prediction.cend());
55 testing::check(
"riterator location wrong", logger, ri_prediction == prediction.rend());
56 testing::check(
"criterator location wrong", logger, cri_prediction == prediction.crend());
61 template<
class T,
class C,
class Compare>
66 template<test_mode Mode>
69 impl::check(logger, sequence, prediction);
72 template<test_mode Mode>
75 check(equality,
"", logger, sequence.begin(), sequence.end(), prediction.begin(), prediction.end());
79 template<
class T, std::
size_t N,
class Compare>
84 template<test_mode Mode>
87 impl::check(logger, sequence, prediction);
90 template<test_mode Mode>
93 check(equality,
"", logger, sequence.begin(), sequence.end(), prediction.begin(), prediction.end());
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 monotonic sequence.
Utilities for checking regular semantics.
Definition: MonotonicSequence.hpp:248
Definition: MonotonicSequence.hpp:303
Definition: TestLogger.hpp:183
Definition: FreeCheckers.hpp:82
Definition: FreeCheckers.hpp:87
class template, specializations of which implement various comparisons for the specified type.
Definition: FreeCheckers.hpp:78