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

Side by Side Diff: cc/base/list_container_unittest.cc

Issue 1202153002: Add ListContainer::AppendByMoving (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address reviewer comments Created 5 years, 6 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
« no previous file with comments | « cc/base/list_container.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "cc/base/list_container.h" 5 #include "cc/base/list_container.h"
6 6
7 #include <vector> 7 #include <vector>
8 #include "testing/gmock/include/gmock/gmock.h" 8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 bool isConstNonDerivedElementPointer(const NonDerivedElement* ptr) { 72 bool isConstNonDerivedElementPointer(const NonDerivedElement* ptr) {
73 return true; 73 return true;
74 } 74 }
75 75
76 bool isConstNonDerivedElementPointer(NonDerivedElement* ptr) { 76 bool isConstNonDerivedElementPointer(NonDerivedElement* ptr) {
77 return false; 77 return false;
78 } 78 }
79 79
80 const int kMagicNumberToUseForSimpleDerivedElementOne = 42; 80 const int kMagicNumberToUseForSimpleDerivedElementOne = 42;
81 const int kMagicNumberToUseForSimpleDerivedElementTwo = 314; 81 const int kMagicNumberToUseForSimpleDerivedElementTwo = 314;
82 const int kMagicNumberToUseForSimpleDerivedElementThree = 1618;
82 83
83 class SimpleDerivedElement : public DerivedElement { 84 class SimpleDerivedElement : public DerivedElement {
84 public: 85 public:
85 ~SimpleDerivedElement() override {} 86 ~SimpleDerivedElement() override {}
86 void set_value(int val) { value = val; } 87 void set_value(int val) { value = val; }
87 int get_value() { return value; } 88 int get_value() { return value; }
88 89
89 private: 90 private:
90 int value; 91 int value;
91 }; 92 };
92 93
93 class SimpleDerivedElementConstructMagicNumberOne 94 class SimpleDerivedElementConstructMagicNumberOne
94 : public SimpleDerivedElement { 95 : public SimpleDerivedElement {
95 public: 96 public:
96 SimpleDerivedElementConstructMagicNumberOne() : SimpleDerivedElement() { 97 SimpleDerivedElementConstructMagicNumberOne() {
97 set_value(kMagicNumberToUseForSimpleDerivedElementOne); 98 set_value(kMagicNumberToUseForSimpleDerivedElementOne);
98 } 99 }
99 }; 100 };
100 101
101 class SimpleDerivedElementConstructMagicNumberTwo 102 class SimpleDerivedElementConstructMagicNumberTwo
102 : public SimpleDerivedElement { 103 : public SimpleDerivedElement {
103 public: 104 public:
104 SimpleDerivedElementConstructMagicNumberTwo() : SimpleDerivedElement() { 105 SimpleDerivedElementConstructMagicNumberTwo() {
105 set_value(kMagicNumberToUseForSimpleDerivedElementTwo); 106 set_value(kMagicNumberToUseForSimpleDerivedElementTwo);
106 } 107 }
107 }; 108 };
108 109
109 class MockDerivedElement : public SimpleDerivedElementConstructMagicNumberOne { 110 class MockDerivedElement : public SimpleDerivedElementConstructMagicNumberOne {
110 public: 111 public:
111 ~MockDerivedElement() override { Destruct(); } 112 ~MockDerivedElement() override { Destruct(); }
112 MOCK_METHOD0(Destruct, void()); 113 MOCK_METHOD0(Destruct, void());
113 }; 114 };
114 115
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 check_equal(); // One full, one partially full, one empty. 814 check_equal(); // One full, one partially full, one empty.
814 pop(); 815 pop();
815 check_equal(); // One full, one empty. 816 check_equal(); // One full, one empty.
816 push(); 817 push();
817 pop(); 818 pop();
818 pop(); 819 pop();
819 ASSERT_TRUE(list.empty()); 820 ASSERT_TRUE(list.empty());
820 check_equal(); // Empty. 821 check_equal(); // Empty.
821 } 822 }
822 823
824 TEST(ListContainerTest, AppendByMovingSameList) {
825 ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
826 list.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
827
828 list.AppendByMoving(list.front());
829 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
830 list.back()->get_value());
831 EXPECT_EQ(2u, list.size());
832
833 list.front()->set_value(kMagicNumberToUseForSimpleDerivedElementTwo);
834 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
835 list.front()->get_value());
836 list.AppendByMoving(list.front());
837 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
838 list.back()->get_value());
839 EXPECT_EQ(3u, list.size());
840 }
841
842 TEST(ListContainerTest, AppendByMovingDoesNotDestruct) {
843 ListContainer<DerivedElement> list_1(kCurrentLargestDerivedElementSize);
844 ListContainer<DerivedElement> list_2(kCurrentLargestDerivedElementSize);
845 MockDerivedElement* mde_1 = list_1.AllocateAndConstruct<MockDerivedElement>();
846
847 // Make sure destructor isn't called during AppendByMoving.
848 list_2.AppendByMoving(mde_1);
849 EXPECT_CALL(*mde_1, Destruct()).Times(0);
850 testing::Mock::VerifyAndClearExpectations(mde_1);
851 mde_1 = static_cast<MockDerivedElement*>(list_2.back());
852 EXPECT_CALL(*mde_1, Destruct());
853 }
854
855 TEST(ListContainerTest, AppendByMovingReplacesSourceWithNewDerivedElement) {
856 ListContainer<SimpleDerivedElementConstructMagicNumberOne> list_1(
857 kCurrentLargestDerivedElementSize);
858 ListContainer<SimpleDerivedElementConstructMagicNumberTwo> list_2(
859 kCurrentLargestDerivedElementSize);
860
861 list_1.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
862 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
863 list_1.front()->get_value());
864
865 list_2.AppendByMoving(list_1.front());
866 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
867 list_1.front()->get_value());
868 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
869 list_2.front()->get_value());
870
871 // Change the value of list_2.front() to ensure the value is actually moved.
872 list_2.back()->set_value(kMagicNumberToUseForSimpleDerivedElementThree);
873
874 list_1.AppendByMoving(list_2.back());
875 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
876 list_1.front()->get_value());
877 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree,
878 list_1.back()->get_value());
879 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
880 list_2.back()->get_value());
881
882 // AppendByMoving replaces the source element with a new derived element so
883 // we do not expect sizes to shrink after AppendByMoving is called.
884 EXPECT_EQ(2u,
885 list_1.size()); // One direct allocation and one AppendByMoving.
886 EXPECT_EQ(1u, list_2.size()); // One AppendByMoving.
887 }
888
889 const size_t kLongCountForLongSimpleDerivedElement = 5;
890
891 class LongSimpleDerivedElement : public SimpleDerivedElement {
892 public:
893 ~LongSimpleDerivedElement() override {}
894 void SetAllValues(unsigned long value) {
895 for (size_t i = 0; i < kLongCountForLongSimpleDerivedElement; i++)
896 values[i] = value;
897 }
898 bool AreAllValuesEqualTo(size_t value) const {
899 for (size_t i = 1; i < kLongCountForLongSimpleDerivedElement; i++) {
900 if (values[i] != values[0])
901 return false;
902 }
903 return true;
904 }
905
906 private:
907 unsigned long values[kLongCountForLongSimpleDerivedElement];
908 };
909
910 const unsigned long kMagicNumberToUseForLongSimpleDerivedElement = 2718ul;
911
912 class LongSimpleDerivedElementConstructMagicNumber
913 : public LongSimpleDerivedElement {
914 public:
915 LongSimpleDerivedElementConstructMagicNumber() {
916 SetAllValues(kMagicNumberToUseForLongSimpleDerivedElement);
917 }
918 };
919
920 TEST(ListContainerTest, AppendByMovingLongAndSimpleDerivedElements) {
921 static_assert(sizeof(LongSimpleDerivedElement) > sizeof(SimpleDerivedElement),
922 "LongSimpleDerivedElement should be larger than "
923 "SimpleDerivedElement's size.");
924 static_assert(sizeof(LongSimpleDerivedElement) <= kLargestDerivedElementSize,
925 "LongSimpleDerivedElement should be smaller than the maximum "
926 "DerivedElement size.");
927
928 ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
929 list.AllocateAndConstruct<LongSimpleDerivedElementConstructMagicNumber>();
930 list.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
931
932 EXPECT_TRUE(
933 static_cast<LongSimpleDerivedElement*>(list.front())
934 ->AreAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
935 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
936 list.back()->get_value());
937
938 // Test that moving a simple derived element actually moves enough data so
939 // that the LongSimpleDerivedElement at this location is entirely moved.
940 SimpleDerivedElement* simple_element = list.back();
941 list.AppendByMoving(list.front());
942 EXPECT_TRUE(
943 static_cast<LongSimpleDerivedElement*>(list.back())
944 ->AreAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
945 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
946 simple_element->get_value());
947
948 LongSimpleDerivedElement* long_element =
949 static_cast<LongSimpleDerivedElement*>(list.back());
950 list.AppendByMoving(simple_element);
951 EXPECT_TRUE(long_element->AreAllValuesEqualTo(
952 kMagicNumberToUseForLongSimpleDerivedElement));
953 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
954 list.back()->get_value());
955 }
956
823 } // namespace 957 } // namespace
824 } // namespace cc 958 } // namespace cc
OLDNEW
« no previous file with comments | « cc/base/list_container.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698