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 |