blob: 1a87a270a67f9577ce6bdc6a87df0311e0d59992 [file] [log] [blame]
Duncan P. N. Exon Smith5c001c32016-08-30 00:13:12 +00001//===- unittests/ADT/IListIteratorTest.cpp - ilist_iterator 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
10#include "llvm/ADT/ilist.h"
11#include "gtest/gtest.h"
12
13using namespace llvm;
14
15namespace {
16
17struct Node : ilist_node<Node> {};
18
19TEST(IListIteratorTest, DefaultConstructor) {
20 iplist<Node>::iterator I;
21 iplist<Node>::reverse_iterator RI;
22 iplist<Node>::const_iterator CI;
23 iplist<Node>::const_reverse_iterator CRI;
24 EXPECT_EQ(nullptr, I.getNodePtr());
25 EXPECT_EQ(nullptr, CI.getNodePtr());
26 EXPECT_EQ(nullptr, RI.getNodePtr());
27 EXPECT_EQ(nullptr, CRI.getNodePtr());
28 EXPECT_EQ(I, I);
29 EXPECT_EQ(I, CI);
30 EXPECT_EQ(CI, I);
31 EXPECT_EQ(CI, CI);
32 EXPECT_EQ(RI, RI);
33 EXPECT_EQ(RI, CRI);
34 EXPECT_EQ(CRI, RI);
35 EXPECT_EQ(CRI, CRI);
36 EXPECT_EQ(I, RI.getReverse());
37 EXPECT_EQ(RI, I.getReverse());
38}
39
40TEST(IListIteratorTest, Empty) {
41 iplist<Node> L;
42
43 // Check iterators of L.
44 EXPECT_EQ(L.begin(), L.end());
45 EXPECT_EQ(L.rbegin(), L.rend());
46
47 // Reverse of end should be rend (since the sentinel sits on both sides).
48 EXPECT_EQ(L.end(), L.rend().getReverse());
49 EXPECT_EQ(L.rend(), L.end().getReverse());
50
51 // Iterators shouldn't match default constructors.
52 iplist<Node>::iterator I;
53 iplist<Node>::reverse_iterator RI;
54 EXPECT_NE(I, L.begin());
55 EXPECT_NE(I, L.end());
56 EXPECT_NE(RI, L.rbegin());
57 EXPECT_NE(RI, L.rend());
58
59 // Don't delete nodes.
60 L.clearAndLeakNodesUnsafely();
61}
62
63TEST(IListIteratorTest, OneNodeList) {
64 iplist<Node> L;
65 Node A;
66 L.insert(L.end(), &A);
67
68 // Check address of reference.
69 EXPECT_EQ(&A, &*L.begin());
70 EXPECT_EQ(&A, &*L.rbegin());
71
72 // Check that the handle matches.
73 EXPECT_EQ(L.rbegin().getNodePtr(), L.begin().getNodePtr());
74
75 // Check iteration.
76 EXPECT_EQ(L.end(), ++L.begin());
77 EXPECT_EQ(L.begin(), --L.end());
78 EXPECT_EQ(L.rend(), ++L.rbegin());
79 EXPECT_EQ(L.rbegin(), --L.rend());
80
81 // Check conversions.
82 EXPECT_EQ(L.rbegin(), L.begin().getReverse());
83 EXPECT_EQ(L.begin(), L.rbegin().getReverse());
84
85 // Don't delete nodes.
86 L.clearAndLeakNodesUnsafely();
87}
88
89TEST(IListIteratorTest, TwoNodeList) {
90 iplist<Node> L;
91 Node A, B;
92 L.insert(L.end(), &A);
93 L.insert(L.end(), &B);
94
95 // Check order.
96 EXPECT_EQ(&A, &*L.begin());
97 EXPECT_EQ(&B, &*++L.begin());
98 EXPECT_EQ(L.end(), ++++L.begin());
99 EXPECT_EQ(&B, &*L.rbegin());
100 EXPECT_EQ(&A, &*++L.rbegin());
101 EXPECT_EQ(L.rend(), ++++L.rbegin());
102
103 // Check conversions.
104 EXPECT_EQ(++L.rbegin(), L.begin().getReverse());
105 EXPECT_EQ(L.rbegin(), (++L.begin()).getReverse());
106 EXPECT_EQ(++L.begin(), L.rbegin().getReverse());
107 EXPECT_EQ(L.begin(), (++L.rbegin()).getReverse());
108
109 // Don't delete nodes.
110 L.clearAndLeakNodesUnsafely();
111}
112
113TEST(IListIteratorTest, CheckEraseForward) {
114 iplist<Node> L;
115 Node A, B;
116 L.insert(L.end(), &A);
117 L.insert(L.end(), &B);
118
119 // Erase nodes.
120 auto I = L.begin();
121 EXPECT_EQ(&A, &*I);
122 EXPECT_EQ(&A, L.remove(I++));
123 EXPECT_EQ(&B, &*I);
124 EXPECT_EQ(&B, L.remove(I++));
125 EXPECT_EQ(L.end(), I);
126
127 // Don't delete nodes.
128 L.clearAndLeakNodesUnsafely();
129}
130
131TEST(IListIteratorTest, CheckEraseReverse) {
132 iplist<Node> L;
133 Node A, B;
134 L.insert(L.end(), &A);
135 L.insert(L.end(), &B);
136
137 // Erase nodes.
138 auto RI = L.rbegin();
139 EXPECT_EQ(&B, &*RI);
140 EXPECT_EQ(&B, L.remove(&*RI++));
141 EXPECT_EQ(&A, &*RI);
142 EXPECT_EQ(&A, L.remove(&*RI++));
143 EXPECT_EQ(L.rend(), RI);
144
145 // Don't delete nodes.
146 L.clearAndLeakNodesUnsafely();
147}
148
149} // end namespace