| 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 "base/values.h" | 5 #include "base/values.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 EXPECT_EQ(Value::Type::STRING, value.type()); | 82 EXPECT_EQ(Value::Type::STRING, value.type()); |
| 83 EXPECT_EQ("foobar", value.GetString()); | 83 EXPECT_EQ("foobar", value.GetString()); |
| 84 } | 84 } |
| 85 | 85 |
| 86 TEST(ValuesTest, ConstructBinary) { | 86 TEST(ValuesTest, ConstructBinary) { |
| 87 BinaryValue value(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2})); | 87 BinaryValue value(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2})); |
| 88 EXPECT_EQ(Value::Type::BINARY, value.type()); | 88 EXPECT_EQ(Value::Type::BINARY, value.type()); |
| 89 EXPECT_EQ(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}), value.GetBlob()); | 89 EXPECT_EQ(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}), value.GetBlob()); |
| 90 } | 90 } |
| 91 | 91 |
| 92 TEST(ValuesTest, ConstructDict) { |
| 93 DictionaryValue value; |
| 94 EXPECT_EQ(Value::Type::DICTIONARY, value.type()); |
| 95 } |
| 96 |
| 97 TEST(ValuesTest, ConstructList) { |
| 98 ListValue value; |
| 99 EXPECT_EQ(Value::Type::LIST, value.type()); |
| 100 } |
| 101 |
| 92 // Group of tests for the copy constructors and copy-assigmnent. For equality | 102 // Group of tests for the copy constructors and copy-assigmnent. For equality |
| 93 // checks comparisons of the interesting fields are done instead of relying on | 103 // checks comparisons of the interesting fields are done instead of relying on |
| 94 // Equals being correct. | 104 // Equals being correct. |
| 95 TEST(ValuesTest, CopyBool) { | 105 TEST(ValuesTest, CopyBool) { |
| 96 FundamentalValue true_value(true); | 106 FundamentalValue true_value(true); |
| 97 FundamentalValue copied_true_value(true_value); | 107 FundamentalValue copied_true_value(true_value); |
| 98 EXPECT_EQ(true_value.type(), copied_true_value.type()); | 108 EXPECT_EQ(true_value.type(), copied_true_value.type()); |
| 99 EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool()); | 109 EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool()); |
| 100 | 110 |
| 101 FundamentalValue false_value(false); | 111 FundamentalValue false_value(false); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 EXPECT_EQ(value.type(), copied_value.type()); | 169 EXPECT_EQ(value.type(), copied_value.type()); |
| 160 EXPECT_EQ(value.GetBlob(), copied_value.GetBlob()); | 170 EXPECT_EQ(value.GetBlob(), copied_value.GetBlob()); |
| 161 | 171 |
| 162 Value blank; | 172 Value blank; |
| 163 | 173 |
| 164 blank = value; | 174 blank = value; |
| 165 EXPECT_EQ(value.type(), blank.type()); | 175 EXPECT_EQ(value.type(), blank.type()); |
| 166 EXPECT_EQ(value.GetBlob(), blank.GetBlob()); | 176 EXPECT_EQ(value.GetBlob(), blank.GetBlob()); |
| 167 } | 177 } |
| 168 | 178 |
| 179 TEST(ValuesTest, CopyDictionary) { |
| 180 // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to |
| 181 // value semantics. |
| 182 int copy; |
| 183 DictionaryValue value; |
| 184 value.SetInteger("Int", 123); |
| 185 |
| 186 DictionaryValue copied_value(value); |
| 187 copied_value.GetInteger("Int", ©); |
| 188 |
| 189 EXPECT_EQ(value.type(), copied_value.type()); |
| 190 EXPECT_EQ(123, copy); |
| 191 |
| 192 auto blank = MakeUnique<Value>(); |
| 193 |
| 194 *blank = value; |
| 195 EXPECT_EQ(Value::Type::DICTIONARY, blank->type()); |
| 196 |
| 197 static_cast<DictionaryValue*>(blank.get())->GetInteger("Int", ©); |
| 198 EXPECT_EQ(123, copy); |
| 199 } |
| 200 |
| 201 TEST(ValuesTest, CopyList) { |
| 202 // TODO(crbug.com/646113): Clean this up once ListValue switched to |
| 203 // value semantics. |
| 204 int copy; |
| 205 ListValue value; |
| 206 value.AppendInteger(123); |
| 207 |
| 208 ListValue copied_value(value); |
| 209 copied_value.GetInteger(0, ©); |
| 210 |
| 211 EXPECT_EQ(value.type(), copied_value.type()); |
| 212 EXPECT_EQ(123, copy); |
| 213 |
| 214 auto blank = MakeUnique<Value>(); |
| 215 |
| 216 *blank = value; |
| 217 EXPECT_EQ(Value::Type::LIST, blank->type()); |
| 218 |
| 219 static_cast<ListValue*>(blank.get())->GetInteger(0, ©); |
| 220 EXPECT_EQ(123, copy); |
| 221 } |
| 222 |
| 169 // Group of tests for the move constructors and move-assigmnent. | 223 // Group of tests for the move constructors and move-assigmnent. |
| 170 TEST(ValuesTest, MoveBool) { | 224 TEST(ValuesTest, MoveBool) { |
| 171 FundamentalValue true_value(true); | 225 FundamentalValue true_value(true); |
| 172 FundamentalValue moved_true_value(std::move(true_value)); | 226 FundamentalValue moved_true_value(std::move(true_value)); |
| 173 EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type()); | 227 EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type()); |
| 174 EXPECT_TRUE(moved_true_value.GetBool()); | 228 EXPECT_TRUE(moved_true_value.GetBool()); |
| 175 | 229 |
| 176 FundamentalValue false_value(false); | 230 FundamentalValue false_value(false); |
| 177 FundamentalValue moved_false_value(std::move(false_value)); | 231 FundamentalValue moved_false_value(std::move(false_value)); |
| 178 EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type()); | 232 EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type()); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 EXPECT_EQ(Value::Type::BINARY, moved_value.type()); | 289 EXPECT_EQ(Value::Type::BINARY, moved_value.type()); |
| 236 EXPECT_EQ(buffer, moved_value.GetBlob()); | 290 EXPECT_EQ(buffer, moved_value.GetBlob()); |
| 237 | 291 |
| 238 Value blank; | 292 Value blank; |
| 239 | 293 |
| 240 blank = BinaryValue(buffer); | 294 blank = BinaryValue(buffer); |
| 241 EXPECT_EQ(Value::Type::BINARY, blank.type()); | 295 EXPECT_EQ(Value::Type::BINARY, blank.type()); |
| 242 EXPECT_EQ(buffer, blank.GetBlob()); | 296 EXPECT_EQ(buffer, blank.GetBlob()); |
| 243 } | 297 } |
| 244 | 298 |
| 299 TEST(ValuesTest, MoveDictionary) { |
| 300 // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to |
| 301 // value semantics. |
| 302 int move; |
| 303 DictionaryValue value; |
| 304 value.SetInteger("Int", 123); |
| 305 |
| 306 DictionaryValue moved_value(std::move(value)); |
| 307 moved_value.GetInteger("Int", &move); |
| 308 |
| 309 EXPECT_EQ(Value::Type::DICTIONARY, moved_value.type()); |
| 310 EXPECT_EQ(123, move); |
| 311 |
| 312 Value blank; |
| 313 |
| 314 blank = DictionaryValue(); |
| 315 EXPECT_EQ(Value::Type::DICTIONARY, blank.type()); |
| 316 } |
| 317 |
| 318 TEST(ValuesTest, MoveList) { |
| 319 // TODO(crbug.com/646113): Clean this up once ListValue switched to |
| 320 // value semantics. |
| 321 int move; |
| 322 ListValue value; |
| 323 value.AppendInteger(123); |
| 324 |
| 325 ListValue moved_value(std::move(value)); |
| 326 moved_value.GetInteger(0, &move); |
| 327 |
| 328 EXPECT_EQ(Value::Type::LIST, moved_value.type()); |
| 329 EXPECT_EQ(123, move); |
| 330 |
| 331 Value blank; |
| 332 |
| 333 blank = ListValue(); |
| 334 EXPECT_EQ(Value::Type::LIST, blank.type()); |
| 335 } |
| 336 |
| 245 TEST(ValuesTest, Basic) { | 337 TEST(ValuesTest, Basic) { |
| 246 // Test basic dictionary getting/setting | 338 // Test basic dictionary getting/setting |
| 247 DictionaryValue settings; | 339 DictionaryValue settings; |
| 248 std::string homepage = "http://google.com"; | 340 std::string homepage = "http://google.com"; |
| 249 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); | 341 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); |
| 250 ASSERT_EQ(std::string("http://google.com"), homepage); | 342 ASSERT_EQ(std::string("http://google.com"), homepage); |
| 251 | 343 |
| 252 ASSERT_FALSE(settings.Get("global", NULL)); | 344 ASSERT_FALSE(settings.Get("global", NULL)); |
| 253 settings.SetBoolean("global", true); | 345 settings.SetBoolean("global", true); |
| 254 ASSERT_TRUE(settings.Get("global", NULL)); | 346 ASSERT_TRUE(settings.Get("global", NULL)); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); | 484 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); |
| 393 ASSERT_EQ(string_value->GetString(), narrow); | 485 ASSERT_EQ(string_value->GetString(), narrow); |
| 394 | 486 |
| 395 // Don't choke on NULL values. | 487 // Don't choke on NULL values. |
| 396 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL))); | 488 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL))); |
| 397 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL))); | 489 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL))); |
| 398 ASSERT_TRUE(narrow_value->GetAsString( | 490 ASSERT_TRUE(narrow_value->GetAsString( |
| 399 static_cast<const StringValue**>(NULL))); | 491 static_cast<const StringValue**>(NULL))); |
| 400 } | 492 } |
| 401 | 493 |
| 402 // This is a Value object that allows us to tell if it's been | |
| 403 // properly deleted by modifying the value of external flag on destruction. | |
| 404 class DeletionTestValue : public Value { | |
| 405 public: | |
| 406 explicit DeletionTestValue(bool* deletion_flag) : Value(Type::NONE) { | |
| 407 Init(deletion_flag); // Separate function so that we can use ASSERT_* | |
| 408 } | |
| 409 | |
| 410 void Init(bool* deletion_flag) { | |
| 411 ASSERT_TRUE(deletion_flag); | |
| 412 deletion_flag_ = deletion_flag; | |
| 413 *deletion_flag_ = false; | |
| 414 } | |
| 415 | |
| 416 ~DeletionTestValue() override { *deletion_flag_ = true; } | |
| 417 | |
| 418 private: | |
| 419 bool* deletion_flag_; | |
| 420 }; | |
| 421 | |
| 422 TEST(ValuesTest, ListDeletion) { | 494 TEST(ValuesTest, ListDeletion) { |
| 423 bool deletion_flag = true; | 495 ListValue list; |
| 424 | 496 list.Append(MakeUnique<Value>()); |
| 425 { | 497 EXPECT_FALSE(list.empty()); |
| 426 ListValue list; | 498 list.Clear(); |
| 427 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 499 EXPECT_TRUE(list.empty()); |
| 428 EXPECT_FALSE(deletion_flag); | |
| 429 } | |
| 430 EXPECT_TRUE(deletion_flag); | |
| 431 | |
| 432 { | |
| 433 ListValue list; | |
| 434 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | |
| 435 EXPECT_FALSE(deletion_flag); | |
| 436 list.Clear(); | |
| 437 EXPECT_TRUE(deletion_flag); | |
| 438 } | |
| 439 | |
| 440 { | |
| 441 ListValue list; | |
| 442 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | |
| 443 EXPECT_FALSE(deletion_flag); | |
| 444 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); | |
| 445 EXPECT_TRUE(deletion_flag); | |
| 446 } | |
| 447 } | 500 } |
| 448 | 501 |
| 449 TEST(ValuesTest, ListRemoval) { | 502 TEST(ValuesTest, ListRemoval) { |
| 450 bool deletion_flag = true; | |
| 451 std::unique_ptr<Value> removed_item; | 503 std::unique_ptr<Value> removed_item; |
| 452 | 504 |
| 453 { | 505 { |
| 454 ListValue list; | 506 ListValue list; |
| 455 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 507 list.Append(MakeUnique<Value>()); |
| 456 EXPECT_FALSE(deletion_flag); | |
| 457 EXPECT_EQ(1U, list.GetSize()); | 508 EXPECT_EQ(1U, list.GetSize()); |
| 458 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), | 509 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), |
| 459 &removed_item)); | 510 &removed_item)); |
| 460 EXPECT_FALSE(list.Remove(1, &removed_item)); | 511 EXPECT_FALSE(list.Remove(1, &removed_item)); |
| 461 EXPECT_TRUE(list.Remove(0, &removed_item)); | 512 EXPECT_TRUE(list.Remove(0, &removed_item)); |
| 462 ASSERT_TRUE(removed_item); | 513 ASSERT_TRUE(removed_item); |
| 463 EXPECT_EQ(0U, list.GetSize()); | 514 EXPECT_EQ(0U, list.GetSize()); |
| 464 } | 515 } |
| 465 EXPECT_FALSE(deletion_flag); | |
| 466 removed_item.reset(); | 516 removed_item.reset(); |
| 467 EXPECT_TRUE(deletion_flag); | |
| 468 | 517 |
| 469 { | 518 { |
| 470 ListValue list; | 519 ListValue list; |
| 471 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 520 list.Append(MakeUnique<Value>()); |
| 472 EXPECT_FALSE(deletion_flag); | |
| 473 EXPECT_TRUE(list.Remove(0, NULL)); | 521 EXPECT_TRUE(list.Remove(0, NULL)); |
| 474 EXPECT_TRUE(deletion_flag); | |
| 475 EXPECT_EQ(0U, list.GetSize()); | 522 EXPECT_EQ(0U, list.GetSize()); |
| 476 } | 523 } |
| 477 | 524 |
| 478 { | 525 { |
| 479 ListValue list; | 526 ListValue list; |
| 480 std::unique_ptr<DeletionTestValue> value( | 527 auto value = MakeUnique<Value>(); |
| 481 new DeletionTestValue(&deletion_flag)); | 528 Value* original_value = value.get(); |
| 482 DeletionTestValue* original_value = value.get(); | |
| 483 list.Append(std::move(value)); | 529 list.Append(std::move(value)); |
| 484 EXPECT_FALSE(deletion_flag); | |
| 485 size_t index = 0; | 530 size_t index = 0; |
| 486 list.Remove(*original_value, &index); | 531 list.Remove(*original_value, &index); |
| 487 EXPECT_EQ(0U, index); | 532 EXPECT_EQ(0U, index); |
| 488 EXPECT_TRUE(deletion_flag); | |
| 489 EXPECT_EQ(0U, list.GetSize()); | 533 EXPECT_EQ(0U, list.GetSize()); |
| 490 } | 534 } |
| 491 } | 535 } |
| 492 | 536 |
| 493 TEST(ValuesTest, DictionaryDeletion) { | 537 TEST(ValuesTest, DictionaryDeletion) { |
| 494 std::string key = "test"; | 538 std::string key = "test"; |
| 495 bool deletion_flag = true; | 539 DictionaryValue dict; |
| 496 | 540 dict.Set(key, MakeUnique<Value>()); |
| 497 { | 541 EXPECT_FALSE(dict.empty()); |
| 498 DictionaryValue dict; | 542 dict.Clear(); |
| 499 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 543 EXPECT_TRUE(dict.empty()); |
| 500 EXPECT_FALSE(deletion_flag); | |
| 501 } | |
| 502 EXPECT_TRUE(deletion_flag); | |
| 503 | |
| 504 { | |
| 505 DictionaryValue dict; | |
| 506 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | |
| 507 EXPECT_FALSE(deletion_flag); | |
| 508 dict.Clear(); | |
| 509 EXPECT_TRUE(deletion_flag); | |
| 510 } | |
| 511 | |
| 512 { | |
| 513 DictionaryValue dict; | |
| 514 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | |
| 515 EXPECT_FALSE(deletion_flag); | |
| 516 dict.Set(key, Value::CreateNullValue()); | |
| 517 EXPECT_TRUE(deletion_flag); | |
| 518 } | |
| 519 } | 544 } |
| 520 | 545 |
| 521 TEST(ValuesTest, DictionaryRemoval) { | 546 TEST(ValuesTest, DictionaryRemoval) { |
| 522 std::string key = "test"; | 547 std::string key = "test"; |
| 523 bool deletion_flag = true; | |
| 524 std::unique_ptr<Value> removed_item; | 548 std::unique_ptr<Value> removed_item; |
| 525 | 549 |
| 526 { | 550 { |
| 527 DictionaryValue dict; | 551 DictionaryValue dict; |
| 528 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 552 dict.Set(key, MakeUnique<Value>()); |
| 529 EXPECT_FALSE(deletion_flag); | |
| 530 EXPECT_TRUE(dict.HasKey(key)); | 553 EXPECT_TRUE(dict.HasKey(key)); |
| 531 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); | 554 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); |
| 532 EXPECT_TRUE(dict.Remove(key, &removed_item)); | 555 EXPECT_TRUE(dict.Remove(key, &removed_item)); |
| 533 EXPECT_FALSE(dict.HasKey(key)); | 556 EXPECT_FALSE(dict.HasKey(key)); |
| 534 ASSERT_TRUE(removed_item); | 557 ASSERT_TRUE(removed_item); |
| 535 } | 558 } |
| 536 EXPECT_FALSE(deletion_flag); | |
| 537 removed_item.reset(); | |
| 538 EXPECT_TRUE(deletion_flag); | |
| 539 | 559 |
| 540 { | 560 { |
| 541 DictionaryValue dict; | 561 DictionaryValue dict; |
| 542 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 562 dict.Set(key, MakeUnique<Value>()); |
| 543 EXPECT_FALSE(deletion_flag); | |
| 544 EXPECT_TRUE(dict.HasKey(key)); | 563 EXPECT_TRUE(dict.HasKey(key)); |
| 545 EXPECT_TRUE(dict.Remove(key, NULL)); | 564 EXPECT_TRUE(dict.Remove(key, NULL)); |
| 546 EXPECT_TRUE(deletion_flag); | |
| 547 EXPECT_FALSE(dict.HasKey(key)); | 565 EXPECT_FALSE(dict.HasKey(key)); |
| 548 } | 566 } |
| 549 } | 567 } |
| 550 | 568 |
| 551 TEST(ValuesTest, DictionaryWithoutPathExpansion) { | 569 TEST(ValuesTest, DictionaryWithoutPathExpansion) { |
| 552 DictionaryValue dict; | 570 DictionaryValue dict; |
| 553 dict.Set("this.is.expanded", Value::CreateNullValue()); | 571 dict.Set("this.is.expanded", Value::CreateNullValue()); |
| 554 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); | 572 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); |
| 555 | 573 |
| 556 EXPECT_FALSE(dict.HasKey("this.is.expanded")); | 574 EXPECT_FALSE(dict.HasKey("this.is.expanded")); |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1366 EXPECT_FALSE(main_list.GetList(1, NULL)); | 1384 EXPECT_FALSE(main_list.GetList(1, NULL)); |
| 1367 EXPECT_FALSE(main_list.GetList(2, NULL)); | 1385 EXPECT_FALSE(main_list.GetList(2, NULL)); |
| 1368 EXPECT_FALSE(main_list.GetList(3, NULL)); | 1386 EXPECT_FALSE(main_list.GetList(3, NULL)); |
| 1369 EXPECT_FALSE(main_list.GetList(4, NULL)); | 1387 EXPECT_FALSE(main_list.GetList(4, NULL)); |
| 1370 EXPECT_FALSE(main_list.GetList(5, NULL)); | 1388 EXPECT_FALSE(main_list.GetList(5, NULL)); |
| 1371 EXPECT_TRUE(main_list.GetList(6, NULL)); | 1389 EXPECT_TRUE(main_list.GetList(6, NULL)); |
| 1372 EXPECT_FALSE(main_list.GetList(7, NULL)); | 1390 EXPECT_FALSE(main_list.GetList(7, NULL)); |
| 1373 } | 1391 } |
| 1374 | 1392 |
| 1375 } // namespace base | 1393 } // namespace base |
| OLD | NEW |