1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/FoldingSetTest.cpp -------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // FoldingSet unit tests.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/FoldingSet.h"
16*9880d681SAndroid Build Coastguard Worker #include <string>
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker // Unaligned string test.
TEST(FoldingSetTest,UnalignedStringTest)23*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, UnalignedStringTest) {
24*9880d681SAndroid Build Coastguard Worker SCOPED_TRACE("UnalignedStringTest");
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker FoldingSetNodeID a, b;
27*9880d681SAndroid Build Coastguard Worker // An aligned string.
28*9880d681SAndroid Build Coastguard Worker std::string str1= "a test string";
29*9880d681SAndroid Build Coastguard Worker a.AddString(str1);
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker // An unaligned string.
32*9880d681SAndroid Build Coastguard Worker std::string str2 = ">" + str1;
33*9880d681SAndroid Build Coastguard Worker b.AddString(str2.c_str() + 1);
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(a.ComputeHash(), b.ComputeHash());
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker struct TrivialPair : public FoldingSetNode {
39*9880d681SAndroid Build Coastguard Worker unsigned Key = 0;
40*9880d681SAndroid Build Coastguard Worker unsigned Value = 0;
TrivialPair__anon4d6c627b0111::TrivialPair41*9880d681SAndroid Build Coastguard Worker TrivialPair(unsigned K, unsigned V) : FoldingSetNode(), Key(K), Value(V) {}
42*9880d681SAndroid Build Coastguard Worker
Profile__anon4d6c627b0111::TrivialPair43*9880d681SAndroid Build Coastguard Worker void Profile(FoldingSetNodeID &ID) const {
44*9880d681SAndroid Build Coastguard Worker ID.AddInteger(Key);
45*9880d681SAndroid Build Coastguard Worker ID.AddInteger(Value);
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker };
48*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,IDComparison)49*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, IDComparison) {
50*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
53*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker void *InsertPos = nullptr;
56*9880d681SAndroid Build Coastguard Worker FoldingSetNodeID ID;
57*9880d681SAndroid Build Coastguard Worker T.Profile(ID);
58*9880d681SAndroid Build Coastguard Worker TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
59*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&T, N);
60*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, InsertPos);
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,MissedIDComparison)63*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, MissedIDComparison) {
64*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker TrivialPair S(100, 42);
67*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
68*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker void *InsertPos = nullptr;
71*9880d681SAndroid Build Coastguard Worker FoldingSetNodeID ID;
72*9880d681SAndroid Build Coastguard Worker S.Profile(ID);
73*9880d681SAndroid Build Coastguard Worker TrivialPair *N = Trivial.FindNodeOrInsertPos(ID, InsertPos);
74*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, N);
75*9880d681SAndroid Build Coastguard Worker EXPECT_NE(nullptr, InsertPos);
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,RemoveNodeThatIsPresent)78*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, RemoveNodeThatIsPresent) {
79*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
82*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Trivial.size(), 1U);
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker bool WasThere = Trivial.RemoveNode(&T);
86*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(WasThere);
87*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0U, Trivial.size());
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,RemoveNodeThatIsAbsent)90*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, RemoveNodeThatIsAbsent) {
91*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
94*9880d681SAndroid Build Coastguard Worker bool WasThere = Trivial.RemoveNode(&T);
95*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(WasThere);
96*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0U, Trivial.size());
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,GetOrInsertInserting)99*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, GetOrInsertInserting) {
100*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
103*9880d681SAndroid Build Coastguard Worker TrivialPair *N = Trivial.GetOrInsertNode(&T);
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&T, N);
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,GetOrInsertGetting)107*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, GetOrInsertGetting) {
108*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
111*9880d681SAndroid Build Coastguard Worker TrivialPair T2(99, 42);
112*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
113*9880d681SAndroid Build Coastguard Worker TrivialPair *N = Trivial.GetOrInsertNode(&T2);
114*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&T, N);
115*9880d681SAndroid Build Coastguard Worker }
116*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,InsertAtPos)117*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, InsertAtPos) {
118*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker void *InsertPos = nullptr;
121*9880d681SAndroid Build Coastguard Worker TrivialPair Finder(99, 42);
122*9880d681SAndroid Build Coastguard Worker FoldingSetNodeID ID;
123*9880d681SAndroid Build Coastguard Worker Finder.Profile(ID);
124*9880d681SAndroid Build Coastguard Worker Trivial.FindNodeOrInsertPos(ID, InsertPos);
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
127*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T, InsertPos);
128*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, Trivial.size());
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,EmptyIsTrue)131*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, EmptyIsTrue) {
132*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
133*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Trivial.empty());
134*9880d681SAndroid Build Coastguard Worker }
135*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,EmptyIsFalse)136*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, EmptyIsFalse) {
137*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
138*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
139*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
140*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Trivial.empty());
141*9880d681SAndroid Build Coastguard Worker }
142*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,ClearOnEmpty)143*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, ClearOnEmpty) {
144*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
145*9880d681SAndroid Build Coastguard Worker Trivial.clear();
146*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Trivial.empty());
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,ClearOnNonEmpty)149*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, ClearOnNonEmpty) {
150*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
151*9880d681SAndroid Build Coastguard Worker TrivialPair T(99, 42);
152*9880d681SAndroid Build Coastguard Worker Trivial.InsertNode(&T);
153*9880d681SAndroid Build Coastguard Worker Trivial.clear();
154*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Trivial.empty());
155*9880d681SAndroid Build Coastguard Worker }
156*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,CapacityLargerThanReserve)157*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, CapacityLargerThanReserve) {
158*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
159*9880d681SAndroid Build Coastguard Worker auto OldCapacity = Trivial.capacity();
160*9880d681SAndroid Build Coastguard Worker Trivial.reserve(OldCapacity + 1);
161*9880d681SAndroid Build Coastguard Worker EXPECT_GE(Trivial.capacity(), OldCapacity + 1);
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker
TEST(FoldingSetTest,SmallReserveChangesNothing)164*9880d681SAndroid Build Coastguard Worker TEST(FoldingSetTest, SmallReserveChangesNothing) {
165*9880d681SAndroid Build Coastguard Worker FoldingSet<TrivialPair> Trivial;
166*9880d681SAndroid Build Coastguard Worker auto OldCapacity = Trivial.capacity();
167*9880d681SAndroid Build Coastguard Worker Trivial.reserve(OldCapacity - 1);
168*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Trivial.capacity(), OldCapacity);
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker
173