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