blob: 3391a5c83f5a129b04481235c0631d296f520e07 [file] [log] [blame]
Florian Hahnc2adc2d2018-06-08 21:14:49 +00001//===- llvm/unittest/ADT/SmallSetTest.cpp ------------------------------===//
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// SmallSet unit tests.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/ADT/SmallSet.h"
15#include "gtest/gtest.h"
Florian Hahnf2cead42018-07-24 10:32:54 +000016#include <string>
Florian Hahnc2adc2d2018-06-08 21:14:49 +000017
18using namespace llvm;
19
20TEST(SmallSetTest, Insert) {
21
22 SmallSet<int, 4> s1;
23
24 for (int i = 0; i < 4; i++)
25 s1.insert(i);
26
27 for (int i = 0; i < 4; i++)
28 s1.insert(i);
29
30 EXPECT_EQ(4u, s1.size());
31
32 for (int i = 0; i < 4; i++)
33 EXPECT_EQ(1u, s1.count(i));
34
35 EXPECT_EQ(0u, s1.count(4));
36}
37
38TEST(SmallSetTest, Grow) {
39 SmallSet<int, 4> s1;
40
41 for (int i = 0; i < 8; i++)
42 s1.insert(i);
43
44 EXPECT_EQ(8u, s1.size());
45
46 for (int i = 0; i < 8; i++)
47 EXPECT_EQ(1u, s1.count(i));
48
49 EXPECT_EQ(0u, s1.count(8));
50}
51
52TEST(SmallSetTest, Erase) {
53 SmallSet<int, 4> s1;
54
55 for (int i = 0; i < 8; i++)
56 s1.insert(i);
57
58 EXPECT_EQ(8u, s1.size());
59
60 // Remove elements one by one and check if all other elements are still there.
61 for (int i = 0; i < 8; i++) {
62 EXPECT_EQ(1u, s1.count(i));
63 EXPECT_TRUE(s1.erase(i));
64 EXPECT_EQ(0u, s1.count(i));
65 EXPECT_EQ(8u - i - 1, s1.size());
66 for (int j = i + 1; j < 8; j++)
67 EXPECT_EQ(1u, s1.count(j));
68 }
69
70 EXPECT_EQ(0u, s1.count(8));
71}
Florian Hahnf2cead42018-07-24 10:32:54 +000072
73TEST(SmallSetTest, IteratorInt) {
74 SmallSet<int, 4> s1;
75
76 // Test the 'small' case.
77 for (int i = 0; i < 3; i++)
78 s1.insert(i);
79
80 std::vector<int> V(s1.begin(), s1.end());
81 // Make sure the elements are in the expected order.
82 std::sort(V.begin(), V.end());
83 for (int i = 0; i < 3; i++)
84 EXPECT_EQ(i, V[i]);
85
86 // Test the 'big' case by adding a few more elements to switch to std::set
87 // internally.
88 for (int i = 3; i < 6; i++)
89 s1.insert(i);
90
91 V.assign(s1.begin(), s1.end());
92 // Make sure the elements are in the expected order.
93 std::sort(V.begin(), V.end());
94 for (int i = 0; i < 6; i++)
95 EXPECT_EQ(i, V[i]);
96}
97
98TEST(SmallSetTest, IteratorString) {
99 // Test SmallSetIterator for SmallSet with a type with non-trivial
100 // ctors/dtors.
101 SmallSet<std::string, 2> s1;
102
103 s1.insert("str 1");
104 s1.insert("str 2");
105 s1.insert("str 1");
106
107 std::vector<std::string> V(s1.begin(), s1.end());
108 std::sort(V.begin(), V.end());
109 EXPECT_EQ(2u, s1.size());
110 EXPECT_EQ("str 1", V[0]);
111 EXPECT_EQ("str 2", V[1]);
112
113 s1.insert("str 4");
114 s1.insert("str 0");
115 s1.insert("str 4");
116
117 V.assign(s1.begin(), s1.end());
118 // Make sure the elements are in the expected order.
119 std::sort(V.begin(), V.end());
120 EXPECT_EQ(4u, s1.size());
121 EXPECT_EQ("str 0", V[0]);
122 EXPECT_EQ("str 1", V[1]);
123 EXPECT_EQ("str 2", V[2]);
124 EXPECT_EQ("str 4", V[3]);
125}
126
127TEST(SmallSetTest, IteratorIncMoveCopy) {
128 // Test SmallSetIterator for SmallSet with a type with non-trivial
129 // ctors/dtors.
130 SmallSet<std::string, 2> s1;
131
132 s1.insert("str 1");
133 s1.insert("str 2");
134
135 auto Iter = s1.begin();
136 EXPECT_EQ("str 1", *Iter);
137 ++Iter;
138 EXPECT_EQ("str 2", *Iter);
139
140 s1.insert("str 4");
141 s1.insert("str 0");
142 auto Iter2 = s1.begin();
143 Iter = std::move(Iter2);
144 EXPECT_EQ("str 0", *Iter);
Florian Hahnf2cead42018-07-24 10:32:54 +0000145}