1
//===----------- ImmutableSetTest.cpp - ImmutableSet unit tests ------------===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
#include "gtest/gtest.h"
11
#include "llvm/ADT/ImmutableSet.h"
16
class ImmutableSetTest : public testing::Test {
19
static char buffer[10];
25
MyIter() : counter(0), ptr(buffer) {
26
for (unsigned i=0; i<sizeof(buffer);++i) buffer[i]='\0';
28
void operator()(char c) {
34
char ImmutableSetTest::buffer[10];
37
TEST_F(ImmutableSetTest, EmptyIntSetTest) {
38
ImmutableSet<int>::Factory f;
40
EXPECT_TRUE(f.GetEmptySet() == f.GetEmptySet());
41
EXPECT_FALSE(f.GetEmptySet() != f.GetEmptySet());
42
EXPECT_TRUE(f.GetEmptySet().isEmpty());
44
ImmutableSet<int> S = f.GetEmptySet();
45
EXPECT_EQ(0u, S.getHeight());
46
EXPECT_TRUE(S.begin() == S.end());
47
EXPECT_FALSE(S.begin() != S.end());
51
TEST_F(ImmutableSetTest, OneElemIntSetTest) {
52
ImmutableSet<int>::Factory f;
53
ImmutableSet<int> S = f.GetEmptySet();
55
ImmutableSet<int> S2 = f.Add(S, 3);
56
EXPECT_TRUE(S.isEmpty());
57
EXPECT_FALSE(S2.isEmpty());
58
EXPECT_FALSE(S == S2);
60
EXPECT_FALSE(S.contains(3));
61
EXPECT_TRUE(S2.contains(3));
62
EXPECT_FALSE(S2.begin() == S2.end());
63
EXPECT_TRUE(S2.begin() != S2.end());
65
ImmutableSet<int> S3 = f.Add(S, 2);
66
EXPECT_TRUE(S.isEmpty());
67
EXPECT_FALSE(S3.isEmpty());
68
EXPECT_FALSE(S == S3);
70
EXPECT_FALSE(S.contains(2));
71
EXPECT_TRUE(S3.contains(2));
73
EXPECT_FALSE(S2 == S3);
74
EXPECT_TRUE(S2 != S3);
75
EXPECT_FALSE(S2.contains(2));
76
EXPECT_FALSE(S3.contains(3));
79
TEST_F(ImmutableSetTest, MultiElemIntSetTest) {
80
ImmutableSet<int>::Factory f;
81
ImmutableSet<int> S = f.GetEmptySet();
83
ImmutableSet<int> S2 = f.Add(f.Add(f.Add(S, 3), 4), 5);
84
ImmutableSet<int> S3 = f.Add(f.Add(f.Add(S2, 9), 20), 43);
85
ImmutableSet<int> S4 = f.Add(S2, 9);
87
EXPECT_TRUE(S.isEmpty());
88
EXPECT_FALSE(S2.isEmpty());
89
EXPECT_FALSE(S3.isEmpty());
90
EXPECT_FALSE(S4.isEmpty());
92
EXPECT_FALSE(S.contains(3));
93
EXPECT_FALSE(S.contains(9));
95
EXPECT_TRUE(S2.contains(3));
96
EXPECT_TRUE(S2.contains(4));
97
EXPECT_TRUE(S2.contains(5));
98
EXPECT_FALSE(S2.contains(9));
99
EXPECT_FALSE(S2.contains(0));
101
EXPECT_TRUE(S3.contains(43));
102
EXPECT_TRUE(S3.contains(20));
103
EXPECT_TRUE(S3.contains(9));
104
EXPECT_TRUE(S3.contains(3));
105
EXPECT_TRUE(S3.contains(4));
106
EXPECT_TRUE(S3.contains(5));
107
EXPECT_FALSE(S3.contains(0));
109
EXPECT_TRUE(S4.contains(9));
110
EXPECT_TRUE(S4.contains(3));
111
EXPECT_TRUE(S4.contains(4));
112
EXPECT_TRUE(S4.contains(5));
113
EXPECT_FALSE(S4.contains(20));
114
EXPECT_FALSE(S4.contains(43));
117
TEST_F(ImmutableSetTest, RemoveIntSetTest) {
118
ImmutableSet<int>::Factory f;
119
ImmutableSet<int> S = f.GetEmptySet();
121
ImmutableSet<int> S2 = f.Add(f.Add(S, 4), 5);
122
ImmutableSet<int> S3 = f.Add(S2, 3);
123
ImmutableSet<int> S4 = f.Remove(S3, 3);
125
EXPECT_TRUE(S3.contains(3));
126
EXPECT_FALSE(S2.contains(3));
127
EXPECT_FALSE(S4.contains(3));
129
EXPECT_TRUE(S2 == S4);
130
EXPECT_TRUE(S3 != S2);
131
EXPECT_TRUE(S3 != S4);
133
EXPECT_TRUE(S3.contains(4));
134
EXPECT_TRUE(S3.contains(5));
136
EXPECT_TRUE(S4.contains(4));
137
EXPECT_TRUE(S4.contains(5));
140
TEST_F(ImmutableSetTest, CallbackCharSetTest) {
141
ImmutableSet<char>::Factory f;
142
ImmutableSet<char> S = f.GetEmptySet();
144
ImmutableSet<char> S2 = f.Add(f.Add(f.Add(S, 'a'), 'e'), 'i');
145
ImmutableSet<char> S3 = f.Add(f.Add(S2, 'o'), 'u');
147
S3.foreach<MyIter>();
149
ASSERT_STREQ("aeiou", buffer);
152
TEST_F(ImmutableSetTest, Callback2CharSetTest) {
153
ImmutableSet<char>::Factory f;
154
ImmutableSet<char> S = f.GetEmptySet();
156
ImmutableSet<char> S2 = f.Add(f.Add(f.Add(S, 'b'), 'c'), 'd');
157
ImmutableSet<char> S3 = f.Add(f.Add(f.Add(S2, 'f'), 'g'), 'h');
160
S3.foreach<MyIter>(obj);
161
ASSERT_STREQ("bcdfgh", buffer);
162
ASSERT_EQ(6, obj.counter);
165
S2.foreach<MyIter>(obj2);
166
ASSERT_STREQ("bcd", buffer);
167
ASSERT_EQ(3, obj2.counter);
170
S.foreach<MyIter>(obj);
171
ASSERT_STREQ("", buffer);
172
ASSERT_EQ(0, obj3.counter);
175
TEST_F(ImmutableSetTest, IterLongSetTest) {
176
ImmutableSet<long>::Factory f;
177
ImmutableSet<long> S = f.GetEmptySet();
179
ImmutableSet<long> S2 = f.Add(f.Add(f.Add(S, 0), 1), 2);
180
ImmutableSet<long> S3 = f.Add(f.Add(f.Add(S2, 3), 4), 5);
183
for (ImmutableSet<long>::iterator I = S.begin(), E = S.end(); I != E; ++I) {
189
for (ImmutableSet<long>::iterator I = S2.begin(), E = S2.end(); I != E; ++I) {
195
for (ImmutableSet<long>::iterator I = S3.begin(), E = S3.end(); I != E; I++) {