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

Side by Side Diff: Source/platform/graphics/ListContainerTest.cpp

Issue 1205733002: Add ListContainer::appendByMoving (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Appease compiler overlords 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 | « Source/platform/graphics/ListContainer.cpp ('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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "config.h" 5 #include "config.h"
6 #include "platform/graphics/ListContainer.h" 6 #include "platform/graphics/ListContainer.h"
7 7
8 #include "wtf/OwnPtr.h" 8 #include "wtf/OwnPtr.h"
9 #include "wtf/PassOwnPtr.h" 9 #include "wtf/PassOwnPtr.h"
10 #include "wtf/RefPtr.h" 10 #include "wtf/RefPtr.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 return true; 78 return true;
79 } 79 }
80 80
81 bool isConstNonDerivedElementPointer(NonDerivedElement* ptr) 81 bool isConstNonDerivedElementPointer(NonDerivedElement* ptr)
82 { 82 {
83 return false; 83 return false;
84 } 84 }
85 85
86 const int kMagicNumberToUseForSimpleDerivedElementOne = 42; 86 const int kMagicNumberToUseForSimpleDerivedElementOne = 42;
87 const int kMagicNumberToUseForSimpleDerivedElementTwo = 314; 87 const int kMagicNumberToUseForSimpleDerivedElementTwo = 314;
88 const int kMagicNumberToUseForSimpleDerivedElementThree = 1618;
88 89
89 class SimpleDerivedElement : public DerivedElement { 90 class SimpleDerivedElement : public DerivedElement {
90 public: 91 public:
91 ~SimpleDerivedElement() override {} 92 ~SimpleDerivedElement() override {}
92 void setValue(int val) { value = val; } 93 void setValue(int val) { value = val; }
93 int getValue() { return value; } 94 int getValue() { return value; }
94 95
95 private: 96 private:
96 int value; 97 int value;
97 }; 98 };
98 99
99 class SimpleDerivedElementConstructMagicNumberOne : public SimpleDerivedElement { 100 class SimpleDerivedElementConstructMagicNumberOne : public SimpleDerivedElement {
100 public: 101 public:
101 SimpleDerivedElementConstructMagicNumberOne() : SimpleDerivedElement() 102 SimpleDerivedElementConstructMagicNumberOne()
102 { 103 {
103 setValue(kMagicNumberToUseForSimpleDerivedElementOne); 104 setValue(kMagicNumberToUseForSimpleDerivedElementOne);
104 } 105 }
105 }; 106 };
106 107
107 class SimpleDerivedElementConstructMagicNumberTwo : public SimpleDerivedElement { 108 class SimpleDerivedElementConstructMagicNumberTwo : public SimpleDerivedElement {
108 public: 109 public:
109 SimpleDerivedElementConstructMagicNumberTwo() : SimpleDerivedElement() 110 SimpleDerivedElementConstructMagicNumberTwo()
110 { 111 {
111 setValue(kMagicNumberToUseForSimpleDerivedElementTwo); 112 setValue(kMagicNumberToUseForSimpleDerivedElementTwo);
112 } 113 }
113 }; 114 };
114 115
115 class MockDerivedElement : public SimpleDerivedElementConstructMagicNumberOne { 116 class MockDerivedElement : public SimpleDerivedElementConstructMagicNumberOne {
116 public: 117 public:
117 ~MockDerivedElement() override { Destruct(); } 118 ~MockDerivedElement() override { Destruct(); }
118 MOCK_METHOD0(Destruct, void()); 119 MOCK_METHOD0(Destruct, void());
119 }; 120 };
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 check_equal(); // One full, one partially full, one empty. 808 check_equal(); // One full, one partially full, one empty.
808 pop(); 809 pop();
809 check_equal(); // One full, one empty. 810 check_equal(); // One full, one empty.
810 push(); 811 push();
811 pop(); 812 pop();
812 pop(); 813 pop();
813 ASSERT_TRUE(list.empty()); 814 ASSERT_TRUE(list.empty());
814 check_equal(); // Empty. 815 check_equal(); // Empty.
815 } 816 }
816 817
818 TEST(ListContainerTest, AppendByMovingSameList)
819 {
820 ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
821 list.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
822
823 list.appendByMoving(list.front());
824 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue ());
825 EXPECT_EQ(2u, list.size());
826
827 list.front()->setValue(kMagicNumberToUseForSimpleDerivedElementTwo);
828 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo, list.front()->getValu e());
829 list.appendByMoving(list.front());
830 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo, list.back()->getValue ());
831 EXPECT_EQ(3u, list.size());
832 }
833
834 TEST(ListContainerTest, AppendByMovingDoesNotDestruct)
835 {
836 ListContainer<DerivedElement> list1(kCurrentLargestDerivedElementSize);
837 ListContainer<DerivedElement> list2(kCurrentLargestDerivedElementSize);
838 MockDerivedElement* mde1 = list1.allocateAndConstruct<MockDerivedElement>();
839
840 // Make sure destructor isn't called during AppendByMoving.
841 list2.appendByMoving(mde1);
842 EXPECT_CALL(*mde1, Destruct()).Times(0);
843 testing::Mock::VerifyAndClearExpectations(mde1);
844 mde1 = static_cast<MockDerivedElement*>(list2.back());
845 EXPECT_CALL(*mde1, Destruct());
846 }
847
848 TEST(ListContainerTest, AppendByMovingReplacesSourceWithNewDerivedElement)
849 {
850 ListContainer<SimpleDerivedElementConstructMagicNumberOne> list1(kCurrentLar gestDerivedElementSize);
851 ListContainer<SimpleDerivedElementConstructMagicNumberTwo> list2(kCurrentLar gestDerivedElementSize);
852
853 list1.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
854 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
855 list1.front()->getValue());
856
857 list2.appendByMoving(list1.front());
858 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
859 list1.front()->getValue());
860 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
861 list2.front()->getValue());
862
863 // Change the value of list2.front() to ensure the value is actually moved.
864 list2.back()->setValue(kMagicNumberToUseForSimpleDerivedElementThree);
865
866 list1.appendByMoving(list2.back());
867 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
868 list1.front()->getValue());
869 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree,
870 list1.back()->getValue());
871 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
872 list2.back()->getValue());
873
874 // AppendByMoving replaces the source element with a new derived element so
875 // we do not expect sizes to shrink after AppendByMoving is called.
876 EXPECT_EQ(2u, list1.size()); // One direct allocation and one AppendByMoving .
877 EXPECT_EQ(1u, list2.size()); // One AppendByMoving.
878 }
879
880 const size_t kLongCountForLongSimpleDerivedElement = 5;
881
882 class LongSimpleDerivedElement : public SimpleDerivedElement {
883 public:
884 ~LongSimpleDerivedElement() override {}
885 void setAllValues(unsigned long value)
886 {
887 for (size_t i = 0; i < kLongCountForLongSimpleDerivedElement; i++)
888 values[i] = value;
889 }
890 bool areAllValuesEqualTo(size_t value) const
891 {
892 for (size_t i = 1; i < kLongCountForLongSimpleDerivedElement; i++) {
893 if (values[i] != values[0])
894 return false;
895 }
896 return true;
897 }
898
899 private:
900 unsigned long values[kLongCountForLongSimpleDerivedElement];
901 };
902
903 const unsigned long kMagicNumberToUseForLongSimpleDerivedElement = 2718ul;
904
905 class LongSimpleDerivedElementConstructMagicNumber : public LongSimpleDerivedEle ment {
906 public:
907 LongSimpleDerivedElementConstructMagicNumber()
908 {
909 setAllValues(kMagicNumberToUseForLongSimpleDerivedElement);
910 }
911 };
912
913 TEST(ListContainerTest, AppendByMovingLongAndSimpleDerivedElements)
914 {
915 static_assert(sizeof(LongSimpleDerivedElement) > sizeof(SimpleDerivedElement ),
916 "LongSimpleDerivedElement should be larger than "
917 "SimpleDerivedElement's size.");
918 static_assert(sizeof(LongSimpleDerivedElement) <= kLargestDerivedElementSize ,
919 "LongSimpleDerivedElement should be smaller than the maximum "
920 "DerivedElement size.");
921
922 ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
923 list.allocateAndConstruct<LongSimpleDerivedElementConstructMagicNumber>();
924 list.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
925
926 EXPECT_TRUE(static_cast<LongSimpleDerivedElement*>(list.front())->areAllValu esEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
927 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue ());
928
929 // Test that moving a simple derived element actually moves enough data so
930 // that the LongSimpleDerivedElement at this location is entirely moved.
931 SimpleDerivedElement* simpleElement = list.back();
932 list.appendByMoving(list.front());
933 EXPECT_TRUE(static_cast<LongSimpleDerivedElement*>(list.back())->areAllValue sEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
934 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, simpleElement->getVal ue());
935
936 LongSimpleDerivedElement* longElement = static_cast<LongSimpleDerivedElement *>(list.back());
937 list.appendByMoving(simpleElement);
938 EXPECT_TRUE(longElement->areAllValuesEqualTo(kMagicNumberToUseForLongSimpleD erivedElement));
939 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue ());
940 }
941
817 } // namespace 942 } // namespace
818 } // namespace blink 943 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/graphics/ListContainer.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698