| //===- 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_SUITE(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()); | 
 | } | 
 |  | 
 | } |