Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: base/values_unittest.cc

Issue 2683203004: Move Storage for ListValue and DictValue in Union (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« base/values.h ('K') | « base/values.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); 392 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16);
393 ASSERT_EQ(string_value->GetString(), narrow); 393 ASSERT_EQ(string_value->GetString(), narrow);
394 394
395 // Don't choke on NULL values. 395 // Don't choke on NULL values.
396 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL))); 396 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL)));
397 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL))); 397 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL)));
398 ASSERT_TRUE(narrow_value->GetAsString( 398 ASSERT_TRUE(narrow_value->GetAsString(
399 static_cast<const StringValue**>(NULL))); 399 static_cast<const StringValue**>(NULL)));
400 } 400 }
401 401
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 };
jdoerrie 2017/02/10 15:17:38 I had to get rid of this class since Value's const
jdoerrie 2017/02/10 18:45:44 The tests are currently failing, because there is
brettw 2017/02/11 00:24:04 I think doing so is OK.
jdoerrie 2017/02/14 17:06:56 Done.
421
422 TEST(ValuesTest, ListDeletion) { 402 TEST(ValuesTest, ListDeletion) {
423 bool deletion_flag = true; 403 ListValue list;
424 404 list.Append(MakeUnique<Value>());
425 { 405 EXPECT_FALSE(list.empty());
426 ListValue list; 406 list.Clear();
427 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); 407 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 } 408 }
448 409
449 TEST(ValuesTest, ListRemoval) { 410 TEST(ValuesTest, ListRemoval) {
450 bool deletion_flag = true;
451 std::unique_ptr<Value> removed_item; 411 std::unique_ptr<Value> removed_item;
452 412
453 { 413 {
454 ListValue list; 414 ListValue list;
455 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); 415 list.Append(MakeUnique<Value>());
456 EXPECT_FALSE(deletion_flag);
457 EXPECT_EQ(1U, list.GetSize()); 416 EXPECT_EQ(1U, list.GetSize());
458 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), 417 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
459 &removed_item)); 418 &removed_item));
460 EXPECT_FALSE(list.Remove(1, &removed_item)); 419 EXPECT_FALSE(list.Remove(1, &removed_item));
461 EXPECT_TRUE(list.Remove(0, &removed_item)); 420 EXPECT_TRUE(list.Remove(0, &removed_item));
462 ASSERT_TRUE(removed_item); 421 ASSERT_TRUE(removed_item);
463 EXPECT_EQ(0U, list.GetSize()); 422 EXPECT_EQ(0U, list.GetSize());
464 } 423 }
465 EXPECT_FALSE(deletion_flag);
466 removed_item.reset(); 424 removed_item.reset();
467 EXPECT_TRUE(deletion_flag);
468 425
469 { 426 {
470 ListValue list; 427 ListValue list;
471 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); 428 list.Append(MakeUnique<Value>());
472 EXPECT_FALSE(deletion_flag);
473 EXPECT_TRUE(list.Remove(0, NULL)); 429 EXPECT_TRUE(list.Remove(0, NULL));
474 EXPECT_TRUE(deletion_flag);
475 EXPECT_EQ(0U, list.GetSize()); 430 EXPECT_EQ(0U, list.GetSize());
476 } 431 }
477 432
478 { 433 {
479 ListValue list; 434 ListValue list;
480 std::unique_ptr<DeletionTestValue> value( 435 auto value = MakeUnique<Value>();
481 new DeletionTestValue(&deletion_flag)); 436 Value* original_value = value.get();
482 DeletionTestValue* original_value = value.get();
483 list.Append(std::move(value)); 437 list.Append(std::move(value));
484 EXPECT_FALSE(deletion_flag);
485 size_t index = 0; 438 size_t index = 0;
486 list.Remove(*original_value, &index); 439 list.Remove(*original_value, &index);
487 EXPECT_EQ(0U, index); 440 EXPECT_EQ(0U, index);
488 EXPECT_TRUE(deletion_flag);
489 EXPECT_EQ(0U, list.GetSize()); 441 EXPECT_EQ(0U, list.GetSize());
490 } 442 }
491 } 443 }
492 444
493 TEST(ValuesTest, DictionaryDeletion) { 445 TEST(ValuesTest, DictionaryDeletion) {
494 std::string key = "test"; 446 std::string key = "test";
495 bool deletion_flag = true; 447 DictionaryValue dict;
496 448 dict.Set(key, MakeUnique<Value>());
497 { 449 EXPECT_FALSE(dict.empty());
498 DictionaryValue dict; 450 dict.Clear();
499 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); 451 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 } 452 }
520 453
521 TEST(ValuesTest, DictionaryRemoval) { 454 TEST(ValuesTest, DictionaryRemoval) {
522 std::string key = "test"; 455 std::string key = "test";
523 bool deletion_flag = true;
524 std::unique_ptr<Value> removed_item; 456 std::unique_ptr<Value> removed_item;
525 457
526 { 458 {
527 DictionaryValue dict; 459 DictionaryValue dict;
528 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); 460 dict.Set(key, MakeUnique<Value>());
529 EXPECT_FALSE(deletion_flag);
530 EXPECT_TRUE(dict.HasKey(key)); 461 EXPECT_TRUE(dict.HasKey(key));
531 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); 462 EXPECT_FALSE(dict.Remove("absent key", &removed_item));
532 EXPECT_TRUE(dict.Remove(key, &removed_item)); 463 EXPECT_TRUE(dict.Remove(key, &removed_item));
533 EXPECT_FALSE(dict.HasKey(key)); 464 EXPECT_FALSE(dict.HasKey(key));
534 ASSERT_TRUE(removed_item); 465 ASSERT_TRUE(removed_item);
535 } 466 }
536 EXPECT_FALSE(deletion_flag);
537 removed_item.reset();
538 EXPECT_TRUE(deletion_flag);
539 467
540 { 468 {
541 DictionaryValue dict; 469 DictionaryValue dict;
542 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); 470 dict.Set(key, MakeUnique<Value>());
543 EXPECT_FALSE(deletion_flag);
544 EXPECT_TRUE(dict.HasKey(key)); 471 EXPECT_TRUE(dict.HasKey(key));
545 EXPECT_TRUE(dict.Remove(key, NULL)); 472 EXPECT_TRUE(dict.Remove(key, NULL));
546 EXPECT_TRUE(deletion_flag);
547 EXPECT_FALSE(dict.HasKey(key)); 473 EXPECT_FALSE(dict.HasKey(key));
548 } 474 }
549 } 475 }
550 476
551 TEST(ValuesTest, DictionaryWithoutPathExpansion) { 477 TEST(ValuesTest, DictionaryWithoutPathExpansion) {
552 DictionaryValue dict; 478 DictionaryValue dict;
553 dict.Set("this.is.expanded", Value::CreateNullValue()); 479 dict.Set("this.is.expanded", Value::CreateNullValue());
554 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); 480 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue());
555 481
556 EXPECT_FALSE(dict.HasKey("this.is.expanded")); 482 EXPECT_FALSE(dict.HasKey("this.is.expanded"));
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 EXPECT_FALSE(main_list.GetList(1, NULL)); 1292 EXPECT_FALSE(main_list.GetList(1, NULL));
1367 EXPECT_FALSE(main_list.GetList(2, NULL)); 1293 EXPECT_FALSE(main_list.GetList(2, NULL));
1368 EXPECT_FALSE(main_list.GetList(3, NULL)); 1294 EXPECT_FALSE(main_list.GetList(3, NULL));
1369 EXPECT_FALSE(main_list.GetList(4, NULL)); 1295 EXPECT_FALSE(main_list.GetList(4, NULL));
1370 EXPECT_FALSE(main_list.GetList(5, NULL)); 1296 EXPECT_FALSE(main_list.GetList(5, NULL));
1371 EXPECT_TRUE(main_list.GetList(6, NULL)); 1297 EXPECT_TRUE(main_list.GetList(6, NULL));
1372 EXPECT_FALSE(main_list.GetList(7, NULL)); 1298 EXPECT_FALSE(main_list.GetList(7, NULL));
1373 } 1299 }
1374 1300
1375 } // namespace base 1301 } // namespace base
OLDNEW
« base/values.h ('K') | « base/values.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698