Index: base/values_unittest.cc |
diff --git a/base/values_unittest.cc b/base/values_unittest.cc |
index adcd07e0f93dee1df62e97d96a8c64455eb8ad32..774dfcaa138b01057024c08c65f6b7a18a64c228 100644 |
--- a/base/values_unittest.cc |
+++ b/base/values_unittest.cc |
@@ -323,15 +323,16 @@ TEST_F(ValuesTest, DeepCopy) { |
DictionaryValue original_dict; |
Value* original_null = Value::CreateNullValue(); |
original_dict.Set("null", original_null); |
- Value* original_bool = Value::CreateBooleanValue(true); |
+ FundamentalValue* original_bool = Value::CreateBooleanValue(true); |
original_dict.Set("bool", original_bool); |
- Value* original_int = Value::CreateIntegerValue(42); |
+ FundamentalValue* original_int = Value::CreateIntegerValue(42); |
original_dict.Set("int", original_int); |
- Value* original_real = Value::CreateRealValue(3.14); |
+ FundamentalValue* original_real = Value::CreateRealValue(3.14); |
original_dict.Set("real", original_real); |
- Value* original_string = Value::CreateStringValue("hello"); |
+ StringValue* original_string = Value::CreateStringValue("hello"); |
original_dict.Set("string", original_string); |
- Value* original_string16 = Value::CreateStringValue(ASCIIToUTF16("hello16")); |
+ StringValue* original_string16 = |
+ Value::CreateStringValue(ASCIIToUTF16("hello16")); |
original_dict.Set("string16", original_string16); |
char* original_buffer = new char[42]; |
@@ -340,14 +341,13 @@ TEST_F(ValuesTest, DeepCopy) { |
original_dict.Set("binary", original_binary); |
ListValue* original_list = new ListValue(); |
- Value* original_list_element_0 = Value::CreateIntegerValue(0); |
+ FundamentalValue* original_list_element_0 = Value::CreateIntegerValue(0); |
original_list->Append(original_list_element_0); |
- Value* original_list_element_1 = Value::CreateIntegerValue(1); |
+ FundamentalValue* original_list_element_1 = Value::CreateIntegerValue(1); |
original_list->Append(original_list_element_1); |
original_dict.Set("list", original_list); |
- scoped_ptr<DictionaryValue> copy_dict( |
- static_cast<DictionaryValue*>(original_dict.DeepCopy())); |
+ scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy()); |
ASSERT_TRUE(copy_dict.get()); |
ASSERT_NE(copy_dict.get(), &original_dict); |
@@ -465,7 +465,7 @@ TEST_F(ValuesTest, Equals) { |
dv.Set("e", Value::CreateNullValue()); |
scoped_ptr<DictionaryValue> copy; |
- copy.reset(static_cast<DictionaryValue*>(dv.DeepCopy())); |
+ copy.reset(dv.DeepCopy()); |
EXPECT_TRUE(dv.Equals(copy.get())); |
ListValue* list = new ListValue; |
@@ -481,7 +481,7 @@ TEST_F(ValuesTest, Equals) { |
EXPECT_FALSE(dv.Equals(copy.get())); |
// Check if Equals detects differences in only the keys. |
- copy.reset(static_cast<DictionaryValue*>(dv.DeepCopy())); |
+ copy.reset(dv.DeepCopy()); |
EXPECT_TRUE(dv.Equals(copy.get())); |
copy->Remove("a", NULL); |
copy->SetBoolean("aa", false); |
@@ -511,6 +511,62 @@ TEST_F(ValuesTest, StaticEquals) { |
EXPECT_FALSE(Value::Equals(NULL, null1.get())); |
} |
+TEST_F(ValuesTest, DeepCopyCovariantReturnTypes) { |
+ DictionaryValue original_dict; |
+ Value* original_null = Value::CreateNullValue(); |
+ original_dict.Set("null", original_null); |
+ FundamentalValue* original_bool = Value::CreateBooleanValue(true); |
+ original_dict.Set("bool", original_bool); |
+ FundamentalValue* original_int = Value::CreateIntegerValue(42); |
+ original_dict.Set("int", original_int); |
+ FundamentalValue* original_real = Value::CreateRealValue(3.14); |
+ original_dict.Set("real", original_real); |
+ StringValue* original_string = Value::CreateStringValue("hello"); |
+ original_dict.Set("string", original_string); |
+ StringValue* original_string16 = |
+ Value::CreateStringValue(ASCIIToUTF16("hello16")); |
+ original_dict.Set("string16", original_string16); |
+ |
+ char* original_buffer = new char[42]; |
+ memset(original_buffer, '!', 42); |
+ BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); |
+ original_dict.Set("binary", original_binary); |
+ |
+ ListValue* original_list = new ListValue(); |
+ FundamentalValue* original_list_element_0 = Value::CreateIntegerValue(0); |
+ original_list->Append(original_list_element_0); |
+ FundamentalValue* original_list_element_1 = Value::CreateIntegerValue(1); |
+ original_list->Append(original_list_element_1); |
+ original_dict.Set("list", original_list); |
+ |
+ Value* original_dict_value = &original_dict; |
+ Value* original_bool_value = original_bool; |
+ Value* original_int_value = original_int; |
+ Value* original_real_value = original_real; |
+ Value* original_string_value = original_string; |
+ Value* original_string16_value = original_string16; |
+ Value* original_binary_value = original_binary; |
+ Value* original_list_value = original_list; |
+ |
+ scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy()); |
+ scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy()); |
+ scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy()); |
+ scoped_ptr<Value> copy_real_value(original_real_value->DeepCopy()); |
+ scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy()); |
+ scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy()); |
+ scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy()); |
+ scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy()); |
+ |
+ EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get())); |
+ EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get())); |
+ EXPECT_TRUE(original_int_value->Equals(copy_int_value.get())); |
+ EXPECT_TRUE(original_real_value->Equals(copy_real_value.get())); |
+ EXPECT_TRUE(original_string_value->Equals(copy_string_value.get())); |
+ EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get())); |
+ EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get())); |
+ EXPECT_TRUE(original_list_value->Equals(copy_list_value.get())); |
+} |
+ |
TEST_F(ValuesTest, RemoveEmptyChildren) { |
scoped_ptr<DictionaryValue> root(new DictionaryValue); |
// Remove empty lists and dictionaries. |