xref: /aosp_15_r20/external/cronet/base/value_iterators_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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