| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |