| //===-- flang/unittests/Common/FastIntSetTest.cpp ---------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "gtest/gtest.h" |
| #include "flang/Common/fast-int-set.h" |
| #include <optional> |
| |
| TEST(FastIntSetTests, Sanity) { |
| static constexpr int N{100}; |
| Fortran::common::FastIntSet<N> set; |
| |
| ASSERT_FALSE(set.IsValidValue(-1)); |
| ASSERT_TRUE(set.IsValidValue(0)); |
| ASSERT_TRUE(set.IsValidValue(N - 1)); |
| ASSERT_FALSE(set.IsValidValue(N)); |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| ASSERT_FALSE(set.Contains(0)); |
| ASSERT_FALSE(set.Contains(N - 1)); |
| |
| ASSERT_TRUE(set.Add(0)); |
| ASSERT_FALSE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 1); |
| ASSERT_TRUE(set.Contains(0)); |
| |
| ASSERT_TRUE(set.Add(0)); // duplicate |
| ASSERT_EQ(set.size(), 1); |
| ASSERT_TRUE(set.Contains(0)); |
| |
| ASSERT_TRUE(set.Remove(0)); |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| ASSERT_FALSE(set.Contains(0)); |
| |
| ASSERT_FALSE(set.Add(N)); |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| ASSERT_FALSE(set.Contains(N)); |
| |
| ASSERT_TRUE(set.Add(N - 1)); |
| ASSERT_FALSE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 1); |
| ASSERT_TRUE(set.Contains(N - 1)); |
| |
| std::optional<int> x; |
| x = set.PopValue(); |
| ASSERT_TRUE(x.has_value()); |
| ASSERT_EQ(*x, N - 1); |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| |
| x = set.PopValue(); |
| ASSERT_FALSE(x.has_value()); |
| |
| for (int j{0}; j < N; ++j) { |
| ASSERT_TRUE(set.Add(j)) << j; |
| } |
| ASSERT_FALSE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), N); |
| for (int j{0}; j < N; ++j) { |
| ASSERT_TRUE(set.Contains(j)) << j; |
| } |
| |
| for (int j{0}; j < N; ++j) { |
| ASSERT_TRUE(set.Remove(j)) << j; |
| ASSERT_EQ(set.size(), N - j - 1) << j; |
| ASSERT_FALSE(set.Contains(j)) << j; |
| } |
| |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| |
| for (int j{N - 1}; j >= 0; --j) { |
| ASSERT_TRUE(set.Add(j)) << j; |
| } |
| for (int j{0}; j < N; j++) { |
| x = set.PopValue(); |
| ASSERT_TRUE(x.has_value()); |
| ASSERT_EQ(*x, j) << j; |
| } |
| ASSERT_TRUE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), 0); |
| |
| for (int j{0}; j < N; j++) { |
| ASSERT_TRUE(set.Add(j)) << j; |
| } |
| ASSERT_FALSE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), N); |
| for (int j{0}; j < N; j += 2) { |
| ASSERT_TRUE(set.Remove(j)) << j; |
| } |
| ASSERT_FALSE(set.IsEmpty()); |
| ASSERT_EQ(set.size(), N / 2); |
| for (int j{0}; j < N; j++) { |
| ASSERT_EQ(set.Contains(j), (j & 1) == 1); |
| } |
| |
| set.Clear(); |
| ASSERT_TRUE(set.IsEmpty()); |
| } |