OXYGENHUB
◆ main openmsx / src / unittest / xrange_test.cc
2.2 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
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
	// undefined behavior
44
	//test<int>(xrange(10, 5), {});
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
}