| 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/string16.h" | 8 #include "base/string16.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3)); | 316 EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3)); |
| 317 Value* value4; | 317 Value* value4; |
| 318 ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4)); | 318 ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4)); |
| 319 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); | 319 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); |
| 320 } | 320 } |
| 321 | 321 |
| 322 TEST_F(ValuesTest, DeepCopy) { | 322 TEST_F(ValuesTest, DeepCopy) { |
| 323 DictionaryValue original_dict; | 323 DictionaryValue original_dict; |
| 324 Value* original_null = Value::CreateNullValue(); | 324 Value* original_null = Value::CreateNullValue(); |
| 325 original_dict.Set("null", original_null); | 325 original_dict.Set("null", original_null); |
| 326 Value* original_bool = Value::CreateBooleanValue(true); | 326 FundamentalValue* original_bool = Value::CreateBooleanValue(true); |
| 327 original_dict.Set("bool", original_bool); | 327 original_dict.Set("bool", original_bool); |
| 328 Value* original_int = Value::CreateIntegerValue(42); | 328 FundamentalValue* original_int = Value::CreateIntegerValue(42); |
| 329 original_dict.Set("int", original_int); | 329 original_dict.Set("int", original_int); |
| 330 Value* original_real = Value::CreateRealValue(3.14); | 330 FundamentalValue* original_real = Value::CreateRealValue(3.14); |
| 331 original_dict.Set("real", original_real); | 331 original_dict.Set("real", original_real); |
| 332 Value* original_string = Value::CreateStringValue("hello"); | 332 StringValue* original_string = Value::CreateStringValue("hello"); |
| 333 original_dict.Set("string", original_string); | 333 original_dict.Set("string", original_string); |
| 334 Value* original_string16 = Value::CreateStringValue(ASCIIToUTF16("hello16")); | 334 StringValue* original_string16 = |
| 335 Value::CreateStringValue(ASCIIToUTF16("hello16")); |
| 335 original_dict.Set("string16", original_string16); | 336 original_dict.Set("string16", original_string16); |
| 336 | 337 |
| 337 char* original_buffer = new char[42]; | 338 char* original_buffer = new char[42]; |
| 338 memset(original_buffer, '!', 42); | 339 memset(original_buffer, '!', 42); |
| 339 BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); | 340 BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); |
| 340 original_dict.Set("binary", original_binary); | 341 original_dict.Set("binary", original_binary); |
| 341 | 342 |
| 342 ListValue* original_list = new ListValue(); | 343 ListValue* original_list = new ListValue(); |
| 343 Value* original_list_element_0 = Value::CreateIntegerValue(0); | 344 FundamentalValue* original_list_element_0 = Value::CreateIntegerValue(0); |
| 344 original_list->Append(original_list_element_0); | 345 original_list->Append(original_list_element_0); |
| 345 Value* original_list_element_1 = Value::CreateIntegerValue(1); | 346 FundamentalValue* original_list_element_1 = Value::CreateIntegerValue(1); |
| 346 original_list->Append(original_list_element_1); | 347 original_list->Append(original_list_element_1); |
| 347 original_dict.Set("list", original_list); | 348 original_dict.Set("list", original_list); |
| 348 | 349 |
| 349 scoped_ptr<DictionaryValue> copy_dict( | 350 scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy()); |
| 350 static_cast<DictionaryValue*>(original_dict.DeepCopy())); | |
| 351 ASSERT_TRUE(copy_dict.get()); | 351 ASSERT_TRUE(copy_dict.get()); |
| 352 ASSERT_NE(copy_dict.get(), &original_dict); | 352 ASSERT_NE(copy_dict.get(), &original_dict); |
| 353 | 353 |
| 354 Value* copy_null = NULL; | 354 Value* copy_null = NULL; |
| 355 ASSERT_TRUE(copy_dict->Get("null", ©_null)); | 355 ASSERT_TRUE(copy_dict->Get("null", ©_null)); |
| 356 ASSERT_TRUE(copy_null); | 356 ASSERT_TRUE(copy_null); |
| 357 ASSERT_NE(copy_null, original_null); | 357 ASSERT_NE(copy_null, original_null); |
| 358 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); | 358 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); |
| 359 | 359 |
| 360 Value* copy_bool = NULL; | 360 Value* copy_bool = NULL; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 458 |
| 459 DictionaryValue dv; | 459 DictionaryValue dv; |
| 460 dv.SetBoolean("a", false); | 460 dv.SetBoolean("a", false); |
| 461 dv.SetInteger("b", 2); | 461 dv.SetInteger("b", 2); |
| 462 dv.SetReal("c", 2.5); | 462 dv.SetReal("c", 2.5); |
| 463 dv.SetString("d1", "string"); | 463 dv.SetString("d1", "string"); |
| 464 dv.SetString("d2", ASCIIToUTF16("http://google.com")); | 464 dv.SetString("d2", ASCIIToUTF16("http://google.com")); |
| 465 dv.Set("e", Value::CreateNullValue()); | 465 dv.Set("e", Value::CreateNullValue()); |
| 466 | 466 |
| 467 scoped_ptr<DictionaryValue> copy; | 467 scoped_ptr<DictionaryValue> copy; |
| 468 copy.reset(static_cast<DictionaryValue*>(dv.DeepCopy())); | 468 copy.reset(dv.DeepCopy()); |
| 469 EXPECT_TRUE(dv.Equals(copy.get())); | 469 EXPECT_TRUE(dv.Equals(copy.get())); |
| 470 | 470 |
| 471 ListValue* list = new ListValue; | 471 ListValue* list = new ListValue; |
| 472 list->Append(Value::CreateNullValue()); | 472 list->Append(Value::CreateNullValue()); |
| 473 list->Append(new DictionaryValue); | 473 list->Append(new DictionaryValue); |
| 474 dv.Set("f", list); | 474 dv.Set("f", list); |
| 475 | 475 |
| 476 EXPECT_FALSE(dv.Equals(copy.get())); | 476 EXPECT_FALSE(dv.Equals(copy.get())); |
| 477 copy->Set("f", list->DeepCopy()); | 477 copy->Set("f", list->DeepCopy()); |
| 478 EXPECT_TRUE(dv.Equals(copy.get())); | 478 EXPECT_TRUE(dv.Equals(copy.get())); |
| 479 | 479 |
| 480 list->Append(Value::CreateBooleanValue(true)); | 480 list->Append(Value::CreateBooleanValue(true)); |
| 481 EXPECT_FALSE(dv.Equals(copy.get())); | 481 EXPECT_FALSE(dv.Equals(copy.get())); |
| 482 | 482 |
| 483 // Check if Equals detects differences in only the keys. | 483 // Check if Equals detects differences in only the keys. |
| 484 copy.reset(static_cast<DictionaryValue*>(dv.DeepCopy())); | 484 copy.reset(dv.DeepCopy()); |
| 485 EXPECT_TRUE(dv.Equals(copy.get())); | 485 EXPECT_TRUE(dv.Equals(copy.get())); |
| 486 copy->Remove("a", NULL); | 486 copy->Remove("a", NULL); |
| 487 copy->SetBoolean("aa", false); | 487 copy->SetBoolean("aa", false); |
| 488 EXPECT_FALSE(dv.Equals(copy.get())); | 488 EXPECT_FALSE(dv.Equals(copy.get())); |
| 489 } | 489 } |
| 490 | 490 |
| 491 TEST_F(ValuesTest, StaticEquals) { | 491 TEST_F(ValuesTest, StaticEquals) { |
| 492 scoped_ptr<Value> null1(Value::CreateNullValue()); | 492 scoped_ptr<Value> null1(Value::CreateNullValue()); |
| 493 scoped_ptr<Value> null2(Value::CreateNullValue()); | 493 scoped_ptr<Value> null2(Value::CreateNullValue()); |
| 494 EXPECT_TRUE(Value::Equals(null1.get(), null2.get())); | 494 EXPECT_TRUE(Value::Equals(null1.get(), null2.get())); |
| 495 EXPECT_TRUE(Value::Equals(NULL, NULL)); | 495 EXPECT_TRUE(Value::Equals(NULL, NULL)); |
| 496 | 496 |
| 497 scoped_ptr<Value> i42(Value::CreateIntegerValue(42)); | 497 scoped_ptr<Value> i42(Value::CreateIntegerValue(42)); |
| 498 scoped_ptr<Value> j42(Value::CreateIntegerValue(42)); | 498 scoped_ptr<Value> j42(Value::CreateIntegerValue(42)); |
| 499 scoped_ptr<Value> i17(Value::CreateIntegerValue(17)); | 499 scoped_ptr<Value> i17(Value::CreateIntegerValue(17)); |
| 500 EXPECT_TRUE(Value::Equals(i42.get(), i42.get())); | 500 EXPECT_TRUE(Value::Equals(i42.get(), i42.get())); |
| 501 EXPECT_TRUE(Value::Equals(j42.get(), i42.get())); | 501 EXPECT_TRUE(Value::Equals(j42.get(), i42.get())); |
| 502 EXPECT_TRUE(Value::Equals(i42.get(), j42.get())); | 502 EXPECT_TRUE(Value::Equals(i42.get(), j42.get())); |
| 503 EXPECT_FALSE(Value::Equals(i42.get(), i17.get())); | 503 EXPECT_FALSE(Value::Equals(i42.get(), i17.get())); |
| 504 EXPECT_FALSE(Value::Equals(i42.get(), NULL)); | 504 EXPECT_FALSE(Value::Equals(i42.get(), NULL)); |
| 505 EXPECT_FALSE(Value::Equals(NULL, i42.get())); | 505 EXPECT_FALSE(Value::Equals(NULL, i42.get())); |
| 506 | 506 |
| 507 // NULL and Value::CreateNullValue() are intentionally different: We need | 507 // NULL and Value::CreateNullValue() are intentionally different: We need |
| 508 // support for NULL as a return value for "undefined" without caring for | 508 // support for NULL as a return value for "undefined" without caring for |
| 509 // ownership of the pointer. | 509 // ownership of the pointer. |
| 510 EXPECT_FALSE(Value::Equals(null1.get(), NULL)); | 510 EXPECT_FALSE(Value::Equals(null1.get(), NULL)); |
| 511 EXPECT_FALSE(Value::Equals(NULL, null1.get())); | 511 EXPECT_FALSE(Value::Equals(NULL, null1.get())); |
| 512 } | 512 } |
| 513 | 513 |
| 514 TEST_F(ValuesTest, DeepCopyCovariantReturnTypes) { |
| 515 DictionaryValue original_dict; |
| 516 Value* original_null = Value::CreateNullValue(); |
| 517 original_dict.Set("null", original_null); |
| 518 FundamentalValue* original_bool = Value::CreateBooleanValue(true); |
| 519 original_dict.Set("bool", original_bool); |
| 520 FundamentalValue* original_int = Value::CreateIntegerValue(42); |
| 521 original_dict.Set("int", original_int); |
| 522 FundamentalValue* original_real = Value::CreateRealValue(3.14); |
| 523 original_dict.Set("real", original_real); |
| 524 StringValue* original_string = Value::CreateStringValue("hello"); |
| 525 original_dict.Set("string", original_string); |
| 526 StringValue* original_string16 = |
| 527 Value::CreateStringValue(ASCIIToUTF16("hello16")); |
| 528 original_dict.Set("string16", original_string16); |
| 529 |
| 530 char* original_buffer = new char[42]; |
| 531 memset(original_buffer, '!', 42); |
| 532 BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); |
| 533 original_dict.Set("binary", original_binary); |
| 534 |
| 535 ListValue* original_list = new ListValue(); |
| 536 FundamentalValue* original_list_element_0 = Value::CreateIntegerValue(0); |
| 537 original_list->Append(original_list_element_0); |
| 538 FundamentalValue* original_list_element_1 = Value::CreateIntegerValue(1); |
| 539 original_list->Append(original_list_element_1); |
| 540 original_dict.Set("list", original_list); |
| 541 |
| 542 Value* original_dict_value = &original_dict; |
| 543 Value* original_bool_value = original_bool; |
| 544 Value* original_int_value = original_int; |
| 545 Value* original_real_value = original_real; |
| 546 Value* original_string_value = original_string; |
| 547 Value* original_string16_value = original_string16; |
| 548 Value* original_binary_value = original_binary; |
| 549 Value* original_list_value = original_list; |
| 550 |
| 551 scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy()); |
| 552 scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy()); |
| 553 scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy()); |
| 554 scoped_ptr<Value> copy_real_value(original_real_value->DeepCopy()); |
| 555 scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy()); |
| 556 scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy()); |
| 557 scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy()); |
| 558 scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy()); |
| 559 |
| 560 EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get())); |
| 561 EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get())); |
| 562 EXPECT_TRUE(original_int_value->Equals(copy_int_value.get())); |
| 563 EXPECT_TRUE(original_real_value->Equals(copy_real_value.get())); |
| 564 EXPECT_TRUE(original_string_value->Equals(copy_string_value.get())); |
| 565 EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get())); |
| 566 EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get())); |
| 567 EXPECT_TRUE(original_list_value->Equals(copy_list_value.get())); |
| 568 } |
| 569 |
| 514 TEST_F(ValuesTest, RemoveEmptyChildren) { | 570 TEST_F(ValuesTest, RemoveEmptyChildren) { |
| 515 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 571 scoped_ptr<DictionaryValue> root(new DictionaryValue); |
| 516 // Remove empty lists and dictionaries. | 572 // Remove empty lists and dictionaries. |
| 517 root->Set("empty_dict", new DictionaryValue); | 573 root->Set("empty_dict", new DictionaryValue); |
| 518 root->Set("empty_list", new ListValue); | 574 root->Set("empty_list", new ListValue); |
| 519 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); | 575 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); |
| 520 root.reset(root->DeepCopyWithoutEmptyChildren()); | 576 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 521 EXPECT_TRUE(root->empty()); | 577 EXPECT_TRUE(root->empty()); |
| 522 | 578 |
| 523 // Make sure we don't prune too much. | 579 // Make sure we don't prune too much. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value)); | 679 EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value)); |
| 624 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. | 680 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. |
| 625 std::string sub_collide_key_value; | 681 std::string sub_collide_key_value; |
| 626 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", | 682 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", |
| 627 &sub_collide_key_value)); | 683 &sub_collide_key_value)); |
| 628 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | 684 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. |
| 629 std::string sub_merge_key_value; | 685 std::string sub_merge_key_value; |
| 630 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); | 686 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); |
| 631 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | 687 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. |
| 632 } | 688 } |
| OLD | NEW |