19f5c83b9SDuncan P. N. Exon Smith //===- unittests/ADT/IListNodeBaseTest.cpp - ilist_node_base unit tests ---===//
29f5c83b9SDuncan P. N. Exon Smith //
39f5c83b9SDuncan P. N. Exon Smith //                     The LLVM Compiler Infrastructure
49f5c83b9SDuncan P. N. Exon Smith //
59f5c83b9SDuncan P. N. Exon Smith // This file is distributed under the University of Illinois Open Source
69f5c83b9SDuncan P. N. Exon Smith // License. See LICENSE.TXT for details.
79f5c83b9SDuncan P. N. Exon Smith //
89f5c83b9SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
99f5c83b9SDuncan P. N. Exon Smith 
1079185d80SDuncan P. N. Exon Smith #include "llvm/ADT/ilist_node_base.h"
119f5c83b9SDuncan P. N. Exon Smith #include "gtest/gtest.h"
129f5c83b9SDuncan P. N. Exon Smith 
139f5c83b9SDuncan P. N. Exon Smith using namespace llvm;
149f5c83b9SDuncan P. N. Exon Smith 
159f5c83b9SDuncan P. N. Exon Smith namespace {
169f5c83b9SDuncan P. N. Exon Smith 
17*085bbf1eSDuncan P. N. Exon Smith typedef ilist_node_base<false> RawNode;
18*085bbf1eSDuncan P. N. Exon Smith typedef ilist_node_base<true> TrackingNode;
19*085bbf1eSDuncan P. N. Exon Smith 
209f5c83b9SDuncan P. N. Exon Smith TEST(IListNodeBaseTest, DefaultConstructor) {
21*085bbf1eSDuncan P. N. Exon Smith   RawNode A;
229f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, A.getPrev());
239f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, A.getNext());
249f5c83b9SDuncan P. N. Exon Smith   EXPECT_FALSE(A.isKnownSentinel());
25*085bbf1eSDuncan P. N. Exon Smith 
26*085bbf1eSDuncan P. N. Exon Smith   TrackingNode TA;
27*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TA.getPrev());
28*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TA.getNext());
29*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isKnownSentinel());
30*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isSentinel());
319f5c83b9SDuncan P. N. Exon Smith }
329f5c83b9SDuncan P. N. Exon Smith 
339f5c83b9SDuncan P. N. Exon Smith TEST(IListNodeBaseTest, setPrevAndNext) {
34*085bbf1eSDuncan P. N. Exon Smith   RawNode A, B, C;
359f5c83b9SDuncan P. N. Exon Smith   A.setPrev(&B);
369f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getPrev());
379f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, A.getNext());
389f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, B.getPrev());
399f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, B.getNext());
409f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, C.getPrev());
419f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, C.getNext());
429f5c83b9SDuncan P. N. Exon Smith 
439f5c83b9SDuncan P. N. Exon Smith   A.setNext(&C);
449f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getPrev());
459f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&C, A.getNext());
469f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, B.getPrev());
479f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, B.getNext());
489f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, C.getPrev());
499f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, C.getNext());
50*085bbf1eSDuncan P. N. Exon Smith 
51*085bbf1eSDuncan P. N. Exon Smith   TrackingNode TA, TB, TC;
52*085bbf1eSDuncan P. N. Exon Smith   TA.setPrev(&TB);
53*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getPrev());
54*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TA.getNext());
55*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TB.getPrev());
56*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TB.getNext());
57*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TC.getPrev());
58*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TC.getNext());
59*085bbf1eSDuncan P. N. Exon Smith 
60*085bbf1eSDuncan P. N. Exon Smith   TA.setNext(&TC);
61*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getPrev());
62*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TC, TA.getNext());
63*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TB.getPrev());
64*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TB.getNext());
65*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TC.getPrev());
66*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(nullptr, TC.getNext());
679f5c83b9SDuncan P. N. Exon Smith }
689f5c83b9SDuncan P. N. Exon Smith 
699f5c83b9SDuncan P. N. Exon Smith TEST(IListNodeBaseTest, isKnownSentinel) {
70*085bbf1eSDuncan P. N. Exon Smith   // Without sentinel tracking.
71*085bbf1eSDuncan P. N. Exon Smith   RawNode A, B;
729f5c83b9SDuncan P. N. Exon Smith   EXPECT_FALSE(A.isKnownSentinel());
739f5c83b9SDuncan P. N. Exon Smith   A.setPrev(&B);
749f5c83b9SDuncan P. N. Exon Smith   A.setNext(&B);
759f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getPrev());
769f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getNext());
779f5c83b9SDuncan P. N. Exon Smith   EXPECT_FALSE(A.isKnownSentinel());
78*085bbf1eSDuncan P. N. Exon Smith   A.initializeSentinel();
79*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(A.isKnownSentinel());
809f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getPrev());
819f5c83b9SDuncan P. N. Exon Smith   EXPECT_EQ(&B, A.getNext());
82*085bbf1eSDuncan P. N. Exon Smith 
83*085bbf1eSDuncan P. N. Exon Smith   // With sentinel tracking.
84*085bbf1eSDuncan P. N. Exon Smith   TrackingNode TA, TB;
85*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isKnownSentinel());
86*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isSentinel());
87*085bbf1eSDuncan P. N. Exon Smith   TA.setPrev(&TB);
88*085bbf1eSDuncan P. N. Exon Smith   TA.setNext(&TB);
89*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getPrev());
90*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getNext());
91*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isKnownSentinel());
92*085bbf1eSDuncan P. N. Exon Smith   EXPECT_FALSE(TA.isSentinel());
93*085bbf1eSDuncan P. N. Exon Smith   TA.initializeSentinel();
94*085bbf1eSDuncan P. N. Exon Smith   EXPECT_TRUE(TA.isKnownSentinel());
95*085bbf1eSDuncan P. N. Exon Smith   EXPECT_TRUE(TA.isSentinel());
96*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getPrev());
97*085bbf1eSDuncan P. N. Exon Smith   EXPECT_EQ(&TB, TA.getNext());
989f5c83b9SDuncan P. N. Exon Smith }
999f5c83b9SDuncan P. N. Exon Smith 
1009f5c83b9SDuncan P. N. Exon Smith } // end namespace
101