1 //===- unittests/ADT/IListBaseTest.cpp - ilist_base unit tests ------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/ilist_base.h"
11 #include "gtest/gtest.h"
18 template <typename T
> class IListBaseTest
: public ::testing::Test
{};
20 // Test variants with the same test.
21 typedef ::testing::Types
<ilist_base
<false>, ilist_base
<true>>
23 TYPED_TEST_CASE(IListBaseTest
, IListBaseTestTypes
);
25 TYPED_TEST(IListBaseTest
, insertBeforeImpl
) {
26 typedef TypeParam list_base_type
;
27 typedef typename
list_base_type::node_base_type node_base_type
;
29 node_base_type S
, A
, B
;
36 list_base_type::insertBeforeImpl(S
, A
);
37 EXPECT_EQ(&A
, S
.getPrev());
38 EXPECT_EQ(&S
, A
.getPrev());
39 EXPECT_EQ(&A
, S
.getNext());
40 EXPECT_EQ(&S
, A
.getNext());
42 // [S] <-> A <-> B <-> [S]
43 list_base_type::insertBeforeImpl(S
, B
);
44 EXPECT_EQ(&B
, S
.getPrev());
45 EXPECT_EQ(&A
, B
.getPrev());
46 EXPECT_EQ(&S
, A
.getPrev());
47 EXPECT_EQ(&A
, S
.getNext());
48 EXPECT_EQ(&B
, A
.getNext());
49 EXPECT_EQ(&S
, B
.getNext());
52 TYPED_TEST(IListBaseTest
, removeImpl
) {
53 typedef TypeParam list_base_type
;
54 typedef typename
list_base_type::node_base_type node_base_type
;
56 node_base_type S
, A
, B
;
58 // [S] <-> A <-> B <-> [S]
61 list_base_type::insertBeforeImpl(S
, A
);
62 list_base_type::insertBeforeImpl(S
, B
);
65 list_base_type::removeImpl(A
);
66 EXPECT_EQ(&B
, S
.getPrev());
67 EXPECT_EQ(&S
, B
.getPrev());
68 EXPECT_EQ(&B
, S
.getNext());
69 EXPECT_EQ(&S
, B
.getNext());
70 EXPECT_EQ(nullptr, A
.getPrev());
71 EXPECT_EQ(nullptr, A
.getNext());
74 list_base_type::removeImpl(B
);
75 EXPECT_EQ(&S
, S
.getPrev());
76 EXPECT_EQ(&S
, S
.getNext());
77 EXPECT_EQ(nullptr, B
.getPrev());
78 EXPECT_EQ(nullptr, B
.getNext());
81 TYPED_TEST(IListBaseTest
, removeRangeImpl
) {
82 typedef TypeParam list_base_type
;
83 typedef typename
list_base_type::node_base_type node_base_type
;
85 node_base_type S
, A
, B
, C
, D
;
87 // [S] <-> A <-> B <-> C <-> D <-> [S]
90 list_base_type::insertBeforeImpl(S
, A
);
91 list_base_type::insertBeforeImpl(S
, B
);
92 list_base_type::insertBeforeImpl(S
, C
);
93 list_base_type::insertBeforeImpl(S
, D
);
95 // [S] <-> A <-> D <-> [S]
96 list_base_type::removeRangeImpl(B
, D
);
97 EXPECT_EQ(&D
, S
.getPrev());
98 EXPECT_EQ(&A
, D
.getPrev());
99 EXPECT_EQ(&S
, A
.getPrev());
100 EXPECT_EQ(&A
, S
.getNext());
101 EXPECT_EQ(&D
, A
.getNext());
102 EXPECT_EQ(&S
, D
.getNext());
103 EXPECT_EQ(nullptr, B
.getPrev());
104 EXPECT_EQ(nullptr, C
.getNext());
107 TYPED_TEST(IListBaseTest
, removeRangeImplAllButSentinel
) {
108 typedef TypeParam list_base_type
;
109 typedef typename
list_base_type::node_base_type node_base_type
;
111 node_base_type S
, A
, B
;
113 // [S] <-> A <-> B <-> [S]
116 list_base_type::insertBeforeImpl(S
, A
);
117 list_base_type::insertBeforeImpl(S
, B
);
120 list_base_type::removeRangeImpl(A
, S
);
121 EXPECT_EQ(&S
, S
.getPrev());
122 EXPECT_EQ(&S
, S
.getNext());
123 EXPECT_EQ(nullptr, A
.getPrev());
124 EXPECT_EQ(nullptr, B
.getNext());
127 TYPED_TEST(IListBaseTest
, transferBeforeImpl
) {
128 typedef TypeParam list_base_type
;
129 typedef typename
list_base_type::node_base_type node_base_type
;
131 node_base_type S1
, S2
, A
, B
, C
, D
, E
;
133 // [S1] <-> A <-> B <-> C <-> [S1]
136 list_base_type::insertBeforeImpl(S1
, A
);
137 list_base_type::insertBeforeImpl(S1
, B
);
138 list_base_type::insertBeforeImpl(S1
, C
);
140 // [S2] <-> D <-> E <-> [S2]
143 list_base_type::insertBeforeImpl(S2
, D
);
144 list_base_type::insertBeforeImpl(S2
, E
);
146 // [S1] <-> C <-> [S1]
147 list_base_type::transferBeforeImpl(D
, A
, C
);
148 EXPECT_EQ(&C
, S1
.getPrev());
149 EXPECT_EQ(&S1
, C
.getPrev());
150 EXPECT_EQ(&C
, S1
.getNext());
151 EXPECT_EQ(&S1
, C
.getNext());
153 // [S2] <-> A <-> B <-> D <-> E <-> [S2]
154 EXPECT_EQ(&E
, S2
.getPrev());
155 EXPECT_EQ(&D
, E
.getPrev());
156 EXPECT_EQ(&B
, D
.getPrev());
157 EXPECT_EQ(&A
, B
.getPrev());
158 EXPECT_EQ(&S2
, A
.getPrev());
159 EXPECT_EQ(&A
, S2
.getNext());
160 EXPECT_EQ(&B
, A
.getNext());
161 EXPECT_EQ(&D
, B
.getNext());
162 EXPECT_EQ(&E
, D
.getNext());
163 EXPECT_EQ(&S2
, E
.getNext());