[llvm-exegesis] Program should succeed if benchmark returns StringError.
[llvm-core.git] / unittests / ADT / IListBaseTest.cpp
blob3b8ede801c56760359749e983c8f33589b0fd594
1 //===- 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 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/ilist_base.h"
11 #include "gtest/gtest.h"
13 using namespace llvm;
15 namespace {
17 // Test fixture.
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>>
22 IListBaseTestTypes;
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;
31 // [S] <-> [S]
32 S.setPrev(&S);
33 S.setNext(&S);
35 // [S] <-> A <-> [S]
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]
59 S.setPrev(&S);
60 S.setNext(&S);
61 list_base_type::insertBeforeImpl(S, A);
62 list_base_type::insertBeforeImpl(S, B);
64 // [S] <-> B <-> [S]
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());
73 // [S] <-> [S]
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]
88 S.setPrev(&S);
89 S.setNext(&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]
114 S.setPrev(&S);
115 S.setNext(&S);
116 list_base_type::insertBeforeImpl(S, A);
117 list_base_type::insertBeforeImpl(S, B);
119 // [S] <-> [S]
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]
134 S1.setPrev(&S1);
135 S1.setNext(&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]
141 S2.setPrev(&S2);
142 S2.setNext(&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());
166 } // end namespace