xrange_test.cc 2.2 KB

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