15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
22 #include <type_traits>
25 #include <range/v3/iterator/concepts.hpp>
31 TEST(IndexingIterator, IteratorTraits) {
33 static_assert(ranges::random_access_iterator<Iterator>);
34 static_assert(std::is_signed_v<typename Iterator::difference_type>);
35 static_assert(std::is_same_v<typename Iterator::value_type, int>);
36 static_assert(std::is_same_v<typename Iterator::reference, int&>);
37 static_assert(std::is_same_v<typename Iterator::pointer, int*>);
38 using ssize_type = std::make_signed_t<typename std::vector<int>::size_type>;
39 static_assert(std::is_same_v<typename Iterator::difference_type, ssize_type>);
42 TEST(IndexingIterator, ConstIteratorTraits) {
44 static_assert(ranges::random_access_iterator<Iterator>);
45 static_assert(std::is_same_v<typename Iterator::value_type, int>);
46 static_assert(std::is_same_v<typename Iterator::reference, const int&>);
47 static_assert(std::is_same_v<typename Iterator::pointer, const int*>);
48 using ssize_type = std::make_signed_t<typename std::vector<int>::size_type>;
49 static_assert(std::is_same_v<typename Iterator::difference_type, ssize_type>);
52 TEST(IndexingIterator, Arithmetic) {
53 const auto sequence = std::vector{0, 1};
56 EXPECT_EQ(std::next(begin, std::distance(begin, end)), end);
57 EXPECT_EQ(std::prev(end, std::distance(begin, end)), begin);
58 EXPECT_EQ(std::abs(end - begin), std::abs(begin - end));
61 TEST(IndexingIterator, EqualityPreserving) {
62 const auto sequence = std::vector{0, 1};
65 EXPECT_EQ(begin, --(begin + 1));
66 EXPECT_EQ(end, ++(end - 1));
69 TEST(IndexingIterator, Iterate) {
70 const auto expected_sequence = std::vector{3, 0, -1, 5, 8, -2};
71 const auto sequence = std::vector(
74 ASSERT_THAT(sequence, ::testing::ContainerEq(expected_sequence));
77 TEST(IndexingIterator, IterateAndMutate) {
78 const auto input_sequence = std::vector{1, 2, 3, 4, 5, 6};
79 auto output_sequence = std::vector<int>(input_sequence.size());
83 ASSERT_THAT(output_sequence, ::testing::Each(::testing::Eq(7)));
86 TEST(IndexingIterator, IterateAndMove) {
87 const auto expected_sequence = std::vector{std::vector{1, 3, 2, 4, 3, 5}, std::vector{1, -1, 0, 1, -1}};
88 auto input_sequence = expected_sequence;
89 const auto output_sequence = std::vector(
92 EXPECT_THAT(input_sequence, ::testing::Each(::testing::IsEmpty()));
93 ASSERT_THAT(output_sequence, ::testing::ContainerEq(expected_sequence));