diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 21:49:38 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 21:49:38 +0000 |
commit | d7cae12696b96500c05dd2d430f6238922c20c96 (patch) | |
tree | ecff27b367735535b2a66477f8cd89d3c462a6c0 /base/values_unittest.cc | |
parent | ee2815e28d408216cf94e874825b6bcf76c69083 (diff) | |
download | chromium_src-d7cae12696b96500c05dd2d430f6238922c20c96.zip chromium_src-d7cae12696b96500c05dd2d430f6238922c20c96.tar.gz chromium_src-d7cae12696b96500c05dd2d430f6238922c20c96.tar.bz2 |
Add base to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/values_unittest.cc')
-rw-r--r-- | base/values_unittest.cc | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/base/values_unittest.cc b/base/values_unittest.cc new file mode 100644 index 0000000..1470a0d --- /dev/null +++ b/base/values_unittest.cc @@ -0,0 +1,403 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "base/values.h" +#include "testing/gtest/include/gtest/gtest.h" + +class ValuesTest: public testing::Test { +}; + +TEST(ValuesTest, Basic) { + // Test basic dictionary getting/setting + DictionaryValue settings; + std::wstring homepage = L"http://google.com"; + ASSERT_FALSE( + settings.GetString(L"global.homepage", &homepage)); + ASSERT_EQ(std::wstring(L"http://google.com"), homepage); + + ASSERT_FALSE(settings.Get(L"global", NULL)); + ASSERT_TRUE(settings.Set(L"global", Value::CreateBooleanValue(true))); + ASSERT_TRUE(settings.Get(L"global", NULL)); + ASSERT_TRUE(settings.SetString(L"global.homepage", L"http://scurvy.com")); + ASSERT_TRUE(settings.Get(L"global", NULL)); + homepage = L"http://google.com"; + ASSERT_TRUE(settings.GetString(L"global.homepage", &homepage)); + ASSERT_EQ(std::wstring(L"http://scurvy.com"), homepage); + + // Test storing a dictionary in a list. + ListValue* toolbar_bookmarks; + ASSERT_FALSE( + settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks)); + + toolbar_bookmarks = new ListValue; + settings.Set(L"global.toolbar.bookmarks", toolbar_bookmarks); + ASSERT_TRUE( + settings.GetList(L"global.toolbar.bookmarks", &toolbar_bookmarks)); + + DictionaryValue* new_bookmark = new DictionaryValue; + new_bookmark->SetString(L"name", L"Froogle"); + new_bookmark->SetString(L"url", L"http://froogle.com"); + toolbar_bookmarks->Append(new_bookmark); + + ListValue* bookmark_list; + ASSERT_TRUE(settings.GetList(L"global.toolbar.bookmarks", &bookmark_list)); + DictionaryValue* bookmark; + ASSERT_EQ(1, bookmark_list->GetSize()); + ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); + std::wstring bookmark_name = L"Unnamed"; + ASSERT_TRUE(bookmark->GetString(L"name", &bookmark_name)); + ASSERT_EQ(std::wstring(L"Froogle"), bookmark_name); + std::wstring bookmark_url; + ASSERT_TRUE(bookmark->GetString(L"url", &bookmark_url)); + ASSERT_EQ(std::wstring(L"http://froogle.com"), bookmark_url); +} + +TEST(ValuesTest, BinaryValue) { + char* buffer = NULL; + // Passing a null buffer pointer doesn't yield a BinaryValue + BinaryValue* binary = BinaryValue::Create(buffer, 0); + ASSERT_FALSE(binary); + + // If you want to represent an empty binary value, use a zero-length buffer. + buffer = new char[0]; + ASSERT_TRUE(buffer); + binary = BinaryValue::Create(buffer, 0); + ASSERT_TRUE(binary); + ASSERT_TRUE(binary->GetBuffer()); + ASSERT_EQ(buffer, binary->GetBuffer()); + ASSERT_EQ(0, binary->GetSize()); + delete binary; + binary = NULL; + + // Test the common case of a non-empty buffer + buffer = new char[15]; + binary = BinaryValue::Create(buffer, 15); + ASSERT_TRUE(binary); + ASSERT_TRUE(binary->GetBuffer()); + ASSERT_EQ(buffer, binary->GetBuffer()); + ASSERT_EQ(15, binary->GetSize()); + delete binary; + binary = NULL; + + char stack_buffer[42]; + memset(stack_buffer, '!', 42); + binary = BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42); + ASSERT_TRUE(binary); + ASSERT_TRUE(binary->GetBuffer()); + ASSERT_NE(stack_buffer, binary->GetBuffer()); + ASSERT_EQ(42, binary->GetSize()); + ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize())); + delete binary; +} + +// This is a Value object that allows us to tell if it's been +// properly deleted by modifying the value of external flag on destruction. +class DeletionTestValue : public Value { +public: + DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) { + Init(deletion_flag); // Separate function so that we can use ASSERT_* + } + + void Init(bool* deletion_flag) { + ASSERT_TRUE(deletion_flag); + deletion_flag_ = deletion_flag; + *deletion_flag_ = false; + } + + ~DeletionTestValue() { + *deletion_flag_ = true; + } + +private: + bool* deletion_flag_; +}; + +TEST(ValuesTest, ListDeletion) { + bool deletion_flag = true; + + { + ListValue list; + list.Append(new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + } + EXPECT_TRUE(deletion_flag); + + { + ListValue list; + list.Append(new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + list.Clear(); + EXPECT_TRUE(deletion_flag); + } + + { + ListValue list; + list.Append(new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); + EXPECT_TRUE(deletion_flag); + } +} + +TEST(ValuesTest, ListRemoval) { + bool deletion_flag = true; + Value* removed_item = NULL; + + { + ListValue list; + list.Append(new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + EXPECT_EQ(1, list.GetSize()); + EXPECT_FALSE(list.Remove(-1, &removed_item)); + EXPECT_FALSE(list.Remove(1, &removed_item)); + EXPECT_TRUE(list.Remove(0, &removed_item)); + ASSERT_TRUE(removed_item); + EXPECT_EQ(0, list.GetSize()); + } + EXPECT_FALSE(deletion_flag); + delete removed_item; + removed_item = NULL; + EXPECT_TRUE(deletion_flag); + + { + ListValue list; + list.Append(new DeletionTestValue(&deletion_flag)); + EXPECT_FALSE(deletion_flag); + EXPECT_TRUE(list.Remove(0, NULL)); + EXPECT_TRUE(deletion_flag); + EXPECT_EQ(0, list.GetSize()); + } +} + +TEST(ValuesTest, DictionaryDeletion) { + std::wstring key = L"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); + } +} + +TEST(ValuesTest, DictionaryRemoval) { + std::wstring key = L"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(L"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)); + } +} + +TEST(ValuesTest, DeepCopy) { + 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); + Value* original_int = Value::CreateIntegerValue(42); + original_dict.Set(L"int", original_int); + Value* original_real = Value::CreateRealValue(3.14); + original_dict.Set(L"real", original_real); + Value* original_string = Value::CreateStringValue(L"peek-a-boo"); + original_dict.Set(L"string", original_string); + + char* original_buffer = new char[42]; + memset(original_buffer, '!', 42); + BinaryValue* original_binary = Value::CreateBinaryValue(original_buffer, 42); + original_dict.Set(L"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(L"list", original_list); + + DictionaryValue* copy_dict = + static_cast<DictionaryValue*>(original_dict.DeepCopy()); + ASSERT_TRUE(copy_dict); + ASSERT_NE(copy_dict, &original_dict); + + Value* copy_null = NULL; + ASSERT_TRUE(copy_dict->Get(L"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(L"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(L"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(L"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(L"string", ©_string)); + ASSERT_TRUE(copy_string); + ASSERT_NE(copy_string, original_string); + ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING)); + std::wstring copy_string_value; + ASSERT_TRUE(copy_string->GetAsString(©_string_value)); + ASSERT_EQ(std::wstring(L"peek-a-boo"), copy_string_value); + + Value* copy_binary = NULL; + ASSERT_TRUE(copy_dict->Get(L"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(L"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(2, 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); + + delete copy_dict; +} + +TEST(ValuesTest, Equals) { + 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); + dv.SetString(L"d", L"string"); + dv.Set(L"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(L"f", list); + + EXPECT_FALSE(dv.Equals(copy)); + copy->Set(L"f", list->DeepCopy()); + EXPECT_TRUE(dv.Equals(copy)); + + list->Append(Value::CreateBooleanValue(true)); + EXPECT_FALSE(dv.Equals(copy)); + delete copy; +} |