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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/graphics/ListContainer.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/graphics/ListContainerTest.cpp
diff --git a/Source/platform/graphics/ListContainerTest.cpp b/Source/platform/graphics/ListContainerTest.cpp
index f7c8d8eb63876f2fd5a9d21956042ce560602456..95d644edd07d509aa62ab2c37a2fec5e24e8889b 100644
--- a/Source/platform/graphics/ListContainerTest.cpp
+++ b/Source/platform/graphics/ListContainerTest.cpp
@@ -85,6 +85,7 @@ bool isConstNonDerivedElementPointer(NonDerivedElement* ptr)
const int kMagicNumberToUseForSimpleDerivedElementOne = 42;
const int kMagicNumberToUseForSimpleDerivedElementTwo = 314;
+const int kMagicNumberToUseForSimpleDerivedElementThree = 1618;
class SimpleDerivedElement : public DerivedElement {
public:
@@ -98,7 +99,7 @@ private:
class SimpleDerivedElementConstructMagicNumberOne : public SimpleDerivedElement {
public:
- SimpleDerivedElementConstructMagicNumberOne() : SimpleDerivedElement()
+ SimpleDerivedElementConstructMagicNumberOne()
{
setValue(kMagicNumberToUseForSimpleDerivedElementOne);
}
@@ -106,7 +107,7 @@ public:
class SimpleDerivedElementConstructMagicNumberTwo : public SimpleDerivedElement {
public:
- SimpleDerivedElementConstructMagicNumberTwo() : SimpleDerivedElement()
+ SimpleDerivedElementConstructMagicNumberTwo()
{
setValue(kMagicNumberToUseForSimpleDerivedElementTwo);
}
@@ -814,5 +815,129 @@ TEST(ListContainerTest, RemoveLastIteration)
check_equal(); // Empty.
}
+TEST(ListContainerTest, AppendByMovingSameList)
+{
+ ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
+ list.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
+
+ list.appendByMoving(list.front());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue());
+ EXPECT_EQ(2u, list.size());
+
+ list.front()->setValue(kMagicNumberToUseForSimpleDerivedElementTwo);
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo, list.front()->getValue());
+ list.appendByMoving(list.front());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo, list.back()->getValue());
+ EXPECT_EQ(3u, list.size());
+}
+
+TEST(ListContainerTest, AppendByMovingDoesNotDestruct)
+{
+ ListContainer<DerivedElement> list1(kCurrentLargestDerivedElementSize);
+ ListContainer<DerivedElement> list2(kCurrentLargestDerivedElementSize);
+ MockDerivedElement* mde1 = list1.allocateAndConstruct<MockDerivedElement>();
+
+ // Make sure destructor isn't called during AppendByMoving.
+ list2.appendByMoving(mde1);
+ EXPECT_CALL(*mde1, Destruct()).Times(0);
+ testing::Mock::VerifyAndClearExpectations(mde1);
+ mde1 = static_cast<MockDerivedElement*>(list2.back());
+ EXPECT_CALL(*mde1, Destruct());
+}
+
+TEST(ListContainerTest, AppendByMovingReplacesSourceWithNewDerivedElement)
+{
+ ListContainer<SimpleDerivedElementConstructMagicNumberOne> list1(kCurrentLargestDerivedElementSize);
+ ListContainer<SimpleDerivedElementConstructMagicNumberTwo> list2(kCurrentLargestDerivedElementSize);
+
+ list1.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list1.front()->getValue());
+
+ list2.appendByMoving(list1.front());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list1.front()->getValue());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list2.front()->getValue());
+
+ // Change the value of list2.front() to ensure the value is actually moved.
+ list2.back()->setValue(kMagicNumberToUseForSimpleDerivedElementThree);
+
+ list1.appendByMoving(list2.back());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list1.front()->getValue());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree,
+ list1.back()->getValue());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
+ list2.back()->getValue());
+
+ // AppendByMoving replaces the source element with a new derived element so
+ // we do not expect sizes to shrink after AppendByMoving is called.
+ EXPECT_EQ(2u, list1.size()); // One direct allocation and one AppendByMoving.
+ EXPECT_EQ(1u, list2.size()); // One AppendByMoving.
+}
+
+const size_t kLongCountForLongSimpleDerivedElement = 5;
+
+class LongSimpleDerivedElement : public SimpleDerivedElement {
+public:
+ ~LongSimpleDerivedElement() override {}
+ void setAllValues(unsigned long value)
+ {
+ for (size_t i = 0; i < kLongCountForLongSimpleDerivedElement; i++)
+ values[i] = value;
+ }
+ bool areAllValuesEqualTo(size_t value) const
+ {
+ for (size_t i = 1; i < kLongCountForLongSimpleDerivedElement; i++) {
+ if (values[i] != values[0])
+ return false;
+ }
+ return true;
+ }
+
+private:
+ unsigned long values[kLongCountForLongSimpleDerivedElement];
+};
+
+const unsigned long kMagicNumberToUseForLongSimpleDerivedElement = 2718ul;
+
+class LongSimpleDerivedElementConstructMagicNumber : public LongSimpleDerivedElement {
+public:
+ LongSimpleDerivedElementConstructMagicNumber()
+ {
+ setAllValues(kMagicNumberToUseForLongSimpleDerivedElement);
+ }
+};
+
+TEST(ListContainerTest, AppendByMovingLongAndSimpleDerivedElements)
+{
+ static_assert(sizeof(LongSimpleDerivedElement) > sizeof(SimpleDerivedElement),
+ "LongSimpleDerivedElement should be larger than "
+ "SimpleDerivedElement's size.");
+ static_assert(sizeof(LongSimpleDerivedElement) <= kLargestDerivedElementSize,
+ "LongSimpleDerivedElement should be smaller than the maximum "
+ "DerivedElement size.");
+
+ ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize);
+ list.allocateAndConstruct<LongSimpleDerivedElementConstructMagicNumber>();
+ list.allocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
+
+ EXPECT_TRUE(static_cast<LongSimpleDerivedElement*>(list.front())->areAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue());
+
+ // Test that moving a simple derived element actually moves enough data so
+ // that the LongSimpleDerivedElement at this location is entirely moved.
+ SimpleDerivedElement* simpleElement = list.back();
+ list.appendByMoving(list.front());
+ EXPECT_TRUE(static_cast<LongSimpleDerivedElement*>(list.back())->areAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, simpleElement->getValue());
+
+ LongSimpleDerivedElement* longElement = static_cast<LongSimpleDerivedElement*>(list.back());
+ list.appendByMoving(simpleElement);
+ EXPECT_TRUE(longElement->areAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement));
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, list.back()->getValue());
+}
+
} // namespace
} // namespace blink
« 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