1 /* 2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 3 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 4 */ 5 6 #include "precompiled.hpp" 7 #include "gc/z/zList.inline.hpp" 8 #include "unittest.hpp" 9 10 #ifndef PRODUCT 11 12 class ZTestEntry { 13 friend class ZList<ZTestEntry>; 14 15 private: 16 const int _id; 17 ZListNode<ZTestEntry> _node; 18 19 public: 20 ZTestEntry(int id) : 21 _id(id), 22 _node() {} 23 24 int id() const { 25 return _id; 26 } 27 }; 28 29 class ZListTest : public ::testing::Test { 30 protected: 31 static void assert_sorted(ZList<ZTestEntry>* list) { 32 // Iterate forward 33 { 34 int count = list->first()->id(); 35 ZListIterator<ZTestEntry> iter(list); 36 for (ZTestEntry* entry; iter.next(&entry);) { 37 ASSERT_EQ(entry->id(), count); 38 count++; 39 } 40 } 41 42 // Iterate backward 43 { 44 int count = list->last()->id(); 45 ZListReverseIterator<ZTestEntry> iter(list); 46 for (ZTestEntry* entry; iter.next(&entry);) { 47 EXPECT_EQ(entry->id(), count); 48 count--; 49 } 50 } 51 } 52 }; 53 54 TEST_F(ZListTest, test_insert) { 55 ZList<ZTestEntry> list; 56 ZTestEntry e0(0); 57 ZTestEntry e1(1); 58 ZTestEntry e2(2); 59 ZTestEntry e3(3); 60 ZTestEntry e4(4); 61 ZTestEntry e5(5); 62 63 list.insert_first(&e2); 64 list.insert_before(&e2, &e1); 65 list.insert_after(&e2, &e3); 66 list.insert_last(&e4); 67 list.insert_first(&e0); 68 list.insert_last(&e5); 69 70 EXPECT_EQ(list.size(), 6u); 71 assert_sorted(&list); 72 } 73 74 TEST_F(ZListTest, test_remove) { 75 // Remove first 76 { 77 ZList<ZTestEntry> list; 78 ZTestEntry e0(0); 79 ZTestEntry e1(1); 80 ZTestEntry e2(2); 81 ZTestEntry e3(3); 82 ZTestEntry e4(4); 83 ZTestEntry e5(5); 84 85 list.insert_last(&e0); 86 list.insert_last(&e1); 87 list.insert_last(&e2); 88 list.insert_last(&e3); 89 list.insert_last(&e4); 90 list.insert_last(&e5); 91 92 EXPECT_EQ(list.size(), 6u); 93 94 for (int i = 0; i < 6; i++) { 95 ZTestEntry* e = list.remove_first(); 96 EXPECT_EQ(e->id(), i); 97 } 98 99 EXPECT_EQ(list.size(), 0u); 100 } 101 102 // Remove last 103 { 104 ZList<ZTestEntry> list; 105 ZTestEntry e0(0); 106 ZTestEntry e1(1); 107 ZTestEntry e2(2); 108 ZTestEntry e3(3); 109 ZTestEntry e4(4); 110 ZTestEntry e5(5); 111 112 list.insert_last(&e0); 113 list.insert_last(&e1); 114 list.insert_last(&e2); 115 list.insert_last(&e3); 116 list.insert_last(&e4); 117 list.insert_last(&e5); 118 119 EXPECT_EQ(list.size(), 6u); 120 121 for (int i = 5; i >= 0; i--) { 122 ZTestEntry* e = list.remove_last(); 123 EXPECT_EQ(e->id(), i); 124 } 125 126 EXPECT_EQ(list.size(), 0u); 127 } 128 } 129 130 TEST_F(ZListTest, test_transfer) { 131 // Transfer empty to empty 132 { 133 ZList<ZTestEntry> list0; 134 ZList<ZTestEntry> list1; 135 136 EXPECT_TRUE(list0.is_empty()); 137 EXPECT_TRUE(list1.is_empty()); 138 139 list0.transfer(&list1); 140 141 EXPECT_TRUE(list0.is_empty()); 142 EXPECT_TRUE(list1.is_empty()); 143 } 144 145 // Transfer non-empty to empty 146 { 147 ZList<ZTestEntry> list0; 148 ZList<ZTestEntry> list1; 149 ZTestEntry e0(0); 150 ZTestEntry e1(1); 151 ZTestEntry e2(2); 152 ZTestEntry e3(3); 153 ZTestEntry e4(4); 154 ZTestEntry e5(5); 155 156 list1.insert_last(&e0); 157 list1.insert_last(&e1); 158 list1.insert_last(&e2); 159 list1.insert_last(&e3); 160 list1.insert_last(&e4); 161 list1.insert_last(&e5); 162 163 EXPECT_EQ(list0.size(), 0u); 164 EXPECT_EQ(list1.size(), 6u); 165 166 list0.transfer(&list1); 167 168 EXPECT_EQ(list0.size(), 6u); 169 EXPECT_EQ(list1.size(), 0u); 170 171 assert_sorted(&list0); 172 } 173 174 // Transfer non-empty to non-empty 175 { 176 ZList<ZTestEntry> list0; 177 ZList<ZTestEntry> list1; 178 ZTestEntry e0(0); 179 ZTestEntry e1(1); 180 ZTestEntry e2(2); 181 ZTestEntry e3(3); 182 ZTestEntry e4(4); 183 ZTestEntry e5(5); 184 185 list0.insert_last(&e0); 186 list0.insert_last(&e1); 187 list0.insert_last(&e2); 188 189 list1.insert_last(&e3); 190 list1.insert_last(&e4); 191 list1.insert_last(&e5); 192 193 EXPECT_EQ(list0.size(), 3u); 194 EXPECT_EQ(list1.size(), 3u); 195 196 list0.transfer(&list1); 197 198 EXPECT_EQ(list0.size(), 6u); 199 EXPECT_EQ(list1.size(), 0u); 200 201 assert_sorted(&list0); 202 } 203 } 204 205 #endif // PRODUCT