blob: a20f3c8c5afabd6b88691673df636733582337ba [file] [log] [blame]
finnur@chromium.org07b7b082009-07-03 11:28:55 +09001// Copyright (c) 2009 The Chromium Authors. All rights reserved.
license.botf003cfe2008-08-24 09:55:55 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit3f4a7322008-07-27 06:49:38 +09004
deanm@google.com19650de2008-08-13 23:57:51 +09005#include <limits>
6
aa@chromium.orgc93b02f2009-01-21 06:05:32 +09007#include "base/scoped_ptr.h"
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +09008#include "base/string_util.h"
9#include "base/string16.h"
10#include "base/values.h"
initial.commit3f4a7322008-07-27 06:49:38 +090011#include "testing/gtest/include/gtest/gtest.h"
12
13class ValuesTest: public testing::Test {
14};
15
16TEST(ValuesTest, Basic) {
17 // Test basic dictionary getting/setting
18 DictionaryValue settings;
nsylvain@chromium.org12426672009-03-04 07:59:43 +090019 std::wstring homepage = L"http://google.com";
20 ASSERT_FALSE(
21 settings.GetString(L"global.homepage", &homepage));
22 ASSERT_EQ(std::wstring(L"http://google.com"), homepage);
initial.commit3f4a7322008-07-27 06:49:38 +090023
nsylvain@chromium.org12426672009-03-04 07:59:43 +090024 ASSERT_FALSE(settings.Get(L"global", NULL));
pkasting@chromium.org36515db2009-11-26 05:47:52 +090025 settings.Set(L"global", Value::CreateBooleanValue(true));
nsylvain@chromium.org12426672009-03-04 07:59:43 +090026 ASSERT_TRUE(settings.Get(L"global", NULL));
pkasting@chromium.org36515db2009-11-26 05:47:52 +090027 settings.SetString(L"global.homepage", L"http://scurvy.com");
nsylvain@chromium.org12426672009-03-04 07:59:43 +090028 ASSERT_TRUE(settings.Get(L"global", NULL));
29 homepage = L"http://google.com";
30 ASSERT_TRUE(settings.GetString(L"global.homepage", &homepage));
31 ASSERT_EQ(std::wstring(L"http://scurvy.com"), homepage);
initial.commit3f4a7322008-07-27 06:49:38 +090032
33 // Test storing a dictionary in a list.
34 ListValue* toolbar_bookmarks;
35 ASSERT_FALSE(
nsylvain@chromium.org12426672009-03-04 07:59:43 +090036 settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks));
initial.commit3f4a7322008-07-27 06:49:38 +090037
38 toolbar_bookmarks = new ListValue;
nsylvain@chromium.org12426672009-03-04 07:59:43 +090039 settings.Set(L"global.toolbar.bookmarks", toolbar_bookmarks);
initial.commit3f4a7322008-07-27 06:49:38 +090040 ASSERT_TRUE(
nsylvain@chromium.org12426672009-03-04 07:59:43 +090041 settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks));
initial.commit3f4a7322008-07-27 06:49:38 +090042
43 DictionaryValue* new_bookmark = new DictionaryValue;
nsylvain@chromium.org12426672009-03-04 07:59:43 +090044 new_bookmark->SetString(L"name", L"Froogle");
45 new_bookmark->SetString(L"url", L"http://froogle.com");
initial.commit3f4a7322008-07-27 06:49:38 +090046 toolbar_bookmarks->Append(new_bookmark);
47
48 ListValue* bookmark_list;
nsylvain@chromium.org12426672009-03-04 07:59:43 +090049 ASSERT_TRUE(settings.GetList(L"global.toolbar.bookmarks", &bookmark_list));
initial.commit3f4a7322008-07-27 06:49:38 +090050 DictionaryValue* bookmark;
mmentovai@google.com691ecef2008-08-22 01:24:51 +090051 ASSERT_EQ(1U, bookmark_list->GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +090052 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark));
nsylvain@chromium.org12426672009-03-04 07:59:43 +090053 std::wstring bookmark_name = L"Unnamed";
54 ASSERT_TRUE(bookmark->GetString(L"name", &bookmark_name));
55 ASSERT_EQ(std::wstring(L"Froogle"), bookmark_name);
56 std::wstring bookmark_url;
57 ASSERT_TRUE(bookmark->GetString(L"url", &bookmark_url));
58 ASSERT_EQ(std::wstring(L"http://froogle.com"), bookmark_url);
initial.commit3f4a7322008-07-27 06:49:38 +090059}
60
aa@chromium.orgc93b02f2009-01-21 06:05:32 +090061TEST(ValuesTest, List) {
62 scoped_ptr<ListValue> mixed_list(new ListValue());
63 mixed_list->Set(0, Value::CreateBooleanValue(true));
64 mixed_list->Set(1, Value::CreateIntegerValue(42));
65 mixed_list->Set(2, Value::CreateRealValue(88.8));
66 mixed_list->Set(3, Value::CreateStringValue("foo"));
67 ASSERT_EQ(4u, mixed_list->GetSize());
maruel@chromium.org8fe7adc2009-03-04 00:01:12 +090068
aa@chromium.orgc93b02f2009-01-21 06:05:32 +090069 Value *value = NULL;
70 bool bool_value = false;
71 int int_value = 0;
72 double double_value = 0.0;
73 std::string string_value;
74
75 ASSERT_FALSE(mixed_list->Get(4, &value));
76
77 ASSERT_FALSE(mixed_list->GetInteger(0, &int_value));
78 ASSERT_EQ(0, int_value);
79 ASSERT_FALSE(mixed_list->GetReal(1, &double_value));
80 ASSERT_EQ(0.0, double_value);
81 ASSERT_FALSE(mixed_list->GetString(2, &string_value));
82 ASSERT_EQ("", string_value);
83 ASSERT_FALSE(mixed_list->GetBoolean(3, &bool_value));
84 ASSERT_EQ(false, bool_value);
85
86 ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value));
87 ASSERT_EQ(true, bool_value);
88 ASSERT_TRUE(mixed_list->GetInteger(1, &int_value));
89 ASSERT_EQ(42, int_value);
90 ASSERT_TRUE(mixed_list->GetReal(2, &double_value));
91 ASSERT_EQ(88.8, double_value);
92 ASSERT_TRUE(mixed_list->GetString(3, &string_value));
93 ASSERT_EQ("foo", string_value);
94}
95
initial.commit3f4a7322008-07-27 06:49:38 +090096TEST(ValuesTest, BinaryValue) {
97 char* buffer = NULL;
98 // Passing a null buffer pointer doesn't yield a BinaryValue
patrick@chromium.orgc6585462009-03-25 08:37:14 +090099 scoped_ptr<BinaryValue> binary(BinaryValue::Create(buffer, 0));
100 ASSERT_FALSE(binary.get());
initial.commit3f4a7322008-07-27 06:49:38 +0900101
102 // If you want to represent an empty binary value, use a zero-length buffer.
evanm@google.com32f2c512008-08-13 11:39:51 +0900103 buffer = new char[1];
initial.commit3f4a7322008-07-27 06:49:38 +0900104 ASSERT_TRUE(buffer);
patrick@chromium.orgc6585462009-03-25 08:37:14 +0900105 binary.reset(BinaryValue::Create(buffer, 0));
106 ASSERT_TRUE(binary.get());
initial.commit3f4a7322008-07-27 06:49:38 +0900107 ASSERT_TRUE(binary->GetBuffer());
108 ASSERT_EQ(buffer, binary->GetBuffer());
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900109 ASSERT_EQ(0U, binary->GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900110
111 // Test the common case of a non-empty buffer
112 buffer = new char[15];
patrick@chromium.orgc6585462009-03-25 08:37:14 +0900113 binary.reset(BinaryValue::Create(buffer, 15));
114 ASSERT_TRUE(binary.get());
initial.commit3f4a7322008-07-27 06:49:38 +0900115 ASSERT_TRUE(binary->GetBuffer());
116 ASSERT_EQ(buffer, binary->GetBuffer());
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900117 ASSERT_EQ(15U, binary->GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900118
119 char stack_buffer[42];
120 memset(stack_buffer, '!', 42);
patrick@chromium.orgc6585462009-03-25 08:37:14 +0900121 binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42));
122 ASSERT_TRUE(binary.get());
initial.commit3f4a7322008-07-27 06:49:38 +0900123 ASSERT_TRUE(binary->GetBuffer());
124 ASSERT_NE(stack_buffer, binary->GetBuffer());
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900125 ASSERT_EQ(42U, binary->GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900126 ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize()));
initial.commit3f4a7322008-07-27 06:49:38 +0900127}
128
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900129TEST(ValuesTest, StringValue) {
130 // Test overloaded CreateStringValue.
patrick@chromium.orgc6585462009-03-25 08:37:14 +0900131 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow"));
132 ASSERT_TRUE(narrow_value.get());
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900133 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING));
patrick@chromium.orgc6585462009-03-25 08:37:14 +0900134 scoped_ptr<Value> wide_value(Value::CreateStringValue(L"wide"));
135 ASSERT_TRUE(wide_value.get());
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900136 ASSERT_TRUE(wide_value->IsType(Value::TYPE_STRING));
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900137 scoped_ptr<Value> utf16_value(
138 Value::CreateStringValueFromUTF16(ASCIIToUTF16("utf16")));
139 ASSERT_TRUE(utf16_value.get());
140 ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900141
142 // Test overloaded GetString.
143 std::string narrow = "http://google.com";
144 std::wstring wide = L"http://google.com";
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900145 string16 utf16 = ASCIIToUTF16("http://google.com");
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900146 ASSERT_TRUE(narrow_value->GetAsString(&narrow));
147 ASSERT_TRUE(narrow_value->GetAsString(&wide));
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900148 ASSERT_TRUE(narrow_value->GetAsUTF16(&utf16));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900149 ASSERT_EQ(std::string("narrow"), narrow);
150 ASSERT_EQ(std::wstring(L"narrow"), wide);
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900151 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16);
152
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900153 ASSERT_TRUE(wide_value->GetAsString(&narrow));
154 ASSERT_TRUE(wide_value->GetAsString(&wide));
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900155 ASSERT_TRUE(wide_value->GetAsUTF16(&utf16));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900156 ASSERT_EQ(std::string("wide"), narrow);
157 ASSERT_EQ(std::wstring(L"wide"), wide);
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900158 ASSERT_EQ(ASCIIToUTF16("wide"), utf16);
159
160 ASSERT_TRUE(utf16_value->GetAsString(&narrow));
161 ASSERT_TRUE(utf16_value->GetAsString(&wide));
162 ASSERT_TRUE(utf16_value->GetAsUTF16(&utf16));
163 ASSERT_EQ(std::string("utf16"), narrow);
164 ASSERT_EQ(std::wstring(L"utf16"), wide);
165 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16);
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900166}
167
initial.commit3f4a7322008-07-27 06:49:38 +0900168// This is a Value object that allows us to tell if it's been
169// properly deleted by modifying the value of external flag on destruction.
170class DeletionTestValue : public Value {
finnur@chromium.org07b7b082009-07-03 11:28:55 +0900171 public:
initial.commit3f4a7322008-07-27 06:49:38 +0900172 DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) {
173 Init(deletion_flag); // Separate function so that we can use ASSERT_*
174 }
175
176 void Init(bool* deletion_flag) {
177 ASSERT_TRUE(deletion_flag);
178 deletion_flag_ = deletion_flag;
179 *deletion_flag_ = false;
180 }
181
182 ~DeletionTestValue() {
183 *deletion_flag_ = true;
184 }
185
finnur@chromium.org07b7b082009-07-03 11:28:55 +0900186 private:
initial.commit3f4a7322008-07-27 06:49:38 +0900187 bool* deletion_flag_;
188};
189
190TEST(ValuesTest, ListDeletion) {
191 bool deletion_flag = true;
192
193 {
194 ListValue list;
195 list.Append(new DeletionTestValue(&deletion_flag));
196 EXPECT_FALSE(deletion_flag);
197 }
198 EXPECT_TRUE(deletion_flag);
199
200 {
201 ListValue list;
202 list.Append(new DeletionTestValue(&deletion_flag));
203 EXPECT_FALSE(deletion_flag);
204 list.Clear();
205 EXPECT_TRUE(deletion_flag);
206 }
207
208 {
209 ListValue list;
210 list.Append(new DeletionTestValue(&deletion_flag));
211 EXPECT_FALSE(deletion_flag);
212 EXPECT_TRUE(list.Set(0, Value::CreateNullValue()));
213 EXPECT_TRUE(deletion_flag);
214 }
215}
216
217TEST(ValuesTest, ListRemoval) {
218 bool deletion_flag = true;
219 Value* removed_item = NULL;
220
221 {
222 ListValue list;
223 list.Append(new DeletionTestValue(&deletion_flag));
224 EXPECT_FALSE(deletion_flag);
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900225 EXPECT_EQ(1U, list.GetSize());
deanm@google.com19650de2008-08-13 23:57:51 +0900226 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
227 &removed_item));
initial.commit3f4a7322008-07-27 06:49:38 +0900228 EXPECT_FALSE(list.Remove(1, &removed_item));
229 EXPECT_TRUE(list.Remove(0, &removed_item));
230 ASSERT_TRUE(removed_item);
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900231 EXPECT_EQ(0U, list.GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900232 }
233 EXPECT_FALSE(deletion_flag);
234 delete removed_item;
235 removed_item = NULL;
236 EXPECT_TRUE(deletion_flag);
237
238 {
239 ListValue list;
240 list.Append(new DeletionTestValue(&deletion_flag));
241 EXPECT_FALSE(deletion_flag);
242 EXPECT_TRUE(list.Remove(0, NULL));
243 EXPECT_TRUE(deletion_flag);
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900244 EXPECT_EQ(0U, list.GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900245 }
pkasting@chromium.orgdfe6a692009-12-01 04:59:11 +0900246
247 {
248 ListValue list;
249 DeletionTestValue* value = new DeletionTestValue(&deletion_flag);
250 list.Append(value);
251 EXPECT_FALSE(deletion_flag);
252 EXPECT_EQ(0, list.Remove(*value));
253 EXPECT_TRUE(deletion_flag);
254 EXPECT_EQ(0U, list.GetSize());
255 }
initial.commit3f4a7322008-07-27 06:49:38 +0900256}
257
258TEST(ValuesTest, DictionaryDeletion) {
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900259 std::wstring key = L"test";
initial.commit3f4a7322008-07-27 06:49:38 +0900260 bool deletion_flag = true;
261
262 {
263 DictionaryValue dict;
264 dict.Set(key, new DeletionTestValue(&deletion_flag));
265 EXPECT_FALSE(deletion_flag);
266 }
267 EXPECT_TRUE(deletion_flag);
268
269 {
270 DictionaryValue dict;
271 dict.Set(key, new DeletionTestValue(&deletion_flag));
272 EXPECT_FALSE(deletion_flag);
273 dict.Clear();
274 EXPECT_TRUE(deletion_flag);
275 }
276
277 {
278 DictionaryValue dict;
279 dict.Set(key, new DeletionTestValue(&deletion_flag));
280 EXPECT_FALSE(deletion_flag);
281 dict.Set(key, Value::CreateNullValue());
282 EXPECT_TRUE(deletion_flag);
283 }
284}
285
286TEST(ValuesTest, DictionaryRemoval) {
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900287 std::wstring key = L"test";
initial.commit3f4a7322008-07-27 06:49:38 +0900288 bool deletion_flag = true;
289 Value* removed_item = NULL;
290
291 {
292 DictionaryValue dict;
293 dict.Set(key, new DeletionTestValue(&deletion_flag));
294 EXPECT_FALSE(deletion_flag);
295 EXPECT_TRUE(dict.HasKey(key));
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900296 EXPECT_FALSE(dict.Remove(L"absent key", &removed_item));
initial.commit3f4a7322008-07-27 06:49:38 +0900297 EXPECT_TRUE(dict.Remove(key, &removed_item));
298 EXPECT_FALSE(dict.HasKey(key));
299 ASSERT_TRUE(removed_item);
300 }
301 EXPECT_FALSE(deletion_flag);
302 delete removed_item;
303 removed_item = NULL;
304 EXPECT_TRUE(deletion_flag);
305
306 {
307 DictionaryValue dict;
308 dict.Set(key, new DeletionTestValue(&deletion_flag));
309 EXPECT_FALSE(deletion_flag);
310 EXPECT_TRUE(dict.HasKey(key));
311 EXPECT_TRUE(dict.Remove(key, NULL));
312 EXPECT_TRUE(deletion_flag);
313 EXPECT_FALSE(dict.HasKey(key));
314 }
315}
316
pkasting@chromium.org36515db2009-11-26 05:47:52 +0900317TEST(ValuesTest, DictionaryWithoutPathExpansion) {
318 DictionaryValue dict;
319 dict.Set(L"this.is.expanded", Value::CreateNullValue());
320 dict.SetWithoutPathExpansion(L"this.isnt.expanded", Value::CreateNullValue());
321
322 EXPECT_FALSE(dict.HasKey(L"this.is.expanded"));
323 EXPECT_TRUE(dict.HasKey(L"this"));
324 Value* value1;
325 EXPECT_TRUE(dict.Get(L"this", &value1));
326 DictionaryValue* value2;
327 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion(L"this", &value2));
328 EXPECT_EQ(value1, value2);
329 EXPECT_EQ(1U, value2->size());
330
331 EXPECT_TRUE(dict.HasKey(L"this.isnt.expanded"));
332 Value* value3;
333 EXPECT_FALSE(dict.Get(L"this.isnt.expanded", &value3));
334 Value* value4;
335 ASSERT_TRUE(dict.GetWithoutPathExpansion(L"this.isnt.expanded", &value4));
336 EXPECT_EQ(Value::TYPE_NULL, value4->GetType());
337}
338
initial.commit3f4a7322008-07-27 06:49:38 +0900339TEST(ValuesTest, DeepCopy) {
340 DictionaryValue original_dict;
341 Value* original_null = Value::CreateNullValue();
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900342 original_dict.Set(L"null", original_null);
initial.commit3f4a7322008-07-27 06:49:38 +0900343 Value* original_bool = Value::CreateBooleanValue(true);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900344 original_dict.Set(L"bool", original_bool);
initial.commit3f4a7322008-07-27 06:49:38 +0900345 Value* original_int = Value::CreateIntegerValue(42);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900346 original_dict.Set(L"int", original_int);
initial.commit3f4a7322008-07-27 06:49:38 +0900347 Value* original_real = Value::CreateRealValue(3.14);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900348 original_dict.Set(L"real", original_real);
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900349 Value* original_string = Value::CreateStringValue("hello");
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900350 original_dict.Set(L"string", original_string);
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900351 Value* original_wstring = Value::CreateStringValue(L"peek-a-boo");
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900352 original_dict.Set(L"wstring", original_wstring);
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900353 Value* original_utf16 =
354 Value::CreateStringValueFromUTF16(ASCIIToUTF16("hello16"));
355 original_dict.Set(L"utf16", original_utf16);
initial.commit3f4a7322008-07-27 06:49:38 +0900356
357 char* original_buffer = new char[42];
358 memset(original_buffer, '!', 42);
359 BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900360 original_dict.Set(L"binary", original_binary);
initial.commit3f4a7322008-07-27 06:49:38 +0900361
362 ListValue* original_list = new ListValue();
363 Value* original_list_element_0 = Value::CreateIntegerValue(0);
364 original_list->Append(original_list_element_0);
365 Value* original_list_element_1 = Value::CreateIntegerValue(1);
366 original_list->Append(original_list_element_1);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900367 original_dict.Set(L"list", original_list);
initial.commit3f4a7322008-07-27 06:49:38 +0900368
finnur@chromium.org07b7b082009-07-03 11:28:55 +0900369 scoped_ptr<DictionaryValue> copy_dict(
370 static_cast<DictionaryValue*>(original_dict.DeepCopy()));
371 ASSERT_TRUE(copy_dict.get());
372 ASSERT_NE(copy_dict.get(), &original_dict);
initial.commit3f4a7322008-07-27 06:49:38 +0900373
374 Value* copy_null = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900375 ASSERT_TRUE(copy_dict->Get(L"null", &copy_null));
initial.commit3f4a7322008-07-27 06:49:38 +0900376 ASSERT_TRUE(copy_null);
377 ASSERT_NE(copy_null, original_null);
378 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL));
379
380 Value* copy_bool = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900381 ASSERT_TRUE(copy_dict->Get(L"bool", &copy_bool));
initial.commit3f4a7322008-07-27 06:49:38 +0900382 ASSERT_TRUE(copy_bool);
383 ASSERT_NE(copy_bool, original_bool);
384 ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN));
385 bool copy_bool_value = false;
386 ASSERT_TRUE(copy_bool->GetAsBoolean(&copy_bool_value));
387 ASSERT_TRUE(copy_bool_value);
388
389 Value* copy_int = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900390 ASSERT_TRUE(copy_dict->Get(L"int", &copy_int));
initial.commit3f4a7322008-07-27 06:49:38 +0900391 ASSERT_TRUE(copy_int);
392 ASSERT_NE(copy_int, original_int);
393 ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER));
394 int copy_int_value = 0;
395 ASSERT_TRUE(copy_int->GetAsInteger(&copy_int_value));
396 ASSERT_EQ(42, copy_int_value);
397
398 Value* copy_real = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900399 ASSERT_TRUE(copy_dict->Get(L"real", &copy_real));
initial.commit3f4a7322008-07-27 06:49:38 +0900400 ASSERT_TRUE(copy_real);
401 ASSERT_NE(copy_real, original_real);
402 ASSERT_TRUE(copy_real->IsType(Value::TYPE_REAL));
403 double copy_real_value = 0;
404 ASSERT_TRUE(copy_real->GetAsReal(&copy_real_value));
405 ASSERT_EQ(3.14, copy_real_value);
406
407 Value* copy_string = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900408 ASSERT_TRUE(copy_dict->Get(L"string", &copy_string));
initial.commit3f4a7322008-07-27 06:49:38 +0900409 ASSERT_TRUE(copy_string);
410 ASSERT_NE(copy_string, original_string);
411 ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900412 std::string copy_string_value;
413 std::wstring copy_wstring_value;
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900414 string16 copy_utf16_value;
initial.commit3f4a7322008-07-27 06:49:38 +0900415 ASSERT_TRUE(copy_string->GetAsString(&copy_string_value));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900416 ASSERT_TRUE(copy_string->GetAsString(&copy_wstring_value));
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900417 ASSERT_TRUE(copy_string->GetAsUTF16(&copy_utf16_value));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900418 ASSERT_EQ(std::string("hello"), copy_string_value);
419 ASSERT_EQ(std::wstring(L"hello"), copy_wstring_value);
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900420 ASSERT_EQ(ASCIIToUTF16("hello"), copy_utf16_value);
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900421
422 Value* copy_wstring = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900423 ASSERT_TRUE(copy_dict->Get(L"wstring", &copy_wstring));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900424 ASSERT_TRUE(copy_wstring);
425 ASSERT_NE(copy_wstring, original_wstring);
maruel@chromium.org8fe7adc2009-03-04 00:01:12 +0900426 ASSERT_TRUE(copy_wstring->IsType(Value::TYPE_STRING));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900427 ASSERT_TRUE(copy_wstring->GetAsString(&copy_string_value));
428 ASSERT_TRUE(copy_wstring->GetAsString(&copy_wstring_value));
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900429 ASSERT_TRUE(copy_wstring->GetAsUTF16(&copy_utf16_value));
scherkus@chromium.org2b923e72008-12-11 10:23:17 +0900430 ASSERT_EQ(std::string("peek-a-boo"), copy_string_value);
431 ASSERT_EQ(std::wstring(L"peek-a-boo"), copy_wstring_value);
munjal@chromium.org3b2d3a42010-01-16 05:09:03 +0900432 ASSERT_EQ(ASCIIToUTF16("peek-a-boo"), copy_utf16_value);
433
434 Value* copy_utf16 = NULL;
435 ASSERT_TRUE(copy_dict->Get(L"utf16", &copy_utf16));
436 ASSERT_TRUE(copy_utf16);
437 ASSERT_NE(copy_utf16, original_utf16);
438 ASSERT_TRUE(copy_utf16->IsType(Value::TYPE_STRING));
439 ASSERT_TRUE(copy_utf16->GetAsString(&copy_string_value));
440 ASSERT_TRUE(copy_utf16->GetAsString(&copy_wstring_value));
441 ASSERT_TRUE(copy_utf16->GetAsUTF16(&copy_utf16_value));
442 ASSERT_EQ(std::string("hello16"), copy_string_value);
443 ASSERT_EQ(std::wstring(L"hello16"), copy_wstring_value);
444 ASSERT_EQ(ASCIIToUTF16("hello16"), copy_utf16_value);
initial.commit3f4a7322008-07-27 06:49:38 +0900445
446 Value* copy_binary = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900447 ASSERT_TRUE(copy_dict->Get(L"binary", &copy_binary));
initial.commit3f4a7322008-07-27 06:49:38 +0900448 ASSERT_TRUE(copy_binary);
449 ASSERT_NE(copy_binary, original_binary);
450 ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY));
451 ASSERT_NE(original_binary->GetBuffer(),
452 static_cast<BinaryValue*>(copy_binary)->GetBuffer());
453 ASSERT_EQ(original_binary->GetSize(),
454 static_cast<BinaryValue*>(copy_binary)->GetSize());
455 ASSERT_EQ(0, memcmp(original_binary->GetBuffer(),
456 static_cast<BinaryValue*>(copy_binary)->GetBuffer(),
457 original_binary->GetSize()));
458
459 Value* copy_value = NULL;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900460 ASSERT_TRUE(copy_dict->Get(L"list", &copy_value));
initial.commit3f4a7322008-07-27 06:49:38 +0900461 ASSERT_TRUE(copy_value);
462 ASSERT_NE(copy_value, original_list);
463 ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST));
464 ListValue* copy_list = static_cast<ListValue*>(copy_value);
mmentovai@google.com691ecef2008-08-22 01:24:51 +0900465 ASSERT_EQ(2U, copy_list->GetSize());
initial.commit3f4a7322008-07-27 06:49:38 +0900466
467 Value* copy_list_element_0;
468 ASSERT_TRUE(copy_list->Get(0, &copy_list_element_0));
469 ASSERT_TRUE(copy_list_element_0);
470 ASSERT_NE(copy_list_element_0, original_list_element_0);
471 int copy_list_element_0_value;
472 ASSERT_TRUE(copy_list_element_0->GetAsInteger(&copy_list_element_0_value));
473 ASSERT_EQ(0, copy_list_element_0_value);
474
475 Value* copy_list_element_1;
476 ASSERT_TRUE(copy_list->Get(1, &copy_list_element_1));
477 ASSERT_TRUE(copy_list_element_1);
478 ASSERT_NE(copy_list_element_1, original_list_element_1);
479 int copy_list_element_1_value;
480 ASSERT_TRUE(copy_list_element_1->GetAsInteger(&copy_list_element_1_value));
481 ASSERT_EQ(1, copy_list_element_1_value);
initial.commit3f4a7322008-07-27 06:49:38 +0900482}
483
484TEST(ValuesTest, Equals) {
485 Value* null1 = Value::CreateNullValue();
486 Value* null2 = Value::CreateNullValue();
487 EXPECT_NE(null1, null2);
488 EXPECT_TRUE(null1->Equals(null2));
489
490 Value* boolean = Value::CreateBooleanValue(false);
491 EXPECT_FALSE(null1->Equals(boolean));
492 delete null1;
493 delete null2;
494 delete boolean;
495
496 DictionaryValue dv;
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900497 dv.SetBoolean(L"a", false);
498 dv.SetInteger(L"b", 2);
499 dv.SetReal(L"c", 2.5);
500 dv.SetString(L"d1", "string");
501 dv.SetString(L"d2", L"string");
502 dv.Set(L"e", Value::CreateNullValue());
initial.commit3f4a7322008-07-27 06:49:38 +0900503
504 DictionaryValue* copy = static_cast<DictionaryValue*>(dv.DeepCopy());
505 EXPECT_TRUE(dv.Equals(copy));
506
507 ListValue* list = new ListValue;
508 list->Append(Value::CreateNullValue());
509 list->Append(new DictionaryValue);
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900510 dv.Set(L"f", list);
initial.commit3f4a7322008-07-27 06:49:38 +0900511
512 EXPECT_FALSE(dv.Equals(copy));
nsylvain@chromium.org12426672009-03-04 07:59:43 +0900513 copy->Set(L"f", list->DeepCopy());
initial.commit3f4a7322008-07-27 06:49:38 +0900514 EXPECT_TRUE(dv.Equals(copy));
515
516 list->Append(Value::CreateBooleanValue(true));
517 EXPECT_FALSE(dv.Equals(copy));
518 delete copy;
519}
tony@chromium.orge4948ab2009-12-02 09:20:32 +0900520
521TEST(ValuesTest, RemoveEmptyChildren) {
522 scoped_ptr<DictionaryValue> root(new DictionaryValue);
523 // Remove empty lists and dictionaries.
524 root->Set(L"empty_dict", new DictionaryValue);
525 root->Set(L"empty_list", new ListValue);
526 root->SetWithoutPathExpansion(L"a.b.c.d.e", new DictionaryValue);
527 root.reset(root->DeepCopyWithoutEmptyChildren());
528 EXPECT_TRUE(root->empty());
529
530 // Make sure we don't prune too much.
531 root->SetBoolean(L"bool", true);
532 root->Set(L"empty_dict", new DictionaryValue);
533 root->SetString(L"empty_string", "");
534 root.reset(root->DeepCopyWithoutEmptyChildren());
535 EXPECT_EQ(2U, root->size());
536
537 // Should do nothing.
538 root.reset(root->DeepCopyWithoutEmptyChildren());
539 EXPECT_EQ(2U, root->size());
540
541 // Nested test cases. These should all reduce back to the bool and string
542 // set above.
543 {
544 root->Set(L"a.b.c.d.e", new DictionaryValue);
545 root.reset(root->DeepCopyWithoutEmptyChildren());
546 EXPECT_EQ(2U, root->size());
547 }
548 {
549 DictionaryValue* inner = new DictionaryValue;
550 root->Set(L"dict_with_emtpy_children", inner);
551 inner->Set(L"empty_dict", new DictionaryValue);
552 inner->Set(L"empty_list", new ListValue);
553 root.reset(root->DeepCopyWithoutEmptyChildren());
554 EXPECT_EQ(2U, root->size());
555 }
556 {
557 ListValue* inner = new ListValue;
558 root->Set(L"list_with_empty_children", inner);
559 inner->Append(new DictionaryValue);
560 inner->Append(new ListValue);
561 root.reset(root->DeepCopyWithoutEmptyChildren());
562 EXPECT_EQ(2U, root->size());
563 }
564
565 // Nested with siblings.
566 {
567 ListValue* inner = new ListValue;
568 root->Set(L"list_with_empty_children", inner);
569 inner->Append(new DictionaryValue);
570 inner->Append(new ListValue);
571 DictionaryValue* inner2 = new DictionaryValue;
572 root->Set(L"dict_with_empty_children", inner2);
573 inner2->Set(L"empty_dict", new DictionaryValue);
574 inner2->Set(L"empty_list", new ListValue);
575 root.reset(root->DeepCopyWithoutEmptyChildren());
576 EXPECT_EQ(2U, root->size());
577 }
578
579 // Make sure nested values don't get pruned.
580 {
581 ListValue* inner = new ListValue;
582 root->Set(L"list_with_empty_children", inner);
583 ListValue* inner2 = new ListValue;
584 inner->Append(new DictionaryValue);
585 inner->Append(inner2);
586 inner2->Append(Value::CreateStringValue("hello"));
587 root.reset(root->DeepCopyWithoutEmptyChildren());
588 EXPECT_EQ(3U, root->size());
589 EXPECT_TRUE(root->GetList(L"list_with_empty_children", &inner));
590 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned.
591 EXPECT_TRUE(inner->GetList(0, &inner2));
592 EXPECT_EQ(1U, inner2->GetSize());
593 }
594}