1 //===- llvm/unittest/ADT/PriorityWorklist.cpp -----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // PriorityWorklist unit tests.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ADT/PriorityWorklist.h"
15 #include "gtest/gtest.h"
23 template <typename T
> class PriorityWorklistTest
: public ::testing::Test
{};
24 typedef ::testing::Types
<PriorityWorklist
<int>, SmallPriorityWorklist
<int, 2>>
26 TYPED_TEST_CASE(PriorityWorklistTest
, TestTypes
);
28 TYPED_TEST(PriorityWorklistTest
, Basic
) {
30 EXPECT_TRUE(W
.empty());
31 EXPECT_EQ(0u, W
.size());
32 EXPECT_FALSE(W
.count(42));
34 EXPECT_TRUE(W
.insert(21));
35 EXPECT_TRUE(W
.insert(42));
36 EXPECT_TRUE(W
.insert(17));
38 EXPECT_FALSE(W
.empty());
39 EXPECT_EQ(3u, W
.size());
40 EXPECT_TRUE(W
.count(42));
42 EXPECT_FALSE(W
.erase(75));
43 EXPECT_EQ(3u, W
.size());
44 EXPECT_EQ(17, W
.back());
46 EXPECT_TRUE(W
.erase(17));
47 EXPECT_FALSE(W
.count(17));
48 EXPECT_EQ(2u, W
.size());
49 EXPECT_EQ(42, W
.back());
52 EXPECT_TRUE(W
.empty());
53 EXPECT_EQ(0u, W
.size());
55 EXPECT_TRUE(W
.insert(21));
56 EXPECT_TRUE(W
.insert(42));
57 EXPECT_TRUE(W
.insert(12));
58 EXPECT_TRUE(W
.insert(17));
59 EXPECT_TRUE(W
.count(12));
60 EXPECT_TRUE(W
.count(17));
61 EXPECT_EQ(4u, W
.size());
62 EXPECT_EQ(17, W
.back());
63 EXPECT_TRUE(W
.erase(12));
64 EXPECT_FALSE(W
.count(12));
65 EXPECT_TRUE(W
.count(17));
66 EXPECT_EQ(3u, W
.size());
67 EXPECT_EQ(17, W
.back());
69 EXPECT_FALSE(W
.insert(42));
70 EXPECT_EQ(3u, W
.size());
71 EXPECT_EQ(42, W
.pop_back_val());
72 EXPECT_EQ(17, W
.pop_back_val());
73 EXPECT_EQ(21, W
.pop_back_val());
74 EXPECT_TRUE(W
.empty());
77 TYPED_TEST(PriorityWorklistTest
, InsertSequence
) {
79 ASSERT_TRUE(W
.insert(2));
80 ASSERT_TRUE(W
.insert(4));
81 ASSERT_TRUE(W
.insert(7));
82 // Insert a sequence that has internal duplicates and a duplicate among
84 W
.insert(std::vector
<int>({42, 13, 42, 7, 8}));
85 EXPECT_EQ(8, W
.pop_back_val());
86 EXPECT_EQ(7, W
.pop_back_val());
87 EXPECT_EQ(42, W
.pop_back_val());
88 EXPECT_EQ(13, W
.pop_back_val());
89 EXPECT_EQ(4, W
.pop_back_val());
90 EXPECT_EQ(2, W
.pop_back_val());
91 ASSERT_TRUE(W
.empty());
93 // Simpler tests with various other input types.
94 ASSERT_TRUE(W
.insert(2));
95 ASSERT_TRUE(W
.insert(7));
96 // Use a non-random-access container.
97 W
.insert(std::list
<int>({7, 5}));
98 EXPECT_EQ(5, W
.pop_back_val());
99 EXPECT_EQ(7, W
.pop_back_val());
100 EXPECT_EQ(2, W
.pop_back_val());
101 ASSERT_TRUE(W
.empty());
103 ASSERT_TRUE(W
.insert(2));
104 ASSERT_TRUE(W
.insert(7));
108 EXPECT_EQ(5, W
.pop_back_val());
109 EXPECT_EQ(7, W
.pop_back_val());
110 EXPECT_EQ(2, W
.pop_back_val());
111 ASSERT_TRUE(W
.empty());
113 ASSERT_TRUE(W
.insert(2));
114 ASSERT_TRUE(W
.insert(7));
115 // Inserting an empty sequence does nothing.
116 W
.insert(std::vector
<int>());
117 EXPECT_EQ(7, W
.pop_back_val());
118 EXPECT_EQ(2, W
.pop_back_val());
119 ASSERT_TRUE(W
.empty());
122 TYPED_TEST(PriorityWorklistTest
, EraseIf
) {
132 EXPECT_EQ(6u, W
.size());
134 EXPECT_FALSE(W
.erase_if([](int i
) { return i
> 100; }));
135 EXPECT_EQ(6u, W
.size());
136 EXPECT_EQ(42, W
.back());
138 EXPECT_TRUE(W
.erase_if([](int i
) {
139 assert(i
!= 0 && "Saw a null value!");
142 EXPECT_EQ(3u, W
.size());
143 EXPECT_FALSE(W
.count(42));
144 EXPECT_FALSE(W
.count(26));
145 EXPECT_FALSE(W
.count(10));
146 EXPECT_FALSE(W
.insert(47));
147 EXPECT_FALSE(W
.insert(23));
148 EXPECT_EQ(23, W
.pop_back_val());
149 EXPECT_EQ(47, W
.pop_back_val());
150 EXPECT_EQ(13, W
.pop_back_val());