1*73b193aeSPeter Klausler //===-- flang/unittests/Common/FastIntSetTest.cpp ---------------*- C++ -*-===//
2*73b193aeSPeter Klausler //
3*73b193aeSPeter Klausler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*73b193aeSPeter Klausler // See https://llvm.org/LICENSE.txt for license information.
5*73b193aeSPeter Klausler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*73b193aeSPeter Klausler //
7*73b193aeSPeter Klausler //===----------------------------------------------------------------------===//
8*73b193aeSPeter Klausler
9*73b193aeSPeter Klausler #include "gtest/gtest.h"
10*73b193aeSPeter Klausler #include "flang/Common/fast-int-set.h"
11*73b193aeSPeter Klausler #include <optional>
12*73b193aeSPeter Klausler
TEST(FastIntSetTests,Sanity)13*73b193aeSPeter Klausler TEST(FastIntSetTests, Sanity) {
14*73b193aeSPeter Klausler static constexpr int N{100};
15*73b193aeSPeter Klausler Fortran::common::FastIntSet<N> set;
16*73b193aeSPeter Klausler
17*73b193aeSPeter Klausler ASSERT_FALSE(set.IsValidValue(-1));
18*73b193aeSPeter Klausler ASSERT_TRUE(set.IsValidValue(0));
19*73b193aeSPeter Klausler ASSERT_TRUE(set.IsValidValue(N - 1));
20*73b193aeSPeter Klausler ASSERT_FALSE(set.IsValidValue(N));
21*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
22*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
23*73b193aeSPeter Klausler ASSERT_FALSE(set.Contains(0));
24*73b193aeSPeter Klausler ASSERT_FALSE(set.Contains(N - 1));
25*73b193aeSPeter Klausler
26*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(0));
27*73b193aeSPeter Klausler ASSERT_FALSE(set.IsEmpty());
28*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 1);
29*73b193aeSPeter Klausler ASSERT_TRUE(set.Contains(0));
30*73b193aeSPeter Klausler
31*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(0)); // duplicate
32*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 1);
33*73b193aeSPeter Klausler ASSERT_TRUE(set.Contains(0));
34*73b193aeSPeter Klausler
35*73b193aeSPeter Klausler ASSERT_TRUE(set.Remove(0));
36*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
37*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
38*73b193aeSPeter Klausler ASSERT_FALSE(set.Contains(0));
39*73b193aeSPeter Klausler
40*73b193aeSPeter Klausler ASSERT_FALSE(set.Add(N));
41*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
42*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
43*73b193aeSPeter Klausler ASSERT_FALSE(set.Contains(N));
44*73b193aeSPeter Klausler
45*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(N - 1));
46*73b193aeSPeter Klausler ASSERT_FALSE(set.IsEmpty());
47*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 1);
48*73b193aeSPeter Klausler ASSERT_TRUE(set.Contains(N - 1));
49*73b193aeSPeter Klausler
50*73b193aeSPeter Klausler std::optional<int> x;
51*73b193aeSPeter Klausler x = set.PopValue();
52*73b193aeSPeter Klausler ASSERT_TRUE(x.has_value());
53*73b193aeSPeter Klausler ASSERT_EQ(*x, N - 1);
54*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
55*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
56*73b193aeSPeter Klausler
57*73b193aeSPeter Klausler x = set.PopValue();
58*73b193aeSPeter Klausler ASSERT_FALSE(x.has_value());
59*73b193aeSPeter Klausler
60*73b193aeSPeter Klausler for (int j{0}; j < N; ++j) {
61*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(j)) << j;
62*73b193aeSPeter Klausler }
63*73b193aeSPeter Klausler ASSERT_FALSE(set.IsEmpty());
64*73b193aeSPeter Klausler ASSERT_EQ(set.size(), N);
65*73b193aeSPeter Klausler for (int j{0}; j < N; ++j) {
66*73b193aeSPeter Klausler ASSERT_TRUE(set.Contains(j)) << j;
67*73b193aeSPeter Klausler }
68*73b193aeSPeter Klausler
69*73b193aeSPeter Klausler for (int j{0}; j < N; ++j) {
70*73b193aeSPeter Klausler ASSERT_TRUE(set.Remove(j)) << j;
71*73b193aeSPeter Klausler ASSERT_EQ(set.size(), N - j - 1) << j;
72*73b193aeSPeter Klausler ASSERT_FALSE(set.Contains(j)) << j;
73*73b193aeSPeter Klausler }
74*73b193aeSPeter Klausler
75*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
76*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
77*73b193aeSPeter Klausler
78*73b193aeSPeter Klausler for (int j{N - 1}; j >= 0; --j) {
79*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(j)) << j;
80*73b193aeSPeter Klausler }
81*73b193aeSPeter Klausler for (int j{0}; j < N; j++) {
82*73b193aeSPeter Klausler x = set.PopValue();
83*73b193aeSPeter Klausler ASSERT_TRUE(x.has_value());
84*73b193aeSPeter Klausler ASSERT_EQ(*x, j) << j;
85*73b193aeSPeter Klausler }
86*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
87*73b193aeSPeter Klausler ASSERT_EQ(set.size(), 0);
88*73b193aeSPeter Klausler
89*73b193aeSPeter Klausler for (int j{0}; j < N; j++) {
90*73b193aeSPeter Klausler ASSERT_TRUE(set.Add(j)) << j;
91*73b193aeSPeter Klausler }
92*73b193aeSPeter Klausler ASSERT_FALSE(set.IsEmpty());
93*73b193aeSPeter Klausler ASSERT_EQ(set.size(), N);
94*73b193aeSPeter Klausler for (int j{0}; j < N; j += 2) {
95*73b193aeSPeter Klausler ASSERT_TRUE(set.Remove(j)) << j;
96*73b193aeSPeter Klausler }
97*73b193aeSPeter Klausler ASSERT_FALSE(set.IsEmpty());
98*73b193aeSPeter Klausler ASSERT_EQ(set.size(), N / 2);
99*73b193aeSPeter Klausler for (int j{0}; j < N; j++) {
100*73b193aeSPeter Klausler ASSERT_EQ(set.Contains(j), (j & 1) == 1);
101*73b193aeSPeter Klausler }
102*73b193aeSPeter Klausler
103*73b193aeSPeter Klausler set.Clear();
104*73b193aeSPeter Klausler ASSERT_TRUE(set.IsEmpty());
105*73b193aeSPeter Klausler }
106