xref: /aosp_15_r20/external/libchrome/base/value_iterators_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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