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