| //===- llvm/unittest/ADT/PriorityWorklist.cpp -----------------------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // PriorityWorklist unit tests. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/ADT/PriorityWorklist.h" |
| #include "gtest/gtest.h" |
| #include <list> |
| #include <vector> |
| |
| namespace { |
| |
| using namespace llvm; |
| |
| template <typename T> class PriorityWorklistTest : public ::testing::Test {}; |
| typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>> |
| TestTypes; |
| TYPED_TEST_CASE(PriorityWorklistTest, TestTypes); |
| |
| TYPED_TEST(PriorityWorklistTest, Basic) { |
| TypeParam W; |
| EXPECT_TRUE(W.empty()); |
| EXPECT_EQ(0u, W.size()); |
| EXPECT_FALSE(W.count(42)); |
| |
| EXPECT_TRUE(W.insert(21)); |
| EXPECT_TRUE(W.insert(42)); |
| EXPECT_TRUE(W.insert(17)); |
| |
| EXPECT_FALSE(W.empty()); |
| EXPECT_EQ(3u, W.size()); |
| EXPECT_TRUE(W.count(42)); |
| |
| EXPECT_FALSE(W.erase(75)); |
| EXPECT_EQ(3u, W.size()); |
| EXPECT_EQ(17, W.back()); |
| |
| EXPECT_TRUE(W.erase(17)); |
| EXPECT_FALSE(W.count(17)); |
| EXPECT_EQ(2u, W.size()); |
| EXPECT_EQ(42, W.back()); |
| |
| W.clear(); |
| EXPECT_TRUE(W.empty()); |
| EXPECT_EQ(0u, W.size()); |
| |
| EXPECT_TRUE(W.insert(21)); |
| EXPECT_TRUE(W.insert(42)); |
| EXPECT_TRUE(W.insert(12)); |
| EXPECT_TRUE(W.insert(17)); |
| EXPECT_TRUE(W.count(12)); |
| EXPECT_TRUE(W.count(17)); |
| EXPECT_EQ(4u, W.size()); |
| EXPECT_EQ(17, W.back()); |
| EXPECT_TRUE(W.erase(12)); |
| EXPECT_FALSE(W.count(12)); |
| EXPECT_TRUE(W.count(17)); |
| EXPECT_EQ(3u, W.size()); |
| EXPECT_EQ(17, W.back()); |
| |
| EXPECT_FALSE(W.insert(42)); |
| EXPECT_EQ(3u, W.size()); |
| EXPECT_EQ(42, W.pop_back_val()); |
| EXPECT_EQ(17, W.pop_back_val()); |
| EXPECT_EQ(21, W.pop_back_val()); |
| EXPECT_TRUE(W.empty()); |
| } |
| |
| TYPED_TEST(PriorityWorklistTest, InsertSequence) { |
| TypeParam W; |
| ASSERT_TRUE(W.insert(2)); |
| ASSERT_TRUE(W.insert(4)); |
| ASSERT_TRUE(W.insert(7)); |
| // Insert a sequence that has internal duplicates and a duplicate among |
| // existing entries. |
| W.insert(std::vector<int>({42, 13, 42, 7, 8})); |
| EXPECT_EQ(8, W.pop_back_val()); |
| EXPECT_EQ(7, W.pop_back_val()); |
| EXPECT_EQ(42, W.pop_back_val()); |
| EXPECT_EQ(13, W.pop_back_val()); |
| EXPECT_EQ(4, W.pop_back_val()); |
| EXPECT_EQ(2, W.pop_back_val()); |
| ASSERT_TRUE(W.empty()); |
| |
| // Simpler tests with various other input types. |
| ASSERT_TRUE(W.insert(2)); |
| ASSERT_TRUE(W.insert(7)); |
| // Use a non-random-access container. |
| W.insert(std::list<int>({7, 5})); |
| EXPECT_EQ(5, W.pop_back_val()); |
| EXPECT_EQ(7, W.pop_back_val()); |
| EXPECT_EQ(2, W.pop_back_val()); |
| ASSERT_TRUE(W.empty()); |
| |
| ASSERT_TRUE(W.insert(2)); |
| ASSERT_TRUE(W.insert(7)); |
| // Use a raw array. |
| int A[] = {7, 5}; |
| W.insert(A); |
| EXPECT_EQ(5, W.pop_back_val()); |
| EXPECT_EQ(7, W.pop_back_val()); |
| EXPECT_EQ(2, W.pop_back_val()); |
| ASSERT_TRUE(W.empty()); |
| |
| ASSERT_TRUE(W.insert(2)); |
| ASSERT_TRUE(W.insert(7)); |
| // Inserting an empty sequence does nothing. |
| W.insert(std::vector<int>()); |
| EXPECT_EQ(7, W.pop_back_val()); |
| EXPECT_EQ(2, W.pop_back_val()); |
| ASSERT_TRUE(W.empty()); |
| } |
| |
| TYPED_TEST(PriorityWorklistTest, EraseIf) { |
| TypeParam W; |
| W.insert(23); |
| W.insert(10); |
| W.insert(47); |
| W.insert(42); |
| W.insert(23); |
| W.insert(13); |
| W.insert(26); |
| W.insert(42); |
| EXPECT_EQ(6u, W.size()); |
| |
| EXPECT_FALSE(W.erase_if([](int i) { return i > 100; })); |
| EXPECT_EQ(6u, W.size()); |
| EXPECT_EQ(42, W.back()); |
| |
| EXPECT_TRUE(W.erase_if([](int i) { |
| assert(i != 0 && "Saw a null value!"); |
| return (i & 1) == 0; |
| })); |
| EXPECT_EQ(3u, W.size()); |
| EXPECT_FALSE(W.count(42)); |
| EXPECT_FALSE(W.count(26)); |
| EXPECT_FALSE(W.count(10)); |
| EXPECT_FALSE(W.insert(47)); |
| EXPECT_FALSE(W.insert(23)); |
| EXPECT_EQ(23, W.pop_back_val()); |
| EXPECT_EQ(47, W.pop_back_val()); |
| EXPECT_EQ(13, W.pop_back_val()); |
| } |
| |
| } |