TestReverseIterator.cpp (2802B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "gtest/gtest.h" 8 9 #include "mozilla/ReverseIterator.h" 10 11 using namespace mozilla; 12 13 TEST(ReverseIterator, Const_RangeBasedFor) 14 { 15 const std::vector<int> in = {1, 2, 3, 4}; 16 const auto reversedRange = 17 detail::IteratorRange<ReverseIterator<std::vector<int>::const_iterator>>{ 18 ReverseIterator{in.end()}, ReverseIterator{in.begin()}}; 19 20 const std::vector<int> expected = {4, 3, 2, 1}; 21 std::vector<int> out; 22 for (auto i : reversedRange) { 23 out.emplace_back(i); 24 } 25 26 EXPECT_EQ(expected, out); 27 } 28 29 TEST(ReverseIterator, NonConst_RangeBasedFor) 30 { 31 std::vector<int> in = {1, 2, 3, 4}; 32 auto reversedRange = 33 detail::IteratorRange<ReverseIterator<std::vector<int>::iterator>>{ 34 ReverseIterator{in.end()}, ReverseIterator{in.begin()}}; 35 36 const std::vector<int> expected = {-1, -2, -3, -4}; 37 for (auto& i : reversedRange) { 38 i = -i; 39 } 40 41 EXPECT_EQ(expected, in); 42 } 43 44 TEST(ReverseIterator, Difference) 45 { 46 const std::vector<int> in = {1, 2, 3, 4}; 47 using reverse_iterator = ReverseIterator<std::vector<int>::const_iterator>; 48 49 reverse_iterator rbegin = reverse_iterator{in.end()}, 50 rend = reverse_iterator{in.begin()}; 51 EXPECT_EQ(4, rend - rbegin); 52 EXPECT_EQ(0, rend - rend); 53 EXPECT_EQ(0, rbegin - rbegin); 54 55 --rend; 56 EXPECT_EQ(3, rend - rbegin); 57 58 ++rbegin; 59 EXPECT_EQ(2, rend - rbegin); 60 61 rend--; 62 EXPECT_EQ(1, rend - rbegin); 63 64 rbegin++; 65 EXPECT_EQ(0, rend - rbegin); 66 } 67 68 TEST(ReverseIterator, Comparison) 69 { 70 const std::vector<int> in = {1, 2, 3, 4}; 71 using reverse_iterator = ReverseIterator<std::vector<int>::const_iterator>; 72 73 reverse_iterator rbegin = reverse_iterator{in.end()}, 74 rend = reverse_iterator{in.begin()}; 75 EXPECT_TRUE(rbegin < rend); 76 EXPECT_FALSE(rend < rbegin); 77 EXPECT_FALSE(rend < rend); 78 EXPECT_FALSE(rbegin < rbegin); 79 80 EXPECT_TRUE(rend > rbegin); 81 EXPECT_FALSE(rbegin > rend); 82 EXPECT_FALSE(rend > rend); 83 EXPECT_FALSE(rbegin > rbegin); 84 85 EXPECT_TRUE(rbegin <= rend); 86 EXPECT_FALSE(rend <= rbegin); 87 EXPECT_TRUE(rend <= rend); 88 EXPECT_TRUE(rbegin <= rbegin); 89 90 EXPECT_TRUE(rend >= rbegin); 91 EXPECT_FALSE(rbegin >= rend); 92 EXPECT_TRUE(rend >= rend); 93 EXPECT_TRUE(rbegin >= rbegin); 94 95 EXPECT_FALSE(rend == rbegin); 96 EXPECT_FALSE(rbegin == rend); 97 EXPECT_TRUE(rend == rend); 98 EXPECT_TRUE(rbegin == rbegin); 99 100 EXPECT_TRUE(rend != rbegin); 101 EXPECT_TRUE(rbegin != rend); 102 EXPECT_FALSE(rend != rend); 103 EXPECT_FALSE(rbegin != rbegin); 104 }