| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_ITERATOR_TEST_UTIL_H_ | |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_TESTS_ITERATOR_TEST_UTIL_H_ | |
| 7 | |
| 8 #include <algorithm> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "gtest/gtest.h" | |
| 12 | |
| 13 namespace mojo { | |
| 14 namespace test { | |
| 15 | |
| 16 template <typename Iterator, typename ValueType> | |
| 17 void ExpectIteratorValues(Iterator begin, | |
| 18 Iterator end, | |
| 19 const std::vector<ValueType>& expected_values) { | |
| 20 size_t i = 0u; | |
| 21 for (Iterator it = begin; it != end; ++it, ++i) { | |
| 22 EXPECT_EQ(*it, expected_values[i]); | |
| 23 } | |
| 24 EXPECT_EQ(i, expected_values.size()); | |
| 25 } | |
| 26 | |
| 27 // This helper template checks that the specified `Iterator` satisfies the C++ | |
| 28 // BidirectionalIterator concept, as described in: | |
| 29 // http://en.cppreference.com/w/cpp/concept/BidirectionalIterator. | |
| 30 // | |
| 31 // This template will mutate the values in the iterator. | |
| 32 template <typename Iterator, typename ValueType> | |
| 33 void ExpectBidiIteratorConcept(Iterator begin, | |
| 34 Iterator end, | |
| 35 const std::vector<ValueType>& expected_values) { | |
| 36 { | |
| 37 // Default iterator is constructible. Deferencing it is undefined | |
| 38 // behaviour. | |
| 39 Iterator default_iter; | |
| 40 } | |
| 41 | |
| 42 // Now we test bidirecionality: | |
| 43 // Prefix increment. | |
| 44 Iterator iter1(begin); | |
| 45 EXPECT_EQ(*iter1, expected_values[0]); | |
| 46 | |
| 47 Iterator iter2(begin); | |
| 48 ++iter2; | |
| 49 | |
| 50 EXPECT_NE(iter1, iter2); | |
| 51 EXPECT_EQ(*iter2, expected_values[1]); | |
| 52 ++iter1; | |
| 53 EXPECT_EQ(iter1, iter2); | |
| 54 | |
| 55 // Postfix increment. | |
| 56 Iterator prev_iter2 = iter2++; // element 2 | |
| 57 EXPECT_EQ(*prev_iter2, expected_values[1]); | |
| 58 EXPECT_EQ(prev_iter2, iter1); | |
| 59 EXPECT_EQ(*iter2, expected_values[2]); | |
| 60 | |
| 61 // Prefix decrement. | |
| 62 EXPECT_EQ(--iter2, prev_iter2); // element 1 | |
| 63 EXPECT_EQ(--iter1, begin); // element 0 | |
| 64 // Postfix decrement. | |
| 65 EXPECT_EQ(iter2--, prev_iter2); // element 0 | |
| 66 | |
| 67 // Equality. | |
| 68 EXPECT_EQ(iter1, begin); | |
| 69 EXPECT_NE(++iter2, begin); | |
| 70 | |
| 71 // Copy constructible and assignable. | |
| 72 Iterator iter3 = iter2; | |
| 73 EXPECT_EQ(iter3, iter2); | |
| 74 EXPECT_EQ(*iter3, *iter2); | |
| 75 | |
| 76 Iterator iter3_cp(iter3); | |
| 77 EXPECT_EQ(iter3_cp, iter3); | |
| 78 EXPECT_EQ(*iter3_cp, *iter3); | |
| 79 | |
| 80 // Move constructible and assignable. | |
| 81 Iterator iter3_mv = static_cast<Iterator&&>(iter3); | |
| 82 Iterator iter3_cp_mv; | |
| 83 iter3_cp_mv = static_cast<Iterator&&>(iter3_cp); | |
| 84 EXPECT_EQ(iter3_mv, iter3_cp_mv); | |
| 85 | |
| 86 // operator->. | |
| 87 EXPECT_EQ(*(iter3_mv.operator->()), expected_values[1]); | |
| 88 | |
| 89 // Swap two iterators: | |
| 90 Iterator i1 = begin; | |
| 91 Iterator i2 = ++begin; | |
| 92 EXPECT_EQ(*i1, expected_values[0]); | |
| 93 EXPECT_EQ(*i2, expected_values[1]); | |
| 94 std::swap(i1, i2); | |
| 95 EXPECT_EQ(*i1, expected_values[1]); | |
| 96 EXPECT_EQ(*i2, expected_values[0]); | |
| 97 } | |
| 98 | |
| 99 template <typename Iterator, typename ValueType> | |
| 100 void ExpectBidiMutableIteratorConcept( | |
| 101 Iterator begin, | |
| 102 Iterator end, | |
| 103 const std::vector<ValueType>& expected_values) { | |
| 104 Iterator it = begin; | |
| 105 std::vector<ValueType> values = expected_values; | |
| 106 | |
| 107 { | |
| 108 SCOPED_TRACE("Mutate 1st value."); | |
| 109 *it = 12; | |
| 110 values[0] = 12; | |
| 111 ExpectIteratorValues(begin, end, values); | |
| 112 } | |
| 113 | |
| 114 { | |
| 115 SCOPED_TRACE("Mutate 2nd value."); | |
| 116 *++it = 14; | |
| 117 values[1] = 14; | |
| 118 ExpectIteratorValues(begin, end, values); | |
| 119 } | |
| 120 | |
| 121 { | |
| 122 SCOPED_TRACE("Mutate 3rd value."); | |
| 123 *--it = 22; | |
| 124 values[0] = 22; | |
| 125 ExpectIteratorValues(begin, end, values); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 } // namespace test | |
| 130 } // namespace mojo | |
| 131 | |
| 132 #endif // MOJO_PUBLIC_CPP_BINDINGS_TESTS_ITERATOR_TEST_UTIL_H_ | |
| OLD | NEW |