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 |