1 // Copyright 2017 The Chromium Authors
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 "base/value_iterators.h"
6
7 #include <type_traits>
8
9 #include "base/memory/ptr_util.h"
10 #include "base/values.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace base {
15
16 namespace detail {
17
TEST(ValueIteratorsTest,IsAssignable)18 TEST(ValueIteratorsTest, IsAssignable) {
19 static_assert(
20 !std::is_assignable<dict_iterator::reference::first_type, std::string>(),
21 "Can assign strings to dict_iterator");
22
23 static_assert(
24 std::is_assignable<dict_iterator::reference::second_type, Value>(),
25 "Can't assign Values to dict_iterator");
26
27 static_assert(!std::is_assignable<const_dict_iterator::reference::first_type,
28 std::string>(),
29 "Can assign strings to const_dict_iterator");
30
31 static_assert(
32 !std::is_assignable<const_dict_iterator::reference::second_type, Value>(),
33 "Can assign Values to const_dict_iterator");
34 }
35
TEST(ValueIteratorsTest,DictIteratorOperatorStar)36 TEST(ValueIteratorsTest, DictIteratorOperatorStar) {
37 DictStorage storage;
38 storage.emplace("0", std::make_unique<Value>(0));
39
40 using iterator = dict_iterator;
41 iterator iter(storage.begin());
42 EXPECT_EQ("0", (*iter).first);
43 EXPECT_EQ(Value(0), (*iter).second);
44
45 (*iter).second = Value(1);
46 EXPECT_EQ(Value(1), *storage["0"]);
47 }
48
TEST(ValueIteratorsTest,DictIteratorOperatorArrow)49 TEST(ValueIteratorsTest, DictIteratorOperatorArrow) {
50 DictStorage storage;
51 storage.emplace("0", std::make_unique<Value>(0));
52
53 using iterator = dict_iterator;
54 iterator iter(storage.begin());
55 EXPECT_EQ("0", iter->first);
56 EXPECT_EQ(Value(0), iter->second);
57
58 iter->second = Value(1);
59 EXPECT_EQ(Value(1), *storage["0"]);
60 }
61
TEST(ValueIteratorsTest,DictIteratorPreIncrement)62 TEST(ValueIteratorsTest, DictIteratorPreIncrement) {
63 DictStorage storage;
64 storage.emplace("0", std::make_unique<Value>(0));
65 storage.emplace("1", std::make_unique<Value>(1));
66
67 using iterator = dict_iterator;
68 iterator iter(storage.begin());
69 EXPECT_EQ("0", iter->first);
70 EXPECT_EQ(Value(0), iter->second);
71
72 iterator& iter_ref = ++iter;
73 EXPECT_EQ(&iter, &iter_ref);
74
75 EXPECT_EQ("1", iter_ref->first);
76 EXPECT_EQ(Value(1), iter_ref->second);
77 }
78
TEST(ValueIteratorsTest,DictIteratorPostIncrement)79 TEST(ValueIteratorsTest, DictIteratorPostIncrement) {
80 DictStorage storage;
81 storage.emplace("0", std::make_unique<Value>(0));
82 storage.emplace("1", std::make_unique<Value>(1));
83
84 using iterator = dict_iterator;
85 iterator iter(storage.begin());
86 iterator iter_old = iter++;
87
88 EXPECT_EQ("0", iter_old->first);
89 EXPECT_EQ(Value(0), iter_old->second);
90
91 EXPECT_EQ("1", iter->first);
92 EXPECT_EQ(Value(1), iter->second);
93 }
94
TEST(ValueIteratorsTest,DictIteratorPreDecrement)95 TEST(ValueIteratorsTest, DictIteratorPreDecrement) {
96 DictStorage storage;
97 storage.emplace("0", std::make_unique<Value>(0));
98 storage.emplace("1", std::make_unique<Value>(1));
99
100 using iterator = dict_iterator;
101 iterator iter(++storage.begin());
102 EXPECT_EQ("1", iter->first);
103 EXPECT_EQ(Value(1), iter->second);
104
105 iterator& iter_ref = --iter;
106 EXPECT_EQ(&iter, &iter_ref);
107
108 EXPECT_EQ("0", iter_ref->first);
109 EXPECT_EQ(Value(0), iter_ref->second);
110 }
111
TEST(ValueIteratorsTest,DictIteratorPostDecrement)112 TEST(ValueIteratorsTest, DictIteratorPostDecrement) {
113 DictStorage storage;
114 storage.emplace("0", std::make_unique<Value>(0));
115 storage.emplace("1", std::make_unique<Value>(1));
116
117 using iterator = dict_iterator;
118 iterator iter(++storage.begin());
119 iterator iter_old = iter--;
120
121 EXPECT_EQ("1", iter_old->first);
122 EXPECT_EQ(Value(1), iter_old->second);
123
124 EXPECT_EQ("0", iter->first);
125 EXPECT_EQ(Value(0), iter->second);
126 }
127
TEST(ValueIteratorsTest,DictIteratorOperatorEQ)128 TEST(ValueIteratorsTest, DictIteratorOperatorEQ) {
129 DictStorage storage;
130 using iterator = dict_iterator;
131 EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
132 EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
133 }
134
TEST(ValueIteratorsTest,DictIteratorOperatorNE)135 TEST(ValueIteratorsTest, DictIteratorOperatorNE) {
136 DictStorage storage;
137 storage.emplace("0", std::make_unique<Value>(0));
138
139 using iterator = dict_iterator;
140 EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
141 }
142
TEST(ValueIteratorsTest,ConstDictIteratorOperatorStar)143 TEST(ValueIteratorsTest, ConstDictIteratorOperatorStar) {
144 DictStorage storage;
145 storage.emplace("0", std::make_unique<Value>(0));
146
147 using iterator = const_dict_iterator;
148 iterator iter(storage.begin());
149 EXPECT_EQ("0", (*iter).first);
150 EXPECT_EQ(Value(0), (*iter).second);
151 }
152
TEST(ValueIteratorsTest,ConstDictIteratorOperatorArrow)153 TEST(ValueIteratorsTest, ConstDictIteratorOperatorArrow) {
154 DictStorage storage;
155 storage.emplace("0", std::make_unique<Value>(0));
156
157 using iterator = const_dict_iterator;
158 iterator iter(storage.begin());
159 EXPECT_EQ("0", iter->first);
160 EXPECT_EQ(Value(0), iter->second);
161 }
162
TEST(ValueIteratorsTest,ConstDictIteratorPreIncrement)163 TEST(ValueIteratorsTest, ConstDictIteratorPreIncrement) {
164 DictStorage storage;
165 storage.emplace("0", std::make_unique<Value>(0));
166 storage.emplace("1", std::make_unique<Value>(1));
167
168 using iterator = const_dict_iterator;
169 iterator iter(storage.begin());
170 EXPECT_EQ("0", iter->first);
171 EXPECT_EQ(Value(0), iter->second);
172
173 iterator& iter_ref = ++iter;
174 EXPECT_EQ(&iter, &iter_ref);
175
176 EXPECT_EQ("1", iter_ref->first);
177 EXPECT_EQ(Value(1), iter_ref->second);
178 }
179
TEST(ValueIteratorsTest,ConstDictIteratorPostIncrement)180 TEST(ValueIteratorsTest, ConstDictIteratorPostIncrement) {
181 DictStorage storage;
182 storage.emplace("0", std::make_unique<Value>(0));
183 storage.emplace("1", std::make_unique<Value>(1));
184
185 using iterator = const_dict_iterator;
186 iterator iter(storage.begin());
187 iterator iter_old = iter++;
188
189 EXPECT_EQ("0", iter_old->first);
190 EXPECT_EQ(Value(0), iter_old->second);
191
192 EXPECT_EQ("1", iter->first);
193 EXPECT_EQ(Value(1), iter->second);
194 }
195
TEST(ValueIteratorsTest,ConstDictIteratorPreDecrement)196 TEST(ValueIteratorsTest, ConstDictIteratorPreDecrement) {
197 DictStorage storage;
198 storage.emplace("0", std::make_unique<Value>(0));
199 storage.emplace("1", std::make_unique<Value>(1));
200
201 using iterator = const_dict_iterator;
202 iterator iter(++storage.begin());
203 EXPECT_EQ("1", iter->first);
204 EXPECT_EQ(Value(1), iter->second);
205
206 iterator& iter_ref = --iter;
207 EXPECT_EQ(&iter, &iter_ref);
208
209 EXPECT_EQ("0", iter_ref->first);
210 EXPECT_EQ(Value(0), iter_ref->second);
211 }
212
TEST(ValueIteratorsTest,ConstDictIteratorPostDecrement)213 TEST(ValueIteratorsTest, ConstDictIteratorPostDecrement) {
214 DictStorage storage;
215 storage.emplace("0", std::make_unique<Value>(0));
216 storage.emplace("1", std::make_unique<Value>(1));
217
218 using iterator = const_dict_iterator;
219 iterator iter(++storage.begin());
220 iterator iter_old = iter--;
221
222 EXPECT_EQ("1", iter_old->first);
223 EXPECT_EQ(Value(1), iter_old->second);
224
225 EXPECT_EQ("0", iter->first);
226 EXPECT_EQ(Value(0), iter->second);
227 }
228
TEST(ValueIteratorsTest,ConstDictIteratorOperatorEQ)229 TEST(ValueIteratorsTest, ConstDictIteratorOperatorEQ) {
230 DictStorage storage;
231 using iterator = const_dict_iterator;
232 EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
233 EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
234 }
235
TEST(ValueIteratorsTest,ConstDictIteratorOperatorNE)236 TEST(ValueIteratorsTest, ConstDictIteratorOperatorNE) {
237 DictStorage storage;
238 storage.emplace("0", std::make_unique<Value>(0));
239
240 using iterator = const_dict_iterator;
241 EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
242 }
243
244 } // namespace detail
245
246 } // namespace base
247