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