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

Side by Side Diff: mojo/public/cpp/bindings/tests/deque_unittest.cc

Issue 2900543002: Mojo C++ bindings: introduce mojo::internal::deque and use it in MultiplexRouter. (Closed)
Patch Set: . Created 3 years, 6 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
« no previous file with comments | « mojo/public/cpp/bindings/tests/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 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 #include "mojo/public/cpp/bindings/lib/deque.h"
6 #include "base/memory/ptr_util.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace mojo {
10 namespace test {
11
12 template <typename T>
13 class DequeAccessor {
14 public:
15 explicit DequeAccessor(internal::deque<T>* value) : value_(value) {}
16
17 size_t front() { return value_->front_; }
18
19 size_t back() { return value_->back_; }
20
21 std::vector<T>& buffer() { return value_->buffer_; }
22
23 private:
24 internal::deque<T>* value_;
25 };
26
27 namespace {
28
29 using internal::deque;
30
31 template <typename T>
32 struct ElementTraits {
33 static T GetValue(const T& value) { return value; }
34 static T CreateElement(const T& value) { return value; }
35 };
36
37 template <typename T>
38 struct ElementTraits<std::unique_ptr<T>> {
39 static T GetValue(const std::unique_ptr<T>& value) { return *value; }
40 static std::unique_ptr<T> CreateElement(const T& value) {
41 return base::MakeUnique<T>(value);
42 }
43 };
44
45 template <typename T>
46 class DequeTest : public ::testing::Test {};
47
48 using CaseList = ::testing::Types<int32_t, std::unique_ptr<int32_t>>;
49
50 TYPED_TEST_CASE(DequeTest, CaseList);
51
52 TYPED_TEST(DequeTest, PushPop) {
53 using Traits = ElementTraits<TypeParam>;
54
55 deque<TypeParam> deque_object(2);
56 EXPECT_TRUE(deque_object.empty());
57
58 deque_object.push_front(Traits::CreateElement(123));
59 EXPECT_FALSE(deque_object.empty());
60
61 EXPECT_EQ(123, Traits::GetValue(deque_object.front()));
62 EXPECT_EQ(123, Traits::GetValue(deque_object.back()));
63
64 deque_object.push_back(Traits::CreateElement(456));
65
66 EXPECT_EQ(123, Traits::GetValue(deque_object.front()));
67 EXPECT_EQ(456, Traits::GetValue(deque_object.back()));
68
69 deque_object.push_front(Traits::CreateElement(789));
70
71 EXPECT_EQ(789, Traits::GetValue(deque_object.front()));
72 EXPECT_EQ(456, Traits::GetValue(deque_object.back()));
73
74 deque_object.pop_back();
75 EXPECT_EQ(789, Traits::GetValue(deque_object.front()));
76 EXPECT_EQ(123, Traits::GetValue(deque_object.back()));
77
78 deque_object.pop_front();
79 EXPECT_EQ(123, Traits::GetValue(deque_object.front()));
80 EXPECT_EQ(123, Traits::GetValue(deque_object.back()));
81
82 deque_object.pop_front();
83 EXPECT_TRUE(deque_object.empty());
84 }
85
86 TYPED_TEST(DequeTest, Clear) {
87 using Traits = ElementTraits<TypeParam>;
88
89 deque<TypeParam> deque_object;
90 EXPECT_TRUE(deque_object.empty());
91
92 deque_object.clear();
93 EXPECT_TRUE(deque_object.empty());
94
95 deque_object.push_front(Traits::CreateElement(123));
96 deque_object.push_back(Traits::CreateElement(456));
97 deque_object.push_front(Traits::CreateElement(789));
98
99 deque_object.clear();
100
101 EXPECT_TRUE(deque_object.empty());
102 }
103
104 TYPED_TEST(DequeTest, Move) {
105 using Traits = ElementTraits<TypeParam>;
106
107 {
108 deque<TypeParam> deque_object;
109 deque_object.push_back(Traits::CreateElement(123));
110 deque_object.push_back(Traits::CreateElement(456));
111 deque_object.push_back(Traits::CreateElement(789));
112
113 deque<TypeParam> deque_object2(std::move(deque_object));
114
115 EXPECT_TRUE(deque_object.empty());
116
117 EXPECT_EQ(123, Traits::GetValue(deque_object2.front()));
118 deque_object2.pop_front();
119 EXPECT_EQ(456, Traits::GetValue(deque_object2.front()));
120 deque_object2.pop_front();
121 EXPECT_EQ(789, Traits::GetValue(deque_object2.front()));
122
123 // |deque_object| is still in valid state and could be reused.
124 deque_object.push_back(Traits::CreateElement(321));
125 EXPECT_EQ(321, Traits::GetValue(deque_object.front()));
126 EXPECT_EQ(321, Traits::GetValue(deque_object.back()));
127 }
128
129 {
130 deque<TypeParam> deque_object;
131 deque_object.push_back(Traits::CreateElement(123));
132 deque_object.push_back(Traits::CreateElement(456));
133 deque_object.push_back(Traits::CreateElement(789));
134
135 deque<TypeParam> deque_object2;
136 deque_object2 = std::move(deque_object);
137
138 EXPECT_TRUE(deque_object.empty());
139
140 EXPECT_EQ(123, Traits::GetValue(deque_object2.front()));
141 deque_object2.pop_front();
142 EXPECT_EQ(456, Traits::GetValue(deque_object2.front()));
143 deque_object2.pop_front();
144 EXPECT_EQ(789, Traits::GetValue(deque_object2.front()));
145
146 // |deque_object| is still in valid state and could be reused.
147 deque_object.push_back(Traits::CreateElement(321));
148 EXPECT_EQ(321, Traits::GetValue(deque_object.front()));
149 EXPECT_EQ(321, Traits::GetValue(deque_object.back()));
150 }
151 }
152
153 // Constructs a deque with a fully occupied ring buffer.
154 // |front_index| is the position of the front element in the ring buffer.
155 // |values| stores the values from front to back.
156 template <typename T>
157 void ConstructFullDeque(const std::vector<int32_t>& values,
158 size_t front_index,
159 deque<T>* deque_object) {
160 using Traits = ElementTraits<T>;
161
162 DCHECK_LT(front_index, values.size());
163 *deque_object = deque<T>(values.size());
164
165 // Push some temp elements to make sure the desired front element starts at
166 // |front_index|.
167 for (size_t i = 0; i < front_index; ++i)
168 deque_object->push_back(Traits::CreateElement(0));
169
170 deque_object->push_back(Traits::CreateElement(values[0]));
171
172 for (size_t i = 0; i < front_index; ++i)
173 deque_object->pop_front();
174
175 for (size_t i = 1; i < values.size(); ++i)
176 deque_object->push_back(Traits::CreateElement(values[i]));
177 }
178
179 template <typename T>
180 void VerifyDequeInternalState(deque<T>* deque_object,
181 size_t expected_front,
182 size_t expected_back,
183 const std::vector<int32_t>& expected_values,
184 size_t expected_ring_buffer_size) {
185 using Traits = ElementTraits<T>;
186
187 DequeAccessor<T> accessor(deque_object);
188
189 EXPECT_EQ(expected_front, accessor.front());
190 EXPECT_EQ(expected_back, accessor.back());
191 EXPECT_EQ(expected_ring_buffer_size, accessor.buffer().size());
192
193 size_t index = expected_front;
194 for (size_t i = 0; i < expected_values.size(); ++i) {
195 EXPECT_EQ(expected_values[i], Traits::GetValue(accessor.buffer()[index]));
196 index++;
197 if (index == accessor.buffer().size())
198 index = 0;
199 }
200 }
201
202 TYPED_TEST(DequeTest, ExpandWhiteBox) {
203 using Traits = ElementTraits<TypeParam>;
204
205 // Test ConstructFullDeque() and VerifyDequeInternalState().
206 {
207 deque<TypeParam> deque_object;
208 ConstructFullDeque({1, 2, 3}, 0, &deque_object);
209 VerifyDequeInternalState(&deque_object, 0, 2, {1, 2, 3}, 3);
210
211 deque<TypeParam> deque_object1;
212 ConstructFullDeque({1, 2, 3}, 1, &deque_object1);
213 VerifyDequeInternalState(&deque_object1, 1, 0, {1, 2, 3}, 3);
214 }
215
216 // Test that ring buffer [1(front), 2, 3(back)] becomes
217 // [1(front), 2, 3, 4(back), _, _] after push_back(4).
218 {
219 deque<TypeParam> deque_object;
220 ConstructFullDeque({1, 2, 3}, 0, &deque_object);
221
222 deque_object.push_back(Traits::CreateElement(4));
223 VerifyDequeInternalState(&deque_object, 0, 3, {1, 2, 3, 4}, 6);
224 }
225
226 // Test that ring buffer [1(front), 2, 3(back)] becomes
227 // [1, 2, 3(back), _, _, 4(front)] after push_front(4).
228 {
229 deque<TypeParam> deque_object;
230 ConstructFullDeque({1, 2, 3}, 0, &deque_object);
231
232 deque_object.push_front(Traits::CreateElement(4));
233 VerifyDequeInternalState(&deque_object, 5, 2, {4, 1, 2, 3}, 6);
234 }
235
236 // Test that ring buffer [3(back), 1(front), 2] becomes
237 // [_, 1(front), 2, 3, 4(back), _] after push_back(4).
238 {
239 deque<TypeParam> deque_object;
240 ConstructFullDeque({1, 2, 3}, 1, &deque_object);
241
242 deque_object.push_back(Traits::CreateElement(4));
243 VerifyDequeInternalState(&deque_object, 1, 4, {1, 2, 3, 4}, 6);
244 }
245
246 // Test that ring buffer [2, 3(back), 1(front)] becomes
247 // [2, 3, 4(back), _, _, 1(front)] after push_back(4).
248 {
249 deque<TypeParam> deque_object;
250 ConstructFullDeque({1, 2, 3}, 2, &deque_object);
251
252 deque_object.push_back(Traits::CreateElement(4));
253 VerifyDequeInternalState(&deque_object, 5, 2, {1, 2, 3, 4}, 6);
254 }
255 }
256
257 } // namespace
258 } // namespace test
259 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698