xref: /llvm-project/llvm/unittests/ADT/PriorityWorklistTest.cpp (revision 05de4b413930418b60c0dd1e72681b476b50e7fb)
175803272SChandler Carruth //===- llvm/unittest/ADT/PriorityWorklist.cpp -----------------------------===//
275803272SChandler Carruth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
675803272SChandler Carruth //
775803272SChandler Carruth //===----------------------------------------------------------------------===//
875803272SChandler Carruth //
975803272SChandler Carruth // PriorityWorklist unit tests.
1075803272SChandler Carruth //
1175803272SChandler Carruth //===----------------------------------------------------------------------===//
1275803272SChandler Carruth 
1375803272SChandler Carruth #include "llvm/ADT/PriorityWorklist.h"
1475803272SChandler Carruth #include "gtest/gtest.h"
15ac458ba9SChandler Carruth #include <list>
16ac458ba9SChandler Carruth #include <vector>
1775803272SChandler Carruth 
1875803272SChandler Carruth namespace {
1975803272SChandler Carruth 
2075803272SChandler Carruth using namespace llvm;
2175803272SChandler Carruth 
2275803272SChandler Carruth template <typename T> class PriorityWorklistTest : public ::testing::Test {};
2375803272SChandler Carruth typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>>
2475803272SChandler Carruth     TestTypes;
25*05de4b41SBenjamin Kramer TYPED_TEST_SUITE(PriorityWorklistTest, TestTypes, );
2675803272SChandler Carruth 
TYPED_TEST(PriorityWorklistTest,Basic)2775803272SChandler Carruth TYPED_TEST(PriorityWorklistTest, Basic) {
2875803272SChandler Carruth   TypeParam W;
2975803272SChandler Carruth   EXPECT_TRUE(W.empty());
3075803272SChandler Carruth   EXPECT_EQ(0u, W.size());
3175803272SChandler Carruth   EXPECT_FALSE(W.count(42));
3275803272SChandler Carruth 
3375803272SChandler Carruth   EXPECT_TRUE(W.insert(21));
3475803272SChandler Carruth   EXPECT_TRUE(W.insert(42));
3575803272SChandler Carruth   EXPECT_TRUE(W.insert(17));
3675803272SChandler Carruth 
3775803272SChandler Carruth   EXPECT_FALSE(W.empty());
3875803272SChandler Carruth   EXPECT_EQ(3u, W.size());
3975803272SChandler Carruth   EXPECT_TRUE(W.count(42));
4075803272SChandler Carruth 
4175803272SChandler Carruth   EXPECT_FALSE(W.erase(75));
4275803272SChandler Carruth   EXPECT_EQ(3u, W.size());
4375803272SChandler Carruth   EXPECT_EQ(17, W.back());
4475803272SChandler Carruth 
4575803272SChandler Carruth   EXPECT_TRUE(W.erase(17));
4675803272SChandler Carruth   EXPECT_FALSE(W.count(17));
4775803272SChandler Carruth   EXPECT_EQ(2u, W.size());
4875803272SChandler Carruth   EXPECT_EQ(42, W.back());
4975803272SChandler Carruth 
5075803272SChandler Carruth   W.clear();
5175803272SChandler Carruth   EXPECT_TRUE(W.empty());
5275803272SChandler Carruth   EXPECT_EQ(0u, W.size());
5375803272SChandler Carruth 
5475803272SChandler Carruth   EXPECT_TRUE(W.insert(21));
5575803272SChandler Carruth   EXPECT_TRUE(W.insert(42));
5675803272SChandler Carruth   EXPECT_TRUE(W.insert(12));
5775803272SChandler Carruth   EXPECT_TRUE(W.insert(17));
5875803272SChandler Carruth   EXPECT_TRUE(W.count(12));
5975803272SChandler Carruth   EXPECT_TRUE(W.count(17));
6075803272SChandler Carruth   EXPECT_EQ(4u, W.size());
6175803272SChandler Carruth   EXPECT_EQ(17, W.back());
6275803272SChandler Carruth   EXPECT_TRUE(W.erase(12));
6375803272SChandler Carruth   EXPECT_FALSE(W.count(12));
6475803272SChandler Carruth   EXPECT_TRUE(W.count(17));
6575803272SChandler Carruth   EXPECT_EQ(3u, W.size());
6675803272SChandler Carruth   EXPECT_EQ(17, W.back());
6775803272SChandler Carruth 
6875803272SChandler Carruth   EXPECT_FALSE(W.insert(42));
6975803272SChandler Carruth   EXPECT_EQ(3u, W.size());
7075803272SChandler Carruth   EXPECT_EQ(42, W.pop_back_val());
7175803272SChandler Carruth   EXPECT_EQ(17, W.pop_back_val());
7275803272SChandler Carruth   EXPECT_EQ(21, W.pop_back_val());
7375803272SChandler Carruth   EXPECT_TRUE(W.empty());
7475803272SChandler Carruth }
7575803272SChandler Carruth 
TYPED_TEST(PriorityWorklistTest,InsertSequence)76ac458ba9SChandler Carruth TYPED_TEST(PriorityWorklistTest, InsertSequence) {
77ac458ba9SChandler Carruth   TypeParam W;
78ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(2));
79ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(4));
80ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(7));
81ac458ba9SChandler Carruth   // Insert a sequence that has internal duplicates and a duplicate among
82ac458ba9SChandler Carruth   // existing entries.
83ac458ba9SChandler Carruth   W.insert(std::vector<int>({42, 13, 42, 7, 8}));
84ac458ba9SChandler Carruth   EXPECT_EQ(8, W.pop_back_val());
85ac458ba9SChandler Carruth   EXPECT_EQ(7, W.pop_back_val());
86ac458ba9SChandler Carruth   EXPECT_EQ(42, W.pop_back_val());
87ac458ba9SChandler Carruth   EXPECT_EQ(13, W.pop_back_val());
88ac458ba9SChandler Carruth   EXPECT_EQ(4, W.pop_back_val());
89ac458ba9SChandler Carruth   EXPECT_EQ(2, W.pop_back_val());
90ac458ba9SChandler Carruth   ASSERT_TRUE(W.empty());
91ac458ba9SChandler Carruth 
92ac458ba9SChandler Carruth   // Simpler tests with various other input types.
93ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(2));
94ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(7));
95ac458ba9SChandler Carruth   // Use a non-random-access container.
96ac458ba9SChandler Carruth   W.insert(std::list<int>({7, 5}));
97ac458ba9SChandler Carruth   EXPECT_EQ(5, W.pop_back_val());
98ac458ba9SChandler Carruth   EXPECT_EQ(7, W.pop_back_val());
99ac458ba9SChandler Carruth   EXPECT_EQ(2, W.pop_back_val());
100ac458ba9SChandler Carruth   ASSERT_TRUE(W.empty());
101ac458ba9SChandler Carruth 
102ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(2));
103ac458ba9SChandler Carruth   ASSERT_TRUE(W.insert(7));
104ac458ba9SChandler Carruth   // Use a raw array.
105ac458ba9SChandler Carruth   int A[] = {7, 5};
106ac458ba9SChandler Carruth   W.insert(A);
107ac458ba9SChandler Carruth   EXPECT_EQ(5, W.pop_back_val());
108ac458ba9SChandler Carruth   EXPECT_EQ(7, W.pop_back_val());
109ac458ba9SChandler Carruth   EXPECT_EQ(2, W.pop_back_val());
110ac458ba9SChandler Carruth   ASSERT_TRUE(W.empty());
1112eb06503SChandler Carruth 
1122eb06503SChandler Carruth   ASSERT_TRUE(W.insert(2));
1132eb06503SChandler Carruth   ASSERT_TRUE(W.insert(7));
1142eb06503SChandler Carruth   // Inserting an empty sequence does nothing.
1152eb06503SChandler Carruth   W.insert(std::vector<int>());
1162eb06503SChandler Carruth   EXPECT_EQ(7, W.pop_back_val());
1172eb06503SChandler Carruth   EXPECT_EQ(2, W.pop_back_val());
1182eb06503SChandler Carruth   ASSERT_TRUE(W.empty());
119ac458ba9SChandler Carruth }
120ac458ba9SChandler Carruth 
TYPED_TEST(PriorityWorklistTest,EraseIf)12175803272SChandler Carruth TYPED_TEST(PriorityWorklistTest, EraseIf) {
12275803272SChandler Carruth   TypeParam W;
12375803272SChandler Carruth   W.insert(23);
12475803272SChandler Carruth   W.insert(10);
12575803272SChandler Carruth   W.insert(47);
12675803272SChandler Carruth   W.insert(42);
12775803272SChandler Carruth   W.insert(23);
12875803272SChandler Carruth   W.insert(13);
12975803272SChandler Carruth   W.insert(26);
13075803272SChandler Carruth   W.insert(42);
13175803272SChandler Carruth   EXPECT_EQ(6u, W.size());
13275803272SChandler Carruth 
13375803272SChandler Carruth   EXPECT_FALSE(W.erase_if([](int i) { return i > 100; }));
13475803272SChandler Carruth   EXPECT_EQ(6u, W.size());
13575803272SChandler Carruth   EXPECT_EQ(42, W.back());
13675803272SChandler Carruth 
13775803272SChandler Carruth   EXPECT_TRUE(W.erase_if([](int i) {
13875803272SChandler Carruth     assert(i != 0 && "Saw a null value!");
13975803272SChandler Carruth     return (i & 1) == 0;
14075803272SChandler Carruth   }));
14175803272SChandler Carruth   EXPECT_EQ(3u, W.size());
14275803272SChandler Carruth   EXPECT_FALSE(W.count(42));
14375803272SChandler Carruth   EXPECT_FALSE(W.count(26));
14475803272SChandler Carruth   EXPECT_FALSE(W.count(10));
14575803272SChandler Carruth   EXPECT_FALSE(W.insert(47));
14675803272SChandler Carruth   EXPECT_FALSE(W.insert(23));
14775803272SChandler Carruth   EXPECT_EQ(23, W.pop_back_val());
14875803272SChandler Carruth   EXPECT_EQ(47, W.pop_back_val());
14975803272SChandler Carruth   EXPECT_EQ(13, W.pop_back_val());
15075803272SChandler Carruth }
15175803272SChandler Carruth 
15275803272SChandler Carruth }
153