1//===----------- ImmutableSetTest.cpp - ImmutableSet 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 "gtest/gtest.h" 11#include "llvm/ADT/ImmutableSet.h" 12 13using namespace llvm; 14 15namespace { 16class ImmutableSetTest : public testing::Test { 17protected: 18 // for callback tests 19 static char buffer[10]; 20 21 struct MyIter { 22 int counter; 23 char *ptr; 24 25 MyIter() : counter(0), ptr(buffer) { 26 for (unsigned i=0; i<sizeof(buffer);++i) buffer[i]='\0'; 27 } 28 void operator()(char c) { 29 *ptr++ = c; 30 ++counter; 31 } 32 }; 33}; 34char ImmutableSetTest::buffer[10]; 35 36 37TEST_F(ImmutableSetTest, EmptyIntSetTest) { 38 ImmutableSet<int>::Factory f; 39 40 EXPECT_TRUE(f.getEmptySet() == f.getEmptySet()); 41 EXPECT_FALSE(f.getEmptySet() != f.getEmptySet()); 42 EXPECT_TRUE(f.getEmptySet().isEmpty()); 43 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()); 48} 49 50 51TEST_F(ImmutableSetTest, OneElemIntSetTest) { 52 ImmutableSet<int>::Factory f; 53 ImmutableSet<int> S = f.getEmptySet(); 54 55 ImmutableSet<int> S2 = f.add(S, 3); 56 EXPECT_TRUE(S.isEmpty()); 57 EXPECT_FALSE(S2.isEmpty()); 58 EXPECT_FALSE(S == S2); 59 EXPECT_TRUE(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()); 64 65 ImmutableSet<int> S3 = f.add(S, 2); 66 EXPECT_TRUE(S.isEmpty()); 67 EXPECT_FALSE(S3.isEmpty()); 68 EXPECT_FALSE(S == S3); 69 EXPECT_TRUE(S != S3); 70 EXPECT_FALSE(S.contains(2)); 71 EXPECT_TRUE(S3.contains(2)); 72 73 EXPECT_FALSE(S2 == S3); 74 EXPECT_TRUE(S2 != S3); 75 EXPECT_FALSE(S2.contains(2)); 76 EXPECT_FALSE(S3.contains(3)); 77} 78 79TEST_F(ImmutableSetTest, MultiElemIntSetTest) { 80 ImmutableSet<int>::Factory f; 81 ImmutableSet<int> S = f.getEmptySet(); 82 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); 86 87 EXPECT_TRUE(S.isEmpty()); 88 EXPECT_FALSE(S2.isEmpty()); 89 EXPECT_FALSE(S3.isEmpty()); 90 EXPECT_FALSE(S4.isEmpty()); 91 92 EXPECT_FALSE(S.contains(3)); 93 EXPECT_FALSE(S.contains(9)); 94 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)); 100 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)); 108 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)); 115} 116 117TEST_F(ImmutableSetTest, RemoveIntSetTest) { 118 ImmutableSet<int>::Factory f; 119 ImmutableSet<int> S = f.getEmptySet(); 120 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); 124 125 EXPECT_TRUE(S3.contains(3)); 126 EXPECT_FALSE(S2.contains(3)); 127 EXPECT_FALSE(S4.contains(3)); 128 129 EXPECT_TRUE(S2 == S4); 130 EXPECT_TRUE(S3 != S2); 131 EXPECT_TRUE(S3 != S4); 132 133 EXPECT_TRUE(S3.contains(4)); 134 EXPECT_TRUE(S3.contains(5)); 135 136 EXPECT_TRUE(S4.contains(4)); 137 EXPECT_TRUE(S4.contains(5)); 138} 139 140TEST_F(ImmutableSetTest, CallbackCharSetTest) { 141 ImmutableSet<char>::Factory f; 142 ImmutableSet<char> S = f.getEmptySet(); 143 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'); 146 147 S3.foreach<MyIter>(); 148 149 ASSERT_STREQ("aeiou", buffer); 150} 151 152TEST_F(ImmutableSetTest, Callback2CharSetTest) { 153 ImmutableSet<char>::Factory f; 154 ImmutableSet<char> S = f.getEmptySet(); 155 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'); 158 159 MyIter obj; 160 S3.foreach<MyIter>(obj); 161 ASSERT_STREQ("bcdfgh", buffer); 162 ASSERT_EQ(6, obj.counter); 163 164 MyIter obj2; 165 S2.foreach<MyIter>(obj2); 166 ASSERT_STREQ("bcd", buffer); 167 ASSERT_EQ(3, obj2.counter); 168 169 MyIter obj3; 170 S.foreach<MyIter>(obj); 171 ASSERT_STREQ("", buffer); 172 ASSERT_EQ(0, obj3.counter); 173} 174 175TEST_F(ImmutableSetTest, IterLongSetTest) { 176 ImmutableSet<long>::Factory f; 177 ImmutableSet<long> S = f.getEmptySet(); 178 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); 181 182 int i = 0; 183 for (ImmutableSet<long>::iterator I = S.begin(), E = S.end(); I != E; ++I) { 184 ASSERT_EQ(i++, *I); 185 } 186 ASSERT_EQ(0, i); 187 188 i = 0; 189 for (ImmutableSet<long>::iterator I = S2.begin(), E = S2.end(); I != E; ++I) { 190 ASSERT_EQ(i++, *I); 191 } 192 ASSERT_EQ(3, i); 193 194 i = 0; 195 for (ImmutableSet<long>::iterator I = S3.begin(), E = S3.end(); I != E; I++) { 196 ASSERT_EQ(i++, *I); 197 } 198 ASSERT_EQ(6, i); 199} 200 201} 202