diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-31 04:56:14 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-31 04:56:14 +0000 |
commit | 9e4cda73357837678196a948b270862f0c0d8ba8 (patch) | |
tree | 63bde0071949debacaa990d50eacdb4c982f8383 /base/values_unittest.cc | |
parent | 219ba8cbe322f5f0c656f95eba1d6a2bce56c201 (diff) | |
download | chromium_src-9e4cda73357837678196a948b270862f0c0d8ba8.zip chromium_src-9e4cda73357837678196a948b270862f0c0d8ba8.tar.gz chromium_src-9e4cda73357837678196a948b270862f0c0d8ba8.tar.bz2 |
Make ValuesTest use std::strings (instead of wstrings) for dictionary keys.
For now, keep the deprecated tests to check compatibility.
BUG=23581
TEST=base_unittests
Review URL: http://codereview.chromium.org/3041038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54431 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/values_unittest.cc')
-rw-r--r-- | base/values_unittest.cc | 440 |
1 files changed, 440 insertions, 0 deletions
diff --git a/base/values_unittest.cc b/base/values_unittest.cc index 8aa8359..71eec5e 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc @@ -13,9 +13,59 @@ class ValuesTest: public testing::Test { }; +// TODO(viettrungluu): I changed the keys for DictionaryValue from std::wstring +// to std::string. I've temporarily kept the old methods taking std::wstring for +// compatibility. The ...Deprecated tests are the old tests which use these +// methods, and remain to test compatibility. They will be removed once the old +// methods are removed. + TEST(ValuesTest, Basic) { // Test basic dictionary getting/setting DictionaryValue settings; + std::string homepage = "http://google.com"; + ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); + ASSERT_EQ(std::string("http://google.com"), homepage); + + ASSERT_FALSE(settings.Get("global", NULL)); + settings.Set("global", Value::CreateBooleanValue(true)); + ASSERT_TRUE(settings.Get("global", NULL)); + settings.SetString("global.homepage", "http://scurvy.com"); + ASSERT_TRUE(settings.Get("global", NULL)); + homepage = "http://google.com"; + ASSERT_TRUE(settings.GetString("global.homepage", &homepage)); + ASSERT_EQ(std::string("http://scurvy.com"), homepage); + + // Test storing a dictionary in a list. + ListValue* toolbar_bookmarks; + ASSERT_FALSE( + settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); + + toolbar_bookmarks = new ListValue; + settings.Set("global.toolbar.bookmarks", toolbar_bookmarks); + ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); + + DictionaryValue* new_bookmark = new DictionaryValue; + new_bookmark->SetString("name", "Froogle"); + new_bookmark->SetString("url", "http://froogle.com"); + toolbar_bookmarks->Append(new_bookmark); + + ListValue* bookmark_list; + ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list)); + DictionaryValue* bookmark; + ASSERT_EQ(1U, bookmark_list->GetSize()); + ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); + std::string bookmark_name = "Unnamed"; + ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); + ASSERT_EQ(std::string("Froogle"), bookmark_name); + std::string bookmark_url; + ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); + ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, BasicDeprecated) { + // Test basic dictionary getting/setting + DictionaryValue settings; std::wstring homepage = L"http://google.com"; ASSERT_FALSE( settings.GetString(L"global.homepage", &homepage)); @@ -256,6 +306,35 @@ TEST(ValuesTest, ListRemoval) { } TEST(ValuesTest, DictionaryDeletion) { + std::string key = "test"; + bool deletion_flag = true; + + { + DictionaryValue dict; + dict.Set(key, new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + } + EXPECT_TRUE(deletion_flag); + + { + DictionaryValue dict; + dict.Set(key, new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + dict.Clear(); + EXPECT_TRUE(deletion_flag); + } + + { + DictionaryValue dict; + dict.Set(key, new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + dict.Set(key, Value::CreateNullValue()); + EXPECT_TRUE(deletion_flag); + } +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, DictionaryDeletionDeprecated) { std::wstring key = L"test"; bool deletion_flag = true; @@ -284,6 +363,38 @@ TEST(ValuesTest, DictionaryDeletion) { } TEST(ValuesTest, DictionaryRemoval) { + std::string key = "test"; + bool deletion_flag = true; + Value* removed_item = NULL; + + { + DictionaryValue dict; + dict.Set(key, new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + EXPECT_TRUE(dict.HasKey(key)); + EXPECT_FALSE(dict.Remove("absent key", &removed_item)); + EXPECT_TRUE(dict.Remove(key, &removed_item)); + EXPECT_FALSE(dict.HasKey(key)); + ASSERT_TRUE(removed_item); + } + EXPECT_FALSE(deletion_flag); + delete removed_item; + removed_item = NULL; + EXPECT_TRUE(deletion_flag); + + { + DictionaryValue dict; + dict.Set(key, new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + EXPECT_TRUE(dict.HasKey(key)); + EXPECT_TRUE(dict.Remove(key, NULL)); + EXPECT_TRUE(deletion_flag); + EXPECT_FALSE(dict.HasKey(key)); + } +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, DictionaryRemovalDeprecated) { std::wstring key = L"test"; bool deletion_flag = true; Value* removed_item = NULL; @@ -316,6 +427,29 @@ TEST(ValuesTest, DictionaryRemoval) { TEST(ValuesTest, DictionaryWithoutPathExpansion) { DictionaryValue dict; + dict.Set("this.is.expanded", Value::CreateNullValue()); + dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); + + EXPECT_FALSE(dict.HasKey("this.is.expanded")); + EXPECT_TRUE(dict.HasKey("this")); + Value* value1; + EXPECT_TRUE(dict.Get("this", &value1)); + DictionaryValue* value2; + ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2)); + EXPECT_EQ(value1, value2); + EXPECT_EQ(1U, value2->size()); + + EXPECT_TRUE(dict.HasKey("this.isnt.expanded")); + Value* value3; + EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3)); + Value* value4; + ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4)); + EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, DictionaryWithoutPathExpansionDeprecated) { + DictionaryValue dict; dict.Set(L"this.is.expanded", Value::CreateNullValue()); dict.SetWithoutPathExpansion(L"this.isnt.expanded", Value::CreateNullValue()); @@ -339,6 +473,152 @@ TEST(ValuesTest, DictionaryWithoutPathExpansion) { TEST(ValuesTest, DeepCopy) { DictionaryValue original_dict; Value* original_null = Value::CreateNullValue(); + original_dict.Set("null", original_null); + Value* original_bool = Value::CreateBooleanValue(true); + original_dict.Set("bool", original_bool); + Value* original_int = Value::CreateIntegerValue(42); + original_dict.Set("int", original_int); + Value* original_real = Value::CreateRealValue(3.14); + original_dict.Set("real", original_real); + Value* original_string = Value::CreateStringValue("hello"); + original_dict.Set("string", original_string); + Value* original_wstring = Value::CreateStringValue(L"peek-a-boo"); + original_dict.Set("wstring", original_wstring); + Value* original_utf16 = + Value::CreateStringValueFromUTF16(ASCIIToUTF16("hello16")); + original_dict.Set("utf16", original_utf16); + + 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(); + Value* original_list_element_0 = Value::CreateIntegerValue(0); + original_list->Append(original_list_element_0); + Value* 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())); + ASSERT_TRUE(copy_dict.get()); + ASSERT_NE(copy_dict.get(), &original_dict); + + Value* copy_null = NULL; + ASSERT_TRUE(copy_dict->Get("null", ©_null)); + ASSERT_TRUE(copy_null); + ASSERT_NE(copy_null, original_null); + ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); + + Value* copy_bool = NULL; + ASSERT_TRUE(copy_dict->Get("bool", ©_bool)); + ASSERT_TRUE(copy_bool); + ASSERT_NE(copy_bool, original_bool); + ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN)); + bool copy_bool_value = false; + ASSERT_TRUE(copy_bool->GetAsBoolean(©_bool_value)); + ASSERT_TRUE(copy_bool_value); + + Value* copy_int = NULL; + ASSERT_TRUE(copy_dict->Get("int", ©_int)); + ASSERT_TRUE(copy_int); + ASSERT_NE(copy_int, original_int); + ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER)); + int copy_int_value = 0; + ASSERT_TRUE(copy_int->GetAsInteger(©_int_value)); + ASSERT_EQ(42, copy_int_value); + + Value* copy_real = NULL; + ASSERT_TRUE(copy_dict->Get("real", ©_real)); + ASSERT_TRUE(copy_real); + ASSERT_NE(copy_real, original_real); + ASSERT_TRUE(copy_real->IsType(Value::TYPE_REAL)); + double copy_real_value = 0; + ASSERT_TRUE(copy_real->GetAsReal(©_real_value)); + ASSERT_EQ(3.14, copy_real_value); + + Value* copy_string = NULL; + ASSERT_TRUE(copy_dict->Get("string", ©_string)); + ASSERT_TRUE(copy_string); + ASSERT_NE(copy_string, original_string); + ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING)); + std::string copy_string_value; + std::wstring copy_wstring_value; + string16 copy_utf16_value; + ASSERT_TRUE(copy_string->GetAsString(©_string_value)); + ASSERT_TRUE(copy_string->GetAsString(©_wstring_value)); + ASSERT_TRUE(copy_string->GetAsUTF16(©_utf16_value)); + ASSERT_EQ(std::string("hello"), copy_string_value); + ASSERT_EQ(std::wstring(L"hello"), copy_wstring_value); + ASSERT_EQ(ASCIIToUTF16("hello"), copy_utf16_value); + + Value* copy_wstring = NULL; + ASSERT_TRUE(copy_dict->Get("wstring", ©_wstring)); + ASSERT_TRUE(copy_wstring); + ASSERT_NE(copy_wstring, original_wstring); + ASSERT_TRUE(copy_wstring->IsType(Value::TYPE_STRING)); + ASSERT_TRUE(copy_wstring->GetAsString(©_string_value)); + ASSERT_TRUE(copy_wstring->GetAsString(©_wstring_value)); + ASSERT_TRUE(copy_wstring->GetAsUTF16(©_utf16_value)); + ASSERT_EQ(std::string("peek-a-boo"), copy_string_value); + ASSERT_EQ(std::wstring(L"peek-a-boo"), copy_wstring_value); + ASSERT_EQ(ASCIIToUTF16("peek-a-boo"), copy_utf16_value); + + Value* copy_utf16 = NULL; + ASSERT_TRUE(copy_dict->Get("utf16", ©_utf16)); + ASSERT_TRUE(copy_utf16); + ASSERT_NE(copy_utf16, original_utf16); + ASSERT_TRUE(copy_utf16->IsType(Value::TYPE_STRING)); + ASSERT_TRUE(copy_utf16->GetAsString(©_string_value)); + ASSERT_TRUE(copy_utf16->GetAsString(©_wstring_value)); + ASSERT_TRUE(copy_utf16->GetAsUTF16(©_utf16_value)); + ASSERT_EQ(std::string("hello16"), copy_string_value); + ASSERT_EQ(std::wstring(L"hello16"), copy_wstring_value); + ASSERT_EQ(ASCIIToUTF16("hello16"), copy_utf16_value); + + Value* copy_binary = NULL; + ASSERT_TRUE(copy_dict->Get("binary", ©_binary)); + ASSERT_TRUE(copy_binary); + ASSERT_NE(copy_binary, original_binary); + ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY)); + ASSERT_NE(original_binary->GetBuffer(), + static_cast<BinaryValue*>(copy_binary)->GetBuffer()); + ASSERT_EQ(original_binary->GetSize(), + static_cast<BinaryValue*>(copy_binary)->GetSize()); + ASSERT_EQ(0, memcmp(original_binary->GetBuffer(), + static_cast<BinaryValue*>(copy_binary)->GetBuffer(), + original_binary->GetSize())); + + Value* copy_value = NULL; + ASSERT_TRUE(copy_dict->Get("list", ©_value)); + ASSERT_TRUE(copy_value); + ASSERT_NE(copy_value, original_list); + ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST)); + ListValue* copy_list = static_cast<ListValue*>(copy_value); + ASSERT_EQ(2U, copy_list->GetSize()); + + Value* copy_list_element_0; + ASSERT_TRUE(copy_list->Get(0, ©_list_element_0)); + ASSERT_TRUE(copy_list_element_0); + ASSERT_NE(copy_list_element_0, original_list_element_0); + int copy_list_element_0_value; + ASSERT_TRUE(copy_list_element_0->GetAsInteger(©_list_element_0_value)); + ASSERT_EQ(0, copy_list_element_0_value); + + Value* copy_list_element_1; + ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); + ASSERT_TRUE(copy_list_element_1); + ASSERT_NE(copy_list_element_1, original_list_element_1); + int copy_list_element_1_value; + ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); + ASSERT_EQ(1, copy_list_element_1_value); +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, DeepCopyDeprecated) { + DictionaryValue original_dict; + Value* original_null = Value::CreateNullValue(); original_dict.Set(L"null", original_null); Value* original_bool = Value::CreateBooleanValue(true); original_dict.Set(L"bool", original_bool); @@ -494,6 +774,44 @@ TEST(ValuesTest, Equals) { delete boolean; DictionaryValue dv; + dv.SetBoolean("a", false); + dv.SetInteger("b", 2); + dv.SetReal("c", 2.5); + dv.SetString("d1", "string"); + dv.SetStringFromUTF16("d2", ASCIIToUTF16("http://google.com")); + dv.Set("e", Value::CreateNullValue()); + + DictionaryValue* copy = static_cast<DictionaryValue*>(dv.DeepCopy()); + EXPECT_TRUE(dv.Equals(copy)); + + ListValue* list = new ListValue; + list->Append(Value::CreateNullValue()); + list->Append(new DictionaryValue); + dv.Set("f", list); + + EXPECT_FALSE(dv.Equals(copy)); + copy->Set("f", list->DeepCopy()); + EXPECT_TRUE(dv.Equals(copy)); + + list->Append(Value::CreateBooleanValue(true)); + EXPECT_FALSE(dv.Equals(copy)); + delete copy; +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, EqualsDeprecated) { + Value* null1 = Value::CreateNullValue(); + Value* null2 = Value::CreateNullValue(); + EXPECT_NE(null1, null2); + EXPECT_TRUE(null1->Equals(null2)); + + Value* boolean = Value::CreateBooleanValue(false); + EXPECT_FALSE(null1->Equals(boolean)); + delete null1; + delete null2; + delete boolean; + + DictionaryValue dv; dv.SetBoolean(L"a", false); dv.SetInteger(L"b", 2); dv.SetReal(L"c", 2.5); @@ -521,6 +839,82 @@ TEST(ValuesTest, Equals) { TEST(ValuesTest, RemoveEmptyChildren) { scoped_ptr<DictionaryValue> root(new DictionaryValue); // Remove empty lists and dictionaries. + root->Set("empty_dict", new DictionaryValue); + root->Set("empty_list", new ListValue); + root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_TRUE(root->empty()); + + // Make sure we don't prune too much. + root->SetBoolean("bool", true); + root->Set("empty_dict", new DictionaryValue); + root->SetString("empty_string", ""); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + + // Should do nothing. + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + + // Nested test cases. These should all reduce back to the bool and string + // set above. + { + root->Set("a.b.c.d.e", new DictionaryValue); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + } + { + DictionaryValue* inner = new DictionaryValue; + root->Set("dict_with_emtpy_children", inner); + inner->Set("empty_dict", new DictionaryValue); + inner->Set("empty_list", new ListValue); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + } + { + ListValue* inner = new ListValue; + root->Set("list_with_empty_children", inner); + inner->Append(new DictionaryValue); + inner->Append(new ListValue); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + } + + // Nested with siblings. + { + ListValue* inner = new ListValue; + root->Set("list_with_empty_children", inner); + inner->Append(new DictionaryValue); + inner->Append(new ListValue); + DictionaryValue* inner2 = new DictionaryValue; + root->Set("dict_with_empty_children", inner2); + inner2->Set("empty_dict", new DictionaryValue); + inner2->Set("empty_list", new ListValue); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(2U, root->size()); + } + + // Make sure nested values don't get pruned. + { + ListValue* inner = new ListValue; + root->Set("list_with_empty_children", inner); + ListValue* inner2 = new ListValue; + inner->Append(new DictionaryValue); + inner->Append(inner2); + inner2->Append(Value::CreateStringValue("hello")); + root.reset(root->DeepCopyWithoutEmptyChildren()); + EXPECT_EQ(3U, root->size()); + EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); + EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. + EXPECT_TRUE(inner->GetList(0, &inner2)); + EXPECT_EQ(1U, inner2->GetSize()); + } +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, RemoveEmptyChildrenDeprecated) { + scoped_ptr<DictionaryValue> root(new DictionaryValue); + // Remove empty lists and dictionaries. root->Set(L"empty_dict", new DictionaryValue); root->Set(L"empty_list", new ListValue); root->SetWithoutPathExpansion(L"a.b.c.d.e", new DictionaryValue); @@ -595,6 +989,52 @@ TEST(ValuesTest, RemoveEmptyChildren) { TEST(ValuesTest, MergeDictionary) { scoped_ptr<DictionaryValue> base(new DictionaryValue); + base->SetString("base_key", "base_key_value_base"); + base->SetString("collide_key", "collide_key_value_base"); + DictionaryValue* base_sub_dict = new DictionaryValue; + base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); + base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); + base->Set("sub_dict_key", base_sub_dict); + + scoped_ptr<DictionaryValue> merge(new DictionaryValue); + merge->SetString("merge_key", "merge_key_value_merge"); + merge->SetString("collide_key", "collide_key_value_merge"); + DictionaryValue* merge_sub_dict = new DictionaryValue; + merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge"); + merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge"); + merge->Set("sub_dict_key", merge_sub_dict); + + base->MergeDictionary(merge.get()); + + EXPECT_EQ(4U, base->size()); + std::string base_key_value; + EXPECT_TRUE(base->GetString("base_key", &base_key_value)); + EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved. + std::string collide_key_value; + EXPECT_TRUE(base->GetString("collide_key", &collide_key_value)); + EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced. + std::string merge_key_value; + EXPECT_TRUE(base->GetString("merge_key", &merge_key_value)); + EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in. + + DictionaryValue* res_sub_dict; + EXPECT_TRUE(base->GetDictionary("sub_dict_key", &res_sub_dict)); + EXPECT_EQ(3U, res_sub_dict->size()); + std::string sub_base_key_value; + EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value)); + EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. + std::string sub_collide_key_value; + EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", + &sub_collide_key_value)); + EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. + std::string sub_merge_key_value; + EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); + EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. +} + +// TODO(viettrungluu): deprecate: +TEST(ValuesTest, MergeDictionaryDeprecated) { + scoped_ptr<DictionaryValue> base(new DictionaryValue); base->SetString(L"base_key", "base_key_value_base"); base->SetString(L"collide_key", "collide_key_value_base"); DictionaryValue* base_sub_dict = new DictionaryValue; |