Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1392)

Side by Side Diff: base/values_unittest.cc

Issue 6324004: Made return types of various Value::DeepCopy() implementations more specific (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add test for covariant return types Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/values.cc ('k') | ceee/ie/broker/window_api_module.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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", &copy_null)); 355 ASSERT_TRUE(copy_dict->Get("null", &copy_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
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
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 }
OLDNEW
« no previous file with comments | « base/values.cc ('k') | ceee/ie/broker/window_api_module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698