Chromium Code Reviews| 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 testing::MockFunction<void()> after_append; | |
| 849 { | |
| 850 testing::InSequence s; | |
|
danakj
2015/06/23 22:20:08
You can do this https://code.google.com/p/chromium
| |
| 851 EXPECT_CALL(*mde_1, Destruct()).Times(0); | |
| 852 EXPECT_CALL(after_append, Call()); | |
| 853 EXPECT_CALL(*mde_1, Destruct()); | |
| 854 } | |
| 855 | |
| 856 list_2.AppendByMoving(mde_1); | |
| 857 after_append.Call(); | |
| 858 } | |
| 859 | |
| 860 TEST(ListContainerTest, AppendByMovingReplacesSourceWithNewDerivedElement) { | |
| 861 ListContainer<SimpleDerivedElementConstructMagicNumberOne> list_1( | |
| 862 kCurrentLargestDerivedElementSize); | |
| 863 ListContainer<SimpleDerivedElementConstructMagicNumberTwo> list_2( | |
| 864 kCurrentLargestDerivedElementSize); | |
| 865 | |
| 866 list_1.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>(); | |
| 867 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 868 list_1.front()->get_value()); | |
| 869 | |
| 870 list_2.AppendByMoving(list_1.front()); | |
| 871 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 872 list_1.front()->get_value()); | |
| 873 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 874 list_2.front()->get_value()); | |
| 875 | |
| 876 // Change the value of list_2.front() to ensure the value is actually moved. | |
| 877 list_2.back()->set_value(kMagicNumberToUseForSimpleDerivedElementThree); | |
| 878 | |
| 879 list_1.AppendByMoving(list_2.back()); | |
| 880 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 881 list_1.front()->get_value()); | |
| 882 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree, | |
| 883 list_1.back()->get_value()); | |
| 884 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo, | |
| 885 list_2.back()->get_value()); | |
| 886 | |
| 887 // AppendByMoving replaces the source element with a new derived element so | |
| 888 // we do not expect sizes to shrink after AppendByMoving is called. | |
| 889 EXPECT_EQ(2u, | |
| 890 list_1.size()); // One direct allocation and one AppendByMoving. | |
| 891 EXPECT_EQ(1u, list_2.size()); // One AppendByMoving. | |
| 892 } | |
| 893 | |
| 894 const size_t kLongCountForLongSimpleDerivedElement = 5; | |
| 895 | |
| 896 class LongSimpleDerivedElement : public SimpleDerivedElement { | |
| 897 public: | |
| 898 ~LongSimpleDerivedElement() override {} | |
| 899 void SetAllValues(unsigned long value) { | |
| 900 for (size_t i = 0; i < kLongCountForLongSimpleDerivedElement; i++) | |
| 901 values[i] = value; | |
| 902 } | |
| 903 bool AreAllValuesEqualTo(size_t value) const { | |
| 904 for (size_t i = 1; i < kLongCountForLongSimpleDerivedElement; i++) { | |
| 905 if (values[i] != values[0]) | |
| 906 return false; | |
| 907 } | |
| 908 return true; | |
| 909 } | |
| 910 | |
| 911 private: | |
| 912 unsigned long values[kLongCountForLongSimpleDerivedElement]; | |
| 913 }; | |
| 914 | |
| 915 const unsigned long kMagicNumberToUseForLongSimpleDerivedElement = 2718ul; | |
| 916 | |
| 917 class LongSimpleDerivedElementConstructMagicNumber | |
| 918 : public LongSimpleDerivedElement { | |
| 919 public: | |
| 920 LongSimpleDerivedElementConstructMagicNumber() { | |
| 921 SetAllValues(kMagicNumberToUseForLongSimpleDerivedElement); | |
| 922 } | |
| 923 }; | |
| 924 | |
| 925 TEST(ListContainerTest, AppendByMovingLongAndSimpleDerivedElements) { | |
| 926 static_assert(sizeof(LongSimpleDerivedElement) > sizeof(SimpleDerivedElement), | |
| 927 "LongSimpleDerivedElement should be larger than " | |
| 928 "SimpleDerivedElement's size."); | |
| 929 static_assert(sizeof(LongSimpleDerivedElement) <= kLargestDerivedElementSize, | |
| 930 "LongSimpleDerivedElement should be smaller than the maximum " | |
| 931 "DerivedElement size."); | |
| 932 | |
| 933 ListContainer<SimpleDerivedElement> list(kCurrentLargestDerivedElementSize); | |
| 934 list.AllocateAndConstruct<LongSimpleDerivedElementConstructMagicNumber>(); | |
| 935 list.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>(); | |
| 936 | |
| 937 EXPECT_TRUE( | |
| 938 static_cast<LongSimpleDerivedElement*>(list.front()) | |
| 939 ->AreAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement)); | |
| 940 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 941 list.back()->get_value()); | |
| 942 | |
| 943 // Test that moving a simple derived element actually moves enough data so | |
| 944 // that the LongSimpleDerivedElement at this location is entirely moved. | |
| 945 SimpleDerivedElement* simple_element = list.back(); | |
| 946 list.AppendByMoving(list.front()); | |
| 947 EXPECT_TRUE( | |
| 948 static_cast<LongSimpleDerivedElement*>(list.back()) | |
| 949 ->AreAllValuesEqualTo(kMagicNumberToUseForLongSimpleDerivedElement)); | |
| 950 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 951 simple_element->get_value()); | |
| 952 | |
| 953 LongSimpleDerivedElement* long_element = | |
| 954 static_cast<LongSimpleDerivedElement*>(list.back()); | |
| 955 list.AppendByMoving(simple_element); | |
| 956 EXPECT_TRUE(long_element->AreAllValuesEqualTo( | |
| 957 kMagicNumberToUseForLongSimpleDerivedElement)); | |
| 958 EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne, | |
| 959 list.back()->get_value()); | |
| 960 } | |
| 961 | |
| 823 } // namespace | 962 } // namespace |
| 824 } // namespace cc | 963 } // namespace cc |
| OLD | NEW |