blob: 3b8ede801c56760359749e983c8f33589b0fd594 [file] [log] [blame]
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +00001//===- unittests/ADT/IListBaseTest.cpp - ilist_base unit tests ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Duncan P. N. Exon Smith79185d82016-08-30 01:37:58 +000010#include "llvm/ADT/ilist_base.h"
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000011#include "gtest/gtest.h"
12
13using namespace llvm;
14
15namespace {
16
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000017// Test fixture.
18template <typename T> class IListBaseTest : public ::testing::Test {};
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000019
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000020// Test variants with the same test.
21typedef ::testing::Types<ilist_base<false>, ilist_base<true>>
22 IListBaseTestTypes;
23TYPED_TEST_CASE(IListBaseTest, IListBaseTestTypes);
24
25TYPED_TEST(IListBaseTest, insertBeforeImpl) {
26 typedef TypeParam list_base_type;
27 typedef typename list_base_type::node_base_type node_base_type;
28
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000029 node_base_type S, A, B;
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000030
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000031 // [S] <-> [S]
32 S.setPrev(&S);
33 S.setNext(&S);
34
35 // [S] <-> A <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000036 list_base_type::insertBeforeImpl(S, A);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000037 EXPECT_EQ(&A, S.getPrev());
38 EXPECT_EQ(&S, A.getPrev());
39 EXPECT_EQ(&A, S.getNext());
40 EXPECT_EQ(&S, A.getNext());
41
42 // [S] <-> A <-> B <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000043 list_base_type::insertBeforeImpl(S, B);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000044 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());
50}
51
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000052TYPED_TEST(IListBaseTest, removeImpl) {
53 typedef TypeParam list_base_type;
54 typedef typename list_base_type::node_base_type node_base_type;
55
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000056 node_base_type S, A, B;
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000057
58 // [S] <-> A <-> B <-> [S]
59 S.setPrev(&S);
60 S.setNext(&S);
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000061 list_base_type::insertBeforeImpl(S, A);
62 list_base_type::insertBeforeImpl(S, B);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000063
64 // [S] <-> B <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000065 list_base_type::removeImpl(A);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000066 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());
72
73 // [S] <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000074 list_base_type::removeImpl(B);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000075 EXPECT_EQ(&S, S.getPrev());
76 EXPECT_EQ(&S, S.getNext());
77 EXPECT_EQ(nullptr, B.getPrev());
78 EXPECT_EQ(nullptr, B.getNext());
79}
80
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000081TYPED_TEST(IListBaseTest, removeRangeImpl) {
82 typedef TypeParam list_base_type;
83 typedef typename list_base_type::node_base_type node_base_type;
84
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000085 node_base_type S, A, B, C, D;
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +000086
87 // [S] <-> A <-> B <-> C <-> D <-> [S]
88 S.setPrev(&S);
89 S.setNext(&S);
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000090 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);
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +000094
95 // [S] <-> A <-> D <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +000096 list_base_type::removeRangeImpl(B, D);
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +000097 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());
105}
106
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +0000107TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) {
108 typedef TypeParam list_base_type;
109 typedef typename list_base_type::node_base_type node_base_type;
110
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000111 node_base_type S, A, B;
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +0000112
113 // [S] <-> A <-> B <-> [S]
114 S.setPrev(&S);
115 S.setNext(&S);
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000116 list_base_type::insertBeforeImpl(S, A);
117 list_base_type::insertBeforeImpl(S, B);
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +0000118
119 // [S] <-> [S]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000120 list_base_type::removeRangeImpl(A, S);
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +0000121 EXPECT_EQ(&S, S.getPrev());
122 EXPECT_EQ(&S, S.getNext());
123 EXPECT_EQ(nullptr, A.getPrev());
124 EXPECT_EQ(nullptr, B.getNext());
125}
126
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +0000127TYPED_TEST(IListBaseTest, transferBeforeImpl) {
128 typedef TypeParam list_base_type;
129 typedef typename list_base_type::node_base_type node_base_type;
130
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000131 node_base_type S1, S2, A, B, C, D, E;
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +0000132
133 // [S1] <-> A <-> B <-> C <-> [S1]
134 S1.setPrev(&S1);
135 S1.setNext(&S1);
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000136 list_base_type::insertBeforeImpl(S1, A);
137 list_base_type::insertBeforeImpl(S1, B);
138 list_base_type::insertBeforeImpl(S1, C);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +0000139
140 // [S2] <-> D <-> E <-> [S2]
141 S2.setPrev(&S2);
142 S2.setNext(&S2);
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000143 list_base_type::insertBeforeImpl(S2, D);
144 list_base_type::insertBeforeImpl(S2, E);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +0000145
146 // [S1] <-> C <-> [S1]
Duncan P. N. Exon Smith41aceac2016-09-10 16:28:52 +0000147 list_base_type::transferBeforeImpl(D, A, C);
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +0000148 EXPECT_EQ(&C, S1.getPrev());
149 EXPECT_EQ(&S1, C.getPrev());
150 EXPECT_EQ(&C, S1.getNext());
151 EXPECT_EQ(&S1, C.getNext());
152
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());
164}
165
166} // end namespace