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

Side by Side Diff: cc/base/list_container_unittest.cc

Issue 1202153002: Add ListContainer::AppendByMoving (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address reviewer comments 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
« cc/base/list_container.h ('K') | « cc/base/list_container.cc ('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 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
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
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
OLDNEW
« cc/base/list_container.h ('K') | « cc/base/list_container.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698