1*635a8641SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/value_iterators.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <type_traits>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/values.h"
11*635a8641SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
12*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Worker namespace base {
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker namespace detail {
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Worker namespace {
19*635a8641SAndroid Build Coastguard Worker
20*635a8641SAndroid Build Coastguard Worker // Implementation of std::equal variant that is missing in C++11.
21*635a8641SAndroid Build Coastguard Worker template <class BinaryPredicate, class InputIterator1, class InputIterator2>
are_equal(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,BinaryPredicate pred)22*635a8641SAndroid Build Coastguard Worker bool are_equal(InputIterator1 first1,
23*635a8641SAndroid Build Coastguard Worker InputIterator1 last1,
24*635a8641SAndroid Build Coastguard Worker InputIterator2 first2,
25*635a8641SAndroid Build Coastguard Worker InputIterator2 last2,
26*635a8641SAndroid Build Coastguard Worker BinaryPredicate pred) {
27*635a8641SAndroid Build Coastguard Worker for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
28*635a8641SAndroid Build Coastguard Worker if (!pred(*first1, *first2))
29*635a8641SAndroid Build Coastguard Worker return false;
30*635a8641SAndroid Build Coastguard Worker }
31*635a8641SAndroid Build Coastguard Worker return first1 == last1 && first2 == last2;
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker
34*635a8641SAndroid Build Coastguard Worker } // namespace
35*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,SameDictStorage)36*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, SameDictStorage) {
37*635a8641SAndroid Build Coastguard Worker static_assert(std::is_same<Value::DictStorage, DictStorage>::value,
38*635a8641SAndroid Build Coastguard Worker "DictStorage differs between Value and Value Iterators.");
39*635a8641SAndroid Build Coastguard Worker }
40*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,IsAssignable)41*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, IsAssignable) {
42*635a8641SAndroid Build Coastguard Worker static_assert(
43*635a8641SAndroid Build Coastguard Worker !std::is_assignable<dict_iterator::reference::first_type, std::string>(),
44*635a8641SAndroid Build Coastguard Worker "Can assign strings to dict_iterator");
45*635a8641SAndroid Build Coastguard Worker
46*635a8641SAndroid Build Coastguard Worker static_assert(
47*635a8641SAndroid Build Coastguard Worker std::is_assignable<dict_iterator::reference::second_type, Value>(),
48*635a8641SAndroid Build Coastguard Worker "Can't assign Values to dict_iterator");
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker static_assert(!std::is_assignable<const_dict_iterator::reference::first_type,
51*635a8641SAndroid Build Coastguard Worker std::string>(),
52*635a8641SAndroid Build Coastguard Worker "Can assign strings to const_dict_iterator");
53*635a8641SAndroid Build Coastguard Worker
54*635a8641SAndroid Build Coastguard Worker static_assert(
55*635a8641SAndroid Build Coastguard Worker !std::is_assignable<const_dict_iterator::reference::second_type, Value>(),
56*635a8641SAndroid Build Coastguard Worker "Can assign Values to const_dict_iterator");
57*635a8641SAndroid Build Coastguard Worker }
58*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorOperatorStar)59*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorOperatorStar) {
60*635a8641SAndroid Build Coastguard Worker DictStorage storage;
61*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
64*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
65*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", (*iter).first);
66*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), (*iter).second);
67*635a8641SAndroid Build Coastguard Worker
68*635a8641SAndroid Build Coastguard Worker (*iter).second = Value(1);
69*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), *storage["0"]);
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorOperatorArrow)72*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorOperatorArrow) {
73*635a8641SAndroid Build Coastguard Worker DictStorage storage;
74*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
77*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
78*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
79*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
80*635a8641SAndroid Build Coastguard Worker
81*635a8641SAndroid Build Coastguard Worker iter->second = Value(1);
82*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), *storage["0"]);
83*635a8641SAndroid Build Coastguard Worker }
84*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorPreIncrement)85*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorPreIncrement) {
86*635a8641SAndroid Build Coastguard Worker DictStorage storage;
87*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
88*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
89*635a8641SAndroid Build Coastguard Worker
90*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
91*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
92*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
93*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
94*635a8641SAndroid Build Coastguard Worker
95*635a8641SAndroid Build Coastguard Worker iterator& iter_ref = ++iter;
96*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&iter, &iter_ref);
97*635a8641SAndroid Build Coastguard Worker
98*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter_ref->first);
99*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter_ref->second);
100*635a8641SAndroid Build Coastguard Worker }
101*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorPostIncrement)102*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorPostIncrement) {
103*635a8641SAndroid Build Coastguard Worker DictStorage storage;
104*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
105*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
106*635a8641SAndroid Build Coastguard Worker
107*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
108*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
109*635a8641SAndroid Build Coastguard Worker iterator iter_old = iter++;
110*635a8641SAndroid Build Coastguard Worker
111*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter_old->first);
112*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter_old->second);
113*635a8641SAndroid Build Coastguard Worker
114*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter->first);
115*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter->second);
116*635a8641SAndroid Build Coastguard Worker }
117*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorPreDecrement)118*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorPreDecrement) {
119*635a8641SAndroid Build Coastguard Worker DictStorage storage;
120*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
121*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
122*635a8641SAndroid Build Coastguard Worker
123*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
124*635a8641SAndroid Build Coastguard Worker iterator iter(++storage.begin());
125*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter->first);
126*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter->second);
127*635a8641SAndroid Build Coastguard Worker
128*635a8641SAndroid Build Coastguard Worker iterator& iter_ref = --iter;
129*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&iter, &iter_ref);
130*635a8641SAndroid Build Coastguard Worker
131*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter_ref->first);
132*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter_ref->second);
133*635a8641SAndroid Build Coastguard Worker }
134*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorPostDecrement)135*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorPostDecrement) {
136*635a8641SAndroid Build Coastguard Worker DictStorage storage;
137*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
138*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
139*635a8641SAndroid Build Coastguard Worker
140*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
141*635a8641SAndroid Build Coastguard Worker iterator iter(++storage.begin());
142*635a8641SAndroid Build Coastguard Worker iterator iter_old = iter--;
143*635a8641SAndroid Build Coastguard Worker
144*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter_old->first);
145*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter_old->second);
146*635a8641SAndroid Build Coastguard Worker
147*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
148*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
149*635a8641SAndroid Build Coastguard Worker }
150*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorOperatorEQ)151*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorOperatorEQ) {
152*635a8641SAndroid Build Coastguard Worker DictStorage storage;
153*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
154*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
155*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
156*635a8641SAndroid Build Coastguard Worker }
157*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorOperatorNE)158*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorOperatorNE) {
159*635a8641SAndroid Build Coastguard Worker DictStorage storage;
160*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
161*635a8641SAndroid Build Coastguard Worker
162*635a8641SAndroid Build Coastguard Worker using iterator = dict_iterator;
163*635a8641SAndroid Build Coastguard Worker EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
164*635a8641SAndroid Build Coastguard Worker }
165*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorOperatorStar)166*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorOperatorStar) {
167*635a8641SAndroid Build Coastguard Worker DictStorage storage;
168*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
169*635a8641SAndroid Build Coastguard Worker
170*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
171*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
172*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", (*iter).first);
173*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), (*iter).second);
174*635a8641SAndroid Build Coastguard Worker }
175*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorOperatorArrow)176*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorOperatorArrow) {
177*635a8641SAndroid Build Coastguard Worker DictStorage storage;
178*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
179*635a8641SAndroid Build Coastguard Worker
180*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
181*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
182*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
183*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
184*635a8641SAndroid Build Coastguard Worker }
185*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorPreIncrement)186*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorPreIncrement) {
187*635a8641SAndroid Build Coastguard Worker DictStorage storage;
188*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
189*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
190*635a8641SAndroid Build Coastguard Worker
191*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
192*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
193*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
194*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
195*635a8641SAndroid Build Coastguard Worker
196*635a8641SAndroid Build Coastguard Worker iterator& iter_ref = ++iter;
197*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&iter, &iter_ref);
198*635a8641SAndroid Build Coastguard Worker
199*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter_ref->first);
200*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter_ref->second);
201*635a8641SAndroid Build Coastguard Worker }
202*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorPostIncrement)203*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorPostIncrement) {
204*635a8641SAndroid Build Coastguard Worker DictStorage storage;
205*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
206*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
207*635a8641SAndroid Build Coastguard Worker
208*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
209*635a8641SAndroid Build Coastguard Worker iterator iter(storage.begin());
210*635a8641SAndroid Build Coastguard Worker iterator iter_old = iter++;
211*635a8641SAndroid Build Coastguard Worker
212*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter_old->first);
213*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter_old->second);
214*635a8641SAndroid Build Coastguard Worker
215*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter->first);
216*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter->second);
217*635a8641SAndroid Build Coastguard Worker }
218*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorPreDecrement)219*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorPreDecrement) {
220*635a8641SAndroid Build Coastguard Worker DictStorage storage;
221*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
222*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
223*635a8641SAndroid Build Coastguard Worker
224*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
225*635a8641SAndroid Build Coastguard Worker iterator iter(++storage.begin());
226*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter->first);
227*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter->second);
228*635a8641SAndroid Build Coastguard Worker
229*635a8641SAndroid Build Coastguard Worker iterator& iter_ref = --iter;
230*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&iter, &iter_ref);
231*635a8641SAndroid Build Coastguard Worker
232*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter_ref->first);
233*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter_ref->second);
234*635a8641SAndroid Build Coastguard Worker }
235*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorPostDecrement)236*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorPostDecrement) {
237*635a8641SAndroid Build Coastguard Worker DictStorage storage;
238*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
239*635a8641SAndroid Build Coastguard Worker storage.emplace("1", std::make_unique<Value>(1));
240*635a8641SAndroid Build Coastguard Worker
241*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
242*635a8641SAndroid Build Coastguard Worker iterator iter(++storage.begin());
243*635a8641SAndroid Build Coastguard Worker iterator iter_old = iter--;
244*635a8641SAndroid Build Coastguard Worker
245*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1", iter_old->first);
246*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(1), iter_old->second);
247*635a8641SAndroid Build Coastguard Worker
248*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0", iter->first);
249*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Value(0), iter->second);
250*635a8641SAndroid Build Coastguard Worker }
251*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorOperatorEQ)252*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorOperatorEQ) {
253*635a8641SAndroid Build Coastguard Worker DictStorage storage;
254*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
255*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
256*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
257*635a8641SAndroid Build Coastguard Worker }
258*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorOperatorNE)259*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorOperatorNE) {
260*635a8641SAndroid Build Coastguard Worker DictStorage storage;
261*635a8641SAndroid Build Coastguard Worker storage.emplace("0", std::make_unique<Value>(0));
262*635a8641SAndroid Build Coastguard Worker
263*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
264*635a8641SAndroid Build Coastguard Worker EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
265*635a8641SAndroid Build Coastguard Worker }
266*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,DictIteratorProxy)267*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, DictIteratorProxy) {
268*635a8641SAndroid Build Coastguard Worker DictStorage storage;
269*635a8641SAndroid Build Coastguard Worker storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
270*635a8641SAndroid Build Coastguard Worker storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
271*635a8641SAndroid Build Coastguard Worker storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
272*635a8641SAndroid Build Coastguard Worker storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
273*635a8641SAndroid Build Coastguard Worker storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
274*635a8641SAndroid Build Coastguard Worker storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
275*635a8641SAndroid Build Coastguard Worker storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
276*635a8641SAndroid Build Coastguard Worker storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
277*635a8641SAndroid Build Coastguard Worker
278*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
279*635a8641SAndroid Build Coastguard Worker using iterator_proxy = dict_iterator_proxy;
280*635a8641SAndroid Build Coastguard Worker iterator_proxy proxy(&storage);
281*635a8641SAndroid Build Coastguard Worker
282*635a8641SAndroid Build Coastguard Worker auto equal_to = [](const DictStorage::value_type& lhs,
283*635a8641SAndroid Build Coastguard Worker const iterator::reference& rhs) {
284*635a8641SAndroid Build Coastguard Worker return std::tie(lhs.first, *lhs.second) == std::tie(rhs.first, rhs.second);
285*635a8641SAndroid Build Coastguard Worker };
286*635a8641SAndroid Build Coastguard Worker
287*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.begin(), storage.end(), proxy.begin(),
288*635a8641SAndroid Build Coastguard Worker proxy.end(), equal_to));
289*635a8641SAndroid Build Coastguard Worker
290*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.rbegin(), storage.rend(), proxy.rbegin(),
291*635a8641SAndroid Build Coastguard Worker proxy.rend(), equal_to));
292*635a8641SAndroid Build Coastguard Worker
293*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.cbegin(), storage.cend(), proxy.cbegin(),
294*635a8641SAndroid Build Coastguard Worker proxy.cend(), equal_to));
295*635a8641SAndroid Build Coastguard Worker
296*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.crbegin(), storage.crend(), proxy.crbegin(),
297*635a8641SAndroid Build Coastguard Worker proxy.crend(), equal_to));
298*635a8641SAndroid Build Coastguard Worker }
299*635a8641SAndroid Build Coastguard Worker
TEST(ValueIteratorsTest,ConstDictIteratorProxy)300*635a8641SAndroid Build Coastguard Worker TEST(ValueIteratorsTest, ConstDictIteratorProxy) {
301*635a8641SAndroid Build Coastguard Worker DictStorage storage;
302*635a8641SAndroid Build Coastguard Worker storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
303*635a8641SAndroid Build Coastguard Worker storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
304*635a8641SAndroid Build Coastguard Worker storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
305*635a8641SAndroid Build Coastguard Worker storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
306*635a8641SAndroid Build Coastguard Worker storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
307*635a8641SAndroid Build Coastguard Worker storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
308*635a8641SAndroid Build Coastguard Worker storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
309*635a8641SAndroid Build Coastguard Worker storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
310*635a8641SAndroid Build Coastguard Worker
311*635a8641SAndroid Build Coastguard Worker using iterator = const_dict_iterator;
312*635a8641SAndroid Build Coastguard Worker using iterator_proxy = const_dict_iterator_proxy;
313*635a8641SAndroid Build Coastguard Worker iterator_proxy proxy(&storage);
314*635a8641SAndroid Build Coastguard Worker
315*635a8641SAndroid Build Coastguard Worker auto equal_to = [](const DictStorage::value_type& lhs,
316*635a8641SAndroid Build Coastguard Worker const iterator::reference& rhs) {
317*635a8641SAndroid Build Coastguard Worker return std::tie(lhs.first, *lhs.second) == std::tie(rhs.first, rhs.second);
318*635a8641SAndroid Build Coastguard Worker };
319*635a8641SAndroid Build Coastguard Worker
320*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.begin(), storage.end(), proxy.begin(),
321*635a8641SAndroid Build Coastguard Worker proxy.end(), equal_to));
322*635a8641SAndroid Build Coastguard Worker
323*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.rbegin(), storage.rend(), proxy.rbegin(),
324*635a8641SAndroid Build Coastguard Worker proxy.rend(), equal_to));
325*635a8641SAndroid Build Coastguard Worker
326*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.cbegin(), storage.cend(), proxy.cbegin(),
327*635a8641SAndroid Build Coastguard Worker proxy.cend(), equal_to));
328*635a8641SAndroid Build Coastguard Worker
329*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(are_equal(storage.crbegin(), storage.crend(), proxy.crbegin(),
330*635a8641SAndroid Build Coastguard Worker proxy.crend(), equal_to));
331*635a8641SAndroid Build Coastguard Worker }
332*635a8641SAndroid Build Coastguard Worker
333*635a8641SAndroid Build Coastguard Worker } // namespace detail
334*635a8641SAndroid Build Coastguard Worker
335*635a8641SAndroid Build Coastguard Worker } // namespace base
336