blob: 192233277859e36063b0b356a915476c8f8ca1bb [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
66TEST(IListBaseTest, transferBeforeImpl) {
67 ilist_node_base S1, S2, A, B, C, D, E;
68
69 // [S1] <-> A <-> B <-> C <-> [S1]
70 S1.setPrev(&S1);
71 S1.setNext(&S1);
72 ilist_base::insertBeforeImpl(S1, A);
73 ilist_base::insertBeforeImpl(S1, B);
74 ilist_base::insertBeforeImpl(S1, C);
75
76 // [S2] <-> D <-> E <-> [S2]
77 S2.setPrev(&S2);
78 S2.setNext(&S2);
79 ilist_base::insertBeforeImpl(S2, D);
80 ilist_base::insertBeforeImpl(S2, E);
81
82 // [S1] <-> C <-> [S1]
83 ilist_base::transferBeforeImpl(D, A, C);
84 EXPECT_EQ(&C, S1.getPrev());
85 EXPECT_EQ(&S1, C.getPrev());
86 EXPECT_EQ(&C, S1.getNext());
87 EXPECT_EQ(&S1, C.getNext());
88
89 // [S2] <-> A <-> B <-> D <-> E <-> [S2]
90 EXPECT_EQ(&E, S2.getPrev());
91 EXPECT_EQ(&D, E.getPrev());
92 EXPECT_EQ(&B, D.getPrev());
93 EXPECT_EQ(&A, B.getPrev());
94 EXPECT_EQ(&S2, A.getPrev());
95 EXPECT_EQ(&A, S2.getNext());
96 EXPECT_EQ(&B, A.getNext());
97 EXPECT_EQ(&D, B.getNext());
98 EXPECT_EQ(&E, D.getNext());
99 EXPECT_EQ(&S2, E.getNext());
100}
101
102} // end namespace