OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "base/string16.h" | 9 #include "base/string16.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 ASSERT_EQ(expected_paths_count, differing_paths.size()); | 27 ASSERT_EQ(expected_paths_count, differing_paths.size()); |
28 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), | 28 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), |
29 expected_paths_vector.begin())); | 29 expected_paths_vector.begin())); |
30 dict2->GetDifferingPaths(dict1, &differing_paths); | 30 dict2->GetDifferingPaths(dict1, &differing_paths); |
31 ASSERT_EQ(expected_paths_count, differing_paths.size()); | 31 ASSERT_EQ(expected_paths_count, differing_paths.size()); |
32 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), | 32 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), |
33 expected_paths_vector.begin())); | 33 expected_paths_vector.begin())); |
34 } | 34 } |
35 }; | 35 }; |
36 | 36 |
37 // TODO(viettrungluu): I changed the keys for DictionaryValue from std::wstring | |
38 // to std::string. I've temporarily kept the old methods taking std::wstring for | |
39 // compatibility. The ...Deprecated tests are the old tests which use these | |
40 // methods, and remain to test compatibility. They will be removed once the old | |
41 // methods are removed. | |
42 | |
43 TEST_F(ValuesTest, Basic) { | 37 TEST_F(ValuesTest, Basic) { |
44 // Test basic dictionary getting/setting | 38 // Test basic dictionary getting/setting |
45 DictionaryValue settings; | 39 DictionaryValue settings; |
46 std::string homepage = "http://google.com"; | 40 std::string homepage = "http://google.com"; |
47 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); | 41 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); |
48 ASSERT_EQ(std::string("http://google.com"), homepage); | 42 ASSERT_EQ(std::string("http://google.com"), homepage); |
49 | 43 |
50 ASSERT_FALSE(settings.Get("global", NULL)); | 44 ASSERT_FALSE(settings.Get("global", NULL)); |
51 settings.Set("global", Value::CreateBooleanValue(true)); | 45 settings.Set("global", Value::CreateBooleanValue(true)); |
52 ASSERT_TRUE(settings.Get("global", NULL)); | 46 ASSERT_TRUE(settings.Get("global", NULL)); |
(...skipping 23 matching lines...) Expand all Loading... |
76 ASSERT_EQ(1U, bookmark_list->GetSize()); | 70 ASSERT_EQ(1U, bookmark_list->GetSize()); |
77 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); | 71 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); |
78 std::string bookmark_name = "Unnamed"; | 72 std::string bookmark_name = "Unnamed"; |
79 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); | 73 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); |
80 ASSERT_EQ(std::string("Froogle"), bookmark_name); | 74 ASSERT_EQ(std::string("Froogle"), bookmark_name); |
81 std::string bookmark_url; | 75 std::string bookmark_url; |
82 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); | 76 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); |
83 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); | 77 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); |
84 } | 78 } |
85 | 79 |
86 // TODO(viettrungluu): deprecate: | |
87 TEST_F(ValuesTest, BasicDeprecated) { | |
88 // Test basic dictionary getting/setting | |
89 DictionaryValue settings; | |
90 std::wstring homepage = L"http://google.com"; | |
91 ASSERT_FALSE( | |
92 settings.GetString(L"global.homepage", &homepage)); | |
93 ASSERT_EQ(std::wstring(L"http://google.com"), homepage); | |
94 | |
95 ASSERT_FALSE(settings.Get(L"global", NULL)); | |
96 settings.Set(L"global", Value::CreateBooleanValue(true)); | |
97 ASSERT_TRUE(settings.Get(L"global", NULL)); | |
98 settings.SetString(L"global.homepage", L"http://scurvy.com"); | |
99 ASSERT_TRUE(settings.Get(L"global", NULL)); | |
100 homepage = L"http://google.com"; | |
101 ASSERT_TRUE(settings.GetString(L"global.homepage", &homepage)); | |
102 ASSERT_EQ(std::wstring(L"http://scurvy.com"), homepage); | |
103 | |
104 // Test storing a dictionary in a list. | |
105 ListValue* toolbar_bookmarks; | |
106 ASSERT_FALSE( | |
107 settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks)); | |
108 | |
109 toolbar_bookmarks = new ListValue; | |
110 settings.Set(L"global.toolbar.bookmarks", toolbar_bookmarks); | |
111 ASSERT_TRUE( | |
112 settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks)); | |
113 | |
114 DictionaryValue* new_bookmark = new DictionaryValue; | |
115 new_bookmark->SetString(L"name", L"Froogle"); | |
116 new_bookmark->SetString(L"url", L"http://froogle.com"); | |
117 toolbar_bookmarks->Append(new_bookmark); | |
118 | |
119 ListValue* bookmark_list; | |
120 ASSERT_TRUE(settings.GetList(L"global.toolbar.bookmarks", &bookmark_list)); | |
121 DictionaryValue* bookmark; | |
122 ASSERT_EQ(1U, bookmark_list->GetSize()); | |
123 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); | |
124 std::wstring bookmark_name = L"Unnamed"; | |
125 ASSERT_TRUE(bookmark->GetString(L"name", &bookmark_name)); | |
126 ASSERT_EQ(std::wstring(L"Froogle"), bookmark_name); | |
127 std::wstring bookmark_url; | |
128 ASSERT_TRUE(bookmark->GetString(L"url", &bookmark_url)); | |
129 ASSERT_EQ(std::wstring(L"http://froogle.com"), bookmark_url); | |
130 } | |
131 | |
132 TEST_F(ValuesTest, List) { | 80 TEST_F(ValuesTest, List) { |
133 scoped_ptr<ListValue> mixed_list(new ListValue()); | 81 scoped_ptr<ListValue> mixed_list(new ListValue()); |
134 mixed_list->Set(0, Value::CreateBooleanValue(true)); | 82 mixed_list->Set(0, Value::CreateBooleanValue(true)); |
135 mixed_list->Set(1, Value::CreateIntegerValue(42)); | 83 mixed_list->Set(1, Value::CreateIntegerValue(42)); |
136 mixed_list->Set(2, Value::CreateRealValue(88.8)); | 84 mixed_list->Set(2, Value::CreateRealValue(88.8)); |
137 mixed_list->Set(3, Value::CreateStringValue("foo")); | 85 mixed_list->Set(3, Value::CreateStringValue("foo")); |
138 ASSERT_EQ(4u, mixed_list->GetSize()); | 86 ASSERT_EQ(4u, mixed_list->GetSize()); |
139 | 87 |
140 Value *value = NULL; | 88 Value *value = NULL; |
141 bool bool_value = false; | 89 bool bool_value = false; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 ASSERT_TRUE(narrow_value->GetAsString(&utf16)); | 162 ASSERT_TRUE(narrow_value->GetAsString(&utf16)); |
215 ASSERT_EQ(std::string("narrow"), narrow); | 163 ASSERT_EQ(std::string("narrow"), narrow); |
216 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16); | 164 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16); |
217 | 165 |
218 ASSERT_TRUE(utf16_value->GetAsString(&narrow)); | 166 ASSERT_TRUE(utf16_value->GetAsString(&narrow)); |
219 ASSERT_TRUE(utf16_value->GetAsString(&utf16)); | 167 ASSERT_TRUE(utf16_value->GetAsString(&utf16)); |
220 ASSERT_EQ(std::string("utf16"), narrow); | 168 ASSERT_EQ(std::string("utf16"), narrow); |
221 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); | 169 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); |
222 } | 170 } |
223 | 171 |
224 // TODO(viettrungluu): deprecate: | |
225 TEST_F(ValuesTest, StringValueDeprecated) { | |
226 // Test overloaded CreateStringValue. | |
227 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow")); | |
228 ASSERT_TRUE(narrow_value.get()); | |
229 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING)); | |
230 scoped_ptr<Value> utf16_value( | |
231 Value::CreateStringValue(ASCIIToUTF16("utf16"))); | |
232 ASSERT_TRUE(utf16_value.get()); | |
233 ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING)); | |
234 | |
235 // Test overloaded GetString. | |
236 std::string narrow = "http://google.com"; | |
237 std::wstring wide = L"http://google.com"; | |
238 string16 utf16 = ASCIIToUTF16("http://google.com"); | |
239 ASSERT_TRUE(narrow_value->GetAsString(&narrow)); | |
240 ASSERT_TRUE(narrow_value->GetAsString(&wide)); | |
241 ASSERT_TRUE(narrow_value->GetAsString(&utf16)); | |
242 ASSERT_EQ(std::string("narrow"), narrow); | |
243 ASSERT_EQ(std::wstring(L"narrow"), wide); | |
244 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16); | |
245 | |
246 ASSERT_TRUE(utf16_value->GetAsString(&narrow)); | |
247 ASSERT_TRUE(utf16_value->GetAsString(&wide)); | |
248 ASSERT_TRUE(utf16_value->GetAsString(&utf16)); | |
249 ASSERT_EQ(std::string("utf16"), narrow); | |
250 ASSERT_EQ(std::wstring(L"utf16"), wide); | |
251 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); | |
252 } | |
253 | |
254 // This is a Value object that allows us to tell if it's been | 172 // This is a Value object that allows us to tell if it's been |
255 // properly deleted by modifying the value of external flag on destruction. | 173 // properly deleted by modifying the value of external flag on destruction. |
256 class DeletionTestValue : public Value { | 174 class DeletionTestValue : public Value { |
257 public: | 175 public: |
258 explicit DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) { | 176 explicit DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) { |
259 Init(deletion_flag); // Separate function so that we can use ASSERT_* | 177 Init(deletion_flag); // Separate function so that we can use ASSERT_* |
260 } | 178 } |
261 | 179 |
262 void Init(bool* deletion_flag) { | 180 void Init(bool* deletion_flag) { |
263 ASSERT_TRUE(deletion_flag); | 181 ASSERT_TRUE(deletion_flag); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 | 280 |
363 { | 281 { |
364 DictionaryValue dict; | 282 DictionaryValue dict; |
365 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 283 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
366 EXPECT_FALSE(deletion_flag); | 284 EXPECT_FALSE(deletion_flag); |
367 dict.Set(key, Value::CreateNullValue()); | 285 dict.Set(key, Value::CreateNullValue()); |
368 EXPECT_TRUE(deletion_flag); | 286 EXPECT_TRUE(deletion_flag); |
369 } | 287 } |
370 } | 288 } |
371 | 289 |
372 // TODO(viettrungluu): deprecate: | |
373 TEST_F(ValuesTest, DictionaryDeletionDeprecated) { | |
374 std::wstring key = L"test"; | |
375 bool deletion_flag = true; | |
376 | |
377 { | |
378 DictionaryValue dict; | |
379 dict.Set(key, new DeletionTestValue(&deletion_flag)); | |
380 EXPECT_FALSE(deletion_flag); | |
381 } | |
382 EXPECT_TRUE(deletion_flag); | |
383 | |
384 { | |
385 DictionaryValue dict; | |
386 dict.Set(key, new DeletionTestValue(&deletion_flag)); | |
387 EXPECT_FALSE(deletion_flag); | |
388 dict.Clear(); | |
389 EXPECT_TRUE(deletion_flag); | |
390 } | |
391 | |
392 { | |
393 DictionaryValue dict; | |
394 dict.Set(key, new DeletionTestValue(&deletion_flag)); | |
395 EXPECT_FALSE(deletion_flag); | |
396 dict.Set(key, Value::CreateNullValue()); | |
397 EXPECT_TRUE(deletion_flag); | |
398 } | |
399 } | |
400 | |
401 TEST_F(ValuesTest, DictionaryRemoval) { | 290 TEST_F(ValuesTest, DictionaryRemoval) { |
402 std::string key = "test"; | 291 std::string key = "test"; |
403 bool deletion_flag = true; | 292 bool deletion_flag = true; |
404 Value* removed_item = NULL; | 293 Value* removed_item = NULL; |
405 | 294 |
406 { | 295 { |
407 DictionaryValue dict; | 296 DictionaryValue dict; |
408 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 297 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
409 EXPECT_FALSE(deletion_flag); | 298 EXPECT_FALSE(deletion_flag); |
410 EXPECT_TRUE(dict.HasKey(key)); | 299 EXPECT_TRUE(dict.HasKey(key)); |
(...skipping 11 matching lines...) Expand all Loading... |
422 DictionaryValue dict; | 311 DictionaryValue dict; |
423 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 312 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
424 EXPECT_FALSE(deletion_flag); | 313 EXPECT_FALSE(deletion_flag); |
425 EXPECT_TRUE(dict.HasKey(key)); | 314 EXPECT_TRUE(dict.HasKey(key)); |
426 EXPECT_TRUE(dict.Remove(key, NULL)); | 315 EXPECT_TRUE(dict.Remove(key, NULL)); |
427 EXPECT_TRUE(deletion_flag); | 316 EXPECT_TRUE(deletion_flag); |
428 EXPECT_FALSE(dict.HasKey(key)); | 317 EXPECT_FALSE(dict.HasKey(key)); |
429 } | 318 } |
430 } | 319 } |
431 | 320 |
432 // TODO(viettrungluu): deprecate: | |
433 TEST_F(ValuesTest, DictionaryRemovalDeprecated) { | |
434 std::wstring key = L"test"; | |
435 bool deletion_flag = true; | |
436 Value* removed_item = NULL; | |
437 | |
438 { | |
439 DictionaryValue dict; | |
440 dict.Set(key, new DeletionTestValue(&deletion_flag)); | |
441 EXPECT_FALSE(deletion_flag); | |
442 EXPECT_TRUE(dict.HasKey(key)); | |
443 EXPECT_FALSE(dict.Remove(L"absent key", &removed_item)); | |
444 EXPECT_TRUE(dict.Remove(key, &removed_item)); | |
445 EXPECT_FALSE(dict.HasKey(key)); | |
446 ASSERT_TRUE(removed_item); | |
447 } | |
448 EXPECT_FALSE(deletion_flag); | |
449 delete removed_item; | |
450 removed_item = NULL; | |
451 EXPECT_TRUE(deletion_flag); | |
452 | |
453 { | |
454 DictionaryValue dict; | |
455 dict.Set(key, new DeletionTestValue(&deletion_flag)); | |
456 EXPECT_FALSE(deletion_flag); | |
457 EXPECT_TRUE(dict.HasKey(key)); | |
458 EXPECT_TRUE(dict.Remove(key, NULL)); | |
459 EXPECT_TRUE(deletion_flag); | |
460 EXPECT_FALSE(dict.HasKey(key)); | |
461 } | |
462 } | |
463 | |
464 TEST_F(ValuesTest, DictionaryWithoutPathExpansion) { | 321 TEST_F(ValuesTest, DictionaryWithoutPathExpansion) { |
465 DictionaryValue dict; | 322 DictionaryValue dict; |
466 dict.Set("this.is.expanded", Value::CreateNullValue()); | 323 dict.Set("this.is.expanded", Value::CreateNullValue()); |
467 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); | 324 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); |
468 | 325 |
469 EXPECT_FALSE(dict.HasKey("this.is.expanded")); | 326 EXPECT_FALSE(dict.HasKey("this.is.expanded")); |
470 EXPECT_TRUE(dict.HasKey("this")); | 327 EXPECT_TRUE(dict.HasKey("this")); |
471 Value* value1; | 328 Value* value1; |
472 EXPECT_TRUE(dict.Get("this", &value1)); | 329 EXPECT_TRUE(dict.Get("this", &value1)); |
473 DictionaryValue* value2; | 330 DictionaryValue* value2; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 | 458 |
602 Value* copy_list_element_1; | 459 Value* copy_list_element_1; |
603 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); | 460 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); |
604 ASSERT_TRUE(copy_list_element_1); | 461 ASSERT_TRUE(copy_list_element_1); |
605 ASSERT_NE(copy_list_element_1, original_list_element_1); | 462 ASSERT_NE(copy_list_element_1, original_list_element_1); |
606 int copy_list_element_1_value; | 463 int copy_list_element_1_value; |
607 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); | 464 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); |
608 ASSERT_EQ(1, copy_list_element_1_value); | 465 ASSERT_EQ(1, copy_list_element_1_value); |
609 } | 466 } |
610 | 467 |
611 // TODO(viettrungluu): deprecate: | |
612 TEST_F(ValuesTest, DeepCopyDeprecated) { | |
613 DictionaryValue original_dict; | |
614 Value* original_null = Value::CreateNullValue(); | |
615 original_dict.Set(L"null", original_null); | |
616 Value* original_bool = Value::CreateBooleanValue(true); | |
617 original_dict.Set(L"bool", original_bool); | |
618 Value* original_int = Value::CreateIntegerValue(42); | |
619 original_dict.Set(L"int", original_int); | |
620 Value* original_real = Value::CreateRealValue(3.14); | |
621 original_dict.Set(L"real", original_real); | |
622 Value* original_string = Value::CreateStringValue("hello"); | |
623 original_dict.Set(L"string", original_string); | |
624 Value* original_utf16 = Value::CreateStringValue(ASCIIToUTF16("hello16")); | |
625 original_dict.Set(L"utf16", original_utf16); | |
626 | |
627 char* original_buffer = new char[42]; | |
628 memset(original_buffer, '!', 42); | |
629 BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); | |
630 original_dict.Set(L"binary", original_binary); | |
631 | |
632 ListValue* original_list = new ListValue(); | |
633 Value* original_list_element_0 = Value::CreateIntegerValue(0); | |
634 original_list->Append(original_list_element_0); | |
635 Value* original_list_element_1 = Value::CreateIntegerValue(1); | |
636 original_list->Append(original_list_element_1); | |
637 original_dict.Set(L"list", original_list); | |
638 | |
639 scoped_ptr<DictionaryValue> copy_dict( | |
640 static_cast<DictionaryValue*>(original_dict.DeepCopy())); | |
641 ASSERT_TRUE(copy_dict.get()); | |
642 ASSERT_NE(copy_dict.get(), &original_dict); | |
643 | |
644 Value* copy_null = NULL; | |
645 ASSERT_TRUE(copy_dict->Get(L"null", ©_null)); | |
646 ASSERT_TRUE(copy_null); | |
647 ASSERT_NE(copy_null, original_null); | |
648 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); | |
649 | |
650 Value* copy_bool = NULL; | |
651 ASSERT_TRUE(copy_dict->Get(L"bool", ©_bool)); | |
652 ASSERT_TRUE(copy_bool); | |
653 ASSERT_NE(copy_bool, original_bool); | |
654 ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN)); | |
655 bool copy_bool_value = false; | |
656 ASSERT_TRUE(copy_bool->GetAsBoolean(©_bool_value)); | |
657 ASSERT_TRUE(copy_bool_value); | |
658 | |
659 Value* copy_int = NULL; | |
660 ASSERT_TRUE(copy_dict->Get(L"int", ©_int)); | |
661 ASSERT_TRUE(copy_int); | |
662 ASSERT_NE(copy_int, original_int); | |
663 ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER)); | |
664 int copy_int_value = 0; | |
665 ASSERT_TRUE(copy_int->GetAsInteger(©_int_value)); | |
666 ASSERT_EQ(42, copy_int_value); | |
667 | |
668 Value* copy_real = NULL; | |
669 ASSERT_TRUE(copy_dict->Get(L"real", ©_real)); | |
670 ASSERT_TRUE(copy_real); | |
671 ASSERT_NE(copy_real, original_real); | |
672 ASSERT_TRUE(copy_real->IsType(Value::TYPE_REAL)); | |
673 double copy_real_value = 0; | |
674 ASSERT_TRUE(copy_real->GetAsReal(©_real_value)); | |
675 ASSERT_EQ(3.14, copy_real_value); | |
676 | |
677 Value* copy_string = NULL; | |
678 ASSERT_TRUE(copy_dict->Get(L"string", ©_string)); | |
679 ASSERT_TRUE(copy_string); | |
680 ASSERT_NE(copy_string, original_string); | |
681 ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING)); | |
682 std::string copy_string_value; | |
683 std::wstring copy_wstring_value; | |
684 string16 copy_utf16_value; | |
685 ASSERT_TRUE(copy_string->GetAsString(©_string_value)); | |
686 ASSERT_TRUE(copy_string->GetAsString(©_wstring_value)); | |
687 ASSERT_TRUE(copy_string->GetAsString(©_utf16_value)); | |
688 ASSERT_EQ(std::string("hello"), copy_string_value); | |
689 ASSERT_EQ(std::wstring(L"hello"), copy_wstring_value); | |
690 ASSERT_EQ(ASCIIToUTF16("hello"), copy_utf16_value); | |
691 | |
692 Value* copy_utf16 = NULL; | |
693 ASSERT_TRUE(copy_dict->Get(L"utf16", ©_utf16)); | |
694 ASSERT_TRUE(copy_utf16); | |
695 ASSERT_NE(copy_utf16, original_utf16); | |
696 ASSERT_TRUE(copy_utf16->IsType(Value::TYPE_STRING)); | |
697 ASSERT_TRUE(copy_utf16->GetAsString(©_string_value)); | |
698 ASSERT_TRUE(copy_utf16->GetAsString(©_wstring_value)); | |
699 ASSERT_TRUE(copy_utf16->GetAsString(©_utf16_value)); | |
700 ASSERT_EQ(std::string("hello16"), copy_string_value); | |
701 ASSERT_EQ(std::wstring(L"hello16"), copy_wstring_value); | |
702 ASSERT_EQ(ASCIIToUTF16("hello16"), copy_utf16_value); | |
703 | |
704 Value* copy_binary = NULL; | |
705 ASSERT_TRUE(copy_dict->Get(L"binary", ©_binary)); | |
706 ASSERT_TRUE(copy_binary); | |
707 ASSERT_NE(copy_binary, original_binary); | |
708 ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY)); | |
709 ASSERT_NE(original_binary->GetBuffer(), | |
710 static_cast<BinaryValue*>(copy_binary)->GetBuffer()); | |
711 ASSERT_EQ(original_binary->GetSize(), | |
712 static_cast<BinaryValue*>(copy_binary)->GetSize()); | |
713 ASSERT_EQ(0, memcmp(original_binary->GetBuffer(), | |
714 static_cast<BinaryValue*>(copy_binary)->GetBuffer(), | |
715 original_binary->GetSize())); | |
716 | |
717 Value* copy_value = NULL; | |
718 ASSERT_TRUE(copy_dict->Get(L"list", ©_value)); | |
719 ASSERT_TRUE(copy_value); | |
720 ASSERT_NE(copy_value, original_list); | |
721 ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST)); | |
722 ListValue* copy_list = static_cast<ListValue*>(copy_value); | |
723 ASSERT_EQ(2U, copy_list->GetSize()); | |
724 | |
725 Value* copy_list_element_0; | |
726 ASSERT_TRUE(copy_list->Get(0, ©_list_element_0)); | |
727 ASSERT_TRUE(copy_list_element_0); | |
728 ASSERT_NE(copy_list_element_0, original_list_element_0); | |
729 int copy_list_element_0_value; | |
730 ASSERT_TRUE(copy_list_element_0->GetAsInteger(©_list_element_0_value)); | |
731 ASSERT_EQ(0, copy_list_element_0_value); | |
732 | |
733 Value* copy_list_element_1; | |
734 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); | |
735 ASSERT_TRUE(copy_list_element_1); | |
736 ASSERT_NE(copy_list_element_1, original_list_element_1); | |
737 int copy_list_element_1_value; | |
738 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); | |
739 ASSERT_EQ(1, copy_list_element_1_value); | |
740 } | |
741 | |
742 TEST_F(ValuesTest, Equals) { | 468 TEST_F(ValuesTest, Equals) { |
743 Value* null1 = Value::CreateNullValue(); | 469 Value* null1 = Value::CreateNullValue(); |
744 Value* null2 = Value::CreateNullValue(); | 470 Value* null2 = Value::CreateNullValue(); |
745 EXPECT_NE(null1, null2); | 471 EXPECT_NE(null1, null2); |
746 EXPECT_TRUE(null1->Equals(null2)); | 472 EXPECT_TRUE(null1->Equals(null2)); |
747 | 473 |
748 Value* boolean = Value::CreateBooleanValue(false); | 474 Value* boolean = Value::CreateBooleanValue(false); |
749 EXPECT_FALSE(null1->Equals(boolean)); | 475 EXPECT_FALSE(null1->Equals(boolean)); |
750 delete null1; | 476 delete null1; |
751 delete null2; | 477 delete null2; |
(...skipping 17 matching lines...) Expand all Loading... |
769 | 495 |
770 EXPECT_FALSE(dv.Equals(copy)); | 496 EXPECT_FALSE(dv.Equals(copy)); |
771 copy->Set("f", list->DeepCopy()); | 497 copy->Set("f", list->DeepCopy()); |
772 EXPECT_TRUE(dv.Equals(copy)); | 498 EXPECT_TRUE(dv.Equals(copy)); |
773 | 499 |
774 list->Append(Value::CreateBooleanValue(true)); | 500 list->Append(Value::CreateBooleanValue(true)); |
775 EXPECT_FALSE(dv.Equals(copy)); | 501 EXPECT_FALSE(dv.Equals(copy)); |
776 delete copy; | 502 delete copy; |
777 } | 503 } |
778 | 504 |
779 // TODO(viettrungluu): deprecate: | |
780 TEST_F(ValuesTest, EqualsDeprecated) { | |
781 Value* null1 = Value::CreateNullValue(); | |
782 Value* null2 = Value::CreateNullValue(); | |
783 EXPECT_NE(null1, null2); | |
784 EXPECT_TRUE(null1->Equals(null2)); | |
785 | |
786 Value* boolean = Value::CreateBooleanValue(false); | |
787 EXPECT_FALSE(null1->Equals(boolean)); | |
788 delete null1; | |
789 delete null2; | |
790 delete boolean; | |
791 | |
792 DictionaryValue dv; | |
793 dv.SetBoolean(L"a", false); | |
794 dv.SetInteger(L"b", 2); | |
795 dv.SetReal(L"c", 2.5); | |
796 dv.SetString(L"d1", "string"); | |
797 dv.SetString(L"d2", L"string"); | |
798 dv.Set(L"e", Value::CreateNullValue()); | |
799 | |
800 DictionaryValue* copy = static_cast<DictionaryValue*>(dv.DeepCopy()); | |
801 EXPECT_TRUE(dv.Equals(copy)); | |
802 | |
803 ListValue* list = new ListValue; | |
804 list->Append(Value::CreateNullValue()); | |
805 list->Append(new DictionaryValue); | |
806 dv.Set(L"f", list); | |
807 | |
808 EXPECT_FALSE(dv.Equals(copy)); | |
809 copy->Set(L"f", list->DeepCopy()); | |
810 EXPECT_TRUE(dv.Equals(copy)); | |
811 | |
812 list->Append(Value::CreateBooleanValue(true)); | |
813 EXPECT_FALSE(dv.Equals(copy)); | |
814 delete copy; | |
815 } | |
816 | |
817 TEST_F(ValuesTest, RemoveEmptyChildren) { | 505 TEST_F(ValuesTest, RemoveEmptyChildren) { |
818 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 506 scoped_ptr<DictionaryValue> root(new DictionaryValue); |
819 // Remove empty lists and dictionaries. | 507 // Remove empty lists and dictionaries. |
820 root->Set("empty_dict", new DictionaryValue); | 508 root->Set("empty_dict", new DictionaryValue); |
821 root->Set("empty_list", new ListValue); | 509 root->Set("empty_list", new ListValue); |
822 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); | 510 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); |
823 root.reset(root->DeepCopyWithoutEmptyChildren()); | 511 root.reset(root->DeepCopyWithoutEmptyChildren()); |
824 EXPECT_TRUE(root->empty()); | 512 EXPECT_TRUE(root->empty()); |
825 | 513 |
826 // Make sure we don't prune too much. | 514 // Make sure we don't prune too much. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 inner2->Append(Value::CreateStringValue("hello")); | 570 inner2->Append(Value::CreateStringValue("hello")); |
883 root.reset(root->DeepCopyWithoutEmptyChildren()); | 571 root.reset(root->DeepCopyWithoutEmptyChildren()); |
884 EXPECT_EQ(3U, root->size()); | 572 EXPECT_EQ(3U, root->size()); |
885 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); | 573 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); |
886 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. | 574 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. |
887 EXPECT_TRUE(inner->GetList(0, &inner2)); | 575 EXPECT_TRUE(inner->GetList(0, &inner2)); |
888 EXPECT_EQ(1U, inner2->GetSize()); | 576 EXPECT_EQ(1U, inner2->GetSize()); |
889 } | 577 } |
890 } | 578 } |
891 | 579 |
892 // TODO(viettrungluu): deprecate: | |
893 TEST_F(ValuesTest, RemoveEmptyChildrenDeprecated) { | |
894 scoped_ptr<DictionaryValue> root(new DictionaryValue); | |
895 // Remove empty lists and dictionaries. | |
896 root->Set(L"empty_dict", new DictionaryValue); | |
897 root->Set(L"empty_list", new ListValue); | |
898 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); | |
899 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
900 EXPECT_TRUE(root->empty()); | |
901 | |
902 // Make sure we don't prune too much. | |
903 root->SetBoolean(L"bool", true); | |
904 root->Set(L"empty_dict", new DictionaryValue); | |
905 root->SetString(L"empty_string", ""); | |
906 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
907 EXPECT_EQ(2U, root->size()); | |
908 | |
909 // Should do nothing. | |
910 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
911 EXPECT_EQ(2U, root->size()); | |
912 | |
913 // Nested test cases. These should all reduce back to the bool and string | |
914 // set above. | |
915 { | |
916 root->Set(L"a.b.c.d.e", new DictionaryValue); | |
917 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
918 EXPECT_EQ(2U, root->size()); | |
919 } | |
920 { | |
921 DictionaryValue* inner = new DictionaryValue; | |
922 root->Set(L"dict_with_emtpy_children", inner); | |
923 inner->Set(L"empty_dict", new DictionaryValue); | |
924 inner->Set(L"empty_list", new ListValue); | |
925 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
926 EXPECT_EQ(2U, root->size()); | |
927 } | |
928 { | |
929 ListValue* inner = new ListValue; | |
930 root->Set(L"list_with_empty_children", inner); | |
931 inner->Append(new DictionaryValue); | |
932 inner->Append(new ListValue); | |
933 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
934 EXPECT_EQ(2U, root->size()); | |
935 } | |
936 | |
937 // Nested with siblings. | |
938 { | |
939 ListValue* inner = new ListValue; | |
940 root->Set(L"list_with_empty_children", inner); | |
941 inner->Append(new DictionaryValue); | |
942 inner->Append(new ListValue); | |
943 DictionaryValue* inner2 = new DictionaryValue; | |
944 root->Set(L"dict_with_empty_children", inner2); | |
945 inner2->Set(L"empty_dict", new DictionaryValue); | |
946 inner2->Set(L"empty_list", new ListValue); | |
947 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
948 EXPECT_EQ(2U, root->size()); | |
949 } | |
950 | |
951 // Make sure nested values don't get pruned. | |
952 { | |
953 ListValue* inner = new ListValue; | |
954 root->Set(L"list_with_empty_children", inner); | |
955 ListValue* inner2 = new ListValue; | |
956 inner->Append(new DictionaryValue); | |
957 inner->Append(inner2); | |
958 inner2->Append(Value::CreateStringValue("hello")); | |
959 root.reset(root->DeepCopyWithoutEmptyChildren()); | |
960 EXPECT_EQ(3U, root->size()); | |
961 EXPECT_TRUE(root->GetList(L"list_with_empty_children", &inner)); | |
962 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. | |
963 EXPECT_TRUE(inner->GetList(0, &inner2)); | |
964 EXPECT_EQ(1U, inner2->GetSize()); | |
965 } | |
966 } | |
967 | |
968 TEST_F(ValuesTest, MergeDictionary) { | 580 TEST_F(ValuesTest, MergeDictionary) { |
969 scoped_ptr<DictionaryValue> base(new DictionaryValue); | 581 scoped_ptr<DictionaryValue> base(new DictionaryValue); |
970 base->SetString("base_key", "base_key_value_base"); | 582 base->SetString("base_key", "base_key_value_base"); |
971 base->SetString("collide_key", "collide_key_value_base"); | 583 base->SetString("collide_key", "collide_key_value_base"); |
972 DictionaryValue* base_sub_dict = new DictionaryValue; | 584 DictionaryValue* base_sub_dict = new DictionaryValue; |
973 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); | 585 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); |
974 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); | 586 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); |
975 base->Set("sub_dict_key", base_sub_dict); | 587 base->Set("sub_dict_key", base_sub_dict); |
976 | 588 |
977 scoped_ptr<DictionaryValue> merge(new DictionaryValue); | 589 scoped_ptr<DictionaryValue> merge(new DictionaryValue); |
(...skipping 25 matching lines...) Expand all Loading... |
1003 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. | 615 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. |
1004 std::string sub_collide_key_value; | 616 std::string sub_collide_key_value; |
1005 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", | 617 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", |
1006 &sub_collide_key_value)); | 618 &sub_collide_key_value)); |
1007 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | 619 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. |
1008 std::string sub_merge_key_value; | 620 std::string sub_merge_key_value; |
1009 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); | 621 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); |
1010 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | 622 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. |
1011 } | 623 } |
1012 | 624 |
1013 // TODO(viettrungluu): deprecate: | |
1014 TEST_F(ValuesTest, MergeDictionaryDeprecated) { | |
1015 scoped_ptr<DictionaryValue> base(new DictionaryValue); | |
1016 base->SetString(L"base_key", "base_key_value_base"); | |
1017 base->SetString(L"collide_key", "collide_key_value_base"); | |
1018 DictionaryValue* base_sub_dict = new DictionaryValue; | |
1019 base_sub_dict->SetString(L"sub_base_key", "sub_base_key_value_base"); | |
1020 base_sub_dict->SetString(L"sub_collide_key", "sub_collide_key_value_base"); | |
1021 base->Set(L"sub_dict_key", base_sub_dict); | |
1022 | |
1023 scoped_ptr<DictionaryValue> merge(new DictionaryValue); | |
1024 merge->SetString(L"merge_key", "merge_key_value_merge"); | |
1025 merge->SetString(L"collide_key", "collide_key_value_merge"); | |
1026 DictionaryValue* merge_sub_dict = new DictionaryValue; | |
1027 merge_sub_dict->SetString(L"sub_merge_key", "sub_merge_key_value_merge"); | |
1028 merge_sub_dict->SetString(L"sub_collide_key", "sub_collide_key_value_merge"); | |
1029 merge->Set(L"sub_dict_key", merge_sub_dict); | |
1030 | |
1031 base->MergeDictionary(merge.get()); | |
1032 | |
1033 EXPECT_EQ(4U, base->size()); | |
1034 std::string base_key_value; | |
1035 EXPECT_TRUE(base->GetString(L"base_key", &base_key_value)); | |
1036 EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved. | |
1037 std::string collide_key_value; | |
1038 EXPECT_TRUE(base->GetString(L"collide_key", &collide_key_value)); | |
1039 EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced. | |
1040 std::string merge_key_value; | |
1041 EXPECT_TRUE(base->GetString(L"merge_key", &merge_key_value)); | |
1042 EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in. | |
1043 | |
1044 DictionaryValue* res_sub_dict; | |
1045 EXPECT_TRUE(base->GetDictionary(L"sub_dict_key", &res_sub_dict)); | |
1046 EXPECT_EQ(3U, res_sub_dict->size()); | |
1047 std::string sub_base_key_value; | |
1048 EXPECT_TRUE(res_sub_dict->GetString(L"sub_base_key", &sub_base_key_value)); | |
1049 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. | |
1050 std::string sub_collide_key_value; | |
1051 EXPECT_TRUE(res_sub_dict->GetString(L"sub_collide_key", | |
1052 &sub_collide_key_value)); | |
1053 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | |
1054 std::string sub_merge_key_value; | |
1055 EXPECT_TRUE(res_sub_dict->GetString(L"sub_merge_key", &sub_merge_key_value)); | |
1056 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | |
1057 } | |
1058 | |
1059 TEST_F(ValuesTest, GetDifferingPaths) { | 625 TEST_F(ValuesTest, GetDifferingPaths) { |
1060 scoped_ptr<DictionaryValue> dict1(new DictionaryValue()); | 626 scoped_ptr<DictionaryValue> dict1(new DictionaryValue()); |
1061 scoped_ptr<DictionaryValue> dict2(new DictionaryValue()); | 627 scoped_ptr<DictionaryValue> dict2(new DictionaryValue()); |
1062 std::vector<std::string> differing_paths; | 628 std::vector<std::string> differing_paths; |
1063 | 629 |
1064 // Test comparing empty dictionaries. | 630 // Test comparing empty dictionaries. |
1065 dict1->GetDifferingPaths(dict2.get(), &differing_paths); | 631 dict1->GetDifferingPaths(dict2.get(), &differing_paths); |
1066 EXPECT_EQ(differing_paths.size(), 0UL); | 632 EXPECT_EQ(differing_paths.size(), 0UL); |
1067 | 633 |
1068 // Compare an empty dictionary with various non-empty dictionaries. | 634 // Compare an empty dictionary with various non-empty dictionaries. |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 "s1", | 725 "s1", |
1160 "s1.s2" | 726 "s1.s2" |
1161 }; | 727 }; |
1162 dict1.reset(new DictionaryValue()); | 728 dict1.reset(new DictionaryValue()); |
1163 dict1->Set("s1.s2", new DictionaryValue()); | 729 dict1->Set("s1.s2", new DictionaryValue()); |
1164 dict2.reset(new DictionaryValue()); | 730 dict2.reset(new DictionaryValue()); |
1165 dict2->SetInteger("s1", 1); | 731 dict2->SetInteger("s1", 1); |
1166 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths8, | 732 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths8, |
1167 arraysize(expected_paths8)); | 733 arraysize(expected_paths8)); |
1168 } | 734 } |
OLD | NEW |