diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/generic/iterator_range_ut.cpp | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/generic/iterator_range_ut.cpp')
| -rw-r--r-- | util/generic/iterator_range_ut.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/util/generic/iterator_range_ut.cpp b/util/generic/iterator_range_ut.cpp new file mode 100644 index 00000000000..a7e3670ae10 --- /dev/null +++ b/util/generic/iterator_range_ut.cpp @@ -0,0 +1,98 @@ +#include "iterator_range.h" + +#include <library/cpp/testing/unittest/registar.h> +#include <util/generic/algorithm.h> +#include <util/generic/vector.h> + +Y_UNIT_TEST_SUITE(IteratorRange) { + Y_UNIT_TEST(DefaultConstructor) { + TIteratorRange<int*> range; + UNIT_ASSERT(range.empty()); + } + + Y_UNIT_TEST(DefaultConstructorSentinel) { + TIteratorRange<int*, void*> range; + UNIT_ASSERT(range.empty()); + } + + Y_UNIT_TEST(RangeBasedForLoop) { + // compileability test + for (int i : TIteratorRange<int*>()) { + Y_UNUSED(i); + } + } + + Y_UNIT_TEST(RangeBasedForLoopSentinel) { + // compileability test + for (int i : TIteratorRange<int*, void*>()) { + Y_UNUSED(i); + } + } + + Y_UNIT_TEST(Works) { + const int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + auto range = MakeIteratorRange(values, values + Y_ARRAY_SIZE(values)); + UNIT_ASSERT_VALUES_EQUAL(range.size(), Y_ARRAY_SIZE(values)); + UNIT_ASSERT(Equal(range.begin(), range.end(), values)); + UNIT_ASSERT(!range.empty()); + } + + Y_UNIT_TEST(WorksSentinel) { + struct TRangeSentinel { + }; + + struct TEnumerator { + ui32 operator*() const { + return Cur; + } + + void operator++() { + ++Cur; + } + + bool operator!=(const TRangeSentinel&) const { + return Cur < End; + } + + ui32 Cur; + ui32 End; + }; + + auto range = MakeIteratorRange(TEnumerator{0, 10}, TRangeSentinel{}); + UNIT_ASSERT(!range.empty()); + + ui32 i = 0; + for (auto j : range) { + UNIT_ASSERT_VALUES_EQUAL(j, i++); + } + UNIT_ASSERT_VALUES_EQUAL(i, 10); + } + + Y_UNIT_TEST(OperatorsAndReferences) { + TVector<size_t> values{1, 2, 3, 4, 5}; + auto range = MakeIteratorRange(values.begin(), values.end()); + UNIT_ASSERT_VALUES_EQUAL(range[2], 3); + UNIT_ASSERT_VALUES_EQUAL(range[range[2]], 4); + *values.begin() = 100500; + UNIT_ASSERT_VALUES_EQUAL(range[0], 100500); + range[0] = 100501; + UNIT_ASSERT_VALUES_EQUAL(range[0], 100501); + + TVector<bool> valuesBool{false, true, false, false, false, false, true}; + auto rangeBVector = MakeIteratorRange(valuesBool.begin(), valuesBool.end()); + UNIT_ASSERT_VALUES_EQUAL(rangeBVector[1], true); + rangeBVector[0] = true; + valuesBool.back() = false; + UNIT_ASSERT_VALUES_EQUAL(rangeBVector[0], true); + UNIT_ASSERT_VALUES_EQUAL(rangeBVector[2], false); + UNIT_ASSERT_VALUES_EQUAL(rangeBVector[6], false); + } + + Y_UNIT_TEST(CanUseInAlgorithms) { + const int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + auto range = MakeIteratorRange(values, values + Y_ARRAY_SIZE(values)); + // more like compileability test + // we should be able to use TIteratorRange as a container parameter for standard algorithms + UNIT_ASSERT(AllOf(range, [](int x) { return x > 0; })); + } +} |
