blob: 34a8e9263454b99db92680c26c79616e70f05b88 [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
17TEST(IListBaseTest, insertBeforeImpl) {
18 ilist_node_base S, A, B;
19 // [S] <-> [S]
20 S.setPrev(&S);
21 S.setNext(&S);
22
23 // [S] <-> A <-> [S]
24 ilist_base::insertBeforeImpl(S, A);
25 EXPECT_EQ(&A, S.getPrev());
26 EXPECT_EQ(&S, A.getPrev());
27 EXPECT_EQ(&A, S.getNext());
28 EXPECT_EQ(&S, A.getNext());
29
30 // [S] <-> A <-> B <-> [S]
31 ilist_base::insertBeforeImpl(S, B);
32 EXPECT_EQ(&B, S.getPrev());
33 EXPECT_EQ(&A, B.getPrev());
34 EXPECT_EQ(&S, A.getPrev());
35 EXPECT_EQ(&A, S.getNext());
36 EXPECT_EQ(&B, A.getNext());
37 EXPECT_EQ(&S, B.getNext());
38}
39
40TEST(IListBaseTest, removeImpl) {
41 ilist_node_base S, A, B;
42
43 // [S] <-> A <-> B <-> [S]
44 S.setPrev(&S);
45 S.setNext(&S);
46 ilist_base::insertBeforeImpl(S, A);
47 ilist_base::insertBeforeImpl(S, B);
48
49 // [S] <-> B <-> [S]
50 ilist_base::removeImpl(A);
51 EXPECT_EQ(&B, S.getPrev());
52 EXPECT_EQ(&S, B.getPrev());
53 EXPECT_EQ(&B, S.getNext());
54 EXPECT_EQ(&S, B.getNext());
55 EXPECT_EQ(nullptr, A.getPrev());
56 EXPECT_EQ(nullptr, A.getNext());
57
58 // [S] <-> [S]
59 ilist_base::removeImpl(B);
60 EXPECT_EQ(&S, S.getPrev());
61 EXPECT_EQ(&S, S.getNext());
62 EXPECT_EQ(nullptr, B.getPrev());
63 EXPECT_EQ(nullptr, B.getNext());
64}
65
Duncan P. N. Exon Smithac798972016-08-30 16:23:55 +000066TEST(IListBaseTest, removeRangeImpl) {
67 ilist_node_base S, A, B, C, D;
68
69 // [S] <-> A <-> B <-> C <-> D <-> [S]
70 S.setPrev(&S);
71 S.setNext(&S);
72 ilist_base::insertBeforeImpl(S, A);
73 ilist_base::insertBeforeImpl(S, B);
74 ilist_base::insertBeforeImpl(S, C);
75 ilist_base::insertBeforeImpl(S, D);
76
77 // [S] <-> A <-> D <-> [S]
78 ilist_base::removeRangeImpl(B, D);
79 EXPECT_EQ(&D, S.getPrev());
80 EXPECT_EQ(&A, D.getPrev());
81 EXPECT_EQ(&S, A.getPrev());
82 EXPECT_EQ(&A, S.getNext());
83 EXPECT_EQ(&D, A.getNext());
84 EXPECT_EQ(&S, D.getNext());
85 EXPECT_EQ(nullptr, B.getPrev());
86 EXPECT_EQ(nullptr, C.getNext());
87}
88
89TEST(IListBaseTest, removeRangeImplAllButSentinel) {
90 ilist_node_base S, A, B;
91
92 // [S] <-> A <-> B <-> [S]
93 S.setPrev(&S);
94 S.setNext(&S);
95 ilist_base::insertBeforeImpl(S, A);
96 ilist_base::insertBeforeImpl(S, B);
97
98 // [S] <-> [S]
99 ilist_base::removeRangeImpl(A, S);
100 EXPECT_EQ(&S, S.getPrev());
101 EXPECT_EQ(&S, S.getNext());
102 EXPECT_EQ(nullptr, A.getPrev());
103 EXPECT_EQ(nullptr, B.getNext());
104}
105
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +0000106TEST(IListBaseTest, transferBeforeImpl) {
107 ilist_node_base S1, S2, A, B, C, D, E;
108
109 // [S1] <-> A <-> B <-> C <-> [S1]
110 S1.setPrev(&S1);
111 S1.setNext(&S1);
112 ilist_base::insertBeforeImpl(S1, A);
113 ilist_base::insertBeforeImpl(S1, B);
114 ilist_base::insertBeforeImpl(S1, C);
115
116 // [S2] <-> D <-> E <-> [S2]
117 S2.setPrev(&S2);
118 S2.setNext(&S2);
119 ilist_base::insertBeforeImpl(S2, D);
120 ilist_base::insertBeforeImpl(S2, E);
121
122 // [S1] <-> C <-> [S1]
123 ilist_base::transferBeforeImpl(D, A, C);
124 EXPECT_EQ(&C, S1.getPrev());
125 EXPECT_EQ(&S1, C.getPrev());
126 EXPECT_EQ(&C, S1.getNext());
127 EXPECT_EQ(&S1, C.getNext());
128
129 // [S2] <-> A <-> B <-> D <-> E <-> [S2]
130 EXPECT_EQ(&E, S2.getPrev());
131 EXPECT_EQ(&D, E.getPrev());
132 EXPECT_EQ(&B, D.getPrev());
133 EXPECT_EQ(&A, B.getPrev());
134 EXPECT_EQ(&S2, A.getPrev());
135 EXPECT_EQ(&A, S2.getNext());
136 EXPECT_EQ(&B, A.getNext());
137 EXPECT_EQ(&D, B.getNext());
138 EXPECT_EQ(&E, D.getNext());
139 EXPECT_EQ(&S2, E.getNext());
140}
141
142} // end namespace