| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/string16.h" | 9 #include "base/string16.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| 11 #include "base/values.h" | 11 #include "base/values.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 class ValuesTest: public testing::Test { | 14 class ValuesTest: public testing::Test { |
| 15 protected: |
| 16 void CompareDictionariesAndCheckResult( |
| 17 const DictionaryValue* dict1, |
| 18 const DictionaryValue* dict2, |
| 19 const char* expected_paths[], |
| 20 size_t expected_paths_count) { |
| 21 std::vector<std::string> differing_paths; |
| 22 std::vector<std::string> expected_paths_vector(expected_paths, |
| 23 expected_paths+expected_paths_count); |
| 24 // All comparisons should be commutative, check dict1 against dict2 |
| 25 // and vice-versa. |
| 26 dict1->GetDifferingPaths(dict2, &differing_paths); |
| 27 ASSERT_EQ(expected_paths_count, differing_paths.size()); |
| 28 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), |
| 29 expected_paths_vector.begin())); |
| 30 dict2->GetDifferingPaths(dict1, &differing_paths); |
| 31 ASSERT_EQ(expected_paths_count, differing_paths.size()); |
| 32 EXPECT_TRUE(equal(differing_paths.begin(), differing_paths.end(), |
| 33 expected_paths_vector.begin())); |
| 34 } |
| 15 }; | 35 }; |
| 16 | 36 |
| 17 // TODO(viettrungluu): I changed the keys for DictionaryValue from std::wstring | 37 // TODO(viettrungluu): I changed the keys for DictionaryValue from std::wstring |
| 18 // to std::string. I've temporarily kept the old methods taking std::wstring for | 38 // to std::string. I've temporarily kept the old methods taking std::wstring for |
| 19 // compatibility. The ...Deprecated tests are the old tests which use these | 39 // compatibility. The ...Deprecated tests are the old tests which use these |
| 20 // methods, and remain to test compatibility. They will be removed once the old | 40 // methods, and remain to test compatibility. They will be removed once the old |
| 21 // methods are removed. There are also parts of tests marked DEPRECATED which | 41 // methods are removed. There are also parts of tests marked DEPRECATED which |
| 22 // are to be deleted. | 42 // are to be deleted. |
| 23 | 43 |
| 24 TEST(ValuesTest, Basic) { | 44 TEST_F(ValuesTest, Basic) { |
| 25 // Test basic dictionary getting/setting | 45 // Test basic dictionary getting/setting |
| 26 DictionaryValue settings; | 46 DictionaryValue settings; |
| 27 std::string homepage = "http://google.com"; | 47 std::string homepage = "http://google.com"; |
| 28 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); | 48 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); |
| 29 ASSERT_EQ(std::string("http://google.com"), homepage); | 49 ASSERT_EQ(std::string("http://google.com"), homepage); |
| 30 | 50 |
| 31 ASSERT_FALSE(settings.Get("global", NULL)); | 51 ASSERT_FALSE(settings.Get("global", NULL)); |
| 32 settings.Set("global", Value::CreateBooleanValue(true)); | 52 settings.Set("global", Value::CreateBooleanValue(true)); |
| 33 ASSERT_TRUE(settings.Get("global", NULL)); | 53 ASSERT_TRUE(settings.Get("global", NULL)); |
| 34 settings.SetString("global.homepage", "http://scurvy.com"); | 54 settings.SetString("global.homepage", "http://scurvy.com"); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 58 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); | 78 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); |
| 59 std::string bookmark_name = "Unnamed"; | 79 std::string bookmark_name = "Unnamed"; |
| 60 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); | 80 ASSERT_TRUE(bookmark->GetString("name", &bookmark_name)); |
| 61 ASSERT_EQ(std::string("Froogle"), bookmark_name); | 81 ASSERT_EQ(std::string("Froogle"), bookmark_name); |
| 62 std::string bookmark_url; | 82 std::string bookmark_url; |
| 63 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); | 83 ASSERT_TRUE(bookmark->GetString("url", &bookmark_url)); |
| 64 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); | 84 ASSERT_EQ(std::string("http://froogle.com"), bookmark_url); |
| 65 } | 85 } |
| 66 | 86 |
| 67 // TODO(viettrungluu): deprecate: | 87 // TODO(viettrungluu): deprecate: |
| 68 TEST(ValuesTest, BasicDeprecated) { | 88 TEST_F(ValuesTest, BasicDeprecated) { |
| 69 // Test basic dictionary getting/setting | 89 // Test basic dictionary getting/setting |
| 70 DictionaryValue settings; | 90 DictionaryValue settings; |
| 71 std::wstring homepage = L"http://google.com"; | 91 std::wstring homepage = L"http://google.com"; |
| 72 ASSERT_FALSE( | 92 ASSERT_FALSE( |
| 73 settings.GetString(L"global.homepage", &homepage)); | 93 settings.GetString(L"global.homepage", &homepage)); |
| 74 ASSERT_EQ(std::wstring(L"http://google.com"), homepage); | 94 ASSERT_EQ(std::wstring(L"http://google.com"), homepage); |
| 75 | 95 |
| 76 ASSERT_FALSE(settings.Get(L"global", NULL)); | 96 ASSERT_FALSE(settings.Get(L"global", NULL)); |
| 77 settings.Set(L"global", Value::CreateBooleanValue(true)); | 97 settings.Set(L"global", Value::CreateBooleanValue(true)); |
| 78 ASSERT_TRUE(settings.Get(L"global", NULL)); | 98 ASSERT_TRUE(settings.Get(L"global", NULL)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 103 ASSERT_EQ(1U, bookmark_list->GetSize()); | 123 ASSERT_EQ(1U, bookmark_list->GetSize()); |
| 104 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); | 124 ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark)); |
| 105 std::wstring bookmark_name = L"Unnamed"; | 125 std::wstring bookmark_name = L"Unnamed"; |
| 106 ASSERT_TRUE(bookmark->GetString(L"name", &bookmark_name)); | 126 ASSERT_TRUE(bookmark->GetString(L"name", &bookmark_name)); |
| 107 ASSERT_EQ(std::wstring(L"Froogle"), bookmark_name); | 127 ASSERT_EQ(std::wstring(L"Froogle"), bookmark_name); |
| 108 std::wstring bookmark_url; | 128 std::wstring bookmark_url; |
| 109 ASSERT_TRUE(bookmark->GetString(L"url", &bookmark_url)); | 129 ASSERT_TRUE(bookmark->GetString(L"url", &bookmark_url)); |
| 110 ASSERT_EQ(std::wstring(L"http://froogle.com"), bookmark_url); | 130 ASSERT_EQ(std::wstring(L"http://froogle.com"), bookmark_url); |
| 111 } | 131 } |
| 112 | 132 |
| 113 TEST(ValuesTest, List) { | 133 TEST_F(ValuesTest, List) { |
| 114 scoped_ptr<ListValue> mixed_list(new ListValue()); | 134 scoped_ptr<ListValue> mixed_list(new ListValue()); |
| 115 mixed_list->Set(0, Value::CreateBooleanValue(true)); | 135 mixed_list->Set(0, Value::CreateBooleanValue(true)); |
| 116 mixed_list->Set(1, Value::CreateIntegerValue(42)); | 136 mixed_list->Set(1, Value::CreateIntegerValue(42)); |
| 117 mixed_list->Set(2, Value::CreateRealValue(88.8)); | 137 mixed_list->Set(2, Value::CreateRealValue(88.8)); |
| 118 mixed_list->Set(3, Value::CreateStringValue("foo")); | 138 mixed_list->Set(3, Value::CreateStringValue("foo")); |
| 119 ASSERT_EQ(4u, mixed_list->GetSize()); | 139 ASSERT_EQ(4u, mixed_list->GetSize()); |
| 120 | 140 |
| 121 Value *value = NULL; | 141 Value *value = NULL; |
| 122 bool bool_value = false; | 142 bool bool_value = false; |
| 123 int int_value = 0; | 143 int int_value = 0; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 138 ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value)); | 158 ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value)); |
| 139 ASSERT_EQ(true, bool_value); | 159 ASSERT_EQ(true, bool_value); |
| 140 ASSERT_TRUE(mixed_list->GetInteger(1, &int_value)); | 160 ASSERT_TRUE(mixed_list->GetInteger(1, &int_value)); |
| 141 ASSERT_EQ(42, int_value); | 161 ASSERT_EQ(42, int_value); |
| 142 ASSERT_TRUE(mixed_list->GetReal(2, &double_value)); | 162 ASSERT_TRUE(mixed_list->GetReal(2, &double_value)); |
| 143 ASSERT_EQ(88.8, double_value); | 163 ASSERT_EQ(88.8, double_value); |
| 144 ASSERT_TRUE(mixed_list->GetString(3, &string_value)); | 164 ASSERT_TRUE(mixed_list->GetString(3, &string_value)); |
| 145 ASSERT_EQ("foo", string_value); | 165 ASSERT_EQ("foo", string_value); |
| 146 } | 166 } |
| 147 | 167 |
| 148 TEST(ValuesTest, BinaryValue) { | 168 TEST_F(ValuesTest, BinaryValue) { |
| 149 char* buffer = NULL; | 169 char* buffer = NULL; |
| 150 // Passing a null buffer pointer doesn't yield a BinaryValue | 170 // Passing a null buffer pointer doesn't yield a BinaryValue |
| 151 scoped_ptr<BinaryValue> binary(BinaryValue::Create(buffer, 0)); | 171 scoped_ptr<BinaryValue> binary(BinaryValue::Create(buffer, 0)); |
| 152 ASSERT_FALSE(binary.get()); | 172 ASSERT_FALSE(binary.get()); |
| 153 | 173 |
| 154 // If you want to represent an empty binary value, use a zero-length buffer. | 174 // If you want to represent an empty binary value, use a zero-length buffer. |
| 155 buffer = new char[1]; | 175 buffer = new char[1]; |
| 156 ASSERT_TRUE(buffer); | 176 ASSERT_TRUE(buffer); |
| 157 binary.reset(BinaryValue::Create(buffer, 0)); | 177 binary.reset(BinaryValue::Create(buffer, 0)); |
| 158 ASSERT_TRUE(binary.get()); | 178 ASSERT_TRUE(binary.get()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 171 char stack_buffer[42]; | 191 char stack_buffer[42]; |
| 172 memset(stack_buffer, '!', 42); | 192 memset(stack_buffer, '!', 42); |
| 173 binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42)); | 193 binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42)); |
| 174 ASSERT_TRUE(binary.get()); | 194 ASSERT_TRUE(binary.get()); |
| 175 ASSERT_TRUE(binary->GetBuffer()); | 195 ASSERT_TRUE(binary->GetBuffer()); |
| 176 ASSERT_NE(stack_buffer, binary->GetBuffer()); | 196 ASSERT_NE(stack_buffer, binary->GetBuffer()); |
| 177 ASSERT_EQ(42U, binary->GetSize()); | 197 ASSERT_EQ(42U, binary->GetSize()); |
| 178 ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize())); | 198 ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize())); |
| 179 } | 199 } |
| 180 | 200 |
| 181 TEST(ValuesTest, StringValue) { | 201 TEST_F(ValuesTest, StringValue) { |
| 182 // Test overloaded CreateStringValue. | 202 // Test overloaded CreateStringValue. |
| 183 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow")); | 203 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow")); |
| 184 ASSERT_TRUE(narrow_value.get()); | 204 ASSERT_TRUE(narrow_value.get()); |
| 185 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING)); | 205 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING)); |
| 186 scoped_ptr<Value> utf16_value( | 206 scoped_ptr<Value> utf16_value( |
| 187 Value::CreateStringValue(ASCIIToUTF16("utf16"))); | 207 Value::CreateStringValue(ASCIIToUTF16("utf16"))); |
| 188 ASSERT_TRUE(utf16_value.get()); | 208 ASSERT_TRUE(utf16_value.get()); |
| 189 ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING)); | 209 ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING)); |
| 190 | 210 |
| 191 // Test overloaded GetString. | 211 // Test overloaded GetString. |
| 192 std::string narrow = "http://google.com"; | 212 std::string narrow = "http://google.com"; |
| 193 string16 utf16 = ASCIIToUTF16("http://google.com"); | 213 string16 utf16 = ASCIIToUTF16("http://google.com"); |
| 194 ASSERT_TRUE(narrow_value->GetAsString(&narrow)); | 214 ASSERT_TRUE(narrow_value->GetAsString(&narrow)); |
| 195 ASSERT_TRUE(narrow_value->GetAsString(&utf16)); | 215 ASSERT_TRUE(narrow_value->GetAsString(&utf16)); |
| 196 ASSERT_EQ(std::string("narrow"), narrow); | 216 ASSERT_EQ(std::string("narrow"), narrow); |
| 197 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16); | 217 ASSERT_EQ(ASCIIToUTF16("narrow"), utf16); |
| 198 | 218 |
| 199 ASSERT_TRUE(utf16_value->GetAsString(&narrow)); | 219 ASSERT_TRUE(utf16_value->GetAsString(&narrow)); |
| 200 ASSERT_TRUE(utf16_value->GetAsString(&utf16)); | 220 ASSERT_TRUE(utf16_value->GetAsString(&utf16)); |
| 201 ASSERT_EQ(std::string("utf16"), narrow); | 221 ASSERT_EQ(std::string("utf16"), narrow); |
| 202 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); | 222 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); |
| 203 } | 223 } |
| 204 | 224 |
| 205 // TODO(viettrungluu): deprecate: | 225 // TODO(viettrungluu): deprecate: |
| 206 TEST(ValuesTest, StringValueDeprecated) { | 226 TEST_F(ValuesTest, StringValueDeprecated) { |
| 207 // Test overloaded CreateStringValue. | 227 // Test overloaded CreateStringValue. |
| 208 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow")); | 228 scoped_ptr<Value> narrow_value(Value::CreateStringValue("narrow")); |
| 209 ASSERT_TRUE(narrow_value.get()); | 229 ASSERT_TRUE(narrow_value.get()); |
| 210 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING)); | 230 ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING)); |
| 211 scoped_ptr<Value> wide_value(Value::CreateStringValue(L"wide")); | 231 scoped_ptr<Value> wide_value(Value::CreateStringValue(L"wide")); |
| 212 ASSERT_TRUE(wide_value.get()); | 232 ASSERT_TRUE(wide_value.get()); |
| 213 ASSERT_TRUE(wide_value->IsType(Value::TYPE_STRING)); | 233 ASSERT_TRUE(wide_value->IsType(Value::TYPE_STRING)); |
| 214 scoped_ptr<Value> utf16_value( | 234 scoped_ptr<Value> utf16_value( |
| 215 Value::CreateStringValue(ASCIIToUTF16("utf16"))); | 235 Value::CreateStringValue(ASCIIToUTF16("utf16"))); |
| 216 ASSERT_TRUE(utf16_value.get()); | 236 ASSERT_TRUE(utf16_value.get()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 } | 277 } |
| 258 | 278 |
| 259 ~DeletionTestValue() { | 279 ~DeletionTestValue() { |
| 260 *deletion_flag_ = true; | 280 *deletion_flag_ = true; |
| 261 } | 281 } |
| 262 | 282 |
| 263 private: | 283 private: |
| 264 bool* deletion_flag_; | 284 bool* deletion_flag_; |
| 265 }; | 285 }; |
| 266 | 286 |
| 267 TEST(ValuesTest, ListDeletion) { | 287 TEST_F(ValuesTest, ListDeletion) { |
| 268 bool deletion_flag = true; | 288 bool deletion_flag = true; |
| 269 | 289 |
| 270 { | 290 { |
| 271 ListValue list; | 291 ListValue list; |
| 272 list.Append(new DeletionTestValue(&deletion_flag)); | 292 list.Append(new DeletionTestValue(&deletion_flag)); |
| 273 EXPECT_FALSE(deletion_flag); | 293 EXPECT_FALSE(deletion_flag); |
| 274 } | 294 } |
| 275 EXPECT_TRUE(deletion_flag); | 295 EXPECT_TRUE(deletion_flag); |
| 276 | 296 |
| 277 { | 297 { |
| 278 ListValue list; | 298 ListValue list; |
| 279 list.Append(new DeletionTestValue(&deletion_flag)); | 299 list.Append(new DeletionTestValue(&deletion_flag)); |
| 280 EXPECT_FALSE(deletion_flag); | 300 EXPECT_FALSE(deletion_flag); |
| 281 list.Clear(); | 301 list.Clear(); |
| 282 EXPECT_TRUE(deletion_flag); | 302 EXPECT_TRUE(deletion_flag); |
| 283 } | 303 } |
| 284 | 304 |
| 285 { | 305 { |
| 286 ListValue list; | 306 ListValue list; |
| 287 list.Append(new DeletionTestValue(&deletion_flag)); | 307 list.Append(new DeletionTestValue(&deletion_flag)); |
| 288 EXPECT_FALSE(deletion_flag); | 308 EXPECT_FALSE(deletion_flag); |
| 289 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); | 309 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); |
| 290 EXPECT_TRUE(deletion_flag); | 310 EXPECT_TRUE(deletion_flag); |
| 291 } | 311 } |
| 292 } | 312 } |
| 293 | 313 |
| 294 TEST(ValuesTest, ListRemoval) { | 314 TEST_F(ValuesTest, ListRemoval) { |
| 295 bool deletion_flag = true; | 315 bool deletion_flag = true; |
| 296 Value* removed_item = NULL; | 316 Value* removed_item = NULL; |
| 297 | 317 |
| 298 { | 318 { |
| 299 ListValue list; | 319 ListValue list; |
| 300 list.Append(new DeletionTestValue(&deletion_flag)); | 320 list.Append(new DeletionTestValue(&deletion_flag)); |
| 301 EXPECT_FALSE(deletion_flag); | 321 EXPECT_FALSE(deletion_flag); |
| 302 EXPECT_EQ(1U, list.GetSize()); | 322 EXPECT_EQ(1U, list.GetSize()); |
| 303 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), | 323 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), |
| 304 &removed_item)); | 324 &removed_item)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 325 ListValue list; | 345 ListValue list; |
| 326 DeletionTestValue* value = new DeletionTestValue(&deletion_flag); | 346 DeletionTestValue* value = new DeletionTestValue(&deletion_flag); |
| 327 list.Append(value); | 347 list.Append(value); |
| 328 EXPECT_FALSE(deletion_flag); | 348 EXPECT_FALSE(deletion_flag); |
| 329 EXPECT_EQ(0, list.Remove(*value)); | 349 EXPECT_EQ(0, list.Remove(*value)); |
| 330 EXPECT_TRUE(deletion_flag); | 350 EXPECT_TRUE(deletion_flag); |
| 331 EXPECT_EQ(0U, list.GetSize()); | 351 EXPECT_EQ(0U, list.GetSize()); |
| 332 } | 352 } |
| 333 } | 353 } |
| 334 | 354 |
| 335 TEST(ValuesTest, DictionaryDeletion) { | 355 TEST_F(ValuesTest, DictionaryDeletion) { |
| 336 std::string key = "test"; | 356 std::string key = "test"; |
| 337 bool deletion_flag = true; | 357 bool deletion_flag = true; |
| 338 | 358 |
| 339 { | 359 { |
| 340 DictionaryValue dict; | 360 DictionaryValue dict; |
| 341 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 361 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 342 EXPECT_FALSE(deletion_flag); | 362 EXPECT_FALSE(deletion_flag); |
| 343 } | 363 } |
| 344 EXPECT_TRUE(deletion_flag); | 364 EXPECT_TRUE(deletion_flag); |
| 345 | 365 |
| 346 { | 366 { |
| 347 DictionaryValue dict; | 367 DictionaryValue dict; |
| 348 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 368 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 349 EXPECT_FALSE(deletion_flag); | 369 EXPECT_FALSE(deletion_flag); |
| 350 dict.Clear(); | 370 dict.Clear(); |
| 351 EXPECT_TRUE(deletion_flag); | 371 EXPECT_TRUE(deletion_flag); |
| 352 } | 372 } |
| 353 | 373 |
| 354 { | 374 { |
| 355 DictionaryValue dict; | 375 DictionaryValue dict; |
| 356 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 376 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 357 EXPECT_FALSE(deletion_flag); | 377 EXPECT_FALSE(deletion_flag); |
| 358 dict.Set(key, Value::CreateNullValue()); | 378 dict.Set(key, Value::CreateNullValue()); |
| 359 EXPECT_TRUE(deletion_flag); | 379 EXPECT_TRUE(deletion_flag); |
| 360 } | 380 } |
| 361 } | 381 } |
| 362 | 382 |
| 363 // TODO(viettrungluu): deprecate: | 383 // TODO(viettrungluu): deprecate: |
| 364 TEST(ValuesTest, DictionaryDeletionDeprecated) { | 384 TEST_F(ValuesTest, DictionaryDeletionDeprecated) { |
| 365 std::wstring key = L"test"; | 385 std::wstring key = L"test"; |
| 366 bool deletion_flag = true; | 386 bool deletion_flag = true; |
| 367 | 387 |
| 368 { | 388 { |
| 369 DictionaryValue dict; | 389 DictionaryValue dict; |
| 370 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 390 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 371 EXPECT_FALSE(deletion_flag); | 391 EXPECT_FALSE(deletion_flag); |
| 372 } | 392 } |
| 373 EXPECT_TRUE(deletion_flag); | 393 EXPECT_TRUE(deletion_flag); |
| 374 | 394 |
| 375 { | 395 { |
| 376 DictionaryValue dict; | 396 DictionaryValue dict; |
| 377 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 397 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 378 EXPECT_FALSE(deletion_flag); | 398 EXPECT_FALSE(deletion_flag); |
| 379 dict.Clear(); | 399 dict.Clear(); |
| 380 EXPECT_TRUE(deletion_flag); | 400 EXPECT_TRUE(deletion_flag); |
| 381 } | 401 } |
| 382 | 402 |
| 383 { | 403 { |
| 384 DictionaryValue dict; | 404 DictionaryValue dict; |
| 385 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 405 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 386 EXPECT_FALSE(deletion_flag); | 406 EXPECT_FALSE(deletion_flag); |
| 387 dict.Set(key, Value::CreateNullValue()); | 407 dict.Set(key, Value::CreateNullValue()); |
| 388 EXPECT_TRUE(deletion_flag); | 408 EXPECT_TRUE(deletion_flag); |
| 389 } | 409 } |
| 390 } | 410 } |
| 391 | 411 |
| 392 TEST(ValuesTest, DictionaryRemoval) { | 412 TEST_F(ValuesTest, DictionaryRemoval) { |
| 393 std::string key = "test"; | 413 std::string key = "test"; |
| 394 bool deletion_flag = true; | 414 bool deletion_flag = true; |
| 395 Value* removed_item = NULL; | 415 Value* removed_item = NULL; |
| 396 | 416 |
| 397 { | 417 { |
| 398 DictionaryValue dict; | 418 DictionaryValue dict; |
| 399 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 419 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 400 EXPECT_FALSE(deletion_flag); | 420 EXPECT_FALSE(deletion_flag); |
| 401 EXPECT_TRUE(dict.HasKey(key)); | 421 EXPECT_TRUE(dict.HasKey(key)); |
| 402 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); | 422 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 414 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 434 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 415 EXPECT_FALSE(deletion_flag); | 435 EXPECT_FALSE(deletion_flag); |
| 416 EXPECT_TRUE(dict.HasKey(key)); | 436 EXPECT_TRUE(dict.HasKey(key)); |
| 417 EXPECT_TRUE(dict.Remove(key, NULL)); | 437 EXPECT_TRUE(dict.Remove(key, NULL)); |
| 418 EXPECT_TRUE(deletion_flag); | 438 EXPECT_TRUE(deletion_flag); |
| 419 EXPECT_FALSE(dict.HasKey(key)); | 439 EXPECT_FALSE(dict.HasKey(key)); |
| 420 } | 440 } |
| 421 } | 441 } |
| 422 | 442 |
| 423 // TODO(viettrungluu): deprecate: | 443 // TODO(viettrungluu): deprecate: |
| 424 TEST(ValuesTest, DictionaryRemovalDeprecated) { | 444 TEST_F(ValuesTest, DictionaryRemovalDeprecated) { |
| 425 std::wstring key = L"test"; | 445 std::wstring key = L"test"; |
| 426 bool deletion_flag = true; | 446 bool deletion_flag = true; |
| 427 Value* removed_item = NULL; | 447 Value* removed_item = NULL; |
| 428 | 448 |
| 429 { | 449 { |
| 430 DictionaryValue dict; | 450 DictionaryValue dict; |
| 431 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 451 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 432 EXPECT_FALSE(deletion_flag); | 452 EXPECT_FALSE(deletion_flag); |
| 433 EXPECT_TRUE(dict.HasKey(key)); | 453 EXPECT_TRUE(dict.HasKey(key)); |
| 434 EXPECT_FALSE(dict.Remove(L"absent key", &removed_item)); | 454 EXPECT_FALSE(dict.Remove(L"absent key", &removed_item)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 445 DictionaryValue dict; | 465 DictionaryValue dict; |
| 446 dict.Set(key, new DeletionTestValue(&deletion_flag)); | 466 dict.Set(key, new DeletionTestValue(&deletion_flag)); |
| 447 EXPECT_FALSE(deletion_flag); | 467 EXPECT_FALSE(deletion_flag); |
| 448 EXPECT_TRUE(dict.HasKey(key)); | 468 EXPECT_TRUE(dict.HasKey(key)); |
| 449 EXPECT_TRUE(dict.Remove(key, NULL)); | 469 EXPECT_TRUE(dict.Remove(key, NULL)); |
| 450 EXPECT_TRUE(deletion_flag); | 470 EXPECT_TRUE(deletion_flag); |
| 451 EXPECT_FALSE(dict.HasKey(key)); | 471 EXPECT_FALSE(dict.HasKey(key)); |
| 452 } | 472 } |
| 453 } | 473 } |
| 454 | 474 |
| 455 TEST(ValuesTest, DictionaryWithoutPathExpansion) { | 475 TEST_F(ValuesTest, DictionaryWithoutPathExpansion) { |
| 456 DictionaryValue dict; | 476 DictionaryValue dict; |
| 457 dict.Set("this.is.expanded", Value::CreateNullValue()); | 477 dict.Set("this.is.expanded", Value::CreateNullValue()); |
| 458 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); | 478 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); |
| 459 | 479 |
| 460 EXPECT_FALSE(dict.HasKey("this.is.expanded")); | 480 EXPECT_FALSE(dict.HasKey("this.is.expanded")); |
| 461 EXPECT_TRUE(dict.HasKey("this")); | 481 EXPECT_TRUE(dict.HasKey("this")); |
| 462 Value* value1; | 482 Value* value1; |
| 463 EXPECT_TRUE(dict.Get("this", &value1)); | 483 EXPECT_TRUE(dict.Get("this", &value1)); |
| 464 DictionaryValue* value2; | 484 DictionaryValue* value2; |
| 465 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2)); | 485 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2)); |
| 466 EXPECT_EQ(value1, value2); | 486 EXPECT_EQ(value1, value2); |
| 467 EXPECT_EQ(1U, value2->size()); | 487 EXPECT_EQ(1U, value2->size()); |
| 468 | 488 |
| 469 EXPECT_TRUE(dict.HasKey("this.isnt.expanded")); | 489 EXPECT_TRUE(dict.HasKey("this.isnt.expanded")); |
| 470 Value* value3; | 490 Value* value3; |
| 471 EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3)); | 491 EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3)); |
| 472 Value* value4; | 492 Value* value4; |
| 473 ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4)); | 493 ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4)); |
| 474 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); | 494 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); |
| 475 } | 495 } |
| 476 | 496 |
| 477 // TODO(viettrungluu): deprecate: | 497 // TODO(viettrungluu): deprecate: |
| 478 TEST(ValuesTest, DictionaryWithoutPathExpansionDeprecated) { | 498 TEST_F(ValuesTest, DictionaryWithoutPathExpansionDeprecated) { |
| 479 DictionaryValue dict; | 499 DictionaryValue dict; |
| 480 dict.Set(L"this.is.expanded", Value::CreateNullValue()); | 500 dict.Set(L"this.is.expanded", Value::CreateNullValue()); |
| 481 dict.SetWithoutPathExpansion(L"this.isnt.expanded", Value::CreateNullValue()); | 501 dict.SetWithoutPathExpansion(L"this.isnt.expanded", Value::CreateNullValue()); |
| 482 | 502 |
| 483 EXPECT_FALSE(dict.HasKey(L"this.is.expanded")); | 503 EXPECT_FALSE(dict.HasKey(L"this.is.expanded")); |
| 484 EXPECT_TRUE(dict.HasKey(L"this")); | 504 EXPECT_TRUE(dict.HasKey(L"this")); |
| 485 Value* value1; | 505 Value* value1; |
| 486 EXPECT_TRUE(dict.Get(L"this", &value1)); | 506 EXPECT_TRUE(dict.Get(L"this", &value1)); |
| 487 DictionaryValue* value2; | 507 DictionaryValue* value2; |
| 488 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion(L"this", &value2)); | 508 ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion(L"this", &value2)); |
| 489 EXPECT_EQ(value1, value2); | 509 EXPECT_EQ(value1, value2); |
| 490 EXPECT_EQ(1U, value2->size()); | 510 EXPECT_EQ(1U, value2->size()); |
| 491 | 511 |
| 492 EXPECT_TRUE(dict.HasKey(L"this.isnt.expanded")); | 512 EXPECT_TRUE(dict.HasKey(L"this.isnt.expanded")); |
| 493 Value* value3; | 513 Value* value3; |
| 494 EXPECT_FALSE(dict.Get(L"this.isnt.expanded", &value3)); | 514 EXPECT_FALSE(dict.Get(L"this.isnt.expanded", &value3)); |
| 495 Value* value4; | 515 Value* value4; |
| 496 ASSERT_TRUE(dict.GetWithoutPathExpansion(L"this.isnt.expanded", &value4)); | 516 ASSERT_TRUE(dict.GetWithoutPathExpansion(L"this.isnt.expanded", &value4)); |
| 497 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); | 517 EXPECT_EQ(Value::TYPE_NULL, value4->GetType()); |
| 498 } | 518 } |
| 499 | 519 |
| 500 TEST(ValuesTest, DeepCopy) { | 520 TEST_F(ValuesTest, DeepCopy) { |
| 501 DictionaryValue original_dict; | 521 DictionaryValue original_dict; |
| 502 Value* original_null = Value::CreateNullValue(); | 522 Value* original_null = Value::CreateNullValue(); |
| 503 original_dict.Set("null", original_null); | 523 original_dict.Set("null", original_null); |
| 504 Value* original_bool = Value::CreateBooleanValue(true); | 524 Value* original_bool = Value::CreateBooleanValue(true); |
| 505 original_dict.Set("bool", original_bool); | 525 original_dict.Set("bool", original_bool); |
| 506 Value* original_int = Value::CreateIntegerValue(42); | 526 Value* original_int = Value::CreateIntegerValue(42); |
| 507 original_dict.Set("int", original_int); | 527 original_dict.Set("int", original_int); |
| 508 Value* original_real = Value::CreateRealValue(3.14); | 528 Value* original_real = Value::CreateRealValue(3.14); |
| 509 original_dict.Set("real", original_real); | 529 original_dict.Set("real", original_real); |
| 510 Value* original_string = Value::CreateStringValue("hello"); | 530 Value* original_string = Value::CreateStringValue("hello"); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 Value* copy_list_element_1; | 636 Value* copy_list_element_1; |
| 617 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); | 637 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); |
| 618 ASSERT_TRUE(copy_list_element_1); | 638 ASSERT_TRUE(copy_list_element_1); |
| 619 ASSERT_NE(copy_list_element_1, original_list_element_1); | 639 ASSERT_NE(copy_list_element_1, original_list_element_1); |
| 620 int copy_list_element_1_value; | 640 int copy_list_element_1_value; |
| 621 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); | 641 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); |
| 622 ASSERT_EQ(1, copy_list_element_1_value); | 642 ASSERT_EQ(1, copy_list_element_1_value); |
| 623 } | 643 } |
| 624 | 644 |
| 625 // TODO(viettrungluu): deprecate: | 645 // TODO(viettrungluu): deprecate: |
| 626 TEST(ValuesTest, DeepCopyDeprecated) { | 646 TEST_F(ValuesTest, DeepCopyDeprecated) { |
| 627 DictionaryValue original_dict; | 647 DictionaryValue original_dict; |
| 628 Value* original_null = Value::CreateNullValue(); | 648 Value* original_null = Value::CreateNullValue(); |
| 629 original_dict.Set(L"null", original_null); | 649 original_dict.Set(L"null", original_null); |
| 630 Value* original_bool = Value::CreateBooleanValue(true); | 650 Value* original_bool = Value::CreateBooleanValue(true); |
| 631 original_dict.Set(L"bool", original_bool); | 651 original_dict.Set(L"bool", original_bool); |
| 632 Value* original_int = Value::CreateIntegerValue(42); | 652 Value* original_int = Value::CreateIntegerValue(42); |
| 633 original_dict.Set(L"int", original_int); | 653 original_dict.Set(L"int", original_int); |
| 634 Value* original_real = Value::CreateRealValue(3.14); | 654 Value* original_real = Value::CreateRealValue(3.14); |
| 635 original_dict.Set(L"real", original_real); | 655 original_dict.Set(L"real", original_real); |
| 636 Value* original_string = Value::CreateStringValue("hello"); | 656 Value* original_string = Value::CreateStringValue("hello"); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 | 780 |
| 761 Value* copy_list_element_1; | 781 Value* copy_list_element_1; |
| 762 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); | 782 ASSERT_TRUE(copy_list->Get(1, ©_list_element_1)); |
| 763 ASSERT_TRUE(copy_list_element_1); | 783 ASSERT_TRUE(copy_list_element_1); |
| 764 ASSERT_NE(copy_list_element_1, original_list_element_1); | 784 ASSERT_NE(copy_list_element_1, original_list_element_1); |
| 765 int copy_list_element_1_value; | 785 int copy_list_element_1_value; |
| 766 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); | 786 ASSERT_TRUE(copy_list_element_1->GetAsInteger(©_list_element_1_value)); |
| 767 ASSERT_EQ(1, copy_list_element_1_value); | 787 ASSERT_EQ(1, copy_list_element_1_value); |
| 768 } | 788 } |
| 769 | 789 |
| 770 TEST(ValuesTest, Equals) { | 790 TEST_F(ValuesTest, Equals) { |
| 771 Value* null1 = Value::CreateNullValue(); | 791 Value* null1 = Value::CreateNullValue(); |
| 772 Value* null2 = Value::CreateNullValue(); | 792 Value* null2 = Value::CreateNullValue(); |
| 773 EXPECT_NE(null1, null2); | 793 EXPECT_NE(null1, null2); |
| 774 EXPECT_TRUE(null1->Equals(null2)); | 794 EXPECT_TRUE(null1->Equals(null2)); |
| 775 | 795 |
| 776 Value* boolean = Value::CreateBooleanValue(false); | 796 Value* boolean = Value::CreateBooleanValue(false); |
| 777 EXPECT_FALSE(null1->Equals(boolean)); | 797 EXPECT_FALSE(null1->Equals(boolean)); |
| 778 delete null1; | 798 delete null1; |
| 779 delete null2; | 799 delete null2; |
| 780 delete boolean; | 800 delete boolean; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 798 EXPECT_FALSE(dv.Equals(copy)); | 818 EXPECT_FALSE(dv.Equals(copy)); |
| 799 copy->Set("f", list->DeepCopy()); | 819 copy->Set("f", list->DeepCopy()); |
| 800 EXPECT_TRUE(dv.Equals(copy)); | 820 EXPECT_TRUE(dv.Equals(copy)); |
| 801 | 821 |
| 802 list->Append(Value::CreateBooleanValue(true)); | 822 list->Append(Value::CreateBooleanValue(true)); |
| 803 EXPECT_FALSE(dv.Equals(copy)); | 823 EXPECT_FALSE(dv.Equals(copy)); |
| 804 delete copy; | 824 delete copy; |
| 805 } | 825 } |
| 806 | 826 |
| 807 // TODO(viettrungluu): deprecate: | 827 // TODO(viettrungluu): deprecate: |
| 808 TEST(ValuesTest, EqualsDeprecated) { | 828 TEST_F(ValuesTest, EqualsDeprecated) { |
| 809 Value* null1 = Value::CreateNullValue(); | 829 Value* null1 = Value::CreateNullValue(); |
| 810 Value* null2 = Value::CreateNullValue(); | 830 Value* null2 = Value::CreateNullValue(); |
| 811 EXPECT_NE(null1, null2); | 831 EXPECT_NE(null1, null2); |
| 812 EXPECT_TRUE(null1->Equals(null2)); | 832 EXPECT_TRUE(null1->Equals(null2)); |
| 813 | 833 |
| 814 Value* boolean = Value::CreateBooleanValue(false); | 834 Value* boolean = Value::CreateBooleanValue(false); |
| 815 EXPECT_FALSE(null1->Equals(boolean)); | 835 EXPECT_FALSE(null1->Equals(boolean)); |
| 816 delete null1; | 836 delete null1; |
| 817 delete null2; | 837 delete null2; |
| 818 delete boolean; | 838 delete boolean; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 835 | 855 |
| 836 EXPECT_FALSE(dv.Equals(copy)); | 856 EXPECT_FALSE(dv.Equals(copy)); |
| 837 copy->Set(L"f", list->DeepCopy()); | 857 copy->Set(L"f", list->DeepCopy()); |
| 838 EXPECT_TRUE(dv.Equals(copy)); | 858 EXPECT_TRUE(dv.Equals(copy)); |
| 839 | 859 |
| 840 list->Append(Value::CreateBooleanValue(true)); | 860 list->Append(Value::CreateBooleanValue(true)); |
| 841 EXPECT_FALSE(dv.Equals(copy)); | 861 EXPECT_FALSE(dv.Equals(copy)); |
| 842 delete copy; | 862 delete copy; |
| 843 } | 863 } |
| 844 | 864 |
| 845 TEST(ValuesTest, RemoveEmptyChildren) { | 865 TEST_F(ValuesTest, RemoveEmptyChildren) { |
| 846 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 866 scoped_ptr<DictionaryValue> root(new DictionaryValue); |
| 847 // Remove empty lists and dictionaries. | 867 // Remove empty lists and dictionaries. |
| 848 root->Set("empty_dict", new DictionaryValue); | 868 root->Set("empty_dict", new DictionaryValue); |
| 849 root->Set("empty_list", new ListValue); | 869 root->Set("empty_list", new ListValue); |
| 850 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); | 870 root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue); |
| 851 root.reset(root->DeepCopyWithoutEmptyChildren()); | 871 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 852 EXPECT_TRUE(root->empty()); | 872 EXPECT_TRUE(root->empty()); |
| 853 | 873 |
| 854 // Make sure we don't prune too much. | 874 // Make sure we don't prune too much. |
| 855 root->SetBoolean("bool", true); | 875 root->SetBoolean("bool", true); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 root.reset(root->DeepCopyWithoutEmptyChildren()); | 931 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 912 EXPECT_EQ(3U, root->size()); | 932 EXPECT_EQ(3U, root->size()); |
| 913 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); | 933 EXPECT_TRUE(root->GetList("list_with_empty_children", &inner)); |
| 914 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. | 934 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. |
| 915 EXPECT_TRUE(inner->GetList(0, &inner2)); | 935 EXPECT_TRUE(inner->GetList(0, &inner2)); |
| 916 EXPECT_EQ(1U, inner2->GetSize()); | 936 EXPECT_EQ(1U, inner2->GetSize()); |
| 917 } | 937 } |
| 918 } | 938 } |
| 919 | 939 |
| 920 // TODO(viettrungluu): deprecate: | 940 // TODO(viettrungluu): deprecate: |
| 921 TEST(ValuesTest, RemoveEmptyChildrenDeprecated) { | 941 TEST_F(ValuesTest, RemoveEmptyChildrenDeprecated) { |
| 922 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 942 scoped_ptr<DictionaryValue> root(new DictionaryValue); |
| 923 // Remove empty lists and dictionaries. | 943 // Remove empty lists and dictionaries. |
| 924 root->Set(L"empty_dict", new DictionaryValue); | 944 root->Set(L"empty_dict", new DictionaryValue); |
| 925 root->Set(L"empty_list", new ListValue); | 945 root->Set(L"empty_list", new ListValue); |
| 926 root->SetWithoutPathExpansion(L"a.b.c.d.e", new DictionaryValue); | 946 root->SetWithoutPathExpansion(L"a.b.c.d.e", new DictionaryValue); |
| 927 root.reset(root->DeepCopyWithoutEmptyChildren()); | 947 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 928 EXPECT_TRUE(root->empty()); | 948 EXPECT_TRUE(root->empty()); |
| 929 | 949 |
| 930 // Make sure we don't prune too much. | 950 // Make sure we don't prune too much. |
| 931 root->SetBoolean(L"bool", true); | 951 root->SetBoolean(L"bool", true); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 inner2->Append(Value::CreateStringValue("hello")); | 1006 inner2->Append(Value::CreateStringValue("hello")); |
| 987 root.reset(root->DeepCopyWithoutEmptyChildren()); | 1007 root.reset(root->DeepCopyWithoutEmptyChildren()); |
| 988 EXPECT_EQ(3U, root->size()); | 1008 EXPECT_EQ(3U, root->size()); |
| 989 EXPECT_TRUE(root->GetList(L"list_with_empty_children", &inner)); | 1009 EXPECT_TRUE(root->GetList(L"list_with_empty_children", &inner)); |
| 990 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. | 1010 EXPECT_EQ(1U, inner->GetSize()); // Dictionary was pruned. |
| 991 EXPECT_TRUE(inner->GetList(0, &inner2)); | 1011 EXPECT_TRUE(inner->GetList(0, &inner2)); |
| 992 EXPECT_EQ(1U, inner2->GetSize()); | 1012 EXPECT_EQ(1U, inner2->GetSize()); |
| 993 } | 1013 } |
| 994 } | 1014 } |
| 995 | 1015 |
| 996 TEST(ValuesTest, MergeDictionary) { | 1016 TEST_F(ValuesTest, MergeDictionary) { |
| 997 scoped_ptr<DictionaryValue> base(new DictionaryValue); | 1017 scoped_ptr<DictionaryValue> base(new DictionaryValue); |
| 998 base->SetString("base_key", "base_key_value_base"); | 1018 base->SetString("base_key", "base_key_value_base"); |
| 999 base->SetString("collide_key", "collide_key_value_base"); | 1019 base->SetString("collide_key", "collide_key_value_base"); |
| 1000 DictionaryValue* base_sub_dict = new DictionaryValue; | 1020 DictionaryValue* base_sub_dict = new DictionaryValue; |
| 1001 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); | 1021 base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base"); |
| 1002 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); | 1022 base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base"); |
| 1003 base->Set("sub_dict_key", base_sub_dict); | 1023 base->Set("sub_dict_key", base_sub_dict); |
| 1004 | 1024 |
| 1005 scoped_ptr<DictionaryValue> merge(new DictionaryValue); | 1025 scoped_ptr<DictionaryValue> merge(new DictionaryValue); |
| 1006 merge->SetString("merge_key", "merge_key_value_merge"); | 1026 merge->SetString("merge_key", "merge_key_value_merge"); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1032 std::string sub_collide_key_value; | 1052 std::string sub_collide_key_value; |
| 1033 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", | 1053 EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key", |
| 1034 &sub_collide_key_value)); | 1054 &sub_collide_key_value)); |
| 1035 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | 1055 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. |
| 1036 std::string sub_merge_key_value; | 1056 std::string sub_merge_key_value; |
| 1037 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); | 1057 EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value)); |
| 1038 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | 1058 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. |
| 1039 } | 1059 } |
| 1040 | 1060 |
| 1041 // TODO(viettrungluu): deprecate: | 1061 // TODO(viettrungluu): deprecate: |
| 1042 TEST(ValuesTest, MergeDictionaryDeprecated) { | 1062 TEST_F(ValuesTest, MergeDictionaryDeprecated) { |
| 1043 scoped_ptr<DictionaryValue> base(new DictionaryValue); | 1063 scoped_ptr<DictionaryValue> base(new DictionaryValue); |
| 1044 base->SetString(L"base_key", "base_key_value_base"); | 1064 base->SetString(L"base_key", "base_key_value_base"); |
| 1045 base->SetString(L"collide_key", "collide_key_value_base"); | 1065 base->SetString(L"collide_key", "collide_key_value_base"); |
| 1046 DictionaryValue* base_sub_dict = new DictionaryValue; | 1066 DictionaryValue* base_sub_dict = new DictionaryValue; |
| 1047 base_sub_dict->SetString(L"sub_base_key", "sub_base_key_value_base"); | 1067 base_sub_dict->SetString(L"sub_base_key", "sub_base_key_value_base"); |
| 1048 base_sub_dict->SetString(L"sub_collide_key", "sub_collide_key_value_base"); | 1068 base_sub_dict->SetString(L"sub_collide_key", "sub_collide_key_value_base"); |
| 1049 base->Set(L"sub_dict_key", base_sub_dict); | 1069 base->Set(L"sub_dict_key", base_sub_dict); |
| 1050 | 1070 |
| 1051 scoped_ptr<DictionaryValue> merge(new DictionaryValue); | 1071 scoped_ptr<DictionaryValue> merge(new DictionaryValue); |
| 1052 merge->SetString(L"merge_key", "merge_key_value_merge"); | 1072 merge->SetString(L"merge_key", "merge_key_value_merge"); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1076 EXPECT_TRUE(res_sub_dict->GetString(L"sub_base_key", &sub_base_key_value)); | 1096 EXPECT_TRUE(res_sub_dict->GetString(L"sub_base_key", &sub_base_key_value)); |
| 1077 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. | 1097 EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved. |
| 1078 std::string sub_collide_key_value; | 1098 std::string sub_collide_key_value; |
| 1079 EXPECT_TRUE(res_sub_dict->GetString(L"sub_collide_key", | 1099 EXPECT_TRUE(res_sub_dict->GetString(L"sub_collide_key", |
| 1080 &sub_collide_key_value)); | 1100 &sub_collide_key_value)); |
| 1081 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. | 1101 EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced. |
| 1082 std::string sub_merge_key_value; | 1102 std::string sub_merge_key_value; |
| 1083 EXPECT_TRUE(res_sub_dict->GetString(L"sub_merge_key", &sub_merge_key_value)); | 1103 EXPECT_TRUE(res_sub_dict->GetString(L"sub_merge_key", &sub_merge_key_value)); |
| 1084 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. | 1104 EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in. |
| 1085 } | 1105 } |
| 1106 |
| 1107 TEST_F(ValuesTest, GetDifferingPaths) { |
| 1108 scoped_ptr<DictionaryValue> dict1(new DictionaryValue()); |
| 1109 scoped_ptr<DictionaryValue> dict2(new DictionaryValue()); |
| 1110 std::vector<std::string> differing_paths; |
| 1111 |
| 1112 // Test comparing empty dictionaries. |
| 1113 dict1->GetDifferingPaths(dict2.get(), &differing_paths); |
| 1114 EXPECT_EQ(differing_paths.size(), 0UL); |
| 1115 |
| 1116 // Compare an empty dictionary with various non-empty dictionaries. |
| 1117 static const char* expected_paths1[] = { |
| 1118 "segment1" |
| 1119 }; |
| 1120 dict1->SetString("segment1", "value1"); |
| 1121 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths1, |
| 1122 arraysize(expected_paths1)); |
| 1123 |
| 1124 static const char* expected_paths2[] = { |
| 1125 "segment1", |
| 1126 "segment2", |
| 1127 "segment2.segment3" |
| 1128 }; |
| 1129 dict1->SetString("segment2.segment3", "value2"); |
| 1130 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths2, |
| 1131 arraysize(expected_paths2)); |
| 1132 |
| 1133 static const char* expected_paths3[] = { |
| 1134 "segment1", |
| 1135 "segment2", |
| 1136 "segment2.segment3", |
| 1137 "segment4", |
| 1138 "segment4.segment5" |
| 1139 }; |
| 1140 dict1->SetString("segment4.segment5", "value3"); |
| 1141 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths3, |
| 1142 arraysize(expected_paths3)); |
| 1143 |
| 1144 // Now various tests with two populated dictionaries. |
| 1145 static const char* expected_paths4[] = { |
| 1146 "segment1", |
| 1147 "segment2", |
| 1148 "segment2.segment3", |
| 1149 "segment4", |
| 1150 "segment4.segment5" |
| 1151 }; |
| 1152 dict2->Set("segment2", new DictionaryValue()); |
| 1153 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths4, |
| 1154 arraysize(expected_paths4)); |
| 1155 |
| 1156 static const char* expected_paths5[] = { |
| 1157 "segment1", |
| 1158 "segment4", |
| 1159 "segment4.segment5" |
| 1160 }; |
| 1161 dict2->SetString("segment2.segment3", "value2"); |
| 1162 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths5, |
| 1163 arraysize(expected_paths5)); |
| 1164 |
| 1165 dict2->SetBoolean("segment2.segment3", true); |
| 1166 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths4, |
| 1167 arraysize(expected_paths4)); |
| 1168 |
| 1169 // Test two identical dictionaries. |
| 1170 dict2.reset(static_cast<DictionaryValue*>(dict1->DeepCopy())); |
| 1171 dict2->GetDifferingPaths(dict1.get(), &differing_paths); |
| 1172 EXPECT_EQ(differing_paths.size(), 0UL); |
| 1173 |
| 1174 // Test a deep dictionary structure. |
| 1175 static const char* expected_paths6[] = { |
| 1176 "s1", |
| 1177 "s1.s2", |
| 1178 "s1.s2.s3", |
| 1179 "s1.s2.s3.s4", |
| 1180 "s1.s2.s3.s4.s5" |
| 1181 }; |
| 1182 dict1.reset(new DictionaryValue()); |
| 1183 dict2.reset(new DictionaryValue()); |
| 1184 dict1->Set("s1.s2.s3.s4.s5", new DictionaryValue()); |
| 1185 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths6, |
| 1186 arraysize(expected_paths6)); |
| 1187 |
| 1188 // Make sure disjoint dictionaries generate the right differing path list. |
| 1189 static const char* expected_paths7[] = { |
| 1190 "a", |
| 1191 "b", |
| 1192 "c", |
| 1193 "d" |
| 1194 }; |
| 1195 dict1.reset(new DictionaryValue()); |
| 1196 dict1->SetBoolean("a", true); |
| 1197 dict1->SetBoolean("c", true); |
| 1198 dict2.reset(new DictionaryValue()); |
| 1199 dict1->SetBoolean("b", true); |
| 1200 dict1->SetBoolean("d", true); |
| 1201 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths7, |
| 1202 arraysize(expected_paths7)); |
| 1203 |
| 1204 // For code coverage completeness. Make sure that all branches |
| 1205 // that were not covered are executed. |
| 1206 static const char* expected_paths8[] = { |
| 1207 "s1", |
| 1208 "s1.s2" |
| 1209 }; |
| 1210 dict1.reset(new DictionaryValue()); |
| 1211 dict1->Set("s1.s2", new DictionaryValue()); |
| 1212 dict2.reset(new DictionaryValue()); |
| 1213 dict2->SetInteger("s1", 1); |
| 1214 CompareDictionariesAndCheckResult(dict1.get(), dict2.get(), expected_paths8, |
| 1215 arraysize(expected_paths8)); |
| 1216 } |
| OLD | NEW |