1 // Copyright 2016 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <unittest/unittest.h> 6 #include <fbl/intrusive_double_list.h> 7 #include <fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h> 8 #include <fbl/tests/intrusive_containers/sequence_container_test_environment.h> 9 #include <fbl/tests/intrusive_containers/test_thunks.h> 10 11 namespace fbl { 12 namespace tests { 13 namespace intrusive_containers { 14 15 template <typename ContainerStateType> 16 struct OtherListTraits { 17 using PtrTraits = typename ContainerStateType::PtrTraits; node_statefbl::tests::intrusive_containers::OtherListTraits18 static ContainerStateType& node_state(typename PtrTraits::RefType obj) { 19 return obj.other_container_state_; 20 } 21 }; 22 23 template <typename PtrType> 24 class DLLTraits { 25 public: 26 using TestObjBaseType = TestObjBase; 27 28 using ContainerType = DoublyLinkedList<PtrType>; 29 using ContainableBaseClass = DoublyLinkedListable<PtrType>; 30 using ContainerStateType = DoublyLinkedListNodeState<PtrType>; 31 32 using OtherContainerStateType = ContainerStateType; 33 using OtherContainerTraits = OtherListTraits<OtherContainerStateType>; 34 using OtherContainerType = DoublyLinkedList<PtrType, OtherContainerTraits>; 35 }; 36 37 DEFINE_TEST_OBJECTS(DLL); 38 using UMTE = DEFINE_TEST_THUNK(Sequence, DLL, Unmanaged); 39 using UPTE = DEFINE_TEST_THUNK(Sequence, DLL, UniquePtr); 40 using SUPDDTE = DEFINE_TEST_THUNK(Sequence, DLL, StdUniquePtrDefaultDeleter); 41 using SUPCDTE = DEFINE_TEST_THUNK(Sequence, DLL, StdUniquePtrCustomDeleter); 42 using RPTE = DEFINE_TEST_THUNK(Sequence, DLL, RefPtr); 43 44 BEGIN_TEST_CASE(double_linked_list_tests) 45 ////////////////////////////////////////// 46 // General container specific tests. 47 ////////////////////////////////////////// 48 RUN_NAMED_TEST("Clear (unmanaged)", UMTE::ClearTest) 49 RUN_NAMED_TEST("Clear (unique)", UPTE::ClearTest) 50 RUN_NAMED_TEST("Clear (std::uptr)", SUPDDTE::ClearTest) 51 RUN_NAMED_TEST("Clear (std::uptr<Del>)", SUPCDTE::ClearTest) 52 RUN_NAMED_TEST("Clear (RefPtr)", RPTE::ClearTest) 53 54 RUN_NAMED_TEST("ClearUnsafe (unmanaged)", UMTE::ClearUnsafeTest) 55 #if TEST_WILL_NOT_COMPILE || 0 56 RUN_NAMED_TEST("ClearUnsafe (unique)", UPTE::ClearUnsafeTest) 57 RUN_NAMED_TEST("ClearUnsafe (std::uptr)", SUPDDTE::ClearUnsafeTest) 58 RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)", SUPCDTE::ClearUnsafeTest) 59 RUN_NAMED_TEST("ClearUnsafe (RefPtr)", RPTE::ClearUnsafeTest) 60 #endif 61 62 RUN_NAMED_TEST("IsEmpty (unmanaged)", UMTE::IsEmptyTest) 63 RUN_NAMED_TEST("IsEmpty (unique)", UPTE::IsEmptyTest) 64 RUN_NAMED_TEST("IsEmpty (std::uptr)", SUPDDTE::IsEmptyTest) 65 RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)", SUPCDTE::IsEmptyTest) 66 RUN_NAMED_TEST("IsEmpty (RefPtr)", RPTE::IsEmptyTest) 67 68 RUN_NAMED_TEST("Iterate (unmanaged)", UMTE::IterateTest) 69 RUN_NAMED_TEST("Iterate (unique)", UPTE::IterateTest) 70 RUN_NAMED_TEST("Iterate (std::uptr)", SUPDDTE::IterateTest) 71 RUN_NAMED_TEST("Iterate (std::uptr<Del>)", SUPCDTE::IterateTest) 72 RUN_NAMED_TEST("Iterate (RefPtr)", RPTE::IterateTest) 73 74 RUN_NAMED_TEST("IterErase (unmanaged)", UMTE::IterEraseTest) 75 RUN_NAMED_TEST("IterErase (unique)", UPTE::IterEraseTest) 76 RUN_NAMED_TEST("IterErase (std::uptr)", SUPDDTE::IterEraseTest) 77 RUN_NAMED_TEST("IterErase (std::uptr<Del>)", SUPCDTE::IterEraseTest) 78 RUN_NAMED_TEST("IterErase (RefPtr)", RPTE::IterEraseTest) 79 80 RUN_NAMED_TEST("DirectErase (unmanaged)", UMTE::DirectEraseTest) 81 RUN_NAMED_TEST("DirectErase (unique)", UPTE::DirectEraseTest) 82 RUN_NAMED_TEST("DirectErase (std::uptr)", SUPDDTE::DirectEraseTest) 83 RUN_NAMED_TEST("DirectErase (std::uptr<Del>)", SUPCDTE::DirectEraseTest) 84 RUN_NAMED_TEST("DirectErase (RefPtr)", RPTE::DirectEraseTest) 85 86 RUN_NAMED_TEST("MakeIterator (unmanaged)", UMTE::MakeIteratorTest) 87 #if TEST_WILL_NOT_COMPILE || 0 88 RUN_NAMED_TEST("MakeIterator (unique)", UPTE::MakeIteratorTest) 89 RUN_NAMED_TEST("MakeIterator (std::uptr)", SUPDDTE::MakeIteratorTest) 90 RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)", SUPCDTE::MakeIteratorTest) 91 #endif 92 RUN_NAMED_TEST("MakeIterator (RefPtr)", RPTE::MakeIteratorTest) 93 94 RUN_NAMED_TEST("ReverseIterErase (unmanaged)", UMTE::ReverseIterEraseTest) 95 RUN_NAMED_TEST("ReverseIterErase (unique)", UPTE::ReverseIterEraseTest) 96 RUN_NAMED_TEST("ReverseIterErase (std::uptr)", SUPDDTE::ReverseIterEraseTest) 97 RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)", SUPCDTE::ReverseIterEraseTest) 98 RUN_NAMED_TEST("ReverseIterErase (RefPtr)", RPTE::ReverseIterEraseTest) 99 100 RUN_NAMED_TEST("ReverseIterate (unmanaged)", UMTE::ReverseIterateTest) 101 RUN_NAMED_TEST("ReverseIterate (unique)", UPTE::ReverseIterateTest) 102 RUN_NAMED_TEST("ReverseIterate (std::uptr)", SUPDDTE::ReverseIterateTest) 103 RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)", SUPCDTE::ReverseIterateTest) 104 RUN_NAMED_TEST("ReverseIterate (RefPtr)", RPTE::ReverseIterateTest) 105 106 RUN_NAMED_TEST("Swap (unmanaged)", UMTE::SwapTest) 107 RUN_NAMED_TEST("Swap (unique)", UPTE::SwapTest) 108 RUN_NAMED_TEST("Swap (std::uptr)", SUPDDTE::SwapTest) 109 RUN_NAMED_TEST("Swap (std::uptr<Del>)", SUPCDTE::SwapTest) 110 RUN_NAMED_TEST("Swap (RefPtr)", RPTE::SwapTest) 111 112 RUN_NAMED_TEST("Rvalue Ops (unmanaged)", UMTE::RvalueOpsTest) 113 RUN_NAMED_TEST("Rvalue Ops (unique)", UPTE::RvalueOpsTest) 114 RUN_NAMED_TEST("Rvalue Ops (std::uptr)", SUPDDTE::RvalueOpsTest) 115 RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)", SUPCDTE::RvalueOpsTest) 116 RUN_NAMED_TEST("Rvalue Ops (RefPtr)", RPTE::RvalueOpsTest) 117 118 RUN_NAMED_TEST("Scope (unique)", UPTE::ScopeTest) 119 RUN_NAMED_TEST("Scope (std::uptr)", SUPDDTE::ScopeTest) 120 RUN_NAMED_TEST("Scope (std::uptr<Del>)", SUPCDTE::ScopeTest) 121 RUN_NAMED_TEST("Scope (RefPtr)", RPTE::ScopeTest) 122 123 RUN_NAMED_TEST("TwoContainer (unmanaged)", UMTE::TwoContainerTest) 124 #if TEST_WILL_NOT_COMPILE || 0 125 RUN_NAMED_TEST("TwoContainer (unique)", UPTE::TwoContainerTest) 126 RUN_NAMED_TEST("TwoContainer (std::uptr)", SUPDDTE::TwoContainerTest) 127 RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)", SUPCDTE::TwoContainerTest) 128 #endif 129 RUN_NAMED_TEST("TwoContainer (RefPtr)", RPTE::TwoContainerTest) 130 131 RUN_NAMED_TEST("IterCopyPointer (unmanaged)", UMTE::IterCopyPointerTest) 132 #if TEST_WILL_NOT_COMPILE || 0 133 RUN_NAMED_TEST("IterCopyPointer (unique)", UPTE::IterCopyPointerTest) 134 RUN_NAMED_TEST("IterCopyPointer (std::uptr)", SUPDDTE::IterCopyPointerTest) 135 RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)", SUPCDTE::IterCopyPointerTest) 136 #endif 137 RUN_NAMED_TEST("IterCopyPointer (RefPtr)", RPTE::IterCopyPointerTest) 138 139 RUN_NAMED_TEST("EraseIf (unmanaged)", UMTE::EraseIfTest) 140 RUN_NAMED_TEST("EraseIf (unique)", UPTE::EraseIfTest) 141 RUN_NAMED_TEST("EraseIf (std::uptr)", SUPDDTE::EraseIfTest) 142 RUN_NAMED_TEST("EraseIf (std::uptr<Del>)", SUPCDTE::EraseIfTest) 143 RUN_NAMED_TEST("EraseIf (RefPtr)", RPTE::EraseIfTest) 144 145 RUN_NAMED_TEST("FindIf (unmanaged)", UMTE::FindIfTest) 146 RUN_NAMED_TEST("FindIf (unique)", UPTE::FindIfTest) 147 RUN_NAMED_TEST("FindIf (std::uptr)", SUPDDTE::FindIfTest) 148 RUN_NAMED_TEST("FindIf (std::uptr<Del>)", SUPCDTE::FindIfTest) 149 RUN_NAMED_TEST("FindIf (RefPtr)", RPTE::FindIfTest) 150 151 ////////////////////////////////////////// 152 // Sequence container specific tests. 153 ////////////////////////////////////////// 154 RUN_NAMED_TEST("PushFront (unmanaged)", UMTE::PushFrontTest) 155 RUN_NAMED_TEST("PushFront (unique)", UPTE::PushFrontTest) 156 RUN_NAMED_TEST("PushFront (std::uptr)", SUPDDTE::PushFrontTest) 157 RUN_NAMED_TEST("PushFront (std::uptr<Del>)", SUPCDTE::PushFrontTest) 158 RUN_NAMED_TEST("PushFront (RefPtr)", RPTE::PushFrontTest) 159 160 RUN_NAMED_TEST("PopFront (unmanaged)", UMTE::PopFrontTest) 161 RUN_NAMED_TEST("PopFront (unique)", UPTE::PopFrontTest) 162 RUN_NAMED_TEST("PopFront (std::uptr)", SUPDDTE::PopFrontTest) 163 RUN_NAMED_TEST("PopFront (std::uptr<Del>)", SUPCDTE::PopFrontTest) 164 RUN_NAMED_TEST("PopFront (RefPtr)", RPTE::PopFrontTest) 165 166 RUN_NAMED_TEST("PushBack (unmanaged)", UMTE::PushBackTest) 167 RUN_NAMED_TEST("PushBack (unique)", UPTE::PushBackTest) 168 RUN_NAMED_TEST("PushBack (std::uptr)", SUPDDTE::PushBackTest) 169 RUN_NAMED_TEST("PushBack (std::uptr<Del>)", SUPCDTE::PushBackTest) 170 RUN_NAMED_TEST("PushBack (RefPtr)", RPTE::PushBackTest) 171 172 RUN_NAMED_TEST("PopBack (unmanaged)", UMTE::PopBackTest) 173 RUN_NAMED_TEST("PopBack (unique)", UPTE::PopBackTest) 174 RUN_NAMED_TEST("PopBack (std::uptr)", SUPDDTE::PopBackTest) 175 RUN_NAMED_TEST("PopBack (std::uptr<Del>)", SUPCDTE::PopBackTest) 176 RUN_NAMED_TEST("PopBack (RefPtr)", RPTE::PopBackTest) 177 178 RUN_NAMED_TEST("SeqIterate (unmanaged)", UMTE::SeqIterateTest) 179 RUN_NAMED_TEST("SeqIterate (unique)", UPTE::SeqIterateTest) 180 RUN_NAMED_TEST("SeqIterate (std::uptr)", SUPDDTE::SeqIterateTest) 181 RUN_NAMED_TEST("SeqIterate (std::uptr<Del>)", SUPCDTE::SeqIterateTest) 182 RUN_NAMED_TEST("SeqIterate (RefPtr)", RPTE::SeqIterateTest) 183 184 RUN_NAMED_TEST("SeqReverseIterate (unmanaged)", UMTE::SeqReverseIterateTest) 185 RUN_NAMED_TEST("SeqReverseIterate (unique)", UPTE::SeqReverseIterateTest) 186 RUN_NAMED_TEST("SeqReverseIterate (std::uptr)", SUPDDTE::SeqReverseIterateTest) 187 RUN_NAMED_TEST("SeqReverseIterate (std::uptr<Del>)",SUPCDTE::SeqReverseIterateTest) 188 RUN_NAMED_TEST("SeqReverseIterate (RefPtr)", RPTE::SeqReverseIterateTest) 189 190 RUN_NAMED_TEST("EraseNext (unmanaged)", UMTE::EraseNextTest) 191 RUN_NAMED_TEST("EraseNext (unique)", UPTE::EraseNextTest) 192 RUN_NAMED_TEST("EraseNext (std::uptr)", SUPDDTE::EraseNextTest) 193 RUN_NAMED_TEST("EraseNext (std::uptr<Del>)", SUPCDTE::EraseNextTest) 194 RUN_NAMED_TEST("EraseNext (RefPtr)", RPTE::EraseNextTest) 195 196 RUN_NAMED_TEST("InsertAfter (unmanaged)", UMTE::InsertAfterTest) 197 RUN_NAMED_TEST("InsertAfter (unique)", UPTE::InsertAfterTest) 198 RUN_NAMED_TEST("InsertAfter (std::uptr)", SUPDDTE::InsertAfterTest) 199 RUN_NAMED_TEST("InsertAfter (std::uptr<Del>)", SUPCDTE::InsertAfterTest) 200 RUN_NAMED_TEST("InsertAfter (RefPtr)", RPTE::InsertAfterTest) 201 202 RUN_NAMED_TEST("Insert (unmanaged)", UMTE::InsertTest) 203 RUN_NAMED_TEST("Insert (unique)", UPTE::InsertTest) 204 RUN_NAMED_TEST("Insert (std::uptr)", SUPDDTE::InsertTest) 205 RUN_NAMED_TEST("Insert (std::uptr<Del>)", SUPCDTE::InsertTest) 206 RUN_NAMED_TEST("Insert (RefPtr)", RPTE::InsertTest) 207 208 RUN_NAMED_TEST("DirectInsert (unmanaged)", UMTE::DirectInsertTest) 209 RUN_NAMED_TEST("DirectInsert (unique)", UPTE::DirectInsertTest) 210 RUN_NAMED_TEST("DirectInsert (std::uptr)", SUPDDTE::DirectInsertTest) 211 RUN_NAMED_TEST("DirectInsert (std::uptr<Del>)", SUPCDTE::DirectInsertTest) 212 RUN_NAMED_TEST("DirectInsert (RefPtr)", RPTE::DirectInsertTest) 213 214 RUN_NAMED_TEST("Splice (unmanaged)", UMTE::SpliceTest) 215 RUN_NAMED_TEST("Splice (unique)", UPTE::SpliceTest) 216 RUN_NAMED_TEST("Splice (std::uptr)", SUPDDTE::SpliceTest) 217 RUN_NAMED_TEST("Splice (std::uptr<Del>)", SUPCDTE::SpliceTest) 218 RUN_NAMED_TEST("Splice (RefPtr)", RPTE::SpliceTest) 219 220 RUN_NAMED_TEST("ReplaceIfCopy (unmanaged)", UMTE::ReplaceIfCopyTest) 221 #if TEST_WILL_NOT_COMPILE || 0 222 RUN_NAMED_TEST("ReplaceIfCopy (unique)", UPTE::ReplaceIfCopyTest) 223 RUN_NAMED_TEST("ReplaceIfCopy (std::uptr)", SUPDDTE::ReplaceIfCopyTest) 224 RUN_NAMED_TEST("ReplaceIfCopy (std::uptr<Del>)", SUPCDTE::ReplaceIfCopyTest) 225 #endif 226 RUN_NAMED_TEST("ReplaceIfCopy (RefPtr)", RPTE::ReplaceIfCopyTest) 227 228 RUN_NAMED_TEST("ReplaceIfMove (unmanaged)", UMTE::ReplaceIfMoveTest) 229 RUN_NAMED_TEST("ReplaceIfMove (unique)", UPTE::ReplaceIfMoveTest) 230 RUN_NAMED_TEST("ReplaceIfMove (std::uptr)", SUPDDTE::ReplaceIfMoveTest) 231 RUN_NAMED_TEST("ReplaceIfMove (std::uptr<Del>)", SUPCDTE::ReplaceIfMoveTest) 232 RUN_NAMED_TEST("ReplaceIfMove (RefPtr)", RPTE::ReplaceIfMoveTest) 233 234 RUN_NAMED_TEST("ReplaceCopy (unmanaged)", UMTE::ReplaceCopyTest) 235 #if TEST_WILL_NOT_COMPILE || 0 236 RUN_NAMED_TEST("ReplaceCopy (unique)", UPTE::ReplaceCopyTest) 237 RUN_NAMED_TEST("ReplaceCopy (std::uptr)", SUPDDTE::ReplaceCopyTest) 238 RUN_NAMED_TEST("ReplaceCopy (std::uptr<Del>)", SUPCDTE::ReplaceCopyTest) 239 #endif 240 RUN_NAMED_TEST("ReplaceCopy (RefPtr)", RPTE::ReplaceCopyTest) 241 242 RUN_NAMED_TEST("ReplaceMove (unmanaged)", UMTE::ReplaceMoveTest) 243 RUN_NAMED_TEST("ReplaceMove (unique)", UPTE::ReplaceMoveTest) 244 RUN_NAMED_TEST("ReplaceMove (std::uptr)", SUPDDTE::ReplaceMoveTest) 245 RUN_NAMED_TEST("ReplaceMove (std::uptr<Del>)", SUPCDTE::ReplaceMoveTest) 246 RUN_NAMED_TEST("ReplaceMove (RefPtr)", RPTE::ReplaceMoveTest) 247 248 END_TEST_CASE(double_linked_list_tests); 249 250 } // namespace intrusive_containers 251 } // namespace tests 252 } // namespace fbl 253 254