xref: /aosp_15_r20/external/cronet/base/values_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <algorithm>
10*6777b538SAndroid Build Coastguard Worker #include <functional>
11*6777b538SAndroid Build Coastguard Worker #include <iterator>
12*6777b538SAndroid Build Coastguard Worker #include <limits>
13*6777b538SAndroid Build Coastguard Worker #include <memory>
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <type_traits>
16*6777b538SAndroid Build Coastguard Worker #include <utility>
17*6777b538SAndroid Build Coastguard Worker #include <vector>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/bits.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/containers/adapters.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
25*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
26*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
27*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_BASE_TRACING)
30*6777b538SAndroid Build Coastguard Worker #include <optional>
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/test/traced_value_test_support.h"  // no-presubmit-check nogncheck
33*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(ENABLE_BASE_TRACING)
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker namespace base {
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker #ifdef NDEBUG
38*6777b538SAndroid Build Coastguard Worker // `Value` should have a (relatively) small size to avoid creating excess
39*6777b538SAndroid Build Coastguard Worker // overhead, e.g. for lists of values that are all ints.
40*6777b538SAndroid Build Coastguard Worker //
41*6777b538SAndroid Build Coastguard Worker // This test is limited to NDEBUG builds, since some containers may require
42*6777b538SAndroid Build Coastguard Worker // extra storage for supporting debug checks for things like iterators.
TEST(ValuesTest,SizeOfValue)43*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SizeOfValue) {
44*6777b538SAndroid Build Coastguard Worker #if defined(__GLIBCXX__)
45*6777b538SAndroid Build Coastguard Worker   // libstdc++ std::string takes already 4 machine words, so the absl::variant
46*6777b538SAndroid Build Coastguard Worker   // takes 5
47*6777b538SAndroid Build Coastguard Worker   constexpr size_t kExpectedSize = 5 * sizeof(void*);
48*6777b538SAndroid Build Coastguard Worker #else   // !defined(__GLIBCXX__)
49*6777b538SAndroid Build Coastguard Worker   // libc++'s std::string and std::vector both take 3 machine words. An
50*6777b538SAndroid Build Coastguard Worker   // additional word is used by absl::variant for the type index.
51*6777b538SAndroid Build Coastguard Worker   constexpr size_t kExpectedSize = 4 * sizeof(void*);
52*6777b538SAndroid Build Coastguard Worker #endif  // defined(__GLIBCXX__)
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // Use std::integral_constant so the compiler error message includes the
55*6777b538SAndroid Build Coastguard Worker   // evaluated size. In future versions of clang, it should be possible to
56*6777b538SAndroid Build Coastguard Worker   // simplify this to an equality comparison (i.e. newer clangs print out
57*6777b538SAndroid Build Coastguard Worker   // "comparison reduces to '(1 == 2)'").
58*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<std::integral_constant<size_t, sizeof(Value)>,
59*6777b538SAndroid Build Coastguard Worker                                std::integral_constant<size_t, kExpectedSize>>,
60*6777b538SAndroid Build Coastguard Worker                 "base::Value has an unexpected size!");
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker #endif
63*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,TestNothrow)64*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, TestNothrow) {
65*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_nothrow_move_constructible_v<Value>,
66*6777b538SAndroid Build Coastguard Worker                 "IsNothrowMoveConstructible");
67*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_nothrow_default_constructible_v<Value>,
68*6777b538SAndroid Build Coastguard Worker                 "IsNothrowDefaultConstructible");
69*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_nothrow_constructible_v<Value, std::string&&>,
70*6777b538SAndroid Build Coastguard Worker                 "IsNothrowMoveConstructibleFromString");
71*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_nothrow_constructible_v<Value, Value::BlobStorage&&>,
72*6777b538SAndroid Build Coastguard Worker                 "IsNothrowMoveConstructibleFromBlob");
73*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_nothrow_move_assignable_v<Value>,
74*6777b538SAndroid Build Coastguard Worker                 "IsNothrowMoveAssignable");
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,EmptyValue)77*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, EmptyValue) {
78*6777b538SAndroid Build Coastguard Worker   Value value;
79*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::NONE, value.type());
80*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, value.GetIfBool());
81*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, value.GetIfInt());
82*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, value.GetIfDouble());
83*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, value.GetIfString());
84*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, value.GetIfBlob());
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker // Group of tests for the value constructors.
TEST(ValuesTest,ConstructBool)88*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructBool) {
89*6777b538SAndroid Build Coastguard Worker   Value true_value(true);
90*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, true_value.type());
91*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(true_value.GetIfBool(), testing::Optional(true));
92*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(true_value.GetBool());
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   Value false_value(false);
95*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, false_value.type());
96*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(false_value.GetIfBool(), testing::Optional(false));
97*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(false_value.GetBool());
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructFromPtrs)100*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructFromPtrs) {
101*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_constructible_v<Value, int*>, "");
102*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_constructible_v<Value, const int*>, "");
103*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_constructible_v<Value, wchar_t*>, "");
104*6777b538SAndroid Build Coastguard Worker   static_assert(!std::is_constructible_v<Value, const wchar_t*>, "");
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_constructible_v<Value, char*>, "");
107*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_constructible_v<Value, const char*>, "");
108*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_constructible_v<Value, char16_t*>, "");
109*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_constructible_v<Value, const char16_t*>, "");
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructInt)112*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructInt) {
113*6777b538SAndroid Build Coastguard Worker   Value value(-37);
114*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::INTEGER, value.type());
115*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfInt(), testing::Optional(-37));
116*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(-37, value.GetInt());
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfDouble(), testing::Optional(-37.0));
119*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(-37.0, value.GetDouble());
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructDouble)122*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructDouble) {
123*6777b538SAndroid Build Coastguard Worker   Value value(-4.655);
124*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DOUBLE, value.type());
125*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfDouble(), testing::Optional(-4.655));
126*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(-4.655, value.GetDouble());
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructStringFromConstCharPtr)129*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructStringFromConstCharPtr) {
130*6777b538SAndroid Build Coastguard Worker   const char* str = "foobar";
131*6777b538SAndroid Build Coastguard Worker   Value value(str);
132*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, value.type());
133*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfString(), testing::Pointee(std::string("foobar")));
134*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", value.GetString());
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructStringFromStringPiece)137*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructStringFromStringPiece) {
138*6777b538SAndroid Build Coastguard Worker   std::string str = "foobar";
139*6777b538SAndroid Build Coastguard Worker   Value value{StringPiece(str)};
140*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, value.type());
141*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfString(), testing::Pointee(std::string("foobar")));
142*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", value.GetString());
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructStringFromStdStringRRef)145*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructStringFromStdStringRRef) {
146*6777b538SAndroid Build Coastguard Worker   std::string str = "foobar";
147*6777b538SAndroid Build Coastguard Worker   Value value(std::move(str));
148*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, value.type());
149*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfString(), testing::Pointee(std::string("foobar")));
150*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", value.GetString());
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructStringFromConstChar16Ptr)153*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructStringFromConstChar16Ptr) {
154*6777b538SAndroid Build Coastguard Worker   std::u16string str = u"foobar";
155*6777b538SAndroid Build Coastguard Worker   Value value(str.c_str());
156*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, value.type());
157*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfString(), testing::Pointee(std::string("foobar")));
158*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", value.GetString());
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructStringFromStringPiece16)161*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructStringFromStringPiece16) {
162*6777b538SAndroid Build Coastguard Worker   std::u16string str = u"foobar";
163*6777b538SAndroid Build Coastguard Worker   Value value{StringPiece16(str)};
164*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, value.type());
165*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfString(), testing::Pointee(std::string("foobar")));
166*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", value.GetString());
167*6777b538SAndroid Build Coastguard Worker }
168*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructBinary)169*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructBinary) {
170*6777b538SAndroid Build Coastguard Worker   Value::BlobStorage blob = {0xF, 0x0, 0x0, 0xB, 0xA, 0x2};
171*6777b538SAndroid Build Coastguard Worker   Value value(blob);
172*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BINARY, value.type());
173*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(value.GetIfBlob(), testing::Pointee(blob));
174*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(blob, value.GetBlob());
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructDict)177*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructDict) {
178*6777b538SAndroid Build Coastguard Worker   Value::Dict value;
179*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DICT, Value(std::move(value)).type());
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructDictFromValueDict)182*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructDictFromValueDict) {
183*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
184*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", "bar");
185*6777b538SAndroid Build Coastguard Worker   {
186*6777b538SAndroid Build Coastguard Worker     Value value(dict.Clone());
187*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::DICT, value.type());
188*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(value.GetIfDict());
189*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(value.GetDict().FindString("foo"));
190*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("bar", *value.GetDict().FindString("foo"));
191*6777b538SAndroid Build Coastguard Worker   }
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", "baz");
194*6777b538SAndroid Build Coastguard Worker   {
195*6777b538SAndroid Build Coastguard Worker     Value value(std::move(dict));
196*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::DICT, value.type());
197*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(value.GetIfDict());
198*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(value.GetDict().FindString("foo"));
199*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("baz", *value.GetDict().FindString("foo"));
200*6777b538SAndroid Build Coastguard Worker   }
201*6777b538SAndroid Build Coastguard Worker }
202*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructList)203*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructList) {
204*6777b538SAndroid Build Coastguard Worker   Value value(Value::List{});
205*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::LIST, value.type());
206*6777b538SAndroid Build Coastguard Worker }
207*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,UseTestingEachOnValueList)208*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, UseTestingEachOnValueList) {
209*6777b538SAndroid Build Coastguard Worker   Value::List list;
210*6777b538SAndroid Build Coastguard Worker   list.Append(true);
211*6777b538SAndroid Build Coastguard Worker   list.Append(true);
212*6777b538SAndroid Build Coastguard Worker 
213*6777b538SAndroid Build Coastguard Worker   // This will only work if `Value::List::value_type` is defined.
214*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(list, testing::Each(testing::ResultOf(
215*6777b538SAndroid Build Coastguard Worker                         [](const Value& value) { return value.GetBool(); },
216*6777b538SAndroid Build Coastguard Worker                         testing::Eq(true))));
217*6777b538SAndroid Build Coastguard Worker }
218*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructListFromValueList)219*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructListFromValueList) {
220*6777b538SAndroid Build Coastguard Worker   Value::List list;
221*6777b538SAndroid Build Coastguard Worker   list.Append("foo");
222*6777b538SAndroid Build Coastguard Worker   {
223*6777b538SAndroid Build Coastguard Worker     Value value(list.Clone());
224*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::LIST, value.type());
225*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, value.GetList().size());
226*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::STRING, value.GetList()[0].type());
227*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("foo", value.GetList()[0].GetString());
228*6777b538SAndroid Build Coastguard Worker   }
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   list.back() = base::Value("bar");
231*6777b538SAndroid Build Coastguard Worker   {
232*6777b538SAndroid Build Coastguard Worker     Value value(std::move(list));
233*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::LIST, value.type());
234*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1u, value.GetList().size());
235*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::STRING, value.GetList()[0].type());
236*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("bar", value.GetList()[0].GetString());
237*6777b538SAndroid Build Coastguard Worker   }
238*6777b538SAndroid Build Coastguard Worker }
239*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,HardenTests)240*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, HardenTests) {
241*6777b538SAndroid Build Coastguard Worker   Value value;
242*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(value.type(), Value::Type::NONE);
243*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(value.GetBool(), "");
244*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(value.GetInt(), "");
245*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(value.GetDouble(), "");
246*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(value.GetString(), "");
247*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(value.GetBlob(), "");
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker // Group of tests for the copy constructors and copy-assigmnent. For equality
251*6777b538SAndroid Build Coastguard Worker // checks comparisons of the interesting fields are done instead of relying on
252*6777b538SAndroid Build Coastguard Worker // Equals being correct.
TEST(ValuesTest,CopyBool)253*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyBool) {
254*6777b538SAndroid Build Coastguard Worker   Value true_value(true);
255*6777b538SAndroid Build Coastguard Worker   Value copied_true_value(true_value.Clone());
256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(true_value.type(), copied_true_value.type());
257*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool());
258*6777b538SAndroid Build Coastguard Worker 
259*6777b538SAndroid Build Coastguard Worker   Value false_value(false);
260*6777b538SAndroid Build Coastguard Worker   Value copied_false_value(false_value.Clone());
261*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(false_value.type(), copied_false_value.type());
262*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(false_value.GetBool(), copied_false_value.GetBool());
263*6777b538SAndroid Build Coastguard Worker 
264*6777b538SAndroid Build Coastguard Worker   Value blank;
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   blank = true_value.Clone();
267*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(true_value.type(), blank.type());
268*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(true_value.GetBool(), blank.GetBool());
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker   blank = false_value.Clone();
271*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(false_value.type(), blank.type());
272*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(false_value.GetBool(), blank.GetBool());
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyInt)275*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyInt) {
276*6777b538SAndroid Build Coastguard Worker   Value value(74);
277*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
278*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), copied_value.type());
279*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetInt(), copied_value.GetInt());
280*6777b538SAndroid Build Coastguard Worker 
281*6777b538SAndroid Build Coastguard Worker   Value blank;
282*6777b538SAndroid Build Coastguard Worker 
283*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
284*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), blank.type());
285*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetInt(), blank.GetInt());
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyDouble)288*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyDouble) {
289*6777b538SAndroid Build Coastguard Worker   Value value(74.896);
290*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
291*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), copied_value.type());
292*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetDouble(), copied_value.GetDouble());
293*6777b538SAndroid Build Coastguard Worker 
294*6777b538SAndroid Build Coastguard Worker   Value blank;
295*6777b538SAndroid Build Coastguard Worker 
296*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
297*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), blank.type());
298*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetDouble(), blank.GetDouble());
299*6777b538SAndroid Build Coastguard Worker }
300*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyString)301*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyString) {
302*6777b538SAndroid Build Coastguard Worker   Value value("foobar");
303*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
304*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), copied_value.type());
305*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetString(), copied_value.GetString());
306*6777b538SAndroid Build Coastguard Worker 
307*6777b538SAndroid Build Coastguard Worker   Value blank;
308*6777b538SAndroid Build Coastguard Worker 
309*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
310*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), blank.type());
311*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetString(), blank.GetString());
312*6777b538SAndroid Build Coastguard Worker }
313*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyBinary)314*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyBinary) {
315*6777b538SAndroid Build Coastguard Worker   Value value(Value::BlobStorage({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}));
316*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
317*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), copied_value.type());
318*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetBlob(), copied_value.GetBlob());
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker   Value blank;
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
323*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.type(), blank.type());
324*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value.GetBlob(), blank.GetBlob());
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyDictionary)327*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyDictionary) {
328*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
329*6777b538SAndroid Build Coastguard Worker   dict.Set("Int", 123);
330*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
331*6777b538SAndroid Build Coastguard Worker 
332*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
333*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, copied_value);
334*6777b538SAndroid Build Coastguard Worker 
335*6777b538SAndroid Build Coastguard Worker   Value blank;
336*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
337*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, blank);
338*6777b538SAndroid Build Coastguard Worker }
339*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,CopyList)340*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, CopyList) {
341*6777b538SAndroid Build Coastguard Worker   Value::List list;
342*6777b538SAndroid Build Coastguard Worker   list.Append(123);
343*6777b538SAndroid Build Coastguard Worker   Value value(std::move(list));
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker   Value copied_value(value.Clone());
346*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, copied_value);
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   Value blank;
349*6777b538SAndroid Build Coastguard Worker   blank = value.Clone();
350*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, blank);
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker // Group of tests for the move constructors and move-assigmnent.
TEST(ValuesTest,MoveBool)354*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveBool) {
355*6777b538SAndroid Build Coastguard Worker   Value true_value(true);
356*6777b538SAndroid Build Coastguard Worker   Value moved_true_value(std::move(true_value));
357*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type());
358*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(moved_true_value.GetBool());
359*6777b538SAndroid Build Coastguard Worker 
360*6777b538SAndroid Build Coastguard Worker   Value false_value(false);
361*6777b538SAndroid Build Coastguard Worker   Value moved_false_value(std::move(false_value));
362*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type());
363*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(moved_false_value.GetBool());
364*6777b538SAndroid Build Coastguard Worker 
365*6777b538SAndroid Build Coastguard Worker   Value blank;
366*6777b538SAndroid Build Coastguard Worker 
367*6777b538SAndroid Build Coastguard Worker   blank = Value(true);
368*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, blank.type());
369*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(blank.GetBool());
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker   blank = Value(false);
372*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BOOLEAN, blank.type());
373*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(blank.GetBool());
374*6777b538SAndroid Build Coastguard Worker }
375*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveInt)376*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveInt) {
377*6777b538SAndroid Build Coastguard Worker   Value value(74);
378*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
379*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::INTEGER, moved_value.type());
380*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(74, moved_value.GetInt());
381*6777b538SAndroid Build Coastguard Worker 
382*6777b538SAndroid Build Coastguard Worker   Value blank;
383*6777b538SAndroid Build Coastguard Worker 
384*6777b538SAndroid Build Coastguard Worker   blank = Value(47);
385*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::INTEGER, blank.type());
386*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(47, blank.GetInt());
387*6777b538SAndroid Build Coastguard Worker }
388*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveDouble)389*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveDouble) {
390*6777b538SAndroid Build Coastguard Worker   Value value(74.896);
391*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
392*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DOUBLE, moved_value.type());
393*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(74.896, moved_value.GetDouble());
394*6777b538SAndroid Build Coastguard Worker 
395*6777b538SAndroid Build Coastguard Worker   Value blank;
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker   blank = Value(654.38);
398*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DOUBLE, blank.type());
399*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(654.38, blank.GetDouble());
400*6777b538SAndroid Build Coastguard Worker }
401*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveString)402*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveString) {
403*6777b538SAndroid Build Coastguard Worker   Value value("foobar");
404*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
405*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, moved_value.type());
406*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", moved_value.GetString());
407*6777b538SAndroid Build Coastguard Worker 
408*6777b538SAndroid Build Coastguard Worker   Value blank;
409*6777b538SAndroid Build Coastguard Worker 
410*6777b538SAndroid Build Coastguard Worker   blank = Value("foobar");
411*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::STRING, blank.type());
412*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foobar", blank.GetString());
413*6777b538SAndroid Build Coastguard Worker }
414*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveBinary)415*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveBinary) {
416*6777b538SAndroid Build Coastguard Worker   const Value::BlobStorage buffer = {0xF, 0x0, 0x0, 0xB, 0xA, 0x2};
417*6777b538SAndroid Build Coastguard Worker   Value value(buffer);
418*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
419*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BINARY, moved_value.type());
420*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(buffer, moved_value.GetBlob());
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker   Value blank;
423*6777b538SAndroid Build Coastguard Worker 
424*6777b538SAndroid Build Coastguard Worker   blank = Value(buffer);
425*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::BINARY, blank.type());
426*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(buffer, blank.GetBlob());
427*6777b538SAndroid Build Coastguard Worker }
428*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveConstructDictionary)429*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveConstructDictionary) {
430*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
431*6777b538SAndroid Build Coastguard Worker   dict.Set("Int", 123);
432*6777b538SAndroid Build Coastguard Worker 
433*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
434*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
435*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DICT, moved_value.type());
436*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, moved_value.GetDict().Find("Int")->GetInt());
437*6777b538SAndroid Build Coastguard Worker }
438*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveAssignDictionary)439*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveAssignDictionary) {
440*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
441*6777b538SAndroid Build Coastguard Worker   dict.Set("Int", 123);
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker   Value blank;
444*6777b538SAndroid Build Coastguard Worker   blank = Value(std::move(dict));
445*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DICT, blank.type());
446*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, blank.GetDict().Find("Int")->GetInt());
447*6777b538SAndroid Build Coastguard Worker }
448*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ConstructDictWithIterators)449*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ConstructDictWithIterators) {
450*6777b538SAndroid Build Coastguard Worker   std::vector<std::pair<std::string, Value>> values;
451*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::make_pair("Int", 123));
452*6777b538SAndroid Build Coastguard Worker 
453*6777b538SAndroid Build Coastguard Worker   Value blank;
454*6777b538SAndroid Build Coastguard Worker   blank = Value(Value::Dict(std::make_move_iterator(values.begin()),
455*6777b538SAndroid Build Coastguard Worker                             std::make_move_iterator(values.end())));
456*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::DICT, blank.type());
457*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, blank.GetDict().Find("Int")->GetInt());
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MoveList)460*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MoveList) {
461*6777b538SAndroid Build Coastguard Worker   Value::List list;
462*6777b538SAndroid Build Coastguard Worker   list.Append(123);
463*6777b538SAndroid Build Coastguard Worker   Value value(list.Clone());
464*6777b538SAndroid Build Coastguard Worker   Value moved_value(std::move(value));
465*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::LIST, moved_value.type());
466*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, moved_value.GetList().back().GetInt());
467*6777b538SAndroid Build Coastguard Worker 
468*6777b538SAndroid Build Coastguard Worker   Value blank;
469*6777b538SAndroid Build Coastguard Worker   blank = Value(std::move(list));
470*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value::Type::LIST, blank.type());
471*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, blank.GetList().back().GetInt());
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Append)474*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Append) {
475*6777b538SAndroid Build Coastguard Worker   Value::List list;
476*6777b538SAndroid Build Coastguard Worker   list.Append(true);
477*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_bool());
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker   list.Append(123);
480*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_int());
481*6777b538SAndroid Build Coastguard Worker 
482*6777b538SAndroid Build Coastguard Worker   list.Append(3.14);
483*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_double());
484*6777b538SAndroid Build Coastguard Worker 
485*6777b538SAndroid Build Coastguard Worker   std::string str = "foo";
486*6777b538SAndroid Build Coastguard Worker   list.Append(str.c_str());
487*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_string());
488*6777b538SAndroid Build Coastguard Worker 
489*6777b538SAndroid Build Coastguard Worker   list.Append(StringPiece(str));
490*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_string());
491*6777b538SAndroid Build Coastguard Worker 
492*6777b538SAndroid Build Coastguard Worker   list.Append(std::move(str));
493*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_string());
494*6777b538SAndroid Build Coastguard Worker 
495*6777b538SAndroid Build Coastguard Worker   std::u16string str16 = u"bar";
496*6777b538SAndroid Build Coastguard Worker   list.Append(str16.c_str());
497*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_string());
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker   list.Append(base::StringPiece16(str16));
500*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_string());
501*6777b538SAndroid Build Coastguard Worker 
502*6777b538SAndroid Build Coastguard Worker   list.Append(Value());
503*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_none());
504*6777b538SAndroid Build Coastguard Worker 
505*6777b538SAndroid Build Coastguard Worker   list.Append(Value::Dict());
506*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_dict());
507*6777b538SAndroid Build Coastguard Worker 
508*6777b538SAndroid Build Coastguard Worker   list.Append(Value::List());
509*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.back().is_list());
510*6777b538SAndroid Build Coastguard Worker }
511*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListInsert)512*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListInsert) {
513*6777b538SAndroid Build Coastguard Worker   Value::List list;
514*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   auto iter = list.Insert(list.end(), Value(true));
517*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.begin() == iter);
518*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, true);
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   iter = list.Insert(const_list.begin(), Value(123));
521*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(const_list.begin() == iter);
522*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, 123);
523*6777b538SAndroid Build Coastguard Worker 
524*6777b538SAndroid Build Coastguard Worker   iter = list.Insert(list.begin() + 1, Value("Hello world!"));
525*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.begin() + 1 == iter);
526*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, "Hello world!");
527*6777b538SAndroid Build Coastguard Worker }
528*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListResize)529*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListResize) {
530*6777b538SAndroid Build Coastguard Worker   auto list = base::Value::List().Append("Hello world!");
531*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list.size(), 1U);
532*6777b538SAndroid Build Coastguard Worker 
533*6777b538SAndroid Build Coastguard Worker   list.resize(2);
534*6777b538SAndroid Build Coastguard Worker   // Adds an empty entry to the back to match the size.
535*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list.size(), 2U);
536*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list[0].is_string());
537*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list[1].is_none());
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker   list.resize(1);
540*6777b538SAndroid Build Coastguard Worker   // Shrinks the list and kicks the new entry out.
541*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list.size(), 1U);
542*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list[0].is_string());
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   list.resize(0);
545*6777b538SAndroid Build Coastguard Worker   // Removes the remaining entry too.
546*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list.size(), 0U);
547*6777b538SAndroid Build Coastguard Worker }
548*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ReverseIter)549*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ReverseIter) {
550*6777b538SAndroid Build Coastguard Worker   Value::List list;
551*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker   list.Append(Value(true));
554*6777b538SAndroid Build Coastguard Worker   list.Append(Value(123));
555*6777b538SAndroid Build Coastguard Worker   list.Append(Value("Hello world!"));
556*6777b538SAndroid Build Coastguard Worker 
557*6777b538SAndroid Build Coastguard Worker   auto iter = list.rbegin();
558*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(const_list.rbegin() == iter);
559*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, "Hello world!");
560*6777b538SAndroid Build Coastguard Worker 
561*6777b538SAndroid Build Coastguard Worker   ++iter;
562*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, 123);
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker   ++iter;
565*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*iter, true);
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker   ++iter;
568*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.rend() == iter);
569*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(const_list.rend() == iter);
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker 
572*6777b538SAndroid Build Coastguard Worker // Test all three behaviors of EnsureDict() (Create a new dict where no
573*6777b538SAndroid Build Coastguard Worker // matchining values exist, return an existing dict, create a dict overwriting
574*6777b538SAndroid Build Coastguard Worker // a value of another type).
TEST(ValuesTest,DictEnsureDict)575*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictEnsureDict) {
576*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
577*6777b538SAndroid Build Coastguard Worker 
578*6777b538SAndroid Build Coastguard Worker   // This call should create a new nested dictionary.
579*6777b538SAndroid Build Coastguard Worker   Value::Dict* foo_dict = root.EnsureDict("foo");
580*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(foo_dict->empty());
581*6777b538SAndroid Build Coastguard Worker   foo_dict->Set("a", "b");
582*6777b538SAndroid Build Coastguard Worker 
583*6777b538SAndroid Build Coastguard Worker   // This call should retrieve the dictionary created above, rather than
584*6777b538SAndroid Build Coastguard Worker   // creating a new one.
585*6777b538SAndroid Build Coastguard Worker   std::string* a_string = root.EnsureDict("foo")->FindString("a");
586*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, a_string);
587*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*a_string, "b");
588*6777b538SAndroid Build Coastguard Worker 
589*6777b538SAndroid Build Coastguard Worker   // Use EnsureDict() to overwrite an existing non-dictionary value.
590*6777b538SAndroid Build Coastguard Worker   root.Set("bar", 3);
591*6777b538SAndroid Build Coastguard Worker   Value::Dict* bar_dict = root.EnsureDict("bar");
592*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(bar_dict->empty());
593*6777b538SAndroid Build Coastguard Worker   bar_dict->Set("b", "c");
594*6777b538SAndroid Build Coastguard Worker 
595*6777b538SAndroid Build Coastguard Worker   // Test that the above call created a "bar" entry.
596*6777b538SAndroid Build Coastguard Worker   bar_dict = root.FindDict("bar");
597*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, bar_dict);
598*6777b538SAndroid Build Coastguard Worker   std::string* b_string = bar_dict->FindString("b");
599*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, b_string);
600*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*b_string, "c");
601*6777b538SAndroid Build Coastguard Worker }
602*6777b538SAndroid Build Coastguard Worker 
603*6777b538SAndroid Build Coastguard Worker // Test all three behaviors of EnsureList() (Create a new list where no
604*6777b538SAndroid Build Coastguard Worker // matchining value exists, return an existing list, create a list overwriting
605*6777b538SAndroid Build Coastguard Worker // a value of another type).
TEST(ValuesTest,DictEnsureList)606*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictEnsureList) {
607*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
608*6777b538SAndroid Build Coastguard Worker 
609*6777b538SAndroid Build Coastguard Worker   // This call should create a new list.
610*6777b538SAndroid Build Coastguard Worker   Value::List* foo_list = root.EnsureList("foo");
611*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(foo_list->empty());
612*6777b538SAndroid Build Coastguard Worker   foo_list->Append("a");
613*6777b538SAndroid Build Coastguard Worker 
614*6777b538SAndroid Build Coastguard Worker   // This call should retrieve the list created above, rather than creating a
615*6777b538SAndroid Build Coastguard Worker   // new one.
616*6777b538SAndroid Build Coastguard Worker   foo_list = root.EnsureList("foo");
617*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, foo_list->size());
618*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ((*foo_list)[0], Value("a"));
619*6777b538SAndroid Build Coastguard Worker 
620*6777b538SAndroid Build Coastguard Worker   // Use EnsureList() to overwrite an existing non-list value.
621*6777b538SAndroid Build Coastguard Worker   root.Set("bar", 3);
622*6777b538SAndroid Build Coastguard Worker   Value::List* bar_list = root.EnsureList("bar");
623*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(bar_list->empty());
624*6777b538SAndroid Build Coastguard Worker   bar_list->Append("b");
625*6777b538SAndroid Build Coastguard Worker 
626*6777b538SAndroid Build Coastguard Worker   // Test that the above call created a "bar" entry.
627*6777b538SAndroid Build Coastguard Worker   bar_list = root.FindList("bar");
628*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, bar_list);
629*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, bar_list->size());
630*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ((*bar_list)[0], Value("b"));
631*6777b538SAndroid Build Coastguard Worker }
632*6777b538SAndroid Build Coastguard Worker 
633*6777b538SAndroid Build Coastguard Worker // TODO(dcheng): Add more tests directly exercising the updated dictionary and
634*6777b538SAndroid Build Coastguard Worker // list APIs. For now, most of the updated APIs are tested indirectly via the
635*6777b538SAndroid Build Coastguard Worker // legacy APIs that are largely backed by the updated APIs.
TEST(ValuesTest,DictFindByDottedPath)636*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictFindByDottedPath) {
637*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
638*6777b538SAndroid Build Coastguard Worker 
639*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindByDottedPath("a.b.c"));
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker   Value::Dict& a_dict = dict.Set("a", Value::Dict())->GetDict();
642*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindByDottedPath("a.b.c"));
643*6777b538SAndroid Build Coastguard Worker 
644*6777b538SAndroid Build Coastguard Worker   Value::Dict& b_dict = a_dict.Set("b", Value::Dict())->GetDict();
645*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindByDottedPath("a.b.c"));
646*6777b538SAndroid Build Coastguard Worker 
647*6777b538SAndroid Build Coastguard Worker   b_dict.Set("c", true);
648*6777b538SAndroid Build Coastguard Worker   const Value* value = dict.FindByDottedPath("a.b.c");
649*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, value);
650*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(value->GetBool());
651*6777b538SAndroid Build Coastguard Worker }
652*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,DictSetByDottedPath)653*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictSetByDottedPath) {
654*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
655*6777b538SAndroid Build Coastguard Worker 
656*6777b538SAndroid Build Coastguard Worker   Value* c = dict.SetByDottedPath("a.b.c", Value());
657*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(c);
658*6777b538SAndroid Build Coastguard Worker 
659*6777b538SAndroid Build Coastguard Worker   Value::Dict* a = dict.FindDict("a");
660*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(a);
661*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, a->size());
662*6777b538SAndroid Build Coastguard Worker 
663*6777b538SAndroid Build Coastguard Worker   Value::Dict* b = a->FindDict("b");
664*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(b);
665*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, b->size());
666*6777b538SAndroid Build Coastguard Worker 
667*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c, b->Find("c"));
668*6777b538SAndroid Build Coastguard Worker }
669*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,RvalueDictSetByDottedPath)670*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, RvalueDictSetByDottedPath) {
671*6777b538SAndroid Build Coastguard Worker   Value::Dict dict =
672*6777b538SAndroid Build Coastguard Worker       Value::Dict()
673*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.null", Value())
674*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.bool", false)
675*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.int", 42)
676*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.double", 1.2)
677*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.string", "value")
678*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.u16-string", u"u16-value")
679*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.std-string",
680*6777b538SAndroid Build Coastguard Worker                            std::string("std-value"))
681*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.blob", Value::BlobStorage({1, 2}))
682*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.list",
683*6777b538SAndroid Build Coastguard Worker                            Value::List().Append("value in list"))
684*6777b538SAndroid Build Coastguard Worker           .SetByDottedPath("nested.dictionary.dict",
685*6777b538SAndroid Build Coastguard Worker                            Value::Dict().Set("key", "value"));
686*6777b538SAndroid Build Coastguard Worker 
687*6777b538SAndroid Build Coastguard Worker   Value::Dict expected =
688*6777b538SAndroid Build Coastguard Worker       Value::Dict()  //
689*6777b538SAndroid Build Coastguard Worker           .Set("nested",
690*6777b538SAndroid Build Coastguard Worker                base::Value::Dict()  //
691*6777b538SAndroid Build Coastguard Worker                    .Set("dictionary",
692*6777b538SAndroid Build Coastguard Worker                         base::Value::Dict()
693*6777b538SAndroid Build Coastguard Worker                             .Set("null", Value())
694*6777b538SAndroid Build Coastguard Worker                             .Set("bool", false)
695*6777b538SAndroid Build Coastguard Worker                             .Set("int", 42)
696*6777b538SAndroid Build Coastguard Worker                             .Set("double", 1.2)
697*6777b538SAndroid Build Coastguard Worker                             .Set("string", "value")
698*6777b538SAndroid Build Coastguard Worker                             .Set("u16-string", u"u16-value")
699*6777b538SAndroid Build Coastguard Worker                             .Set("std-string", std::string("std-value"))
700*6777b538SAndroid Build Coastguard Worker                             .Set("blob", Value::BlobStorage({1, 2}))
701*6777b538SAndroid Build Coastguard Worker                             .Set("list", Value::List().Append("value in list"))
702*6777b538SAndroid Build Coastguard Worker                             .Set("dict", Value::Dict().Set("key", "value"))));
703*6777b538SAndroid Build Coastguard Worker 
704*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dict, expected);
705*6777b538SAndroid Build Coastguard Worker }
706*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,DictSetWithDottedKey)707*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictSetWithDottedKey) {
708*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
709*6777b538SAndroid Build Coastguard Worker 
710*6777b538SAndroid Build Coastguard Worker   Value* abc = dict.Set("a.b.c", Value());
711*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(abc);
712*6777b538SAndroid Build Coastguard Worker 
713*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dict.FindByDottedPath("a"));
714*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dict.FindByDottedPath("a.b"));
715*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dict.FindByDottedPath("a.b.c"));
716*6777b538SAndroid Build Coastguard Worker 
717*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(abc, dict.Find("a.b.c"));
718*6777b538SAndroid Build Coastguard Worker }
719*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListFront)720*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListFront) {
721*6777b538SAndroid Build Coastguard Worker   Value::List list;
722*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
723*6777b538SAndroid Build Coastguard Worker 
724*6777b538SAndroid Build Coastguard Worker   list.Append(1);
725*6777b538SAndroid Build Coastguard Worker   list.Append(2);
726*6777b538SAndroid Build Coastguard Worker   list.Append(3);
727*6777b538SAndroid Build Coastguard Worker 
728*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(1), list.front());
729*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(1), const_list.front());
730*6777b538SAndroid Build Coastguard Worker }
731*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListFrontWhenEmpty)732*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListFrontWhenEmpty) {
733*6777b538SAndroid Build Coastguard Worker   Value::List list;
734*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
735*6777b538SAndroid Build Coastguard Worker 
736*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH(list.front());
737*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH(const_list.front());
738*6777b538SAndroid Build Coastguard Worker }
739*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListBack)740*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListBack) {
741*6777b538SAndroid Build Coastguard Worker   Value::List list;
742*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
743*6777b538SAndroid Build Coastguard Worker 
744*6777b538SAndroid Build Coastguard Worker   list.Append(1);
745*6777b538SAndroid Build Coastguard Worker   list.Append(2);
746*6777b538SAndroid Build Coastguard Worker   list.Append(3);
747*6777b538SAndroid Build Coastguard Worker 
748*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(3), list.back());
749*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(3), const_list.back());
750*6777b538SAndroid Build Coastguard Worker }
751*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListBackWhenEmpty)752*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListBackWhenEmpty) {
753*6777b538SAndroid Build Coastguard Worker   Value::List list;
754*6777b538SAndroid Build Coastguard Worker   const Value::List& const_list = list;
755*6777b538SAndroid Build Coastguard Worker 
756*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH(list.back());
757*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH(const_list.back());
758*6777b538SAndroid Build Coastguard Worker }
759*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListErase)760*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListErase) {
761*6777b538SAndroid Build Coastguard Worker   Value::List list;
762*6777b538SAndroid Build Coastguard Worker   list.Append(1);
763*6777b538SAndroid Build Coastguard Worker   list.Append(2);
764*6777b538SAndroid Build Coastguard Worker   list.Append(3);
765*6777b538SAndroid Build Coastguard Worker 
766*6777b538SAndroid Build Coastguard Worker   auto next_it = list.erase(list.begin() + 1);
767*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2u, list.size());
768*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[0], Value(1));
769*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[1], Value(3));
770*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*next_it, Value(3));
771*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it + 1, list.end());
772*6777b538SAndroid Build Coastguard Worker }
773*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListEraseRange)774*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListEraseRange) {
775*6777b538SAndroid Build Coastguard Worker   Value::List list;
776*6777b538SAndroid Build Coastguard Worker   list.Append(1);
777*6777b538SAndroid Build Coastguard Worker   list.Append(2);
778*6777b538SAndroid Build Coastguard Worker   list.Append(3);
779*6777b538SAndroid Build Coastguard Worker   list.Append(4);
780*6777b538SAndroid Build Coastguard Worker 
781*6777b538SAndroid Build Coastguard Worker   auto next_it = list.erase(list.begin() + 1, list.begin() + 3);
782*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2u, list.size());
783*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[0], Value(1));
784*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[1], Value(4));
785*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*next_it, Value(4));
786*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it + 1, list.end());
787*6777b538SAndroid Build Coastguard Worker 
788*6777b538SAndroid Build Coastguard Worker   next_it = list.erase(list.begin() + 1, list.begin() + 1);
789*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(2u, list.size());
790*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[0], Value(1));
791*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[1], Value(4));
792*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*next_it, Value(4));
793*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it + 1, list.end());
794*6777b538SAndroid Build Coastguard Worker 
795*6777b538SAndroid Build Coastguard Worker   next_it = list.erase(list.begin() + 1, list.end());
796*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, list.size());
797*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list[0], Value(1));
798*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it, list.end());
799*6777b538SAndroid Build Coastguard Worker 
800*6777b538SAndroid Build Coastguard Worker   list.clear();
801*6777b538SAndroid Build Coastguard Worker   next_it = list.erase(list.begin(), list.begin());
802*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0u, list.size());
803*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it, list.begin());
804*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(next_it, list.end());
805*6777b538SAndroid Build Coastguard Worker }
806*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListEraseValue)807*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListEraseValue) {
808*6777b538SAndroid Build Coastguard Worker   Value::List list;
809*6777b538SAndroid Build Coastguard Worker   list.Append(1);
810*6777b538SAndroid Build Coastguard Worker   list.Append(2);
811*6777b538SAndroid Build Coastguard Worker   list.Append(2);
812*6777b538SAndroid Build Coastguard Worker   list.Append(3);
813*6777b538SAndroid Build Coastguard Worker 
814*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2u, list.EraseValue(Value(2)));
815*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2u, list.size());
816*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, list[0]);
817*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, list[1]);
818*6777b538SAndroid Build Coastguard Worker 
819*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, list.EraseValue(Value(1)));
820*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, list.size());
821*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, list[0]);
822*6777b538SAndroid Build Coastguard Worker 
823*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, list.EraseValue(Value(3)));
824*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.empty());
825*6777b538SAndroid Build Coastguard Worker 
826*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, list.EraseValue(Value(3)));
827*6777b538SAndroid Build Coastguard Worker }
828*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListEraseIf)829*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListEraseIf) {
830*6777b538SAndroid Build Coastguard Worker   Value::List list;
831*6777b538SAndroid Build Coastguard Worker   list.Append(1);
832*6777b538SAndroid Build Coastguard Worker   list.Append(2);
833*6777b538SAndroid Build Coastguard Worker   list.Append(2);
834*6777b538SAndroid Build Coastguard Worker   list.Append(3);
835*6777b538SAndroid Build Coastguard Worker 
836*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3u, list.EraseIf([](const auto& val) { return val >= Value(2); }));
837*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, list.size());
838*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, list[0]);
839*6777b538SAndroid Build Coastguard Worker 
840*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, list.EraseIf([](const auto& val) { return true; }));
841*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.empty());
842*6777b538SAndroid Build Coastguard Worker 
843*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, list.EraseIf([](const auto& val) { return true; }));
844*6777b538SAndroid Build Coastguard Worker }
845*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ClearList)846*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ClearList) {
847*6777b538SAndroid Build Coastguard Worker   Value::List list;
848*6777b538SAndroid Build Coastguard Worker   list.Append(1);
849*6777b538SAndroid Build Coastguard Worker   list.Append(2);
850*6777b538SAndroid Build Coastguard Worker   list.Append(3);
851*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3u, list.size());
852*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(list.empty());
853*6777b538SAndroid Build Coastguard Worker 
854*6777b538SAndroid Build Coastguard Worker   list.clear();
855*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, list.size());
856*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.empty());
857*6777b538SAndroid Build Coastguard Worker 
858*6777b538SAndroid Build Coastguard Worker   // list.clear() should be idempotent.
859*6777b538SAndroid Build Coastguard Worker   list.clear();
860*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, list.size());
861*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(list.empty());
862*6777b538SAndroid Build Coastguard Worker }
863*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindKey)864*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindKey) {
865*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
866*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", "bar");
867*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
868*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, value.GetDict().Find("foo"));
869*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, value.GetDict().Find("baz"));
870*6777b538SAndroid Build Coastguard Worker }
871*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindKeyChangeValue)872*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindKeyChangeValue) {
873*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
874*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", "bar");
875*6777b538SAndroid Build Coastguard Worker   Value* found = dict.Find("foo");
876*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, found);
877*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("bar", found->GetString());
878*6777b538SAndroid Build Coastguard Worker 
879*6777b538SAndroid Build Coastguard Worker   *found = Value(123);
880*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, dict.Find("foo")->GetInt());
881*6777b538SAndroid Build Coastguard Worker }
882*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindKeyConst)883*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindKeyConst) {
884*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
885*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", "bar");
886*6777b538SAndroid Build Coastguard Worker   const Value value(std::move(dict));
887*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, value.GetDict().Find("foo"));
888*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, value.GetDict().Find("baz"));
889*6777b538SAndroid Build Coastguard Worker }
890*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindBoolKey)891*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindBoolKey) {
892*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
893*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
894*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
895*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
896*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
897*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
898*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
899*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
900*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
901*6777b538SAndroid Build Coastguard Worker 
902*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("null"));
903*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(std::nullopt, dict.FindBool("bool"));
904*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("int"));
905*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("double"));
906*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("string"));
907*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("blob"));
908*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("list"));
909*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindBool("dict"));
910*6777b538SAndroid Build Coastguard Worker }
911*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindIntKey)912*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindIntKey) {
913*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
914*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
915*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
916*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
917*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
918*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
919*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
920*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
921*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
922*6777b538SAndroid Build Coastguard Worker 
923*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("null"));
924*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("bool"));
925*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(std::nullopt, dict.FindInt("int"));
926*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("double"));
927*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("string"));
928*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("blob"));
929*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("list"));
930*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, dict.FindInt("dict"));
931*6777b538SAndroid Build Coastguard Worker }
932*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindStringKey)933*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindStringKey) {
934*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
935*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
936*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
937*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
938*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
939*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
940*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
941*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
942*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
943*6777b538SAndroid Build Coastguard Worker 
944*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("null"));
945*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("bool"));
946*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("int"));
947*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("double"));
948*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, dict.FindString("string"));
949*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("blob"));
950*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("list"));
951*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindString("dict"));
952*6777b538SAndroid Build Coastguard Worker }
953*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MutableFindStringKey)954*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MutableFindStringKey) {
955*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
956*6777b538SAndroid Build Coastguard Worker   dict.Set("string", "foo");
957*6777b538SAndroid Build Coastguard Worker 
958*6777b538SAndroid Build Coastguard Worker   *(dict.FindString("string")) = "bar";
959*6777b538SAndroid Build Coastguard Worker 
960*6777b538SAndroid Build Coastguard Worker   Value::Dict expected_dict;
961*6777b538SAndroid Build Coastguard Worker   expected_dict.Set("string", "bar");
962*6777b538SAndroid Build Coastguard Worker 
963*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_dict, dict);
964*6777b538SAndroid Build Coastguard Worker 
965*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
966*6777b538SAndroid Build Coastguard Worker   Value expected_value(std::move(expected_dict));
967*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_value, value);
968*6777b538SAndroid Build Coastguard Worker }
969*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindDictKey)970*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindDictKey) {
971*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
972*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
973*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
974*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
975*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
976*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
977*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
978*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
979*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
980*6777b538SAndroid Build Coastguard Worker 
981*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("null"));
982*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("bool"));
983*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("int"));
984*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("double"));
985*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("string"));
986*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("blob"));
987*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindDict("list"));
988*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, dict.FindDict("dict"));
989*6777b538SAndroid Build Coastguard Worker }
990*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindListKey)991*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindListKey) {
992*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
993*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
994*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
995*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
996*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
997*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
998*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
999*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
1000*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
1001*6777b538SAndroid Build Coastguard Worker 
1002*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("null"));
1003*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("bool"));
1004*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("int"));
1005*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("double"));
1006*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("string"));
1007*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("blob"));
1008*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, dict.FindList("list"));
1009*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindList("dict"));
1010*6777b538SAndroid Build Coastguard Worker }
1011*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindBlob)1012*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindBlob) {
1013*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1014*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
1015*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
1016*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
1017*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
1018*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
1019*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
1020*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
1021*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
1022*6777b538SAndroid Build Coastguard Worker 
1023*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("null"));
1024*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("bool"));
1025*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("int"));
1026*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("double"));
1027*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("string"));
1028*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, dict.FindBlob("blob"));
1029*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("list"));
1030*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, dict.FindBlob("dict"));
1031*6777b538SAndroid Build Coastguard Worker }
1032*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetKey)1033*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetKey) {
1034*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1035*6777b538SAndroid Build Coastguard Worker   dict.Set("null", Value());
1036*6777b538SAndroid Build Coastguard Worker   dict.Set("bool", false);
1037*6777b538SAndroid Build Coastguard Worker   dict.Set("int", 0);
1038*6777b538SAndroid Build Coastguard Worker   dict.Set("double", 0.0);
1039*6777b538SAndroid Build Coastguard Worker   dict.Set("string", std::string());
1040*6777b538SAndroid Build Coastguard Worker   dict.Set("blob", Value(Value::BlobStorage()));
1041*6777b538SAndroid Build Coastguard Worker   dict.Set("list", Value::List());
1042*6777b538SAndroid Build Coastguard Worker   dict.Set("dict", Value::Dict());
1043*6777b538SAndroid Build Coastguard Worker 
1044*6777b538SAndroid Build Coastguard Worker   Value::Dict dict2;
1045*6777b538SAndroid Build Coastguard Worker   dict2.Set(StringPiece("null"), Value(Value::Type::NONE));
1046*6777b538SAndroid Build Coastguard Worker   dict2.Set(StringPiece("bool"), Value(Value::Type::BOOLEAN));
1047*6777b538SAndroid Build Coastguard Worker   dict2.Set(std::string("int"), Value(Value::Type::INTEGER));
1048*6777b538SAndroid Build Coastguard Worker   dict2.Set(std::string("double"), Value(Value::Type::DOUBLE));
1049*6777b538SAndroid Build Coastguard Worker   dict2.Set(std::string("string"), Value(Value::Type::STRING));
1050*6777b538SAndroid Build Coastguard Worker   dict2.Set("blob", Value(Value::Type::BINARY));
1051*6777b538SAndroid Build Coastguard Worker   dict2.Set("list", Value(Value::Type::LIST));
1052*6777b538SAndroid Build Coastguard Worker   dict2.Set("dict", Value(Value::Type::DICT));
1053*6777b538SAndroid Build Coastguard Worker 
1054*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dict, dict2);
1055*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(std::move(dict)), Value(std::move(dict2)));
1056*6777b538SAndroid Build Coastguard Worker }
1057*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetBoolKey)1058*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetBoolKey) {
1059*6777b538SAndroid Build Coastguard Worker   std::optional<bool> value;
1060*6777b538SAndroid Build Coastguard Worker 
1061*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1062*6777b538SAndroid Build Coastguard Worker   dict.Set("true_key", true);
1063*6777b538SAndroid Build Coastguard Worker   dict.Set("false_key", false);
1064*6777b538SAndroid Build Coastguard Worker 
1065*6777b538SAndroid Build Coastguard Worker   value = dict.FindBool("true_key");
1066*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1067*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(*value);
1068*6777b538SAndroid Build Coastguard Worker 
1069*6777b538SAndroid Build Coastguard Worker   value = dict.FindBool("false_key");
1070*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1071*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(*value);
1072*6777b538SAndroid Build Coastguard Worker 
1073*6777b538SAndroid Build Coastguard Worker   value = dict.FindBool("missing_key");
1074*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(value);
1075*6777b538SAndroid Build Coastguard Worker }
1076*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetIntKey)1077*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetIntKey) {
1078*6777b538SAndroid Build Coastguard Worker   std::optional<int> value;
1079*6777b538SAndroid Build Coastguard Worker 
1080*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1081*6777b538SAndroid Build Coastguard Worker   dict.Set("one_key", 1);
1082*6777b538SAndroid Build Coastguard Worker   dict.Set("minus_one_key", -1);
1083*6777b538SAndroid Build Coastguard Worker 
1084*6777b538SAndroid Build Coastguard Worker   value = dict.FindInt("one_key");
1085*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1086*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1, *value);
1087*6777b538SAndroid Build Coastguard Worker 
1088*6777b538SAndroid Build Coastguard Worker   value = dict.FindInt("minus_one_key");
1089*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1090*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(-1, *value);
1091*6777b538SAndroid Build Coastguard Worker 
1092*6777b538SAndroid Build Coastguard Worker   value = dict.FindInt("missing_key");
1093*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(value);
1094*6777b538SAndroid Build Coastguard Worker }
1095*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetDoubleKey)1096*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetDoubleKey) {
1097*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1098*6777b538SAndroid Build Coastguard Worker   dict.Set("one_key", 1.0);
1099*6777b538SAndroid Build Coastguard Worker   dict.Set("minus_one_key", -1.0);
1100*6777b538SAndroid Build Coastguard Worker   dict.Set("pi_key", 3.1415);
1101*6777b538SAndroid Build Coastguard Worker 
1102*6777b538SAndroid Build Coastguard Worker   const Value* value;
1103*6777b538SAndroid Build Coastguard Worker 
1104*6777b538SAndroid Build Coastguard Worker   value = dict.Find("one_key");
1105*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(value->is_double());
1107*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1.0, value->GetDouble());
1108*6777b538SAndroid Build Coastguard Worker 
1109*6777b538SAndroid Build Coastguard Worker   value = dict.Find("minus_one_key");
1110*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1111*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(value->is_double());
1112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(-1.0, value->GetDouble());
1113*6777b538SAndroid Build Coastguard Worker 
1114*6777b538SAndroid Build Coastguard Worker   value = dict.Find("pi_key");
1115*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1116*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(value->is_double());
1117*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3.1415, value->GetDouble());
1118*6777b538SAndroid Build Coastguard Worker }
1119*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetStringKey)1120*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetStringKey) {
1121*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1122*6777b538SAndroid Build Coastguard Worker   dict.Set("one_key", "one");
1123*6777b538SAndroid Build Coastguard Worker   dict.Set("hello_key", "hello world");
1124*6777b538SAndroid Build Coastguard Worker 
1125*6777b538SAndroid Build Coastguard Worker   std::string movable_value("movable_value");
1126*6777b538SAndroid Build Coastguard Worker   dict.Set("movable_key", std::move(movable_value));
1127*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(movable_value.empty());
1128*6777b538SAndroid Build Coastguard Worker 
1129*6777b538SAndroid Build Coastguard Worker   const std::string* value;
1130*6777b538SAndroid Build Coastguard Worker 
1131*6777b538SAndroid Build Coastguard Worker   value = dict.FindString("one_key");
1132*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1133*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ("one", *value);
1134*6777b538SAndroid Build Coastguard Worker 
1135*6777b538SAndroid Build Coastguard Worker   value = dict.FindString("hello_key");
1136*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1137*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ("hello world", *value);
1138*6777b538SAndroid Build Coastguard Worker 
1139*6777b538SAndroid Build Coastguard Worker   value = dict.FindString("movable_key");
1140*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(value);
1141*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ("movable_value", *value);
1142*6777b538SAndroid Build Coastguard Worker 
1143*6777b538SAndroid Build Coastguard Worker   value = dict.FindString("missing_key");
1144*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(value);
1145*6777b538SAndroid Build Coastguard Worker }
1146*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,RvalueSet)1147*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, RvalueSet) {
1148*6777b538SAndroid Build Coastguard Worker   Value::Dict dict = Value::Dict()
1149*6777b538SAndroid Build Coastguard Worker                          .Set("null", Value())
1150*6777b538SAndroid Build Coastguard Worker                          .Set("bool", false)
1151*6777b538SAndroid Build Coastguard Worker                          .Set("int", 42)
1152*6777b538SAndroid Build Coastguard Worker                          .Set("double", 1.2)
1153*6777b538SAndroid Build Coastguard Worker                          .Set("string", "value")
1154*6777b538SAndroid Build Coastguard Worker                          .Set("u16-string", u"u16-value")
1155*6777b538SAndroid Build Coastguard Worker                          .Set("std-string", std::string("std-value"))
1156*6777b538SAndroid Build Coastguard Worker                          .Set("blob", Value::BlobStorage({1, 2}))
1157*6777b538SAndroid Build Coastguard Worker                          .Set("list", Value::List().Append("value in list"))
1158*6777b538SAndroid Build Coastguard Worker                          .Set("dict", Value::Dict().Set("key", "value"));
1159*6777b538SAndroid Build Coastguard Worker 
1160*6777b538SAndroid Build Coastguard Worker   Value::Dict expected;
1161*6777b538SAndroid Build Coastguard Worker   expected.Set("null", Value());
1162*6777b538SAndroid Build Coastguard Worker   expected.Set("bool", false);
1163*6777b538SAndroid Build Coastguard Worker   expected.Set("int", 42);
1164*6777b538SAndroid Build Coastguard Worker   expected.Set("double", 1.2);
1165*6777b538SAndroid Build Coastguard Worker   expected.Set("string", "value");
1166*6777b538SAndroid Build Coastguard Worker   expected.Set("u16-string", u"u16-value");
1167*6777b538SAndroid Build Coastguard Worker   expected.Set("std-string", std::string("std-value"));
1168*6777b538SAndroid Build Coastguard Worker   expected.Set("blob", Value::BlobStorage({1, 2}));
1169*6777b538SAndroid Build Coastguard Worker   Value::List nested_list;
1170*6777b538SAndroid Build Coastguard Worker   nested_list.Append("value in list");
1171*6777b538SAndroid Build Coastguard Worker   expected.Set("list", std::move(nested_list));
1172*6777b538SAndroid Build Coastguard Worker   Value::Dict nested_dict;
1173*6777b538SAndroid Build Coastguard Worker   nested_dict.Set("key", "value");
1174*6777b538SAndroid Build Coastguard Worker   expected.Set("dict", std::move(nested_dict));
1175*6777b538SAndroid Build Coastguard Worker 
1176*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dict, expected);
1177*6777b538SAndroid Build Coastguard Worker }
1178*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FindPath)1179*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FindPath) {
1180*6777b538SAndroid Build Coastguard Worker   // Construct a dictionary path {root}.foo.bar = 123
1181*6777b538SAndroid Build Coastguard Worker   Value::Dict foo;
1182*6777b538SAndroid Build Coastguard Worker   foo.Set("bar", Value(123));
1183*6777b538SAndroid Build Coastguard Worker 
1184*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1185*6777b538SAndroid Build Coastguard Worker   root.Set("foo", std::move(foo));
1186*6777b538SAndroid Build Coastguard Worker 
1187*6777b538SAndroid Build Coastguard Worker   // Double key, second not found.
1188*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("foo.notfound");
1189*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(found);
1190*6777b538SAndroid Build Coastguard Worker 
1191*6777b538SAndroid Build Coastguard Worker   // Double key, found.
1192*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1193*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(found);
1194*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(found->is_int());
1195*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, found->GetInt());
1196*6777b538SAndroid Build Coastguard Worker }
1197*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetByDottedPath)1198*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetByDottedPath) {
1199*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1200*6777b538SAndroid Build Coastguard Worker 
1201*6777b538SAndroid Build Coastguard Worker   Value* inserted = root.SetByDottedPath("one.two", Value(123));
1202*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("one.two");
1203*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1204*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(found->type(), Value::Type::INTEGER);
1205*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1206*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, found->GetInt());
1207*6777b538SAndroid Build Coastguard Worker 
1208*6777b538SAndroid Build Coastguard Worker   inserted = root.SetByDottedPath("foo.bar", Value(123));
1209*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1210*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1211*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(found->type(), Value::Type::INTEGER);
1212*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1213*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, found->GetInt());
1214*6777b538SAndroid Build Coastguard Worker 
1215*6777b538SAndroid Build Coastguard Worker   // Overwrite with a different value.
1216*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("foo.bar", Value("hello"));
1217*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1218*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1219*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(found->type(), Value::Type::STRING);
1220*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("hello", found->GetString());
1221*6777b538SAndroid Build Coastguard Worker 
1222*6777b538SAndroid Build Coastguard Worker   // Can't change existing non-dictionary keys to dictionaries.
1223*6777b538SAndroid Build Coastguard Worker   found = root.SetByDottedPath("foo.bar.baz", Value(123));
1224*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(found);
1225*6777b538SAndroid Build Coastguard Worker }
1226*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetBoolPath)1227*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetBoolPath) {
1228*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1229*6777b538SAndroid Build Coastguard Worker   Value* inserted = root.SetByDottedPath("foo.bar", true);
1230*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("foo.bar");
1231*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1232*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1233*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_bool());
1234*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(found->GetBool());
1235*6777b538SAndroid Build Coastguard Worker 
1236*6777b538SAndroid Build Coastguard Worker   // Overwrite with a different value.
1237*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("foo.bar", false);
1238*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1239*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1240*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_bool());
1241*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(found->GetBool());
1242*6777b538SAndroid Build Coastguard Worker 
1243*6777b538SAndroid Build Coastguard Worker   // Can't change existing non-dictionary keys.
1244*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(root.SetByDottedPath("foo.bar.zoo", true));
1245*6777b538SAndroid Build Coastguard Worker }
1246*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetIntPath)1247*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetIntPath) {
1248*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1249*6777b538SAndroid Build Coastguard Worker   Value* inserted = root.SetByDottedPath("foo.bar", 123);
1250*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("foo.bar");
1251*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1252*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1253*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_int());
1254*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(123, found->GetInt());
1255*6777b538SAndroid Build Coastguard Worker 
1256*6777b538SAndroid Build Coastguard Worker   // Overwrite with a different value.
1257*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("foo.bar", 234);
1258*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1259*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1260*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_int());
1261*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(234, found->GetInt());
1262*6777b538SAndroid Build Coastguard Worker 
1263*6777b538SAndroid Build Coastguard Worker   // Can't change existing non-dictionary keys.
1264*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(root.SetByDottedPath("foo.bar.zoo", 567));
1265*6777b538SAndroid Build Coastguard Worker }
1266*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetDoublePath)1267*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetDoublePath) {
1268*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1269*6777b538SAndroid Build Coastguard Worker   Value* inserted = root.SetByDottedPath("foo.bar", 1.23);
1270*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("foo.bar");
1271*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1272*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1273*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_double());
1274*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1.23, found->GetDouble());
1275*6777b538SAndroid Build Coastguard Worker 
1276*6777b538SAndroid Build Coastguard Worker   // Overwrite with a different value.
1277*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("foo.bar", 2.34);
1278*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1279*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1280*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_double());
1281*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2.34, found->GetDouble());
1282*6777b538SAndroid Build Coastguard Worker 
1283*6777b538SAndroid Build Coastguard Worker   // Can't change existing non-dictionary keys.
1284*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(root.SetByDottedPath("foo.bar.zoo", 5.67));
1285*6777b538SAndroid Build Coastguard Worker }
1286*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SetStringPath)1287*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SetStringPath) {
1288*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1289*6777b538SAndroid Build Coastguard Worker   Value* inserted = root.SetByDottedPath("foo.bar", "hello world");
1290*6777b538SAndroid Build Coastguard Worker   Value* found = root.FindByDottedPath("foo.bar");
1291*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1292*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(inserted, found);
1293*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_string());
1294*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("hello world", found->GetString());
1295*6777b538SAndroid Build Coastguard Worker 
1296*6777b538SAndroid Build Coastguard Worker   // Overwrite with a different value.
1297*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("foo.bar", "bonjour monde");
1298*6777b538SAndroid Build Coastguard Worker   found = root.FindByDottedPath("foo.bar");
1299*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
1300*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found->is_string());
1301*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("bonjour monde", found->GetString());
1302*6777b538SAndroid Build Coastguard Worker 
1303*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(root.SetByDottedPath("foo.bar", StringPiece("rah rah")));
1304*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(root.SetByDottedPath("foo.bar", std::string("temp string")));
1305*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(root.SetByDottedPath("foo.bar", u"temp string"));
1306*6777b538SAndroid Build Coastguard Worker 
1307*6777b538SAndroid Build Coastguard Worker   // Can't change existing non-dictionary keys.
1308*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(root.SetByDottedPath("foo.bar.zoo", "ola mundo"));
1309*6777b538SAndroid Build Coastguard Worker }
1310*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Remove)1311*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Remove) {
1312*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1313*6777b538SAndroid Build Coastguard Worker   root.Set("one", Value(123));
1314*6777b538SAndroid Build Coastguard Worker 
1315*6777b538SAndroid Build Coastguard Worker   // Removal of missing key should fail.
1316*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(root.Remove("two"));
1317*6777b538SAndroid Build Coastguard Worker 
1318*6777b538SAndroid Build Coastguard Worker   // Removal of existing key should succeed.
1319*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(root.Remove("one"));
1320*6777b538SAndroid Build Coastguard Worker 
1321*6777b538SAndroid Build Coastguard Worker   // Second removal of previously existing key should fail.
1322*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(root.Remove("one"));
1323*6777b538SAndroid Build Coastguard Worker }
1324*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Extract)1325*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Extract) {
1326*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1327*6777b538SAndroid Build Coastguard Worker   root.Set("one", Value(123));
1328*6777b538SAndroid Build Coastguard Worker 
1329*6777b538SAndroid Build Coastguard Worker   // Extraction of missing key should fail.
1330*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, root.Extract("two"));
1331*6777b538SAndroid Build Coastguard Worker 
1332*6777b538SAndroid Build Coastguard Worker   // Extraction of existing key should succeed.
1333*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(123), root.Extract("one"));
1334*6777b538SAndroid Build Coastguard Worker 
1335*6777b538SAndroid Build Coastguard Worker   // Second extraction of previously existing key should fail.
1336*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, root.Extract("one"));
1337*6777b538SAndroid Build Coastguard Worker }
1338*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,RemoveByDottedPath)1339*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, RemoveByDottedPath) {
1340*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1341*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.three", Value(123));
1342*6777b538SAndroid Build Coastguard Worker 
1343*6777b538SAndroid Build Coastguard Worker   // Removal of missing key should fail.
1344*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(root.RemoveByDottedPath("one.two.four"));
1345*6777b538SAndroid Build Coastguard Worker 
1346*6777b538SAndroid Build Coastguard Worker   // Removal of existing key should succeed.
1347*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(root.RemoveByDottedPath("one.two.three"));
1348*6777b538SAndroid Build Coastguard Worker 
1349*6777b538SAndroid Build Coastguard Worker   // Second removal of previously existing key should fail.
1350*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(root.RemoveByDottedPath("one.two.three"));
1351*6777b538SAndroid Build Coastguard Worker 
1352*6777b538SAndroid Build Coastguard Worker   // Intermediate empty dictionaries should be cleared.
1353*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, root.Find("one"));
1354*6777b538SAndroid Build Coastguard Worker 
1355*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.three", Value(123));
1356*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.four", Value(124));
1357*6777b538SAndroid Build Coastguard Worker 
1358*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(root.RemoveByDottedPath("one.two.three"));
1359*6777b538SAndroid Build Coastguard Worker   // Intermediate non-empty dictionaries should be kept.
1360*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.Find("one"));
1361*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.FindByDottedPath("one.two"));
1362*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.FindByDottedPath("one.two.four"));
1363*6777b538SAndroid Build Coastguard Worker }
1364*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ExtractByDottedPath)1365*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ExtractByDottedPath) {
1366*6777b538SAndroid Build Coastguard Worker   Value::Dict root;
1367*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.three", Value(123));
1368*6777b538SAndroid Build Coastguard Worker 
1369*6777b538SAndroid Build Coastguard Worker   // Extraction of missing key should fail.
1370*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, root.ExtractByDottedPath("one.two.four"));
1371*6777b538SAndroid Build Coastguard Worker 
1372*6777b538SAndroid Build Coastguard Worker   // Extraction of existing key should succeed.
1373*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(123), root.ExtractByDottedPath("one.two.three"));
1374*6777b538SAndroid Build Coastguard Worker 
1375*6777b538SAndroid Build Coastguard Worker   // Second extraction of previously existing key should fail.
1376*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::nullopt, root.ExtractByDottedPath("one.two.three"));
1377*6777b538SAndroid Build Coastguard Worker 
1378*6777b538SAndroid Build Coastguard Worker   // Intermediate empty dictionaries should be cleared.
1379*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, root.Find("one"));
1380*6777b538SAndroid Build Coastguard Worker 
1381*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.three", Value(123));
1382*6777b538SAndroid Build Coastguard Worker   root.SetByDottedPath("one.two.four", Value(124));
1383*6777b538SAndroid Build Coastguard Worker 
1384*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(Value(123), root.ExtractByDottedPath("one.two.three"));
1385*6777b538SAndroid Build Coastguard Worker   // Intermediate non-empty dictionaries should be kept.
1386*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.Find("one"));
1387*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.FindByDottedPath("one.two"));
1388*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, root.FindByDottedPath("one.two.four"));
1389*6777b538SAndroid Build Coastguard Worker }
1390*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Basic)1391*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Basic) {
1392*6777b538SAndroid Build Coastguard Worker   // Test basic dictionary getting/setting
1393*6777b538SAndroid Build Coastguard Worker   Value::Dict settings;
1394*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(settings.FindByDottedPath("global.homepage"));
1395*6777b538SAndroid Build Coastguard Worker 
1396*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(settings.Find("global"));
1397*6777b538SAndroid Build Coastguard Worker   settings.Set("global", Value(true));
1398*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(settings.Find("global"));
1399*6777b538SAndroid Build Coastguard Worker   settings.Remove("global");
1400*6777b538SAndroid Build Coastguard Worker   settings.SetByDottedPath("global.homepage", Value("http://scurvy.com"));
1401*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(settings.Find("global"));
1402*6777b538SAndroid Build Coastguard Worker   const std::string* homepage =
1403*6777b538SAndroid Build Coastguard Worker       settings.FindStringByDottedPath("global.homepage");
1404*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(homepage);
1405*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::string("http://scurvy.com"), *homepage);
1406*6777b538SAndroid Build Coastguard Worker 
1407*6777b538SAndroid Build Coastguard Worker   // Test storing a dictionary in a list.
1408*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(settings.FindByDottedPath("global.toolbar.bookmarks"));
1409*6777b538SAndroid Build Coastguard Worker 
1410*6777b538SAndroid Build Coastguard Worker   Value::List new_toolbar_bookmarks;
1411*6777b538SAndroid Build Coastguard Worker   settings.SetByDottedPath("global.toolbar.bookmarks",
1412*6777b538SAndroid Build Coastguard Worker                            std::move(new_toolbar_bookmarks));
1413*6777b538SAndroid Build Coastguard Worker   Value::List* toolbar_bookmarks =
1414*6777b538SAndroid Build Coastguard Worker       settings.FindListByDottedPath("global.toolbar.bookmarks");
1415*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(toolbar_bookmarks);
1416*6777b538SAndroid Build Coastguard Worker 
1417*6777b538SAndroid Build Coastguard Worker   Value::Dict new_bookmark;
1418*6777b538SAndroid Build Coastguard Worker   new_bookmark.Set("name", Value("Froogle"));
1419*6777b538SAndroid Build Coastguard Worker   new_bookmark.Set("url", Value("http://froogle.com"));
1420*6777b538SAndroid Build Coastguard Worker   toolbar_bookmarks->Append(std::move(new_bookmark));
1421*6777b538SAndroid Build Coastguard Worker 
1422*6777b538SAndroid Build Coastguard Worker   Value* bookmark_list = settings.FindByDottedPath("global.toolbar.bookmarks");
1423*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(bookmark_list);
1424*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1U, bookmark_list->GetList().size());
1425*6777b538SAndroid Build Coastguard Worker   Value* bookmark = &bookmark_list->GetList()[0];
1426*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(bookmark);
1427*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(bookmark->is_dict());
1428*6777b538SAndroid Build Coastguard Worker   const std::string* bookmark_name = bookmark->GetDict().FindString("name");
1429*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(bookmark_name);
1430*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::string("Froogle"), *bookmark_name);
1431*6777b538SAndroid Build Coastguard Worker   const std::string* bookmark_url = bookmark->GetDict().FindString("url");
1432*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(bookmark_url);
1433*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::string("http://froogle.com"), *bookmark_url);
1434*6777b538SAndroid Build Coastguard Worker }
1435*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,List)1436*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, List) {
1437*6777b538SAndroid Build Coastguard Worker   Value::List mixed_list;
1438*6777b538SAndroid Build Coastguard Worker   mixed_list.Append(true);
1439*6777b538SAndroid Build Coastguard Worker   mixed_list.Append(42);
1440*6777b538SAndroid Build Coastguard Worker   mixed_list.Append(88.8);
1441*6777b538SAndroid Build Coastguard Worker   mixed_list.Append("foo");
1442*6777b538SAndroid Build Coastguard Worker 
1443*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(4u, mixed_list.size());
1444*6777b538SAndroid Build Coastguard Worker 
1445*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(true, mixed_list[0]);
1446*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(42, mixed_list[1]);
1447*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(88.8, mixed_list[2]);
1448*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("foo", mixed_list[3]);
1449*6777b538SAndroid Build Coastguard Worker 
1450*6777b538SAndroid Build Coastguard Worker   // Try searching in the mixed list.
1451*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(Contains(mixed_list, 42));
1452*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(Contains(mixed_list, false));
1453*6777b538SAndroid Build Coastguard Worker }
1454*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,RvalueAppend)1455*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, RvalueAppend) {
1456*6777b538SAndroid Build Coastguard Worker   Value::List list = Value::List()
1457*6777b538SAndroid Build Coastguard Worker                          .Append(Value())
1458*6777b538SAndroid Build Coastguard Worker                          .Append(false)
1459*6777b538SAndroid Build Coastguard Worker                          .Append(42)
1460*6777b538SAndroid Build Coastguard Worker                          .Append(1.2)
1461*6777b538SAndroid Build Coastguard Worker                          .Append("value")
1462*6777b538SAndroid Build Coastguard Worker                          .Append(u"u16-value")
1463*6777b538SAndroid Build Coastguard Worker                          .Append(std::string("std-value"))
1464*6777b538SAndroid Build Coastguard Worker                          .Append(Value::BlobStorage({1, 2}))
1465*6777b538SAndroid Build Coastguard Worker                          .Append(Value::List().Append("value in list"))
1466*6777b538SAndroid Build Coastguard Worker                          .Append(Value::Dict().Set("key", "value"));
1467*6777b538SAndroid Build Coastguard Worker 
1468*6777b538SAndroid Build Coastguard Worker   Value::List expected;
1469*6777b538SAndroid Build Coastguard Worker   expected.Append(Value());
1470*6777b538SAndroid Build Coastguard Worker   expected.Append(false);
1471*6777b538SAndroid Build Coastguard Worker   expected.Append(42);
1472*6777b538SAndroid Build Coastguard Worker   expected.Append(1.2);
1473*6777b538SAndroid Build Coastguard Worker   expected.Append("value");
1474*6777b538SAndroid Build Coastguard Worker   expected.Append(u"u16-value");
1475*6777b538SAndroid Build Coastguard Worker   expected.Append(std::string("std-value"));
1476*6777b538SAndroid Build Coastguard Worker   expected.Append(Value::BlobStorage({1, 2}));
1477*6777b538SAndroid Build Coastguard Worker   Value::List nested_list;
1478*6777b538SAndroid Build Coastguard Worker   nested_list.Append("value in list");
1479*6777b538SAndroid Build Coastguard Worker   expected.Append(std::move(nested_list));
1480*6777b538SAndroid Build Coastguard Worker   Value::Dict nested_dict;
1481*6777b538SAndroid Build Coastguard Worker   nested_dict.Set("key", "value");
1482*6777b538SAndroid Build Coastguard Worker   expected.Append(std::move(nested_dict));
1483*6777b538SAndroid Build Coastguard Worker 
1484*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(list, expected);
1485*6777b538SAndroid Build Coastguard Worker }
1486*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,ListWithCapacity)1487*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, ListWithCapacity) {
1488*6777b538SAndroid Build Coastguard Worker   Value::List list_with_capacity =
1489*6777b538SAndroid Build Coastguard Worker       Value::List::with_capacity(3).Append(true).Append(42).Append(88.8);
1490*6777b538SAndroid Build Coastguard Worker 
1491*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(3u, list_with_capacity.size());
1492*6777b538SAndroid Build Coastguard Worker }
1493*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,BinaryValue)1494*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, BinaryValue) {
1495*6777b538SAndroid Build Coastguard Worker   // Default constructor creates a BinaryValue with a buffer of size 0.
1496*6777b538SAndroid Build Coastguard Worker   Value binary(Value::Type::BINARY);
1497*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(binary.GetBlob().empty());
1498*6777b538SAndroid Build Coastguard Worker 
1499*6777b538SAndroid Build Coastguard Worker   // Test the common case of a non-empty buffer
1500*6777b538SAndroid Build Coastguard Worker   Value::BlobStorage buffer(15);
1501*6777b538SAndroid Build Coastguard Worker   uint8_t* original_buffer = buffer.data();
1502*6777b538SAndroid Build Coastguard Worker   binary = Value(std::move(buffer));
1503*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(binary.GetBlob().data());
1504*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(original_buffer, binary.GetBlob().data());
1505*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(15U, binary.GetBlob().size());
1506*6777b538SAndroid Build Coastguard Worker 
1507*6777b538SAndroid Build Coastguard Worker   char stack_buffer[42];
1508*6777b538SAndroid Build Coastguard Worker   memset(stack_buffer, '!', 42);
1509*6777b538SAndroid Build Coastguard Worker   binary = Value(Value::BlobStorage(stack_buffer, stack_buffer + 42));
1510*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(binary.GetBlob().data());
1511*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(stack_buffer,
1512*6777b538SAndroid Build Coastguard Worker             reinterpret_cast<const char*>(binary.GetBlob().data()));
1513*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(42U, binary.GetBlob().size());
1514*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0, memcmp(stack_buffer, binary.GetBlob().data(),
1515*6777b538SAndroid Build Coastguard Worker                       binary.GetBlob().size()));
1516*6777b538SAndroid Build Coastguard Worker }
1517*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,StringValue)1518*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, StringValue) {
1519*6777b538SAndroid Build Coastguard Worker   // Test overloaded StringValue constructor.
1520*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Value> narrow_value(new Value("narrow"));
1521*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(narrow_value.get());
1522*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(narrow_value->is_string());
1523*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Value> utf16_value(new Value(u"utf16"));
1524*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(utf16_value.get());
1525*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(utf16_value->is_string());
1526*6777b538SAndroid Build Coastguard Worker 
1527*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(narrow_value->is_string());
1528*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::string("narrow"), narrow_value->GetString());
1529*6777b538SAndroid Build Coastguard Worker 
1530*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(utf16_value->is_string());
1531*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::string("utf16"), utf16_value->GetString());
1532*6777b538SAndroid Build Coastguard Worker }
1533*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,DictionaryDeletion)1534*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictionaryDeletion) {
1535*6777b538SAndroid Build Coastguard Worker   std::string key = "test";
1536*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1537*6777b538SAndroid Build Coastguard Worker   dict.Set(key, Value());
1538*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dict.empty());
1539*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, dict.size());
1540*6777b538SAndroid Build Coastguard Worker   dict.clear();
1541*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(dict.empty());
1542*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(dict.empty());
1543*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0U, dict.size());
1544*6777b538SAndroid Build Coastguard Worker }
1545*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,DictionarySetReturnsPointer)1546*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictionarySetReturnsPointer) {
1547*6777b538SAndroid Build Coastguard Worker   {
1548*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1549*6777b538SAndroid Build Coastguard Worker     Value* blank_ptr = dict.Set("foo.bar", Value());
1550*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::NONE, blank_ptr->type());
1551*6777b538SAndroid Build Coastguard Worker   }
1552*6777b538SAndroid Build Coastguard Worker 
1553*6777b538SAndroid Build Coastguard Worker   {
1554*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1555*6777b538SAndroid Build Coastguard Worker     Value* blank_ptr = dict.Set("foo.bar", Value());
1556*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::NONE, blank_ptr->type());
1557*6777b538SAndroid Build Coastguard Worker   }
1558*6777b538SAndroid Build Coastguard Worker 
1559*6777b538SAndroid Build Coastguard Worker   {
1560*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1561*6777b538SAndroid Build Coastguard Worker     Value* int_ptr = dict.Set("foo.bar", 42);
1562*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::INTEGER, int_ptr->type());
1563*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(42, int_ptr->GetInt());
1564*6777b538SAndroid Build Coastguard Worker   }
1565*6777b538SAndroid Build Coastguard Worker 
1566*6777b538SAndroid Build Coastguard Worker   {
1567*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1568*6777b538SAndroid Build Coastguard Worker     Value* string_ptr = dict.Set("foo.bar", "foo");
1569*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::STRING, string_ptr->type());
1570*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("foo", string_ptr->GetString());
1571*6777b538SAndroid Build Coastguard Worker   }
1572*6777b538SAndroid Build Coastguard Worker 
1573*6777b538SAndroid Build Coastguard Worker   {
1574*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1575*6777b538SAndroid Build Coastguard Worker     Value* string16_ptr = dict.Set("foo.bar", u"baz");
1576*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::STRING, string16_ptr->type());
1577*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("baz", string16_ptr->GetString());
1578*6777b538SAndroid Build Coastguard Worker   }
1579*6777b538SAndroid Build Coastguard Worker 
1580*6777b538SAndroid Build Coastguard Worker   {
1581*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1582*6777b538SAndroid Build Coastguard Worker     Value* dict_ptr = dict.Set("foo.bar", Value::Dict());
1583*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::DICT, dict_ptr->type());
1584*6777b538SAndroid Build Coastguard Worker   }
1585*6777b538SAndroid Build Coastguard Worker 
1586*6777b538SAndroid Build Coastguard Worker   {
1587*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
1588*6777b538SAndroid Build Coastguard Worker     Value* list_ptr = dict.Set("foo.bar", Value::List());
1589*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(Value::Type::LIST, list_ptr->type());
1590*6777b538SAndroid Build Coastguard Worker   }
1591*6777b538SAndroid Build Coastguard Worker }
1592*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Clone)1593*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Clone) {
1594*6777b538SAndroid Build Coastguard Worker   Value original_null;
1595*6777b538SAndroid Build Coastguard Worker   Value original_bool(true);
1596*6777b538SAndroid Build Coastguard Worker   Value original_int(42);
1597*6777b538SAndroid Build Coastguard Worker   Value original_double(3.14);
1598*6777b538SAndroid Build Coastguard Worker   Value original_string("hello");
1599*6777b538SAndroid Build Coastguard Worker   Value original_string16(u"hello16");
1600*6777b538SAndroid Build Coastguard Worker   Value original_binary(Value::BlobStorage(42, '!'));
1601*6777b538SAndroid Build Coastguard Worker 
1602*6777b538SAndroid Build Coastguard Worker   Value::List list;
1603*6777b538SAndroid Build Coastguard Worker   list.Append(0);
1604*6777b538SAndroid Build Coastguard Worker   list.Append(1);
1605*6777b538SAndroid Build Coastguard Worker   Value original_list(std::move(list));
1606*6777b538SAndroid Build Coastguard Worker 
1607*6777b538SAndroid Build Coastguard Worker   Value original_dict(Value::Dict()
1608*6777b538SAndroid Build Coastguard Worker                           .Set("null", original_null.Clone())
1609*6777b538SAndroid Build Coastguard Worker                           .Set("bool", original_bool.Clone())
1610*6777b538SAndroid Build Coastguard Worker                           .Set("int", original_int.Clone())
1611*6777b538SAndroid Build Coastguard Worker                           .Set("double", original_double.Clone())
1612*6777b538SAndroid Build Coastguard Worker                           .Set("string", original_string.Clone())
1613*6777b538SAndroid Build Coastguard Worker                           .Set("string16", original_string16.Clone())
1614*6777b538SAndroid Build Coastguard Worker                           .Set("binary", original_binary.Clone())
1615*6777b538SAndroid Build Coastguard Worker                           .Set("list", original_list.Clone()));
1616*6777b538SAndroid Build Coastguard Worker 
1617*6777b538SAndroid Build Coastguard Worker   Value copy_value = original_dict.Clone();
1618*6777b538SAndroid Build Coastguard Worker   const Value::Dict& copy_dict = copy_value.GetDict();
1619*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_dict, copy_dict);
1620*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_null, *copy_dict.Find("null"));
1621*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_bool, *copy_dict.Find("bool"));
1622*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_int, *copy_dict.Find("int"));
1623*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_double, *copy_dict.Find("double"));
1624*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_string, *copy_dict.Find("string"));
1625*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_string16, *copy_dict.Find("string16"));
1626*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_binary, *copy_dict.Find("binary"));
1627*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(original_list, *copy_dict.Find("list"));
1628*6777b538SAndroid Build Coastguard Worker }
1629*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,TakeString)1630*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, TakeString) {
1631*6777b538SAndroid Build Coastguard Worker   Value value("foo");
1632*6777b538SAndroid Build Coastguard Worker   std::string taken = std::move(value).TakeString();
1633*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(taken, "foo");
1634*6777b538SAndroid Build Coastguard Worker }
1635*6777b538SAndroid Build Coastguard Worker 
1636*6777b538SAndroid Build Coastguard Worker // Check that the value can still be used after `TakeString()` was called, as
1637*6777b538SAndroid Build Coastguard Worker // long as a new value was assigned to it.
TEST(ValuesTest,PopulateAfterTakeString)1638*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, PopulateAfterTakeString) {
1639*6777b538SAndroid Build Coastguard Worker   Value value("foo");
1640*6777b538SAndroid Build Coastguard Worker   std::string taken = std::move(value).TakeString();
1641*6777b538SAndroid Build Coastguard Worker 
1642*6777b538SAndroid Build Coastguard Worker   value = Value(false);
1643*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, Value(false));
1644*6777b538SAndroid Build Coastguard Worker }
1645*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,TakeDict)1646*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, TakeDict) {
1647*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1648*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", 123);
1649*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
1650*6777b538SAndroid Build Coastguard Worker   Value clone = value.Clone();
1651*6777b538SAndroid Build Coastguard Worker 
1652*6777b538SAndroid Build Coastguard Worker   Value::Dict taken = std::move(value).TakeDict();
1653*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(taken, clone);
1654*6777b538SAndroid Build Coastguard Worker }
1655*6777b538SAndroid Build Coastguard Worker 
1656*6777b538SAndroid Build Coastguard Worker // Check that the value can still be used after `TakeDict()` was called, as long
1657*6777b538SAndroid Build Coastguard Worker // as a new value was assigned to it.
TEST(ValuesTest,PopulateAfterTakeDict)1658*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, PopulateAfterTakeDict) {
1659*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1660*6777b538SAndroid Build Coastguard Worker   dict.Set("foo", 123);
1661*6777b538SAndroid Build Coastguard Worker   Value value(std::move(dict));
1662*6777b538SAndroid Build Coastguard Worker   Value::Dict taken = std::move(value).TakeDict();
1663*6777b538SAndroid Build Coastguard Worker 
1664*6777b538SAndroid Build Coastguard Worker   value = Value(false);
1665*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, Value(false));
1666*6777b538SAndroid Build Coastguard Worker }
1667*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,TakeList)1668*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, TakeList) {
1669*6777b538SAndroid Build Coastguard Worker   Value::List list;
1670*6777b538SAndroid Build Coastguard Worker   list.Append(true);
1671*6777b538SAndroid Build Coastguard Worker   list.Append(123);
1672*6777b538SAndroid Build Coastguard Worker   Value value(std::move(list));
1673*6777b538SAndroid Build Coastguard Worker   Value clone = value.Clone();
1674*6777b538SAndroid Build Coastguard Worker 
1675*6777b538SAndroid Build Coastguard Worker   Value::List taken = std::move(value).TakeList();
1676*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(taken, clone);
1677*6777b538SAndroid Build Coastguard Worker }
1678*6777b538SAndroid Build Coastguard Worker 
1679*6777b538SAndroid Build Coastguard Worker // Check that the value can still be used after `TakeList()` was called, as long
1680*6777b538SAndroid Build Coastguard Worker // as a new value was assigned to it.
TEST(ValuesTest,PopulateAfterTakeList)1681*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, PopulateAfterTakeList) {
1682*6777b538SAndroid Build Coastguard Worker   Value::List list;
1683*6777b538SAndroid Build Coastguard Worker   list.Append("hello");
1684*6777b538SAndroid Build Coastguard Worker   Value value(std::move(list));
1685*6777b538SAndroid Build Coastguard Worker   Value::List taken = std::move(value).TakeList();
1686*6777b538SAndroid Build Coastguard Worker 
1687*6777b538SAndroid Build Coastguard Worker   value = Value(false);
1688*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(value, Value(false));
1689*6777b538SAndroid Build Coastguard Worker }
1690*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SpecializedEquals)1691*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SpecializedEquals) {
1692*6777b538SAndroid Build Coastguard Worker   std::vector<Value> values;
1693*6777b538SAndroid Build Coastguard Worker   values.emplace_back(false);
1694*6777b538SAndroid Build Coastguard Worker   values.emplace_back(true);
1695*6777b538SAndroid Build Coastguard Worker   values.emplace_back(0);
1696*6777b538SAndroid Build Coastguard Worker   values.emplace_back(1);
1697*6777b538SAndroid Build Coastguard Worker   values.emplace_back(1.0);
1698*6777b538SAndroid Build Coastguard Worker   values.emplace_back(2.0);
1699*6777b538SAndroid Build Coastguard Worker   values.emplace_back("hello");
1700*6777b538SAndroid Build Coastguard Worker   values.emplace_back("world");
1701*6777b538SAndroid Build Coastguard Worker   base::Value::Dict dict;
1702*6777b538SAndroid Build Coastguard Worker   dict.Set("hello", "world");
1703*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(dict));
1704*6777b538SAndroid Build Coastguard Worker   base::Value::Dict dict2;
1705*6777b538SAndroid Build Coastguard Worker   dict2.Set("world", "hello");
1706*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(dict2));
1707*6777b538SAndroid Build Coastguard Worker   base::Value::List list;
1708*6777b538SAndroid Build Coastguard Worker   list.Append("hello");
1709*6777b538SAndroid Build Coastguard Worker   list.Append("world");
1710*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(list));
1711*6777b538SAndroid Build Coastguard Worker   base::Value::List list2;
1712*6777b538SAndroid Build Coastguard Worker   list2.Append("world");
1713*6777b538SAndroid Build Coastguard Worker   list2.Append("hello");
1714*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(list2));
1715*6777b538SAndroid Build Coastguard Worker 
1716*6777b538SAndroid Build Coastguard Worker   for (const Value& outer_value : values) {
1717*6777b538SAndroid Build Coastguard Worker     for (const Value& inner_value : values) {
1718*6777b538SAndroid Build Coastguard Worker       SCOPED_TRACE(::testing::Message()
1719*6777b538SAndroid Build Coastguard Worker                    << "Outer: " << outer_value << "Inner: " << inner_value);
1720*6777b538SAndroid Build Coastguard Worker       const bool should_be_equal = &outer_value == &inner_value;
1721*6777b538SAndroid Build Coastguard Worker       if (should_be_equal) {
1722*6777b538SAndroid Build Coastguard Worker         EXPECT_EQ(outer_value, inner_value);
1723*6777b538SAndroid Build Coastguard Worker         EXPECT_EQ(inner_value, outer_value);
1724*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(outer_value != inner_value);
1725*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(inner_value != outer_value);
1726*6777b538SAndroid Build Coastguard Worker       } else {
1727*6777b538SAndroid Build Coastguard Worker         EXPECT_NE(outer_value, inner_value);
1728*6777b538SAndroid Build Coastguard Worker         EXPECT_NE(inner_value, outer_value);
1729*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(outer_value == inner_value);
1730*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(inner_value == outer_value);
1731*6777b538SAndroid Build Coastguard Worker       }
1732*6777b538SAndroid Build Coastguard Worker       // Also test the various overloads for operator== against concrete
1733*6777b538SAndroid Build Coastguard Worker       // subtypes.
1734*6777b538SAndroid Build Coastguard Worker       outer_value.Visit([&](const auto& outer_member) {
1735*6777b538SAndroid Build Coastguard Worker         using T = std::decay_t<decltype(outer_member)>;
1736*6777b538SAndroid Build Coastguard Worker         if constexpr (!std::is_same_v<T, absl::monostate> &&
1737*6777b538SAndroid Build Coastguard Worker                       !std::is_same_v<T, Value::BlobStorage>) {
1738*6777b538SAndroid Build Coastguard Worker           if (should_be_equal) {
1739*6777b538SAndroid Build Coastguard Worker             EXPECT_EQ(outer_member, inner_value);
1740*6777b538SAndroid Build Coastguard Worker             EXPECT_EQ(inner_value, outer_member);
1741*6777b538SAndroid Build Coastguard Worker             EXPECT_FALSE(outer_member != inner_value);
1742*6777b538SAndroid Build Coastguard Worker             EXPECT_FALSE(inner_value != outer_member);
1743*6777b538SAndroid Build Coastguard Worker           } else {
1744*6777b538SAndroid Build Coastguard Worker             EXPECT_NE(outer_member, inner_value);
1745*6777b538SAndroid Build Coastguard Worker             EXPECT_NE(inner_value, outer_member);
1746*6777b538SAndroid Build Coastguard Worker             EXPECT_FALSE(outer_member == inner_value);
1747*6777b538SAndroid Build Coastguard Worker             EXPECT_FALSE(inner_value == outer_member);
1748*6777b538SAndroid Build Coastguard Worker           }
1749*6777b538SAndroid Build Coastguard Worker         }
1750*6777b538SAndroid Build Coastguard Worker       });
1751*6777b538SAndroid Build Coastguard Worker     }
1752*6777b538SAndroid Build Coastguard Worker 
1753*6777b538SAndroid Build Coastguard Worker     // A copy of a Value should also compare equal to itself.
1754*6777b538SAndroid Build Coastguard Worker     Value copied_value = outer_value.Clone();
1755*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(outer_value, copied_value);
1756*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(copied_value, outer_value);
1757*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(outer_value != copied_value);
1758*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(copied_value != outer_value);
1759*6777b538SAndroid Build Coastguard Worker   }
1760*6777b538SAndroid Build Coastguard Worker }
1761*6777b538SAndroid Build Coastguard Worker 
1762*6777b538SAndroid Build Coastguard Worker // Test that a literal string comparison does not end up using the bool (!!)
1763*6777b538SAndroid Build Coastguard Worker // overload.
TEST(ValuesTest,LiteralStringEquals)1764*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, LiteralStringEquals) {
1765*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("hello world", base::Value("hello world"));
1766*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(base::Value("hello world"), "hello world");
1767*6777b538SAndroid Build Coastguard Worker   EXPECT_NE("hello world", base::Value(true));
1768*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(base::Value(true), "hello world");
1769*6777b538SAndroid Build Coastguard Worker }
1770*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Equals)1771*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Equals) {
1772*6777b538SAndroid Build Coastguard Worker   auto null1 = std::make_unique<Value>();
1773*6777b538SAndroid Build Coastguard Worker   auto null2 = std::make_unique<Value>();
1774*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(null1.get(), null2.get());
1775*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*null1, *null2);
1776*6777b538SAndroid Build Coastguard Worker 
1777*6777b538SAndroid Build Coastguard Worker   Value boolean(false);
1778*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(*null1, boolean);
1779*6777b538SAndroid Build Coastguard Worker 
1780*6777b538SAndroid Build Coastguard Worker   Value::Dict dv;
1781*6777b538SAndroid Build Coastguard Worker   dv.Set("a", false);
1782*6777b538SAndroid Build Coastguard Worker   dv.Set("b", 2);
1783*6777b538SAndroid Build Coastguard Worker   dv.Set("c", 2.5);
1784*6777b538SAndroid Build Coastguard Worker   dv.Set("d1", "string");
1785*6777b538SAndroid Build Coastguard Worker   dv.Set("d2", u"http://google.com");
1786*6777b538SAndroid Build Coastguard Worker   dv.Set("e", Value());
1787*6777b538SAndroid Build Coastguard Worker 
1788*6777b538SAndroid Build Coastguard Worker   Value::Dict copy = dv.Clone();
1789*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dv, copy);
1790*6777b538SAndroid Build Coastguard Worker 
1791*6777b538SAndroid Build Coastguard Worker   Value::List list;
1792*6777b538SAndroid Build Coastguard Worker   list.Append(Value());
1793*6777b538SAndroid Build Coastguard Worker   list.Append(Value(Value::Type::DICT));
1794*6777b538SAndroid Build Coastguard Worker   Value::List list_copy(list.Clone());
1795*6777b538SAndroid Build Coastguard Worker 
1796*6777b538SAndroid Build Coastguard Worker   Value* list_weak = dv.Set("f", std::move(list));
1797*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(dv, copy);
1798*6777b538SAndroid Build Coastguard Worker   copy.Set("f", std::move(list_copy));
1799*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dv, copy);
1800*6777b538SAndroid Build Coastguard Worker 
1801*6777b538SAndroid Build Coastguard Worker   list_weak->GetList().Append(true);
1802*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(dv, copy);
1803*6777b538SAndroid Build Coastguard Worker 
1804*6777b538SAndroid Build Coastguard Worker   // Check if Equals detects differences in only the keys.
1805*6777b538SAndroid Build Coastguard Worker   copy = dv.Clone();
1806*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dv, copy);
1807*6777b538SAndroid Build Coastguard Worker   copy.Remove("a");
1808*6777b538SAndroid Build Coastguard Worker   copy.Set("aa", false);
1809*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(dv, copy);
1810*6777b538SAndroid Build Coastguard Worker }
1811*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Comparisons)1812*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Comparisons) {
1813*6777b538SAndroid Build Coastguard Worker   // Test None Values.
1814*6777b538SAndroid Build Coastguard Worker   Value null1;
1815*6777b538SAndroid Build Coastguard Worker   Value null2;
1816*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(null1, null2);
1817*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null1 != null2);
1818*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null1 < null2);
1819*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null1 > null2);
1820*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(null1, null2);
1821*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(null1, null2);
1822*6777b538SAndroid Build Coastguard Worker 
1823*6777b538SAndroid Build Coastguard Worker   // Test Bool Values.
1824*6777b538SAndroid Build Coastguard Worker   Value bool1(false);
1825*6777b538SAndroid Build Coastguard Worker   Value bool2(true);
1826*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(bool1 == bool2);
1827*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(bool1, bool2);
1828*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(bool1, bool2);
1829*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(bool1 > bool2);
1830*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(bool1, bool2);
1831*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(bool1 >= bool2);
1832*6777b538SAndroid Build Coastguard Worker 
1833*6777b538SAndroid Build Coastguard Worker   // Test Int Values.
1834*6777b538SAndroid Build Coastguard Worker   Value int1(1);
1835*6777b538SAndroid Build Coastguard Worker   Value int2(2);
1836*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int1 == int2);
1837*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(int1, int2);
1838*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(int1, int2);
1839*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int1 > int2);
1840*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(int1, int2);
1841*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int1 >= int2);
1842*6777b538SAndroid Build Coastguard Worker 
1843*6777b538SAndroid Build Coastguard Worker   // Test Double Values.
1844*6777b538SAndroid Build Coastguard Worker   Value double1(1.0);
1845*6777b538SAndroid Build Coastguard Worker   Value double2(2.0);
1846*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(double1 == double2);
1847*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(double1, double2);
1848*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(double1, double2);
1849*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(double1 > double2);
1850*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(double1, double2);
1851*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(double1 >= double2);
1852*6777b538SAndroid Build Coastguard Worker 
1853*6777b538SAndroid Build Coastguard Worker   // Test String Values.
1854*6777b538SAndroid Build Coastguard Worker   Value string1("1");
1855*6777b538SAndroid Build Coastguard Worker   Value string2("2");
1856*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(string1 == string2);
1857*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(string1, string2);
1858*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(string1, string2);
1859*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(string1 > string2);
1860*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(string1, string2);
1861*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(string1 >= string2);
1862*6777b538SAndroid Build Coastguard Worker 
1863*6777b538SAndroid Build Coastguard Worker   // Test Binary Values.
1864*6777b538SAndroid Build Coastguard Worker   Value binary1(Value::BlobStorage{0x01});
1865*6777b538SAndroid Build Coastguard Worker   Value binary2(Value::BlobStorage{0x02});
1866*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(binary1 == binary2);
1867*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(binary1, binary2);
1868*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(binary1, binary2);
1869*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(binary1 > binary2);
1870*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(binary1, binary2);
1871*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(binary1 >= binary2);
1872*6777b538SAndroid Build Coastguard Worker 
1873*6777b538SAndroid Build Coastguard Worker   // Test Empty List Values.
1874*6777b538SAndroid Build Coastguard Worker   Value::List null_list1;
1875*6777b538SAndroid Build Coastguard Worker   Value::List null_list2;
1876*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(null_list1, null_list2);
1877*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_list1 != null_list2);
1878*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_list1 < null_list2);
1879*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_list1 > null_list2);
1880*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(null_list1, null_list2);
1881*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(null_list1, null_list2);
1882*6777b538SAndroid Build Coastguard Worker 
1883*6777b538SAndroid Build Coastguard Worker   // Test Non Empty List Values.
1884*6777b538SAndroid Build Coastguard Worker   Value::List int_list1;
1885*6777b538SAndroid Build Coastguard Worker   Value::List int_list2;
1886*6777b538SAndroid Build Coastguard Worker   int_list1.Append(1);
1887*6777b538SAndroid Build Coastguard Worker   int_list2.Append(2);
1888*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_list1 == int_list2);
1889*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(int_list1, int_list2);
1890*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(int_list1, int_list2);
1891*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_list1 > int_list2);
1892*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(int_list1, int_list2);
1893*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_list1 >= int_list2);
1894*6777b538SAndroid Build Coastguard Worker 
1895*6777b538SAndroid Build Coastguard Worker   // Test Empty Dict Values.
1896*6777b538SAndroid Build Coastguard Worker   Value::Dict null_dict1;
1897*6777b538SAndroid Build Coastguard Worker   Value::Dict null_dict2;
1898*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(null_dict1, null_dict2);
1899*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_dict1 != null_dict2);
1900*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_dict1 < null_dict2);
1901*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(null_dict1 > null_dict2);
1902*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(null_dict1, null_dict2);
1903*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(null_dict1, null_dict2);
1904*6777b538SAndroid Build Coastguard Worker 
1905*6777b538SAndroid Build Coastguard Worker   // Test Non Empty Dict Values.
1906*6777b538SAndroid Build Coastguard Worker   Value::Dict int_dict1;
1907*6777b538SAndroid Build Coastguard Worker   Value::Dict int_dict2;
1908*6777b538SAndroid Build Coastguard Worker   int_dict1.Set("key", 1);
1909*6777b538SAndroid Build Coastguard Worker   int_dict2.Set("key", 2);
1910*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_dict1 == int_dict2);
1911*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(int_dict1, int_dict2);
1912*6777b538SAndroid Build Coastguard Worker   EXPECT_LT(int_dict1, int_dict2);
1913*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_dict1 > int_dict2);
1914*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(int_dict1, int_dict2);
1915*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(int_dict1 >= int_dict2);
1916*6777b538SAndroid Build Coastguard Worker 
1917*6777b538SAndroid Build Coastguard Worker   // Test Values of different types.
1918*6777b538SAndroid Build Coastguard Worker   std::vector<Value> values;
1919*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(null1));
1920*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(bool1));
1921*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(int1));
1922*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(double1));
1923*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(string1));
1924*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(binary1));
1925*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(int_dict1));
1926*6777b538SAndroid Build Coastguard Worker   values.emplace_back(std::move(int_list1));
1927*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < values.size(); ++i) {
1928*6777b538SAndroid Build Coastguard Worker     for (size_t j = i + 1; j < values.size(); ++j) {
1929*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(values[i] == values[j]);
1930*6777b538SAndroid Build Coastguard Worker       EXPECT_NE(values[i], values[j]);
1931*6777b538SAndroid Build Coastguard Worker       EXPECT_LT(values[i], values[j]);
1932*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(values[i] > values[j]);
1933*6777b538SAndroid Build Coastguard Worker       EXPECT_LE(values[i], values[j]);
1934*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(values[i] >= values[j]);
1935*6777b538SAndroid Build Coastguard Worker     }
1936*6777b538SAndroid Build Coastguard Worker   }
1937*6777b538SAndroid Build Coastguard Worker }
1938*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,Merge)1939*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, Merge) {
1940*6777b538SAndroid Build Coastguard Worker   Value::Dict base;
1941*6777b538SAndroid Build Coastguard Worker   base.Set("base_key", "base_key_value_base");
1942*6777b538SAndroid Build Coastguard Worker   base.Set("collide_key", "collide_key_value_base");
1943*6777b538SAndroid Build Coastguard Worker   Value::Dict base_sub_dict;
1944*6777b538SAndroid Build Coastguard Worker   base_sub_dict.Set("sub_base_key", "sub_base_key_value_base");
1945*6777b538SAndroid Build Coastguard Worker   base_sub_dict.Set("sub_collide_key", "sub_collide_key_value_base");
1946*6777b538SAndroid Build Coastguard Worker   base.Set("sub_dict_key", std::move(base_sub_dict));
1947*6777b538SAndroid Build Coastguard Worker 
1948*6777b538SAndroid Build Coastguard Worker   Value::Dict merge;
1949*6777b538SAndroid Build Coastguard Worker   merge.Set("merge_key", "merge_key_value_merge");
1950*6777b538SAndroid Build Coastguard Worker   merge.Set("collide_key", "collide_key_value_merge");
1951*6777b538SAndroid Build Coastguard Worker   Value::Dict merge_sub_dict;
1952*6777b538SAndroid Build Coastguard Worker   merge_sub_dict.Set("sub_merge_key", "sub_merge_key_value_merge");
1953*6777b538SAndroid Build Coastguard Worker   merge_sub_dict.Set("sub_collide_key", "sub_collide_key_value_merge");
1954*6777b538SAndroid Build Coastguard Worker   merge.Set("sub_dict_key", std::move(merge_sub_dict));
1955*6777b538SAndroid Build Coastguard Worker 
1956*6777b538SAndroid Build Coastguard Worker   base.Merge(std::move(merge));
1957*6777b538SAndroid Build Coastguard Worker 
1958*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(4U, base.size());
1959*6777b538SAndroid Build Coastguard Worker   const std::string* base_key_value = base.FindString("base_key");
1960*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(base_key_value);
1961*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("base_key_value_base", *base_key_value);  // Base value preserved.
1962*6777b538SAndroid Build Coastguard Worker   const std::string* collide_key_value = base.FindString("collide_key");
1963*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(collide_key_value);
1964*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("collide_key_value_merge", *collide_key_value);  // Replaced.
1965*6777b538SAndroid Build Coastguard Worker   const std::string* merge_key_value = base.FindString("merge_key");
1966*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(merge_key_value);
1967*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("merge_key_value_merge", *merge_key_value);  // Merged in.
1968*6777b538SAndroid Build Coastguard Worker 
1969*6777b538SAndroid Build Coastguard Worker   Value::Dict* res_sub_dict = base.FindDict("sub_dict_key");
1970*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(res_sub_dict);
1971*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3U, res_sub_dict->size());
1972*6777b538SAndroid Build Coastguard Worker   const std::string* sub_base_key_value =
1973*6777b538SAndroid Build Coastguard Worker       res_sub_dict->FindString("sub_base_key");
1974*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(sub_base_key_value);
1975*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("sub_base_key_value_base", *sub_base_key_value);  // Preserved.
1976*6777b538SAndroid Build Coastguard Worker   const std::string* sub_collide_key_value =
1977*6777b538SAndroid Build Coastguard Worker       res_sub_dict->FindString("sub_collide_key");
1978*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(sub_collide_key_value);
1979*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("sub_collide_key_value_merge",
1980*6777b538SAndroid Build Coastguard Worker             *sub_collide_key_value);  // Replaced.
1981*6777b538SAndroid Build Coastguard Worker   const std::string* sub_merge_key_value =
1982*6777b538SAndroid Build Coastguard Worker       res_sub_dict->FindString("sub_merge_key");
1983*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(sub_merge_key_value);
1984*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("sub_merge_key_value_merge", *sub_merge_key_value);  // Merged in.
1985*6777b538SAndroid Build Coastguard Worker }
1986*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,DictionaryIterator)1987*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, DictionaryIterator) {
1988*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
1989*6777b538SAndroid Build Coastguard Worker   for (Value::Dict::iterator it = dict.begin(); it != dict.end(); ++it) {
1990*6777b538SAndroid Build Coastguard Worker     ADD_FAILURE();
1991*6777b538SAndroid Build Coastguard Worker   }
1992*6777b538SAndroid Build Coastguard Worker 
1993*6777b538SAndroid Build Coastguard Worker   Value value1("value1");
1994*6777b538SAndroid Build Coastguard Worker   dict.Set("key1", value1.Clone());
1995*6777b538SAndroid Build Coastguard Worker   bool seen1 = false;
1996*6777b538SAndroid Build Coastguard Worker   for (Value::Dict::iterator it = dict.begin(); it != dict.end(); ++it) {
1997*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(seen1);
1998*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("key1", it->first);
1999*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(value1, it->second);
2000*6777b538SAndroid Build Coastguard Worker     seen1 = true;
2001*6777b538SAndroid Build Coastguard Worker   }
2002*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen1);
2003*6777b538SAndroid Build Coastguard Worker 
2004*6777b538SAndroid Build Coastguard Worker   Value value2("value2");
2005*6777b538SAndroid Build Coastguard Worker   dict.Set("key2", value2.Clone());
2006*6777b538SAndroid Build Coastguard Worker   bool seen2 = seen1 = false;
2007*6777b538SAndroid Build Coastguard Worker   for (Value::Dict::iterator it = dict.begin(); it != dict.end(); ++it) {
2008*6777b538SAndroid Build Coastguard Worker     if (it->first == "key1") {
2009*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(seen1);
2010*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(value1, it->second);
2011*6777b538SAndroid Build Coastguard Worker       seen1 = true;
2012*6777b538SAndroid Build Coastguard Worker     } else if (it->first == "key2") {
2013*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(seen2);
2014*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(value2, it->second);
2015*6777b538SAndroid Build Coastguard Worker       seen2 = true;
2016*6777b538SAndroid Build Coastguard Worker     } else {
2017*6777b538SAndroid Build Coastguard Worker       ADD_FAILURE();
2018*6777b538SAndroid Build Coastguard Worker     }
2019*6777b538SAndroid Build Coastguard Worker   }
2020*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen1);
2021*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen2);
2022*6777b538SAndroid Build Coastguard Worker }
2023*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MutatingCopiedPairsInDictMutatesUnderlyingValues)2024*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MutatingCopiedPairsInDictMutatesUnderlyingValues) {
2025*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
2026*6777b538SAndroid Build Coastguard Worker   dict.Set("key", Value("initial value"));
2027*6777b538SAndroid Build Coastguard Worker 
2028*6777b538SAndroid Build Coastguard Worker   // Because the non-const dict iterates over <const std::string&, Value&>
2029*6777b538SAndroid Build Coastguard Worker   // pairs, it's possible to alter iterated-over values in place even when
2030*6777b538SAndroid Build Coastguard Worker   // "copying" the key-value pair:
2031*6777b538SAndroid Build Coastguard Worker   for (auto kv : dict) {
2032*6777b538SAndroid Build Coastguard Worker     kv.second.GetString() = "replacement";
2033*6777b538SAndroid Build Coastguard Worker   }
2034*6777b538SAndroid Build Coastguard Worker 
2035*6777b538SAndroid Build Coastguard Worker   std::string* found = dict.FindString("key");
2036*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(found);
2037*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*found, "replacement");
2038*6777b538SAndroid Build Coastguard Worker }
2039*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,StdDictionaryIterator)2040*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, StdDictionaryIterator) {
2041*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
2042*6777b538SAndroid Build Coastguard Worker   for (auto it = dict.begin(); it != dict.end(); ++it) {
2043*6777b538SAndroid Build Coastguard Worker     ADD_FAILURE();
2044*6777b538SAndroid Build Coastguard Worker   }
2045*6777b538SAndroid Build Coastguard Worker 
2046*6777b538SAndroid Build Coastguard Worker   Value value1("value1");
2047*6777b538SAndroid Build Coastguard Worker   dict.Set("key1", value1.Clone());
2048*6777b538SAndroid Build Coastguard Worker   bool seen1 = false;
2049*6777b538SAndroid Build Coastguard Worker   for (auto it : dict) {
2050*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(seen1);
2051*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("key1", it.first);
2052*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(value1, it.second);
2053*6777b538SAndroid Build Coastguard Worker     seen1 = true;
2054*6777b538SAndroid Build Coastguard Worker   }
2055*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen1);
2056*6777b538SAndroid Build Coastguard Worker 
2057*6777b538SAndroid Build Coastguard Worker   Value value2("value2");
2058*6777b538SAndroid Build Coastguard Worker   dict.Set("key2", value2.Clone());
2059*6777b538SAndroid Build Coastguard Worker   bool seen2 = seen1 = false;
2060*6777b538SAndroid Build Coastguard Worker   for (auto it : dict) {
2061*6777b538SAndroid Build Coastguard Worker     if (it.first == "key1") {
2062*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(seen1);
2063*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(value1, it.second);
2064*6777b538SAndroid Build Coastguard Worker       seen1 = true;
2065*6777b538SAndroid Build Coastguard Worker     } else if (it.first == "key2") {
2066*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(seen2);
2067*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(value2, it.second);
2068*6777b538SAndroid Build Coastguard Worker       seen2 = true;
2069*6777b538SAndroid Build Coastguard Worker     } else {
2070*6777b538SAndroid Build Coastguard Worker       ADD_FAILURE();
2071*6777b538SAndroid Build Coastguard Worker     }
2072*6777b538SAndroid Build Coastguard Worker   }
2073*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen1);
2074*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(seen2);
2075*6777b538SAndroid Build Coastguard Worker }
2076*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,SelfSwap)2077*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, SelfSwap) {
2078*6777b538SAndroid Build Coastguard Worker   base::Value test(1);
2079*6777b538SAndroid Build Coastguard Worker   std::swap(test, test);
2080*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, test.GetInt());
2081*6777b538SAndroid Build Coastguard Worker }
2082*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,FromToUniquePtrValue)2083*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, FromToUniquePtrValue) {
2084*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Value> dict = std::make_unique<Value>(Value::Type::DICT);
2085*6777b538SAndroid Build Coastguard Worker   dict->GetDict().Set("name", "Froogle");
2086*6777b538SAndroid Build Coastguard Worker   dict->GetDict().Set("url", "http://froogle.com");
2087*6777b538SAndroid Build Coastguard Worker   Value dict_copy = dict->Clone();
2088*6777b538SAndroid Build Coastguard Worker 
2089*6777b538SAndroid Build Coastguard Worker   Value dict_converted = Value::FromUniquePtrValue(std::move(dict));
2090*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dict_copy, dict_converted);
2091*6777b538SAndroid Build Coastguard Worker 
2092*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Value> val =
2093*6777b538SAndroid Build Coastguard Worker       Value::ToUniquePtrValue(std::move(dict_converted));
2094*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dict_copy, *val);
2095*6777b538SAndroid Build Coastguard Worker }
2096*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MutableFindStringPath)2097*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MutableFindStringPath) {
2098*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
2099*6777b538SAndroid Build Coastguard Worker   dict.SetByDottedPath("foo.bar", "value");
2100*6777b538SAndroid Build Coastguard Worker 
2101*6777b538SAndroid Build Coastguard Worker   *(dict.FindStringByDottedPath("foo.bar")) = "new_value";
2102*6777b538SAndroid Build Coastguard Worker 
2103*6777b538SAndroid Build Coastguard Worker   Value::Dict expected_dict;
2104*6777b538SAndroid Build Coastguard Worker   expected_dict.SetByDottedPath("foo.bar", "new_value");
2105*6777b538SAndroid Build Coastguard Worker 
2106*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected_dict, dict);
2107*6777b538SAndroid Build Coastguard Worker }
2108*6777b538SAndroid Build Coastguard Worker 
TEST(ValuesTest,MutableGetString)2109*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, MutableGetString) {
2110*6777b538SAndroid Build Coastguard Worker   Value value("value");
2111*6777b538SAndroid Build Coastguard Worker   value.GetString() = "new_value";
2112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("new_value", value.GetString());
2113*6777b538SAndroid Build Coastguard Worker }
2114*6777b538SAndroid Build Coastguard Worker 
2115*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_BASE_TRACING)
TEST(ValuesTest,TracingSupport)2116*6777b538SAndroid Build Coastguard Worker TEST(ValuesTest, TracingSupport) {
2117*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(perfetto::TracedValueToString(Value(false)), "false");
2118*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(perfetto::TracedValueToString(Value(1)), "1");
2119*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(perfetto::TracedValueToString(Value(1.5)), "1.5");
2120*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(perfetto::TracedValueToString(Value("value")), "value");
2121*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(perfetto::TracedValueToString(Value(Value::Type::NONE)), "<none>");
2122*6777b538SAndroid Build Coastguard Worker   {
2123*6777b538SAndroid Build Coastguard Worker     Value::List list;
2124*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(list), "{}");
2125*6777b538SAndroid Build Coastguard Worker     list.Append(2);
2126*6777b538SAndroid Build Coastguard Worker     list.Append(3);
2127*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(list), "[2,3]");
2128*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(Value(std::move(list))), "[2,3]");
2129*6777b538SAndroid Build Coastguard Worker   }
2130*6777b538SAndroid Build Coastguard Worker   {
2131*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
2132*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(dict), "{}");
2133*6777b538SAndroid Build Coastguard Worker     dict.Set("key", "value");
2134*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(dict), "{key:value}");
2135*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(perfetto::TracedValueToString(Value(std::move(dict))),
2136*6777b538SAndroid Build Coastguard Worker               "{key:value}");
2137*6777b538SAndroid Build Coastguard Worker   }
2138*6777b538SAndroid Build Coastguard Worker }
2139*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(ENABLE_BASE_TRACING)
2140*6777b538SAndroid Build Coastguard Worker 
TEST(ValueViewTest,BasicConstruction)2141*6777b538SAndroid Build Coastguard Worker TEST(ValueViewTest, BasicConstruction) {
2142*6777b538SAndroid Build Coastguard Worker   {
2143*6777b538SAndroid Build Coastguard Worker     ValueView v = true;
2144*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(true, absl::get<bool>(v.data_view_for_test()));
2145*6777b538SAndroid Build Coastguard Worker   }
2146*6777b538SAndroid Build Coastguard Worker   {
2147*6777b538SAndroid Build Coastguard Worker     ValueView v = 25;
2148*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(25, absl::get<int>(v.data_view_for_test()));
2149*6777b538SAndroid Build Coastguard Worker   }
2150*6777b538SAndroid Build Coastguard Worker   {
2151*6777b538SAndroid Build Coastguard Worker     ValueView v = 3.14;
2152*6777b538SAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.14, absl::get<ValueView::DoubleStorageForTest>(
2153*6777b538SAndroid Build Coastguard Worker                                v.data_view_for_test()));
2154*6777b538SAndroid Build Coastguard Worker   }
2155*6777b538SAndroid Build Coastguard Worker   {
2156*6777b538SAndroid Build Coastguard Worker     ValueView v = StringPiece("hello world");
2157*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("hello world", absl::get<StringPiece>(v.data_view_for_test()));
2158*6777b538SAndroid Build Coastguard Worker   }
2159*6777b538SAndroid Build Coastguard Worker   {
2160*6777b538SAndroid Build Coastguard Worker     ValueView v = "hello world";
2161*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("hello world", absl::get<StringPiece>(v.data_view_for_test()));
2162*6777b538SAndroid Build Coastguard Worker   }
2163*6777b538SAndroid Build Coastguard Worker   {
2164*6777b538SAndroid Build Coastguard Worker     std::string str = "hello world";
2165*6777b538SAndroid Build Coastguard Worker     ValueView v = str;
2166*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("hello world", absl::get<StringPiece>(v.data_view_for_test()));
2167*6777b538SAndroid Build Coastguard Worker   }
2168*6777b538SAndroid Build Coastguard Worker   {
2169*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
2170*6777b538SAndroid Build Coastguard Worker     dict.Set("hello", "world");
2171*6777b538SAndroid Build Coastguard Worker     ValueView v = dict;
2172*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(dict, absl::get<std::reference_wrapper<const Value::Dict>>(
2173*6777b538SAndroid Build Coastguard Worker                         v.data_view_for_test()));
2174*6777b538SAndroid Build Coastguard Worker   }
2175*6777b538SAndroid Build Coastguard Worker   {
2176*6777b538SAndroid Build Coastguard Worker     Value::List list;
2177*6777b538SAndroid Build Coastguard Worker     list.Append("hello");
2178*6777b538SAndroid Build Coastguard Worker     list.Append("world");
2179*6777b538SAndroid Build Coastguard Worker     ValueView v = list;
2180*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(list, absl::get<std::reference_wrapper<const Value::List>>(
2181*6777b538SAndroid Build Coastguard Worker                         v.data_view_for_test()));
2182*6777b538SAndroid Build Coastguard Worker   }
2183*6777b538SAndroid Build Coastguard Worker }
2184*6777b538SAndroid Build Coastguard Worker 
TEST(ValueViewTest,ValueConstruction)2185*6777b538SAndroid Build Coastguard Worker TEST(ValueViewTest, ValueConstruction) {
2186*6777b538SAndroid Build Coastguard Worker   {
2187*6777b538SAndroid Build Coastguard Worker     Value val(true);
2188*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2189*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(true, absl::get<bool>(v.data_view_for_test()));
2190*6777b538SAndroid Build Coastguard Worker   }
2191*6777b538SAndroid Build Coastguard Worker   {
2192*6777b538SAndroid Build Coastguard Worker     Value val(25);
2193*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2194*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(25, absl::get<int>(v.data_view_for_test()));
2195*6777b538SAndroid Build Coastguard Worker   }
2196*6777b538SAndroid Build Coastguard Worker   {
2197*6777b538SAndroid Build Coastguard Worker     Value val(3.14);
2198*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2199*6777b538SAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(3.14, absl::get<ValueView::DoubleStorageForTest>(
2200*6777b538SAndroid Build Coastguard Worker                                v.data_view_for_test()));
2201*6777b538SAndroid Build Coastguard Worker   }
2202*6777b538SAndroid Build Coastguard Worker   {
2203*6777b538SAndroid Build Coastguard Worker     Value val("hello world");
2204*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2205*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("hello world", absl::get<StringPiece>(v.data_view_for_test()));
2206*6777b538SAndroid Build Coastguard Worker   }
2207*6777b538SAndroid Build Coastguard Worker   {
2208*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
2209*6777b538SAndroid Build Coastguard Worker     dict.Set("hello", "world");
2210*6777b538SAndroid Build Coastguard Worker     Value val(dict.Clone());
2211*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2212*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(dict, absl::get<std::reference_wrapper<const Value::Dict>>(
2213*6777b538SAndroid Build Coastguard Worker                         v.data_view_for_test()));
2214*6777b538SAndroid Build Coastguard Worker   }
2215*6777b538SAndroid Build Coastguard Worker   {
2216*6777b538SAndroid Build Coastguard Worker     Value::List list;
2217*6777b538SAndroid Build Coastguard Worker     list.Append("hello");
2218*6777b538SAndroid Build Coastguard Worker     list.Append("world");
2219*6777b538SAndroid Build Coastguard Worker     Value val(list.Clone());
2220*6777b538SAndroid Build Coastguard Worker     ValueView v = val;
2221*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(list, absl::get<std::reference_wrapper<const Value::List>>(
2222*6777b538SAndroid Build Coastguard Worker                         v.data_view_for_test()));
2223*6777b538SAndroid Build Coastguard Worker   }
2224*6777b538SAndroid Build Coastguard Worker }
2225*6777b538SAndroid Build Coastguard Worker 
TEST(ValueViewTest,ToValue)2226*6777b538SAndroid Build Coastguard Worker TEST(ValueViewTest, ToValue) {
2227*6777b538SAndroid Build Coastguard Worker   {
2228*6777b538SAndroid Build Coastguard Worker     Value val(true);
2229*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2230*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2231*6777b538SAndroid Build Coastguard Worker   }
2232*6777b538SAndroid Build Coastguard Worker   {
2233*6777b538SAndroid Build Coastguard Worker     Value val(25);
2234*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2235*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2236*6777b538SAndroid Build Coastguard Worker   }
2237*6777b538SAndroid Build Coastguard Worker   {
2238*6777b538SAndroid Build Coastguard Worker     Value val(3.14);
2239*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2240*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2241*6777b538SAndroid Build Coastguard Worker   }
2242*6777b538SAndroid Build Coastguard Worker   {
2243*6777b538SAndroid Build Coastguard Worker     Value val("hello world");
2244*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2245*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2246*6777b538SAndroid Build Coastguard Worker   }
2247*6777b538SAndroid Build Coastguard Worker   {
2248*6777b538SAndroid Build Coastguard Worker     Value::Dict dict;
2249*6777b538SAndroid Build Coastguard Worker     dict.Set("hello", "world");
2250*6777b538SAndroid Build Coastguard Worker     Value val(dict.Clone());
2251*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2252*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2253*6777b538SAndroid Build Coastguard Worker   }
2254*6777b538SAndroid Build Coastguard Worker   {
2255*6777b538SAndroid Build Coastguard Worker     Value::List list;
2256*6777b538SAndroid Build Coastguard Worker     list.Append("hello");
2257*6777b538SAndroid Build Coastguard Worker     list.Append("world");
2258*6777b538SAndroid Build Coastguard Worker     Value val(list.Clone());
2259*6777b538SAndroid Build Coastguard Worker     Value to_val = ValueView(val).ToValue();
2260*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, to_val);
2261*6777b538SAndroid Build Coastguard Worker   }
2262*6777b538SAndroid Build Coastguard Worker }
2263*6777b538SAndroid Build Coastguard Worker 
2264*6777b538SAndroid Build Coastguard Worker }  // namespace base
2265