summaryrefslogtreecommitdiffstats
path: root/base/values_unittest.cc
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 21:49:38 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 21:49:38 +0000
commitd7cae12696b96500c05dd2d430f6238922c20c96 (patch)
treeecff27b367735535b2a66477f8cd89d3c462a6c0 /base/values_unittest.cc
parentee2815e28d408216cf94e874825b6bcf76c69083 (diff)
downloadchromium_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.cc403
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", &copy_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", &copy_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(&copy_bool_value));
+ ASSERT_TRUE(copy_bool_value);
+
+ Value* copy_int = NULL;
+ ASSERT_TRUE(copy_dict->Get(L"int", &copy_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(&copy_int_value));
+ ASSERT_EQ(42, copy_int_value);
+
+ Value* copy_real = NULL;
+ ASSERT_TRUE(copy_dict->Get(L"real", &copy_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(&copy_real_value));
+ ASSERT_EQ(3.14, copy_real_value);
+
+ Value* copy_string = NULL;
+ ASSERT_TRUE(copy_dict->Get(L"string", &copy_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(&copy_string_value));
+ ASSERT_EQ(std::wstring(L"peek-a-boo"), copy_string_value);
+
+ Value* copy_binary = NULL;
+ ASSERT_TRUE(copy_dict->Get(L"binary", &copy_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", &copy_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, &copy_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(&copy_list_element_0_value));
+ ASSERT_EQ(0, copy_list_element_0_value);
+
+ Value* copy_list_element_1;
+ ASSERT_TRUE(copy_list->Get(1, &copy_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(&copy_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;
+}