| 1 |
#include "catch.hpp" |
| 2 |
#include "xrange.hh" |
| 3 |
|
| 4 |
#include <algorithm> |
| 5 |
#include <type_traits> |
| 6 |
#include <vector> |
| 7 |
|
| 8 |
template<typename T, typename RANGE> |
| 9 |
static void test(const RANGE& range, const std::vector<T>& v) |
| 10 |
{ |
| 11 |
CHECK(std::equal(range.begin(), range.end(), v.begin(), v.end())); |
| 12 |
} |
| 13 |
|
| 14 |
TEST_CASE("xrange") |
| 15 |
{ |
| 16 |
test<int>(xrange( 0), {}); |
| 17 |
test<int>(xrange( 1), {0}); |
| 18 |
test<int>(xrange( 2), {0, 1}); |
| 19 |
test<int>(xrange(10), {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); |
| 20 |
|
| 21 |
test<int>(xrange(5, 5), {}); |
| 22 |
test<int>(xrange(5, 6), {5}); |
| 23 |
test<int>(xrange(5, 7), {5, 6}); |
| 24 |
test<int>(xrange(5, 10), {5, 6, 7, 8, 9}); |
| 25 |
|
| 26 |
test<unsigned long long>(xrange(0ULL), {}); |
| 27 |
test<unsigned long long>(xrange(1ULL), {0ULL}); |
| 28 |
test<unsigned long long>(xrange(2ULL), {0ULL, 1ULL}); |
| 29 |
test<unsigned long long>( |
| 30 |
xrange(10ULL), |
| 31 |
{0ULL, 1ULL, 2ULL, 3ULL, 4ULL, 5ULL, 6ULL, 7ULL, 8ULL, 9ULL}); |
| 32 |
|
| 33 |
test<unsigned long long>(xrange(5ULL, 5ULL), {}); |
| 34 |
test<unsigned long long>(xrange(5ULL, 6ULL), {5ULL}); |
| 35 |
test<unsigned long long>(xrange(5ULL, 7ULL), {5ULL, 6ULL}); |
| 36 |
test<unsigned long long>( |
| 37 |
xrange(5ULL, 10ULL), |
| 38 |
{5ULL, 6ULL, 7ULL, 8ULL, 9ULL}); |
| 39 |
test<unsigned long long>( |
| 40 |
xrange(0x112233445566ULL, 0x112233445568ULL), |
| 41 |
{0x112233445566ULL, 0x112233445567ULL}); |
| 42 |
|
| 43 |
|
| 44 |
|
| 45 |
} |
| 46 |
|
| 47 |
TEST_CASE("xrange, random-access") |
| 48 |
{ |
| 49 |
auto r = xrange(20, 45); |
| 50 |
static_assert(std::is_same_v<decltype(r.begin())::iterator_category, |
| 51 |
std::random_access_iterator_tag>); |
| 52 |
|
| 53 |
auto b = r.begin(); REQUIRE(*b == 20); |
| 54 |
auto m = b + 10; |
| 55 |
|
| 56 |
auto i1 = b; auto j1 = i1++; CHECK(*i1 == 21); CHECK(*j1 == 20); CHECK(i1 != j1); |
| 57 |
auto i2 = b; auto j2 = ++i2; CHECK(*i2 == 21); CHECK(*j2 == 21); CHECK(i2 == j2); |
| 58 |
auto i3 = m; auto j3 = i3--; CHECK(*i3 == 29); CHECK(*j3 == 30); CHECK(i3 != j3); |
| 59 |
auto i4 = m; auto j4 = --i4; CHECK(*i4 == 29); CHECK(*j4 == 29); CHECK(i4 == j4); |
| 60 |
|
| 61 |
auto i5 = b; i5 += 7; CHECK(*i5 == 27); |
| 62 |
auto i6 = m; i6 -= 7; CHECK(*i6 == 23); |
| 63 |
|
| 64 |
auto i7 = b + 4; CHECK(*i7 == 24); |
| 65 |
auto i8 = 6 + m; CHECK(*i8 == 36); |
| 66 |
auto i9 = m - 5; CHECK(*i9 == 25); |
| 67 |
|
| 68 |
CHECK((m - b) == 10); |
| 69 |
CHECK(m[4] == 34); |
| 70 |
|
| 71 |
CHECK(b < m); CHECK(!(b < b)); |
| 72 |
CHECK(b <= m); CHECK( b <= b ); |
| 73 |
CHECK(m > b); CHECK(!(b > b)); |
| 74 |
CHECK(m >= b); CHECK( b >= b ); |
| 75 |
} |