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 11namespace fbl { 12namespace tests { 13namespace intrusive_containers { 14 15template <typename ContainerStateType> 16struct OtherListTraits { 17 using PtrTraits = typename ContainerStateType::PtrTraits; 18 static ContainerStateType& node_state(typename PtrTraits::RefType obj) { 19 return obj.other_container_state_; 20 } 21}; 22 23template <typename PtrType> 24class DLLTraits { 25public: 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 37DEFINE_TEST_OBJECTS(DLL); 38using UMTE = DEFINE_TEST_THUNK(Sequence, DLL, Unmanaged); 39using UPTE = DEFINE_TEST_THUNK(Sequence, DLL, UniquePtr); 40using RPTE = DEFINE_TEST_THUNK(Sequence, DLL, RefPtr); 41 42BEGIN_TEST_CASE(double_linked_list_tests) 43////////////////////////////////////////// 44// General container specific tests. 45////////////////////////////////////////// 46RUN_NAMED_TEST("Clear (unmanaged)", UMTE::ClearTest) 47RUN_NAMED_TEST("Clear (unique)", UPTE::ClearTest) 48RUN_NAMED_TEST("Clear (RefPtr)", RPTE::ClearTest) 49 50RUN_NAMED_TEST("ClearUnsafe (unmanaged)", UMTE::ClearUnsafeTest) 51#if TEST_WILL_NOT_COMPILE || 0 52RUN_NAMED_TEST("ClearUnsafe (unique)", UPTE::ClearUnsafeTest) 53RUN_NAMED_TEST("ClearUnsafe (RefPtr)", RPTE::ClearUnsafeTest) 54#endif 55 56RUN_NAMED_TEST("IsEmpty (unmanaged)", UMTE::IsEmptyTest) 57RUN_NAMED_TEST("IsEmpty (unique)", UPTE::IsEmptyTest) 58RUN_NAMED_TEST("IsEmpty (RefPtr)", RPTE::IsEmptyTest) 59 60RUN_NAMED_TEST("Iterate (unmanaged)", UMTE::IterateTest) 61RUN_NAMED_TEST("Iterate (unique)", UPTE::IterateTest) 62RUN_NAMED_TEST("Iterate (RefPtr)", RPTE::IterateTest) 63 64RUN_NAMED_TEST("IterErase (unmanaged)", UMTE::IterEraseTest) 65RUN_NAMED_TEST("IterErase (unique)", UPTE::IterEraseTest) 66RUN_NAMED_TEST("IterErase (RefPtr)", RPTE::IterEraseTest) 67 68RUN_NAMED_TEST("DirectErase (unmanaged)", UMTE::DirectEraseTest) 69RUN_NAMED_TEST("DirectErase (unique)", UPTE::DirectEraseTest) 70RUN_NAMED_TEST("DirectErase (RefPtr)", RPTE::DirectEraseTest) 71 72RUN_NAMED_TEST("MakeIterator (unmanaged)", UMTE::MakeIteratorTest) 73#if TEST_WILL_NOT_COMPILE || 0 74RUN_NAMED_TEST("MakeIterator (unique)", UPTE::MakeIteratorTest) 75#endif 76RUN_NAMED_TEST("MakeIterator (RefPtr)", RPTE::MakeIteratorTest) 77 78RUN_NAMED_TEST("ReverseIterErase (unmanaged)", UMTE::ReverseIterEraseTest) 79RUN_NAMED_TEST("ReverseIterErase (unique)", UPTE::ReverseIterEraseTest) 80RUN_NAMED_TEST("ReverseIterErase (RefPtr)", RPTE::ReverseIterEraseTest) 81 82RUN_NAMED_TEST("ReverseIterate (unmanaged)", UMTE::ReverseIterateTest) 83RUN_NAMED_TEST("ReverseIterate (unique)", UPTE::ReverseIterateTest) 84RUN_NAMED_TEST("ReverseIterate (RefPtr)", RPTE::ReverseIterateTest) 85 86RUN_NAMED_TEST("Swap (unmanaged)", UMTE::SwapTest) 87RUN_NAMED_TEST("Swap (unique)", UPTE::SwapTest) 88RUN_NAMED_TEST("Swap (RefPtr)", RPTE::SwapTest) 89 90RUN_NAMED_TEST("Rvalue Ops (unmanaged)", UMTE::RvalueOpsTest) 91RUN_NAMED_TEST("Rvalue Ops (unique)", UPTE::RvalueOpsTest) 92RUN_NAMED_TEST("Rvalue Ops (RefPtr)", RPTE::RvalueOpsTest) 93 94RUN_NAMED_TEST("Scope (unique)", UPTE::ScopeTest) 95RUN_NAMED_TEST("Scope (RefPtr)", RPTE::ScopeTest) 96 97RUN_NAMED_TEST("TwoContainer (unmanaged)", UMTE::TwoContainerTest) 98#if TEST_WILL_NOT_COMPILE || 0 99RUN_NAMED_TEST("TwoContainer (unique)", UPTE::TwoContainerTest) 100#endif 101RUN_NAMED_TEST("TwoContainer (RefPtr)", RPTE::TwoContainerTest) 102 103RUN_NAMED_TEST("IterCopyPointer (unmanaged)", UMTE::IterCopyPointerTest) 104#if TEST_WILL_NOT_COMPILE || 0 105RUN_NAMED_TEST("IterCopyPointer (unique)", UPTE::IterCopyPointerTest) 106#endif 107RUN_NAMED_TEST("IterCopyPointer (RefPtr)", RPTE::IterCopyPointerTest) 108 109RUN_NAMED_TEST("EraseIf (unmanaged)", UMTE::EraseIfTest) 110RUN_NAMED_TEST("EraseIf (unique)", UPTE::EraseIfTest) 111RUN_NAMED_TEST("EraseIf (RefPtr)", RPTE::EraseIfTest) 112 113RUN_NAMED_TEST("FindIf (unmanaged)", UMTE::FindIfTest) 114RUN_NAMED_TEST("FindIf (unique)", UPTE::FindIfTest) 115RUN_NAMED_TEST("FindIf (RefPtr)", RPTE::FindIfTest) 116 117////////////////////////////////////////// 118// Sequence container specific tests. 119////////////////////////////////////////// 120RUN_NAMED_TEST("PushFront (unmanaged)", UMTE::PushFrontTest) 121RUN_NAMED_TEST("PushFront (unique)", UPTE::PushFrontTest) 122RUN_NAMED_TEST("PushFront (RefPtr)", RPTE::PushFrontTest) 123 124RUN_NAMED_TEST("PopFront (unmanaged)", UMTE::PopFrontTest) 125RUN_NAMED_TEST("PopFront (unique)", UPTE::PopFrontTest) 126RUN_NAMED_TEST("PopFront (RefPtr)", RPTE::PopFrontTest) 127 128RUN_NAMED_TEST("PushBack (unmanaged)", UMTE::PushBackTest) 129RUN_NAMED_TEST("PushBack (unique)", UPTE::PushBackTest) 130RUN_NAMED_TEST("PushBack (RefPtr)", RPTE::PushBackTest) 131 132RUN_NAMED_TEST("PopBack (unmanaged)", UMTE::PopBackTest) 133RUN_NAMED_TEST("PopBack (unique)", UPTE::PopBackTest) 134RUN_NAMED_TEST("PopBack (RefPtr)", RPTE::PopBackTest) 135 136RUN_NAMED_TEST("SeqIterate (unmanaged)", UMTE::SeqIterateTest) 137RUN_NAMED_TEST("SeqIterate (unique)", UPTE::SeqIterateTest) 138RUN_NAMED_TEST("SeqIterate (RefPtr)", RPTE::SeqIterateTest) 139 140RUN_NAMED_TEST("SeqReverseIterate (unmanaged)", UMTE::SeqReverseIterateTest) 141RUN_NAMED_TEST("SeqReverseIterate (unique)", UPTE::SeqReverseIterateTest) 142RUN_NAMED_TEST("SeqReverseIterate (RefPtr)", RPTE::SeqReverseIterateTest) 143 144RUN_NAMED_TEST("EraseNext (unmanaged)", UMTE::EraseNextTest) 145RUN_NAMED_TEST("EraseNext (unique)", UPTE::EraseNextTest) 146RUN_NAMED_TEST("EraseNext (RefPtr)", RPTE::EraseNextTest) 147 148RUN_NAMED_TEST("InsertAfter (unmanaged)", UMTE::InsertAfterTest) 149RUN_NAMED_TEST("InsertAfter (unique)", UPTE::InsertAfterTest) 150RUN_NAMED_TEST("InsertAfter (RefPtr)", RPTE::InsertAfterTest) 151 152RUN_NAMED_TEST("Insert (unmanaged)", UMTE::InsertTest) 153RUN_NAMED_TEST("Insert (unique)", UPTE::InsertTest) 154RUN_NAMED_TEST("Insert (RefPtr)", RPTE::InsertTest) 155 156RUN_NAMED_TEST("DirectInsert (unmanaged)", UMTE::DirectInsertTest) 157RUN_NAMED_TEST("DirectInsert (unique)", UPTE::DirectInsertTest) 158RUN_NAMED_TEST("DirectInsert (RefPtr)", RPTE::DirectInsertTest) 159 160RUN_NAMED_TEST("Splice (unmanaged)", UMTE::SpliceTest) 161RUN_NAMED_TEST("Splice (unique)", UPTE::SpliceTest) 162RUN_NAMED_TEST("Splice (RefPtr)", RPTE::SpliceTest) 163 164RUN_NAMED_TEST("ReplaceIfCopy (unmanaged)", UMTE::ReplaceIfCopyTest) 165#if TEST_WILL_NOT_COMPILE || 0 166RUN_NAMED_TEST("ReplaceIfCopy (unique)", UPTE::ReplaceIfCopyTest) 167#endif 168RUN_NAMED_TEST("ReplaceIfCopy (RefPtr)", RPTE::ReplaceIfCopyTest) 169 170RUN_NAMED_TEST("ReplaceIfMove (unmanaged)", UMTE::ReplaceIfMoveTest) 171RUN_NAMED_TEST("ReplaceIfMove (unique)", UPTE::ReplaceIfMoveTest) 172RUN_NAMED_TEST("ReplaceIfMove (RefPtr)", RPTE::ReplaceIfMoveTest) 173 174RUN_NAMED_TEST("ReplaceCopy (unmanaged)", UMTE::ReplaceCopyTest) 175#if TEST_WILL_NOT_COMPILE || 0 176RUN_NAMED_TEST("ReplaceCopy (unique)", UPTE::ReplaceCopyTest) 177#endif 178RUN_NAMED_TEST("ReplaceCopy (RefPtr)", RPTE::ReplaceCopyTest) 179 180RUN_NAMED_TEST("ReplaceMove (unmanaged)", UMTE::ReplaceMoveTest) 181RUN_NAMED_TEST("ReplaceMove (unique)", UPTE::ReplaceMoveTest) 182RUN_NAMED_TEST("ReplaceMove (RefPtr)", RPTE::ReplaceMoveTest) 183 184END_TEST_CASE(double_linked_list_tests); 185 186} // namespace intrusive_containers 187} // namespace tests 188} // namespace fbl 189 190