Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: mojo/public/cpp/bindings/tests/iterator_test_util.h

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/interface_unittest.cc ('k') | mojo/public/cpp/bindings/tests/iterator_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698