| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/string16.h" | 8 #include "base/strings/string16.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 12 |
| 13 namespace base { | 13 namespace base { |
| 14 | 14 |
| 15 TEST(ValuesTest, Basic) { | 15 TEST(ValuesTest, Basic) { |
| 16 // Test basic dictionary getting/setting | 16 // Test basic dictionary getting/setting |
| 17 DictionaryValue settings; | 17 DictionaryValue settings; |
| 18 std::string homepage = "http://google.com"; | 18 std::string homepage = "http://google.com"; |
| 19 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); | 19 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); |
| 20 ASSERT_EQ(std::string("http://google.com"), homepage); | 20 ASSERT_EQ(std::string("http://google.com"), homepage); |
| 21 | 21 |
| 22 ASSERT_FALSE(settings.Get("global", NULL)); | 22 ASSERT_FALSE(settings.Get("global", NULL)); |
| 23 settings.Set("global", new FundamentalValue(true)); | 23 settings.SetBoolean("global", true); |
| 24 ASSERT_TRUE(settings.Get("global", NULL)); | 24 ASSERT_TRUE(settings.Get("global", NULL)); |
| 25 settings.SetString("global.homepage", "http://scurvy.com"); | 25 settings.SetString("global.homepage", "http://scurvy.com"); |
| 26 ASSERT_TRUE(settings.Get("global", NULL)); | 26 ASSERT_TRUE(settings.Get("global", NULL)); |
| 27 homepage = "http://google.com"; | 27 homepage = "http://google.com"; |
| 28 ASSERT_TRUE(settings.GetString("global.homepage", &homepage)); | 28 ASSERT_TRUE(settings.GetString("global.homepage", &homepage)); |
| 29 ASSERT_EQ(std::string("http://scurvy.com"), homepage); | 29 ASSERT_EQ(std::string("http://scurvy.com"), homepage); |
| 30 | 30 |
| 31 // Test storing a dictionary in a list. | 31 // Test storing a dictionary in a list. |
| 32 ListValue* toolbar_bookmarks; | 32 ListValue* toolbar_bookmarks; |
| 33 ASSERT_FALSE( | 33 ASSERT_FALSE( |
| 34 settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); | 34 settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); |
| 35 | 35 |
| 36 toolbar_bookmarks = new ListValue; | 36 scoped_ptr<ListValue> new_toolbar_bookmarks(new ListValue); |
| 37 settings.Set("global.toolbar.bookmarks", toolbar_bookmarks); | 37 settings.Set("global.toolbar.bookmarks", new_toolbar_bookmarks.Pass()); |
| 38 ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); | 38 ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks)); |
| 39 | 39 |
| 40 DictionaryValue* new_bookmark = new DictionaryValue; | 40 scoped_ptr<DictionaryValue> new_bookmark(new DictionaryValue); |
| 41 new_bookmark->SetString("name", "Froogle"); | 41 new_bookmark->SetString("name", "Froogle"); |
| 42 new_bookmark->SetString("url", "http://froogle.com"); | 42 new_bookmark->SetString("url", "http://froogle.com"); |
| 43 toolbar_bookmarks->Append(new_bookmark); | 43 toolbar_bookmarks->Append(new_bookmark.Pass()); |
| 44 | 44 |
| 45 ListValue* bookmark_list; | 45 ListValue* bookmark_list; |
| 46 ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list)); | 46 ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list)); |
| 47 DictionaryValue* bookmark; | 47 DictionaryValue* bookmark; |
| 48 ASSERT_EQ(1U, bookmark_list->GetSize()); | 48 ASSERT_EQ(1U, bookmark_list->GetSize()); |
| 49 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); | 49 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); |
| 50 std::string bookmark_name = "Unnamed"; | 50 std::string bookmark_name = "Unnamed"; |
| 51 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); | 51 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); |
| 52 ASSERT_EQ(std::string("Froogle"), bookmark_name); | 52 ASSERT_EQ(std::string("Froogle"), bookmark_name); |
| 53 std::string bookmark_url; | 53 std::string bookmark_url; |
| 54 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); | 54 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); |
| 55 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); | 55 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); |
| 56 } | 56 } |
| 57 | 57 |
| 58 TEST(ValuesTest, List) { | 58 TEST(ValuesTest, List) { |
| 59 scoped_ptr<ListValue> mixed_list(new ListValue()); | 59 scoped_ptr<ListValue> mixed_list(new ListValue()); |
| 60 mixed_list->Set(0, new FundamentalValue(true)); | 60 mixed_list->Set(0, make_scoped_ptr(new FundamentalValue(true))); |
| 61 mixed_list->Set(1, new FundamentalValue(42)); | 61 mixed_list->Set(1, make_scoped_ptr(new FundamentalValue(42))); |
| 62 mixed_list->Set(2, new FundamentalValue(88.8)); | 62 mixed_list->Set(2, make_scoped_ptr(new FundamentalValue(88.8))); |
| 63 mixed_list->Set(3, new StringValue("foo")); | 63 mixed_list->Set(3, make_scoped_ptr(new StringValue("foo"))); |
| 64 ASSERT_EQ(4u, mixed_list->GetSize()); | 64 ASSERT_EQ(4u, mixed_list->GetSize()); |
| 65 | 65 |
| 66 Value *value = NULL; | 66 Value *value = NULL; |
| 67 bool bool_value = false; | 67 bool bool_value = false; |
| 68 int int_value = 0; | 68 int int_value = 0; |
| 69 double double_value = 0.0; | 69 double double_value = 0.0; |
| 70 std::string string_value; | 70 std::string string_value; |
| 71 | 71 |
| 72 ASSERT_FALSE(mixed_list->Get(4, &value)); | 72 ASSERT_FALSE(mixed_list->Get(4, &value)); |
| 73 | 73 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 } | 105 } |
| 106 | 106 |
| 107 TEST(ValuesTest, BinaryValue) { | 107 TEST(ValuesTest, BinaryValue) { |
| 108 // Default constructor creates a BinaryValue with a null buffer and size 0. | 108 // Default constructor creates a BinaryValue with a null buffer and size 0. |
| 109 scoped_ptr<BinaryValue> binary(new BinaryValue()); | 109 scoped_ptr<BinaryValue> binary(new BinaryValue()); |
| 110 ASSERT_TRUE(binary.get()); | 110 ASSERT_TRUE(binary.get()); |
| 111 ASSERT_EQ(NULL, binary->GetBuffer()); | 111 ASSERT_EQ(NULL, binary->GetBuffer()); |
| 112 ASSERT_EQ(0U, binary->GetSize()); | 112 ASSERT_EQ(0U, binary->GetSize()); |
| 113 | 113 |
| 114 // Test the common case of a non-empty buffer | 114 // Test the common case of a non-empty buffer |
| 115 char* buffer = new char[15]; | 115 scoped_ptr<char[]> buffer(new char[15]); |
| 116 binary.reset(new BinaryValue(scoped_ptr<char[]>(buffer), 15)); | 116 char* original_buffer = buffer.get(); |
| 117 binary.reset(new BinaryValue(buffer.Pass(), 15)); |
| 117 ASSERT_TRUE(binary.get()); | 118 ASSERT_TRUE(binary.get()); |
| 118 ASSERT_TRUE(binary->GetBuffer()); | 119 ASSERT_TRUE(binary->GetBuffer()); |
| 119 ASSERT_EQ(buffer, binary->GetBuffer()); | 120 ASSERT_EQ(original_buffer, binary->GetBuffer()); |
| 120 ASSERT_EQ(15U, binary->GetSize()); | 121 ASSERT_EQ(15U, binary->GetSize()); |
| 121 | 122 |
| 122 char stack_buffer[42]; | 123 char stack_buffer[42]; |
| 123 memset(stack_buffer, '!', 42); | 124 memset(stack_buffer, '!', 42); |
| 124 binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42)); | 125 binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42)); |
| 125 ASSERT_TRUE(binary.get()); | 126 ASSERT_TRUE(binary.get()); |
| 126 ASSERT_TRUE(binary->GetBuffer()); | 127 ASSERT_TRUE(binary->GetBuffer()); |
| 127 ASSERT_NE(stack_buffer, binary->GetBuffer()); | 128 ASSERT_NE(stack_buffer, binary->GetBuffer()); |
| 128 ASSERT_EQ(42U, binary->GetSize()); | 129 ASSERT_EQ(42U, binary->GetSize()); |
| 129 ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize())); | 130 ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize())); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 | 188 |
| 188 private: | 189 private: |
| 189 bool* deletion_flag_; | 190 bool* deletion_flag_; |
| 190 }; | 191 }; |
| 191 | 192 |
| 192 TEST(ValuesTest, ListDeletion) { | 193 TEST(ValuesTest, ListDeletion) { |
| 193 bool deletion_flag = true; | 194 bool deletion_flag = true; |
| 194 | 195 |
| 195 { | 196 { |
| 196 ListValue list; | 197 ListValue list; |
| 197 list.Append(new DeletionTestValue(&deletion_flag)); | 198 list.Append(make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 198 EXPECT_FALSE(deletion_flag); | 199 EXPECT_FALSE(deletion_flag); |
| 199 } | 200 } |
| 200 EXPECT_TRUE(deletion_flag); | 201 EXPECT_TRUE(deletion_flag); |
| 201 | 202 |
| 202 { | 203 { |
| 203 ListValue list; | 204 ListValue list; |
| 204 list.Append(new DeletionTestValue(&deletion_flag)); | 205 list.Append(make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 205 EXPECT_FALSE(deletion_flag); | 206 EXPECT_FALSE(deletion_flag); |
| 206 list.Clear(); | 207 list.Clear(); |
| 207 EXPECT_TRUE(deletion_flag); | 208 EXPECT_TRUE(deletion_flag); |
| 208 } | 209 } |
| 209 | 210 |
| 210 { | 211 { |
| 211 ListValue list; | 212 ListValue list; |
| 212 list.Append(new DeletionTestValue(&deletion_flag)); | 213 list.Append(make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 213 EXPECT_FALSE(deletion_flag); | 214 EXPECT_FALSE(deletion_flag); |
| 214 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); | 215 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); |
| 215 EXPECT_TRUE(deletion_flag); | 216 EXPECT_TRUE(deletion_flag); |
| 216 } | 217 } |
| 217 } | 218 } |
| 218 | 219 |
| 219 TEST(ValuesTest, ListRemoval) { | 220 TEST(ValuesTest, ListRemoval) { |
| 220 bool deletion_flag = true; | 221 bool deletion_flag = true; |
| 221 scoped_ptr<Value> removed_item; | 222 scoped_ptr<Value> removed_item; |
| 222 | 223 |
| 223 { | 224 { |
| 224 ListValue list; | 225 ListValue list; |
| 225 list.Append(new DeletionTestValue(&deletion_flag)); | 226 list.Append(make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 226 EXPECT_FALSE(deletion_flag); | 227 EXPECT_FALSE(deletion_flag); |
| 227 EXPECT_EQ(1U, list.GetSize()); | 228 EXPECT_EQ(1U, list.GetSize()); |
| 228 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), | 229 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), |
| 229 &removed_item)); | 230 &removed_item)); |
| 230 EXPECT_FALSE(list.Remove(1, &removed_item)); | 231 EXPECT_FALSE(list.Remove(1, &removed_item)); |
| 231 EXPECT_TRUE(list.Remove(0, &removed_item)); | 232 EXPECT_TRUE(list.Remove(0, &removed_item)); |
| 232 ASSERT_TRUE(removed_item); | 233 ASSERT_TRUE(removed_item); |
| 233 EXPECT_EQ(0U, list.GetSize()); | 234 EXPECT_EQ(0U, list.GetSize()); |
| 234 } | 235 } |
| 235 EXPECT_FALSE(deletion_flag); | 236 EXPECT_FALSE(deletion_flag); |
| 236 removed_item.reset(); | 237 removed_item.reset(); |
| 237 EXPECT_TRUE(deletion_flag); | 238 EXPECT_TRUE(deletion_flag); |
| 238 | 239 |
| 239 { | 240 { |
| 240 ListValue list; | 241 ListValue list; |
| 241 list.Append(new DeletionTestValue(&deletion_flag)); | 242 list.Append(make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 242 EXPECT_FALSE(deletion_flag); | 243 EXPECT_FALSE(deletion_flag); |
| 243 EXPECT_TRUE(list.Remove(0, NULL)); | 244 EXPECT_TRUE(list.Remove(0, NULL)); |
| 244 EXPECT_TRUE(deletion_flag); | 245 EXPECT_TRUE(deletion_flag); |
| 245 EXPECT_EQ(0U, list.GetSize()); | 246 EXPECT_EQ(0U, list.GetSize()); |
| 246 } | 247 } |
| 247 | 248 |
| 248 { | 249 { |
| 249 ListValue list; | 250 ListValue list; |
| 250 DeletionTestValue* value = new DeletionTestValue(&deletion_flag); | 251 scoped_ptr<DeletionTestValue> value(new DeletionTestValue(&deletion_flag)); |
| 251 list.Append(value); | 252 DeletionTestValue* original_value = value.get(); |
| 253 list.Append(value.Pass()); |
| 252 EXPECT_FALSE(deletion_flag); | 254 EXPECT_FALSE(deletion_flag); |
| 253 size_t index = 0; | 255 size_t index = 0; |
| 254 list.Remove(*value, &index); | 256 list.Remove(*original_value, &index); |
| 255 EXPECT_EQ(0U, index); | 257 EXPECT_EQ(0U, index); |
| 256 EXPECT_TRUE(deletion_flag); | 258 EXPECT_TRUE(deletion_flag); |
| 257 EXPECT_EQ(0U, list.GetSize()); | 259 EXPECT_EQ(0U, list.GetSize()); |
| 258 } | 260 } |
| 259 } | 261 } |
| 260 | 262 |
| 261 TEST(ValuesTest, DictionaryDeletion) { | 263 TEST(ValuesTest, DictionaryDeletion) { |
| 262 std::string key = "test"; | 264 std::string key = "test"; |
| 263 bool deletion_flag = true; | 265 bool deletion_flag = true; |
| 264 | 266 |
| 265 { | 267 { |
| 266 DictionaryValue dict; | 268 DictionaryValue dict; |
| 267 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 269 dict.Set(key, make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 268 EXPECT_FALSE(deletion_flag); | 270 EXPECT_FALSE(deletion_flag); |
| 269 } | 271 } |
| 270 EXPECT_TRUE(deletion_flag); | 272 EXPECT_TRUE(deletion_flag); |
| 271 | 273 |
| 272 { | 274 { |
| 273 DictionaryValue dict; | 275 DictionaryValue dict; |
| 274 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 276 dict.Set(key, make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 275 EXPECT_FALSE(deletion_flag); | 277 EXPECT_FALSE(deletion_flag); |
| 276 dict.Clear(); | 278 dict.Clear(); |
| 277 EXPECT_TRUE(deletion_flag); | 279 EXPECT_TRUE(deletion_flag); |
| 278 } | 280 } |
| 279 | 281 |
| 280 { | 282 { |
| 281 DictionaryValue dict; | 283 DictionaryValue dict; |
| 282 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 284 dict.Set(key, make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 283 EXPECT_FALSE(deletion_flag); | 285 EXPECT_FALSE(deletion_flag); |
| 284 dict.Set(key, Value::CreateNullValue()); | 286 dict.Set(key, Value::CreateNullValue()); |
| 285 EXPECT_TRUE(deletion_flag); | 287 EXPECT_TRUE(deletion_flag); |
| 286 } | 288 } |
| 287 } | 289 } |
| 288 | 290 |
| 289 TEST(ValuesTest, DictionaryRemoval) { | 291 TEST(ValuesTest, DictionaryRemoval) { |
| 290 std::string key = "test"; | 292 std::string key = "test"; |
| 291 bool deletion_flag = true; | 293 bool deletion_flag = true; |
| 292 scoped_ptr<Value> removed_item; | 294 scoped_ptr<Value> removed_item; |
| 293 | 295 |
| 294 { | 296 { |
| 295 DictionaryValue dict; | 297 DictionaryValue dict; |
| 296 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 298 dict.Set(key, make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 297 EXPECT_FALSE(deletion_flag); | 299 EXPECT_FALSE(deletion_flag); |
| 298 EXPECT_TRUE(dict.HasKey(key)); | 300 EXPECT_TRUE(dict.HasKey(key)); |
| 299 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); | 301 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); |
| 300 EXPECT_TRUE(dict.Remove(key, &removed_item)); | 302 EXPECT_TRUE(dict.Remove(key, &removed_item)); |
| 301 EXPECT_FALSE(dict.HasKey(key)); | 303 EXPECT_FALSE(dict.HasKey(key)); |
| 302 ASSERT_TRUE(removed_item); | 304 ASSERT_TRUE(removed_item); |
| 303 } | 305 } |
| 304 EXPECT_FALSE(deletion_flag); | 306 EXPECT_FALSE(deletion_flag); |
| 305 removed_item.reset(); | 307 removed_item.reset(); |
| 306 EXPECT_TRUE(deletion_flag); | 308 EXPECT_TRUE(deletion_flag); |
| 307 | 309 |
| 308 { | 310 { |
| 309 DictionaryValue dict; | 311 DictionaryValue dict; |
| 310 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 312 dict.Set(key, make_scoped_ptr(new DeletionTestValue(&deletion_flag))); |
| 311 EXPECT_FALSE(deletion_flag); | 313 EXPECT_FALSE(deletion_flag); |
| 312 EXPECT_TRUE(dict.HasKey(key)); | 314 EXPECT_TRUE(dict.HasKey(key)); |
| 313 EXPECT_TRUE(dict.Remove(key, NULL)); | 315 EXPECT_TRUE(dict.Remove(key, NULL)); |
| 314 EXPECT_TRUE(deletion_flag); | 316 EXPECT_TRUE(deletion_flag); |
| 315 EXPECT_FALSE(dict.HasKey(key)); | 317 EXPECT_FALSE(dict.HasKey(key)); |
| 316 } | 318 } |
| 317 } | 319 } |
| 318 | 320 |
| 319 TEST(ValuesTest, DictionaryWithoutPathExpansion) { | 321 TEST(ValuesTest, DictionaryWithoutPathExpansion) { |
| 320 DictionaryValue dict; | 322 DictionaryValue dict; |
| 321 dict.Set("this.is.expanded", make_scoped_ptr(Value::CreateNullValue())); | 323 dict.Set("this.is.expanded", Value::CreateNullValue()); |
| 322 dict.SetWithoutPathExpansion("this.isnt.expanded", | 324 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); |
| 323 make_scoped_ptr(Value::CreateNullValue())); | |
| 324 | 325 |
| 325 EXPECT_FALSE(dict.HasKey("this.is.expanded")); | 326 EXPECT_FALSE(dict.HasKey("this.is.expanded")); |
| 326 EXPECT_TRUE(dict.HasKey("this")); | 327 EXPECT_TRUE(dict.HasKey("this")); |
| 327 Value* value1; | 328 Value* value1; |
| 328 EXPECT_TRUE(dict.Get("this", &value1)); | 329 EXPECT_TRUE(dict.Get("this", &value1)); |
| 329 DictionaryValue* value2; | 330 DictionaryValue* value2; |
| 330 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2)); | 331 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2)); |
| 331 EXPECT_EQ(value1, value2); | 332 EXPECT_EQ(value1, value2); |
| 332 EXPECT_EQ(1U, value2->size()); | 333 EXPECT_EQ(1U, value2->size()); |
| 333 | 334 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 384 |
| 384 removed_item.reset(); | 385 removed_item.reset(); |
| 385 EXPECT_TRUE(dict.RemovePath("a.long.key.path", &removed_item)); | 386 EXPECT_TRUE(dict.RemovePath("a.long.key.path", &removed_item)); |
| 386 ASSERT_TRUE(removed_item); | 387 ASSERT_TRUE(removed_item); |
| 387 EXPECT_TRUE(removed_item->IsType(base::Value::TYPE_BOOLEAN)); | 388 EXPECT_TRUE(removed_item->IsType(base::Value::TYPE_BOOLEAN)); |
| 388 EXPECT_TRUE(dict.empty()); | 389 EXPECT_TRUE(dict.empty()); |
| 389 } | 390 } |
| 390 | 391 |
| 391 TEST(ValuesTest, DeepCopy) { | 392 TEST(ValuesTest, DeepCopy) { |
| 392 DictionaryValue original_dict; | 393 DictionaryValue original_dict; |
| 393 Value* original_null = Value::CreateNullValue(); | 394 scoped_ptr<Value> scoped_null = Value::CreateNullValue(); |
| 394 original_dict.Set("null", make_scoped_ptr(original_null)); | 395 Value* original_null = scoped_null.get(); |
| 395 FundamentalValue* original_bool = new FundamentalValue(true); | 396 original_dict.Set("null", scoped_null.Pass()); |
| 396 original_dict.Set("bool", make_scoped_ptr(original_bool)); | 397 scoped_ptr<FundamentalValue> scoped_bool(new FundamentalValue(true)); |
| 397 FundamentalValue* original_int = new FundamentalValue(42); | 398 FundamentalValue* original_bool = scoped_bool.get(); |
| 398 original_dict.Set("int", make_scoped_ptr(original_int)); | 399 original_dict.Set("bool", scoped_bool.Pass()); |
| 399 FundamentalValue* original_double = new FundamentalValue(3.14); | 400 scoped_ptr<FundamentalValue> scoped_int(new FundamentalValue(42)); |
| 400 original_dict.Set("double", make_scoped_ptr(original_double)); | 401 FundamentalValue* original_int = scoped_int.get(); |
| 401 StringValue* original_string = new StringValue("hello"); | 402 original_dict.Set("int", scoped_int.Pass()); |
| 402 original_dict.Set("string", make_scoped_ptr(original_string)); | 403 scoped_ptr<FundamentalValue> scoped_double(new FundamentalValue(3.14)); |
| 403 StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16")); | 404 FundamentalValue* original_double = scoped_double.get(); |
| 404 original_dict.Set("string16", make_scoped_ptr(original_string16)); | 405 original_dict.Set("double", scoped_double.Pass()); |
| 406 scoped_ptr<StringValue> scoped_string(new StringValue("hello")); |
| 407 StringValue* original_string = scoped_string.get(); |
| 408 original_dict.Set("string", scoped_string.Pass()); |
| 409 scoped_ptr<StringValue> scoped_string16( |
| 410 new StringValue(ASCIIToUTF16("hello16"))); |
| 411 StringValue* original_string16 = scoped_string16.get(); |
| 412 original_dict.Set("string16", scoped_string16.Pass()); |
| 405 | 413 |
| 406 scoped_ptr<char[]> original_buffer(new char[42]); | 414 scoped_ptr<char[]> original_buffer(new char[42]); |
| 407 memset(original_buffer.get(), '!', 42); | 415 memset(original_buffer.get(), '!', 42); |
| 408 BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42); | 416 scoped_ptr<BinaryValue> scoped_binary( |
| 409 original_dict.Set("binary", original_binary); | 417 new BinaryValue(original_buffer.Pass(), 42)); |
| 418 BinaryValue* original_binary = scoped_binary.get(); |
| 419 original_dict.Set("binary", scoped_binary.Pass()); |
| 410 | 420 |
| 411 ListValue* original_list = new ListValue(); | 421 scoped_ptr<ListValue> scoped_list(new ListValue()); |
| 412 FundamentalValue* original_list_element_0 = new FundamentalValue(0); | 422 Value* original_list = scoped_list.get(); |
| 413 original_list->Append(original_list_element_0); | 423 scoped_ptr<FundamentalValue> scoped_list_element_0(new FundamentalValue(0)); |
| 414 FundamentalValue* original_list_element_1 = new FundamentalValue(1); | 424 Value* original_list_element_0 = scoped_list_element_0.get(); |
| 415 original_list->Append(original_list_element_1); | 425 scoped_list->Append(scoped_list_element_0.Pass()); |
| 416 original_dict.Set("list", make_scoped_ptr(original_list)); | 426 scoped_ptr<FundamentalValue> scoped_list_element_1(new FundamentalValue(1)); |
| 427 Value* original_list_element_1 = scoped_list_element_1.get(); |
| 428 scoped_list->Append(scoped_list_element_1.Pass()); |
| 429 original_dict.Set("list", scoped_list.Pass()); |
| 417 | 430 |
| 418 DictionaryValue* original_nested_dictionary = new DictionaryValue(); | 431 scoped_ptr<DictionaryValue> scoped_nested_dictionary(new DictionaryValue()); |
| 419 original_nested_dictionary->SetString("key", "value"); | 432 Value* original_nested_dictionary = scoped_nested_dictionary.get(); |
| 420 original_dict.Set("dictionary", make_scoped_ptr(original_nested_dictionary)); | 433 scoped_nested_dictionary->SetString("key", "value"); |
| 434 original_dict.Set("dictionary", scoped_nested_dictionary.Pass()); |
| 421 | 435 |
| 422 scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy()); | 436 scoped_ptr<DictionaryValue> copy_dict = original_dict.CreateDeepCopy(); |
| 423 ASSERT_TRUE(copy_dict.get()); | 437 ASSERT_TRUE(copy_dict.get()); |
| 424 ASSERT_NE(copy_dict.get(), &original_dict); | 438 ASSERT_NE(copy_dict.get(), &original_dict); |
| 425 | 439 |
| 426 Value* copy_null = NULL; | 440 Value* copy_null = NULL; |
| 427 ASSERT_TRUE(copy_dict->Get("null", ©_null)); | 441 ASSERT_TRUE(copy_dict->Get("null", ©_null)); |
| 428 ASSERT_TRUE(copy_null); | 442 ASSERT_TRUE(copy_null); |
| 429 ASSERT_NE(copy_null, original_null); | 443 ASSERT_NE(copy_null, original_null); |
| 430 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); | 444 ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL)); |
| 431 | 445 |
| 432 Value* copy_bool = NULL; | 446 Value* copy_bool = NULL; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 ASSERT_TRUE(copy_value); | 536 ASSERT_TRUE(copy_value); |
| 523 ASSERT_NE(copy_value, original_nested_dictionary); | 537 ASSERT_NE(copy_value, original_nested_dictionary); |
| 524 ASSERT_TRUE(copy_value->IsType(Value::TYPE_DICTIONARY)); | 538 ASSERT_TRUE(copy_value->IsType(Value::TYPE_DICTIONARY)); |
| 525 DictionaryValue* copy_nested_dictionary = NULL; | 539 DictionaryValue* copy_nested_dictionary = NULL; |
| 526 ASSERT_TRUE(copy_value->GetAsDictionary(©_nested_dictionary)); | 540 ASSERT_TRUE(copy_value->GetAsDictionary(©_nested_dictionary)); |
| 527 ASSERT_TRUE(copy_nested_dictionary); | 541 ASSERT_TRUE(copy_nested_dictionary); |
| 528 EXPECT_TRUE(copy_nested_dictionary->HasKey("key")); | 542 EXPECT_TRUE(copy_nested_dictionary->HasKey("key")); |
| 529 } | 543 } |
| 530 | 544 |
| 531 TEST(ValuesTest, Equals) { | 545 TEST(ValuesTest, Equals) { |
| 532 Value* null1 = Value::CreateNullValue(); | 546 scoped_ptr<Value> null1(Value::CreateNullValue()); |
| 533 Value* null2 = Value::CreateNullValue(); | 547 scoped_ptr<Value> null2(Value::CreateNullValue()); |
| 534 EXPECT_NE(null1, null2); | 548 EXPECT_NE(null1.get(), null2.get()); |
| 535 EXPECT_TRUE(null1->Equals(null2)); | 549 EXPECT_TRUE(null1->Equals(null2.get())); |
| 536 | 550 |
| 537 Value* boolean = new FundamentalValue(false); | 551 FundamentalValue boolean(false); |
| 538 EXPECT_FALSE(null1->Equals(boolean)); | 552 EXPECT_FALSE(null1->Equals(&boolean)); |
| 539 delete null1; | |
| 540 delete null2; | |
| 541 delete boolean; | |
| 542 | 553 |
| 543 DictionaryValue dv; | 554 DictionaryValue dv; |
| 544 dv.SetBoolean("a", false); | 555 dv.SetBoolean("a", false); |
| 545 dv.SetInteger("b", 2); | 556 dv.SetInteger("b", 2); |
| 546 dv.SetDouble("c", 2.5); | 557 dv.SetDouble("c", 2.5); |
| 547 dv.SetString("d1", "string"); | 558 dv.SetString("d1", "string"); |
| 548 dv.SetString("d2", ASCIIToUTF16("http://google.com")); | 559 dv.SetString("d2", ASCIIToUTF16("http://google.com")); |
| 549 dv.Set("e", make_scoped_ptr(Value::CreateNullValue())); | 560 dv.Set("e", Value::CreateNullValue()); |
| 550 | 561 |
| 551 scoped_ptr<DictionaryValue> copy; | 562 scoped_ptr<DictionaryValue> copy = dv.CreateDeepCopy(); |
| 552 copy.reset(dv.DeepCopy()); | |
| 553 EXPECT_TRUE(dv.Equals(copy.get())); | 563 EXPECT_TRUE(dv.Equals(copy.get())); |
| 554 | 564 |
| 555 ListValue* list = new ListValue; | 565 scoped_ptr<ListValue> list(new ListValue); |
| 566 ListValue* original_list = list.get(); |
| 556 list->Append(Value::CreateNullValue()); | 567 list->Append(Value::CreateNullValue()); |
| 557 list->Append(new DictionaryValue); | 568 list->Append(make_scoped_ptr(new DictionaryValue)); |
| 558 dv.Set("f", make_scoped_ptr(list)); | 569 scoped_ptr<Value> list_copy(list->CreateDeepCopy()); |
| 559 | 570 |
| 571 dv.Set("f", list.Pass()); |
| 560 EXPECT_FALSE(dv.Equals(copy.get())); | 572 EXPECT_FALSE(dv.Equals(copy.get())); |
| 561 copy->Set("f", list->DeepCopy()); | 573 copy->Set("f", list_copy.Pass()); |
| 562 EXPECT_TRUE(dv.Equals(copy.get())); | 574 EXPECT_TRUE(dv.Equals(copy.get())); |
| 563 | 575 |
| 564 list->Append(new FundamentalValue(true)); | 576 original_list->Append(make_scoped_ptr(new FundamentalValue(true))); |
| 565 EXPECT_FALSE(dv.Equals(copy.get())); | 577 EXPECT_FALSE(dv.Equals(copy.get())); |
| 566 | 578 |
| 567 // Check if Equals detects differences in only the keys. | 579 // Check if Equals detects differences in only the keys. |
| 568 copy.reset(dv.DeepCopy()); | 580 copy = dv.CreateDeepCopy(); |
| 569 EXPECT_TRUE(dv.Equals(copy.get())); | 581 EXPECT_TRUE(dv.Equals(copy.get())); |
| 570 copy->Remove("a", NULL); | 582 copy->Remove("a", NULL); |
| 571 copy->SetBoolean("aa", false); | 583 copy->SetBoolean("aa", false); |
| 572 EXPECT_FALSE(dv.Equals(copy.get())); | 584 EXPECT_FALSE(dv.Equals(copy.get())); |
| 573 } | 585 } |
| 574 | 586 |
| 575 TEST(ValuesTest, StaticEquals) { | 587 TEST(ValuesTest, StaticEquals) { |
| 576 scoped_ptr<Value> null1(Value::CreateNullValue()); | 588 scoped_ptr<Value> null1(Value::CreateNullValue()); |
| 577 scoped_ptr<Value> null2(Value::CreateNullValue()); | 589 scoped_ptr<Value> null2(Value::CreateNullValue()); |
| 578 EXPECT_TRUE(Value::Equals(null1.get(), null2.get())); | 590 EXPECT_TRUE(Value::Equals(null1.get(), null2.get())); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 590 | 602 |
| 591 // NULL and Value::CreateNullValue() are intentionally different: We need | 603 // NULL and Value::CreateNullValue() are intentionally different: We need |
| 592 // support for NULL as a return value for "undefined" without caring for | 604 // support for NULL as a return value for "undefined" without caring for |
| 593 // ownership of the pointer. | 605 // ownership of the pointer. |
| 594 EXPECT_FALSE(Value::Equals(null1.get(), NULL)); | 606 EXPECT_FALSE(Value::Equals(null1.get(), NULL)); |
| 595 EXPECT_FALSE(Value::Equals(NULL, null1.get())); | 607 EXPECT_FALSE(Value::Equals(NULL, null1.get())); |
| 596 } | 608 } |
| 597 | 609 |
| 598 TEST(ValuesTest, DeepCopyCovariantReturnTypes) { | 610 TEST(ValuesTest, DeepCopyCovariantReturnTypes) { |
| 599 DictionaryValue original_dict; | 611 DictionaryValue original_dict; |
| 600 Value* original_null = Value::CreateNullValue(); | 612 scoped_ptr<Value> scoped_null(Value::CreateNullValue()); |
| 601 original_dict.Set("null", original_null); | 613 Value* original_null = scoped_null.get(); |
| 602 FundamentalValue* original_bool = new FundamentalValue(true); | 614 original_dict.Set("null", scoped_null.Pass()); |
| 603 original_dict.Set("bool", original_bool); | 615 scoped_ptr<FundamentalValue> scoped_bool(new FundamentalValue(true)); |
| 604 FundamentalValue* original_int = new FundamentalValue(42); | 616 Value* original_bool = scoped_bool.get(); |
| 605 original_dict.Set("int", original_int); | 617 original_dict.Set("bool", scoped_bool.Pass()); |
| 606 FundamentalValue* original_double = new FundamentalValue(3.14); | 618 scoped_ptr<FundamentalValue> scoped_int(new FundamentalValue(42)); |
| 607 original_dict.Set("double", original_double); | 619 Value* original_int = scoped_int.get(); |
| 608 StringValue* original_string = new StringValue("hello"); | 620 original_dict.Set("int", scoped_int.Pass()); |
| 609 original_dict.Set("string", original_string); | 621 scoped_ptr<FundamentalValue> scoped_double(new FundamentalValue(3.14)); |
| 610 StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16")); | 622 Value* original_double = scoped_double.get(); |
| 611 original_dict.Set("string16", original_string16); | 623 original_dict.Set("double", scoped_double.Pass()); |
| 624 scoped_ptr<StringValue> scoped_string(new StringValue("hello")); |
| 625 Value* original_string = scoped_string.get(); |
| 626 original_dict.Set("string", scoped_string.Pass()); |
| 627 scoped_ptr<StringValue> scoped_string16( |
| 628 new StringValue(ASCIIToUTF16("hello16"))); |
| 629 Value* original_string16 = scoped_string16.get(); |
| 630 original_dict.Set("string16", scoped_string16.Pass()); |
| 612 | 631 |
| 613 scoped_ptr<char[]> original_buffer(new char[42]); | 632 scoped_ptr<char[]> original_buffer(new char[42]); |
| 614 memset(original_buffer.get(), '!', 42); | 633 memset(original_buffer.get(), '!', 42); |
| 615 BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42); | 634 scoped_ptr<BinaryValue> scoped_binary( |
| 616 original_dict.Set("binary", original_binary); | 635 new BinaryValue(original_buffer.Pass(), 42)); |
| 636 Value* original_binary = scoped_binary.get(); |
| 637 original_dict.Set("binary", scoped_binary.Pass()); |
| 617 | 638 |
| 618 ListValue* original_list = new ListValue(); | 639 scoped_ptr<ListValue> scoped_list(new ListValue()); |
| 619 FundamentalValue* original_list_element_0 = new FundamentalValue(0); | 640 Value* original_list = scoped_list.get(); |
| 620 original_list->Append(original_list_element_0); | 641 scoped_ptr<FundamentalValue> scoped_list_element_0(new FundamentalValue(0)); |
| 621 FundamentalValue* original_list_element_1 = new FundamentalValue(1); | 642 scoped_list->Append(scoped_list_element_0.Pass()); |
| 622 original_list->Append(original_list_element_1); | 643 scoped_ptr<FundamentalValue> scoped_list_element_1(new FundamentalValue(1)); |
| 623 original_dict.Set("list", original_list); | 644 scoped_list->Append(scoped_list_element_1.Pass()); |
| 645 original_dict.Set("list", scoped_list.Pass()); |
| 624 | 646 |
| 625 Value* original_dict_value = &original_dict; | 647 scoped_ptr<Value> copy_dict = original_dict.CreateDeepCopy(); |
| 626 Value* original_bool_value = original_bool; | 648 scoped_ptr<Value> copy_null = original_null->CreateDeepCopy(); |
| 627 Value* original_int_value = original_int; | 649 scoped_ptr<Value> copy_bool = original_bool->CreateDeepCopy(); |
| 628 Value* original_double_value = original_double; | 650 scoped_ptr<Value> copy_int = original_int->CreateDeepCopy(); |
| 629 Value* original_string_value = original_string; | 651 scoped_ptr<Value> copy_double = original_double->CreateDeepCopy(); |
| 630 Value* original_string16_value = original_string16; | 652 scoped_ptr<Value> copy_string = original_string->CreateDeepCopy(); |
| 631 Value* original_binary_value = original_binary; | 653 scoped_ptr<Value> copy_string16 = original_string16->CreateDeepCopy(); |
| 632 Value* original_list_value = original_list; | 654 scoped_ptr<Value> copy_binary = original_binary->CreateDeepCopy(); |
| 655 scoped_ptr<Value> copy_list = original_list->CreateDeepCopy(); |
| 633 | 656 |
| 634 scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy()); | 657 EXPECT_TRUE(original_dict.Equals(copy_dict.get())); |
| 635 scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy()); | 658 EXPECT_TRUE(original_null->Equals(copy_null.get())); |
| 636 scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy()); | 659 EXPECT_TRUE(original_bool->Equals(copy_bool.get())); |
| 637 scoped_ptr<Value> copy_double_value(original_double_value->DeepCopy()); | 660 EXPECT_TRUE(original_int->Equals(copy_int.get())); |
| 638 scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy()); | 661 EXPECT_TRUE(original_double->Equals(copy_double.get())); |
| 639 scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy()); | 662 EXPECT_TRUE(original_string->Equals(copy_string.get())); |
| 640 scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy()); | 663 EXPECT_TRUE(original_string16->Equals(copy_string16.get())); |
| 641 scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy()); | 664 EXPECT_TRUE(original_binary->Equals(copy_binary.get())); |
| 642 | 665 EXPECT_TRUE(original_list->Equals(copy_list.get())); |
| 643 EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get())); | |
| 644 EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get())); | |
| 645 EXPECT_TRUE(original_int_value->Equals(copy_int_value.get())); | |
| 646 EXPECT_TRUE(original_double_value->Equals(copy_double_value.get())); | |
| 647 EXPECT_TRUE(original_string_value->Equals(copy_string_value.get())); | |
| 648 EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get())); | |
| 649 EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get())); | |
| 650 EXPECT_TRUE(original_list_value->Equals(copy_list_value.get())); | |
| 651 } | 666 } |
| 652 | 667 |
| 653 TEST(ValuesTest, RemoveEmptyChildren) { | 668 TEST(ValuesTest, RemoveEmptyChildren) { |
| 654 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 669 scoped_ptr<DictionaryValue> root(new DictionaryValue); |
| 655 // Remove empty lists and dictionaries. | 670 // Remove empty lists and dictionaries. |
| 656 root->Set("empty_dict", make_scoped_ptr(new DictionaryValue)); | 671 root->Set("empty_dict", make_scoped_ptr(new DictionaryValue)); |
| 657 root->Set("empty_list", make_scoped_ptr(new ListValue)); | 672 root->Set("empty_list", make_scoped_ptr(new ListValue)); |
| 658 root->SetWithoutPathExpansion("a.b.c.d.e", | 673 root->SetWithoutPathExpansion("a.b.c.d.e", |
| 659 make_scoped_ptr(new DictionaryValue)); | 674 make_scoped_ptr(new DictionaryValue)); |
| 660 root.reset(root->DeepCopyWithoutEmptyChildren()); | 675 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 661 EXPECT_TRUE(root->empty()); | 676 EXPECT_TRUE(root->empty()); |
| 662 | 677 |
| 663 // Make sure we don't prune too much. | 678 // Make sure we don't prune too much. |
| 664 root->SetBoolean("bool", true); | 679 root->SetBoolean("bool", true); |
| 665 root->Set("empty_dict", new DictionaryValue); | 680 root->Set("empty_dict", make_scoped_ptr(new DictionaryValue)); |
| 666 root->SetString("empty_string", std::string()); | 681 root->SetString("empty_string", std::string()); |
| 667 root.reset(root->DeepCopyWithoutEmptyChildren()); | 682 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 668 EXPECT_EQ(2U, root->size()); | 683 EXPECT_EQ(2U, root->size()); |
| 669 | 684 |
| 670 // Should do nothing. | 685 // Should do nothing. |
| 671 root.reset(root->DeepCopyWithoutEmptyChildren()); | 686 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 672 EXPECT_EQ(2U, root->size()); | 687 EXPECT_EQ(2U, root->size()); |
| 673 | 688 |
| 674 // Nested test cases. These should all reduce back to the bool and string | 689 // Nested test cases. These should all reduce back to the bool and string |
| 675 // set above. | 690 // set above. |
| 676 { | 691 { |
| 677 root->Set("a.b.c.d.e", new DictionaryValue); | 692 root->Set("a.b.c.d.e", make_scoped_ptr(new DictionaryValue)); |
| 678 root.reset(root->DeepCopyWithoutEmptyChildren()); | 693 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 679 EXPECT_EQ(2U, root->size()); | 694 EXPECT_EQ(2U, root->size()); |
| 680 } | 695 } |
| 681 { | 696 { |
| 682 DictionaryValue* inner = new DictionaryValue; | 697 scoped_ptr<DictionaryValue> inner(new DictionaryValue); |
| 683 root->Set("dict_with_emtpy_children", inner); | 698 inner->Set("empty_dict", make_scoped_ptr(new DictionaryValue)); |
| 684 inner->Set("empty_dict", new DictionaryValue); | 699 inner->Set("empty_list", make_scoped_ptr(new ListValue)); |
| 685 inner->Set("empty_list", new ListValue); | 700 root->Set("dict_with_empty_children", inner.Pass()); |
| 686 root.reset(root->DeepCopyWithoutEmptyChildren()); | 701 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 687 EXPECT_EQ(2U, root->size()); | 702 EXPECT_EQ(2U, root->size()); |
| 688 } | 703 } |
| 689 { | 704 { |
| 690 ListValue* inner = new ListValue; | 705 scoped_ptr<ListValue> inner(new ListValue); |
| 691 root->Set("list_with_empty_children", inner); | 706 inner->Append(make_scoped_ptr(new DictionaryValue)); |
| 692 inner->Append(new DictionaryValue); | 707 inner->Append(make_scoped_ptr(new ListValue)); |
| 693 inner->Append(new ListValue); | 708 root->Set("list_with_empty_children", inner.Pass()); |
| 694 root.reset(root->DeepCopyWithoutEmptyChildren()); | 709 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 695 EXPECT_EQ(2U, root->size()); | 710 EXPECT_EQ(2U, root->size()); |
| 696 } | 711 } |
| 697 | 712 |
| 698 // Nested with siblings. | 713 // Nested with siblings. |
| 699 { | 714 { |
| 700 ListValue* inner = new ListValue; | 715 scoped_ptr<ListValue> inner(new ListValue()); |
| 701 root->Set("list_with_empty_children", inner); | 716 inner->Append(make_scoped_ptr(new DictionaryValue)); |
| 702 inner->Append(new DictionaryValue); | 717 inner->Append(make_scoped_ptr(new ListValue)); |
| 703 inner->Append(new ListValue); | 718 root->Set("list_with_empty_children", inner.Pass()); |
| 704 DictionaryValue* inner2 = new DictionaryValue; | 719 scoped_ptr<DictionaryValue> inner2(new DictionaryValue); |
| 705 root->Set("dict_with_empty_children", inner2); | 720 inner2->Set("empty_dict", make_scoped_ptr(new DictionaryValue)); |
| 706 inner2->Set("empty_dict", new DictionaryValue); | 721 inner2->Set("empty_list", make_scoped_ptr(new ListValue)); |
| 707 inner2->Set("empty_list", new ListValue); | 722 root->Set("dict_with_empty_children", inner2.Pass()); |
| 708 root.reset(root->DeepCopyWithoutEmptyChildren()); | 723 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 709 EXPECT_EQ(2U, root->size()); | 724 EXPECT_EQ(2U, root->size()); |
| 710 } | 725 } |
| 711 | 726 |
| 712 // Make sure nested values don't get pruned. | 727 // Make sure nested values don't get pruned. |
| 713 { | 728 { |
| 714 ListValue* inner = new ListValue; | 729 scoped_ptr<ListValue> inner(new ListValue); |
| 715 root->Set("list_with_empty_children", inner); | 730 scoped_ptr<ListValue> inner2(new ListValue); |
| 716 ListValue* inner2 = new ListValue; | 731 inner2->Append(make_scoped_ptr(new StringValue("hello"))); |
| 717 inner->Append(new DictionaryValue); | 732 inner->Append(make_scoped_ptr(new DictionaryValue)); |
| 718 inner->Append(inner2); | 733 inner->Append(inner2.Pass()); |
| 719 inner2->Append(new StringValue("hello")); | 734 root->Set("list_with_empty_children", inner.Pass()); |
| 720 root.reset(root->DeepCopyWithoutEmptyChildren()); | 735 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 721 EXPECT_EQ(3U, root->size()); | 736 EXPECT_EQ(3U, root->size()); |
| 722 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); | 737 |
| 723 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. | 738 ListValue* inner_value, *inner_value2; |
| 724 EXPECT_TRUE(inner->GetList(0, &inner2)); | 739 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner_value)); |
| 725 EXPECT_EQ(1U, inner2->GetSize()); | 740 EXPECT_EQ(1U, inner_value->GetSize()); // Dictionary was pruned. |
| 741 EXPECT_TRUE(inner_value->GetList(0, &inner_value2)); |
| 742 EXPECT_EQ(1U, inner_value2->GetSize()); |
| 726 } | 743 } |
| 727 } | 744 } |
| 728 | 745 |
| 729 TEST(ValuesTest, MergeDictionary) { | 746 TEST(ValuesTest, MergeDictionary) { |
| 730 scoped_ptr<DictionaryValue> base(new DictionaryValue); | 747 scoped_ptr<DictionaryValue> base(new DictionaryValue); |
| 731 base->SetString("base_key", "base_key_value_base"); | 748 base->SetString("base_key", "base_key_value_base"); |
| 732 base->SetString("collide_key", "collide_key_value_base"); | 749 base->SetString("collide_key", "collide_key_value_base"); |
| 733 DictionaryValue* base_sub_dict = new DictionaryValue; | 750 scoped_ptr<DictionaryValue> base_sub_dict(new DictionaryValue); |
| 734 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); | 751 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); |
| 735 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); | 752 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); |
| 736 base->Set("sub_dict_key", base_sub_dict); | 753 base->Set("sub_dict_key", base_sub_dict.Pass()); |
| 737 | 754 |
| 738 scoped_ptr<DictionaryValue> merge(new DictionaryValue); | 755 scoped_ptr<DictionaryValue> merge(new DictionaryValue); |
| 739 merge->SetString("merge_key", "merge_key_value_merge"); | 756 merge->SetString("merge_key", "merge_key_value_merge"); |
| 740 merge->SetString("collide_key", "collide_key_value_merge"); | 757 merge->SetString("collide_key", "collide_key_value_merge"); |
| 741 DictionaryValue* merge_sub_dict = new DictionaryValue; | 758 scoped_ptr<DictionaryValue> merge_sub_dict(new DictionaryValue); |
| 742 merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge"); | 759 merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge"); |
| 743 merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge"); | 760 merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge"); |
| 744 merge->Set("sub_dict_key", merge_sub_dict); | 761 merge->Set("sub_dict_key", merge_sub_dict.Pass()); |
| 745 | 762 |
| 746 base->MergeDictionary(merge.get()); | 763 base->MergeDictionary(merge.get()); |
| 747 | 764 |
| 748 EXPECT_EQ(4U, base->size()); | 765 EXPECT_EQ(4U, base->size()); |
| 749 std::string base_key_value; | 766 std::string base_key_value; |
| 750 EXPECT_TRUE(base->GetString("base_key", &base_key_value)); | 767 EXPECT_TRUE(base->GetString("base_key", &base_key_value)); |
| 751 EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved. | 768 EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved. |
| 752 std::string collide_key_value; | 769 std::string collide_key_value; |
| 753 EXPECT_TRUE(base->GetString("collide_key", &collide_key_value)); | 770 EXPECT_TRUE(base->GetString("collide_key", &collide_key_value)); |
| 754 EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced. | 771 EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 765 std::string sub_collide_key_value; | 782 std::string sub_collide_key_value; |
| 766 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", | 783 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", |
| 767 &sub_collide_key_value)); | 784 &sub_collide_key_value)); |
| 768 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | 785 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. |
| 769 std::string sub_merge_key_value; | 786 std::string sub_merge_key_value; |
| 770 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); | 787 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); |
| 771 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | 788 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. |
| 772 } | 789 } |
| 773 | 790 |
| 774 TEST(ValuesTest, MergeDictionaryDeepCopy) { | 791 TEST(ValuesTest, MergeDictionaryDeepCopy) { |
| 775 DictionaryValue* child = new DictionaryValue; | 792 scoped_ptr<DictionaryValue> child(new DictionaryValue); |
| 793 DictionaryValue* original_child = child.get(); |
| 776 child->SetString("test", "value"); | 794 child->SetString("test", "value"); |
| 777 EXPECT_EQ(1U, child->size()); | 795 EXPECT_EQ(1U, child->size()); |
| 778 | 796 |
| 779 std::string value; | 797 std::string value; |
| 780 EXPECT_TRUE(child->GetString("test", &value)); | 798 EXPECT_TRUE(child->GetString("test", &value)); |
| 781 EXPECT_EQ("value", value); | 799 EXPECT_EQ("value", value); |
| 782 | 800 |
| 783 scoped_ptr<DictionaryValue> base(new DictionaryValue); | 801 scoped_ptr<DictionaryValue> base(new DictionaryValue); |
| 784 base->Set("dict", child); | 802 base->Set("dict", child.Pass()); |
| 785 EXPECT_EQ(1U, base->size()); | 803 EXPECT_EQ(1U, base->size()); |
| 786 | 804 |
| 787 DictionaryValue* ptr; | 805 DictionaryValue* ptr; |
| 788 EXPECT_TRUE(base->GetDictionary("dict", &ptr)); | 806 EXPECT_TRUE(base->GetDictionary("dict", &ptr)); |
| 789 EXPECT_EQ(child, ptr); | 807 EXPECT_EQ(original_child, ptr); |
| 790 | 808 |
| 791 scoped_ptr<DictionaryValue> merged(new DictionaryValue); | 809 scoped_ptr<DictionaryValue> merged(new DictionaryValue); |
| 792 merged->MergeDictionary(base.get()); | 810 merged->MergeDictionary(base.get()); |
| 793 EXPECT_EQ(1U, merged->size()); | 811 EXPECT_EQ(1U, merged->size()); |
| 794 EXPECT_TRUE(merged->GetDictionary("dict", &ptr)); | 812 EXPECT_TRUE(merged->GetDictionary("dict", &ptr)); |
| 795 EXPECT_NE(child, ptr); | 813 EXPECT_NE(original_child, ptr); |
| 796 EXPECT_TRUE(ptr->GetString("test", &value)); | 814 EXPECT_TRUE(ptr->GetString("test", &value)); |
| 797 EXPECT_EQ("value", value); | 815 EXPECT_EQ("value", value); |
| 798 | 816 |
| 799 child->SetString("test", "overwrite"); | 817 original_child->SetString("test", "overwrite"); |
| 800 base.reset(); | 818 base.reset(); |
| 801 EXPECT_TRUE(ptr->GetString("test", &value)); | 819 EXPECT_TRUE(ptr->GetString("test", &value)); |
| 802 EXPECT_EQ("value", value); | 820 EXPECT_EQ("value", value); |
| 803 } | 821 } |
| 804 | 822 |
| 805 TEST(ValuesTest, DictionaryIterator) { | 823 TEST(ValuesTest, DictionaryIterator) { |
| 806 DictionaryValue dict; | 824 DictionaryValue dict; |
| 807 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { | 825 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { |
| 808 ADD_FAILURE(); | 826 ADD_FAILURE(); |
| 809 } | 827 } |
| 810 | 828 |
| 811 StringValue value1("value1"); | 829 StringValue value1("value1"); |
| 812 dict.Set("key1", value1.DeepCopy()); | 830 dict.Set("key1", value1.CreateDeepCopy()); |
| 813 bool seen1 = false; | 831 bool seen1 = false; |
| 814 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { | 832 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { |
| 815 EXPECT_FALSE(seen1); | 833 EXPECT_FALSE(seen1); |
| 816 EXPECT_EQ("key1", it.key()); | 834 EXPECT_EQ("key1", it.key()); |
| 817 EXPECT_TRUE(value1.Equals(&it.value())); | 835 EXPECT_TRUE(value1.Equals(&it.value())); |
| 818 seen1 = true; | 836 seen1 = true; |
| 819 } | 837 } |
| 820 EXPECT_TRUE(seen1); | 838 EXPECT_TRUE(seen1); |
| 821 | 839 |
| 822 StringValue value2("value2"); | 840 StringValue value2("value2"); |
| 823 dict.Set("key2", value2.DeepCopy()); | 841 dict.Set("key2", value2.CreateDeepCopy()); |
| 824 bool seen2 = seen1 = false; | 842 bool seen2 = seen1 = false; |
| 825 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { | 843 for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { |
| 826 if (it.key() == "key1") { | 844 if (it.key() == "key1") { |
| 827 EXPECT_FALSE(seen1); | 845 EXPECT_FALSE(seen1); |
| 828 EXPECT_TRUE(value1.Equals(&it.value())); | 846 EXPECT_TRUE(value1.Equals(&it.value())); |
| 829 seen1 = true; | 847 seen1 = true; |
| 830 } else if (it.key() == "key2") { | 848 } else if (it.key() == "key2") { |
| 831 EXPECT_FALSE(seen2); | 849 EXPECT_FALSE(seen2); |
| 832 EXPECT_TRUE(value2.Equals(&it.value())); | 850 EXPECT_TRUE(value2.Equals(&it.value())); |
| 833 seen2 = true; | 851 seen2 = true; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 846 ListValue main_list; | 864 ListValue main_list; |
| 847 | 865 |
| 848 FundamentalValue bool_value(false); | 866 FundamentalValue bool_value(false); |
| 849 FundamentalValue int_value(1234); | 867 FundamentalValue int_value(1234); |
| 850 FundamentalValue double_value(12.34567); | 868 FundamentalValue double_value(12.34567); |
| 851 StringValue string_value("foo"); | 869 StringValue string_value("foo"); |
| 852 BinaryValue binary_value; | 870 BinaryValue binary_value; |
| 853 DictionaryValue dict_value; | 871 DictionaryValue dict_value; |
| 854 ListValue list_value; | 872 ListValue list_value; |
| 855 | 873 |
| 856 main_dict.Set("bool", bool_value.DeepCopy()); | 874 main_dict.Set("bool", bool_value.CreateDeepCopy()); |
| 857 main_dict.Set("int", int_value.DeepCopy()); | 875 main_dict.Set("int", int_value.CreateDeepCopy()); |
| 858 main_dict.Set("double", double_value.DeepCopy()); | 876 main_dict.Set("double", double_value.CreateDeepCopy()); |
| 859 main_dict.Set("string", string_value.DeepCopy()); | 877 main_dict.Set("string", string_value.CreateDeepCopy()); |
| 860 main_dict.Set("binary", binary_value.DeepCopy()); | 878 main_dict.Set("binary", binary_value.CreateDeepCopy()); |
| 861 main_dict.Set("dict", dict_value.DeepCopy()); | 879 main_dict.Set("dict", dict_value.CreateDeepCopy()); |
| 862 main_dict.Set("list", list_value.DeepCopy()); | 880 main_dict.Set("list", list_value.CreateDeepCopy()); |
| 863 | 881 |
| 864 main_list.Append(bool_value.DeepCopy()); | 882 main_list.Append(bool_value.CreateDeepCopy()); |
| 865 main_list.Append(int_value.DeepCopy()); | 883 main_list.Append(int_value.CreateDeepCopy()); |
| 866 main_list.Append(double_value.DeepCopy()); | 884 main_list.Append(double_value.CreateDeepCopy()); |
| 867 main_list.Append(string_value.DeepCopy()); | 885 main_list.Append(string_value.CreateDeepCopy()); |
| 868 main_list.Append(binary_value.DeepCopy()); | 886 main_list.Append(binary_value.CreateDeepCopy()); |
| 869 main_list.Append(dict_value.DeepCopy()); | 887 main_list.Append(dict_value.CreateDeepCopy()); |
| 870 main_list.Append(list_value.DeepCopy()); | 888 main_list.Append(list_value.CreateDeepCopy()); |
| 871 | 889 |
| 872 EXPECT_TRUE(main_dict.Get("bool", NULL)); | 890 EXPECT_TRUE(main_dict.Get("bool", NULL)); |
| 873 EXPECT_TRUE(main_dict.Get("int", NULL)); | 891 EXPECT_TRUE(main_dict.Get("int", NULL)); |
| 874 EXPECT_TRUE(main_dict.Get("double", NULL)); | 892 EXPECT_TRUE(main_dict.Get("double", NULL)); |
| 875 EXPECT_TRUE(main_dict.Get("string", NULL)); | 893 EXPECT_TRUE(main_dict.Get("string", NULL)); |
| 876 EXPECT_TRUE(main_dict.Get("binary", NULL)); | 894 EXPECT_TRUE(main_dict.Get("binary", NULL)); |
| 877 EXPECT_TRUE(main_dict.Get("dict", NULL)); | 895 EXPECT_TRUE(main_dict.Get("dict", NULL)); |
| 878 EXPECT_TRUE(main_dict.Get("list", NULL)); | 896 EXPECT_TRUE(main_dict.Get("list", NULL)); |
| 879 EXPECT_FALSE(main_dict.Get("DNE", NULL)); | 897 EXPECT_FALSE(main_dict.Get("DNE", NULL)); |
| 880 | 898 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1118 EXPECT_FALSE(main_list.GetList(1, NULL)); | 1136 EXPECT_FALSE(main_list.GetList(1, NULL)); |
| 1119 EXPECT_FALSE(main_list.GetList(2, NULL)); | 1137 EXPECT_FALSE(main_list.GetList(2, NULL)); |
| 1120 EXPECT_FALSE(main_list.GetList(3, NULL)); | 1138 EXPECT_FALSE(main_list.GetList(3, NULL)); |
| 1121 EXPECT_FALSE(main_list.GetList(4, NULL)); | 1139 EXPECT_FALSE(main_list.GetList(4, NULL)); |
| 1122 EXPECT_FALSE(main_list.GetList(5, NULL)); | 1140 EXPECT_FALSE(main_list.GetList(5, NULL)); |
| 1123 EXPECT_TRUE(main_list.GetList(6, NULL)); | 1141 EXPECT_TRUE(main_list.GetList(6, NULL)); |
| 1124 EXPECT_FALSE(main_list.GetList(7, NULL)); | 1142 EXPECT_FALSE(main_list.GetList(7, NULL)); |
| 1125 } | 1143 } |
| 1126 | 1144 |
| 1127 } // namespace base | 1145 } // namespace base |
| OLD | NEW |