You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.0 KiB
258 lines
5.0 KiB
#include "gtest/gtest.h" |
|
#include "chre/util/priority_queue.h" |
|
|
|
using chre::PriorityQueue; |
|
|
|
namespace { |
|
class DummyElement { |
|
public: |
|
DummyElement() {}; |
|
DummyElement(int index, int value) { |
|
mValue = value; |
|
mIndex = index; |
|
}; |
|
~DummyElement() {}; |
|
void setValue(int value) { |
|
mValue = value; |
|
} |
|
int getValue() const { |
|
return mValue; |
|
} |
|
int getIndex() const { |
|
return mIndex; |
|
} |
|
|
|
private: |
|
int mIndex = -1; |
|
int mValue = -1; |
|
}; |
|
|
|
bool compareFunction(const DummyElement& left, const DummyElement& right) { |
|
return left.getValue() > right.getValue(); |
|
}; |
|
|
|
class CompareClass { |
|
public: |
|
bool operator() (const DummyElement& left, const DummyElement& right) const { |
|
return left.getValue() > right.getValue(); |
|
} |
|
}; |
|
} // namespace |
|
|
|
TEST(PriorityQueueTest, IsEmptyInitially) { |
|
PriorityQueue<int> q; |
|
EXPECT_TRUE(q.empty()); |
|
EXPECT_EQ(0, q.size()); |
|
EXPECT_EQ(0, q.capacity()); |
|
} |
|
|
|
TEST(PriorityQueueTest, SimplePushPop) { |
|
PriorityQueue<int> q; |
|
|
|
EXPECT_TRUE(q.push(0)); |
|
EXPECT_TRUE(q.push(2)); |
|
EXPECT_TRUE(q.push(3)); |
|
EXPECT_TRUE(q.push(1)); |
|
q.pop(); |
|
EXPECT_TRUE(q.push(4)); |
|
} |
|
|
|
TEST(PriorityQueueTest, TestSize) { |
|
PriorityQueue<int> q; |
|
|
|
q.push(1); |
|
EXPECT_EQ(1, q.size()); |
|
q.push(2); |
|
EXPECT_EQ(2, q.size()); |
|
q.pop(); |
|
EXPECT_EQ(1, q.size()); |
|
} |
|
|
|
TEST(PriorityQueueTest, TestEmpty) { |
|
PriorityQueue<int> q; |
|
|
|
q.push(1); |
|
EXPECT_FALSE(q.empty()); |
|
q.push(2); |
|
EXPECT_FALSE(q.empty()); |
|
q.pop(); |
|
EXPECT_FALSE(q.empty()); |
|
q.pop(); |
|
EXPECT_TRUE(q.empty()); |
|
} |
|
|
|
TEST(PriorityQueueTest, TestCapacity) { |
|
PriorityQueue<int> q; |
|
|
|
q.push(1); |
|
EXPECT_EQ(1, q.capacity()); |
|
q.push(2); |
|
EXPECT_EQ(2, q.capacity()); |
|
q.push(3); |
|
EXPECT_EQ(4, q.capacity()); |
|
} |
|
|
|
TEST(PriorityQueueTest, PopWhenEmpty) { |
|
PriorityQueue<int> q; |
|
q.pop(); |
|
EXPECT_EQ(0, q.size()); |
|
} |
|
|
|
TEST(PriorityQueueDeathTest, TopWhenEmpty) { |
|
PriorityQueue<int> q; |
|
EXPECT_DEATH(q.top(), ""); |
|
} |
|
|
|
TEST(PriorityQueueTest, TestTop) { |
|
PriorityQueue<int> q; |
|
q.push(1); |
|
EXPECT_EQ(1, q.top()); |
|
q.push(2); |
|
q.push(3); |
|
EXPECT_EQ(3, q.top()); |
|
q.pop(); |
|
EXPECT_EQ(2, q.top()); |
|
q.pop(); |
|
EXPECT_EQ(1, q.top()); |
|
} |
|
|
|
TEST(PriorityQueueDeathTest, InvalidSubscript) { |
|
PriorityQueue<int> q; |
|
EXPECT_DEATH(q[0], ""); |
|
} |
|
|
|
TEST(PriorityQueueTest, Subscript) { |
|
PriorityQueue<int> q; |
|
q.push(1); |
|
q.push(2); |
|
EXPECT_EQ(2, q[0]); |
|
EXPECT_EQ(1, q[1]); |
|
|
|
q.pop(); |
|
EXPECT_EQ(1, q[0]); |
|
} |
|
|
|
TEST(PriorityQueueDeathTest, RemoveWithInvalidIndex) { |
|
PriorityQueue<int> q; |
|
EXPECT_DEATH(q.remove(0), ""); |
|
EXPECT_EQ(0, q.size()); |
|
} |
|
|
|
TEST(PriorityQueueTest, RemoveWithIndex) { |
|
PriorityQueue<int> q; |
|
q.push(1); |
|
q.push(2); |
|
q.remove(0); |
|
EXPECT_EQ(1, q.top()); |
|
EXPECT_EQ(1, q.size()); |
|
|
|
q.push(3); |
|
q.remove(1); |
|
EXPECT_EQ(3, q.top()); |
|
EXPECT_EQ(1, q.size()); |
|
} |
|
|
|
TEST(PriorityQueueTest, CompareGreater) { |
|
PriorityQueue<int, std::greater<int>> q; |
|
|
|
EXPECT_TRUE(q.push(0)); |
|
EXPECT_TRUE(q.push(2)); |
|
EXPECT_TRUE(q.push(3)); |
|
EXPECT_TRUE(q.push(1)); |
|
|
|
for (size_t i = 0; i < 4; i++) { |
|
EXPECT_EQ(i, q.top()); |
|
q.pop(); |
|
} |
|
} |
|
|
|
TEST(PriorityQueueTest, EmplaceCompareLambda) { |
|
auto cmp = [](const DummyElement& left, const DummyElement& right) { |
|
return left.getValue() > right.getValue(); |
|
}; |
|
PriorityQueue<DummyElement, decltype(cmp)> q(cmp); |
|
|
|
EXPECT_TRUE(q.emplace(0, 0)); |
|
EXPECT_TRUE(q.emplace(1, 2)); |
|
EXPECT_TRUE(q.emplace(2, 1)); |
|
EXPECT_EQ(3, q.size()); |
|
|
|
EXPECT_EQ(0, q.top().getValue()); |
|
EXPECT_EQ(0, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(1, q.top().getValue()); |
|
EXPECT_EQ(2, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(2, q.top().getValue()); |
|
EXPECT_EQ(1, q.top().getIndex()); |
|
} |
|
|
|
TEST(PriorityQueueTest, EmplaceCompareFunction) { |
|
PriorityQueue<DummyElement, |
|
std::function<bool(const DummyElement&, const DummyElement&)>> |
|
q(compareFunction); |
|
|
|
EXPECT_TRUE(q.emplace(0, 0)); |
|
EXPECT_TRUE(q.emplace(1, 2)); |
|
EXPECT_TRUE(q.emplace(2, 1)); |
|
EXPECT_EQ(3, q.size()); |
|
|
|
EXPECT_EQ(0, q.top().getValue()); |
|
EXPECT_EQ(0, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(1, q.top().getValue()); |
|
EXPECT_EQ(2, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(2, q.top().getValue()); |
|
EXPECT_EQ(1, q.top().getIndex()); |
|
} |
|
|
|
TEST(PriorityQueueTest, EmplaceCompareClass) { |
|
PriorityQueue<DummyElement, CompareClass> q; |
|
|
|
EXPECT_TRUE(q.emplace(0, 0)); |
|
EXPECT_TRUE(q.emplace(1, 2)); |
|
EXPECT_TRUE(q.emplace(2, 1)); |
|
EXPECT_EQ(3, q.size()); |
|
|
|
EXPECT_EQ(0, q.top().getValue()); |
|
EXPECT_EQ(0, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(1, q.top().getValue()); |
|
EXPECT_EQ(2, q.top().getIndex()); |
|
|
|
q.pop(); |
|
EXPECT_EQ(2, q.top().getValue()); |
|
EXPECT_EQ(1, q.top().getIndex()); |
|
} |
|
|
|
TEST(PriorityQueuetest, Iterator) { |
|
PriorityQueue<int> q; |
|
q.push(0); |
|
q.push(1); |
|
q.push(2); |
|
|
|
PriorityQueue<int>::iterator it = q.begin(); |
|
EXPECT_EQ(q[0], *it); |
|
|
|
it += q.size(); |
|
EXPECT_TRUE(it == q.end()); |
|
} |
|
|
|
TEST(PriorityQueuetest, ConstIterator) { |
|
PriorityQueue<int> q; |
|
q.push(0); |
|
q.push(1); |
|
q.push(2); |
|
|
|
PriorityQueue<int>::const_iterator cit = q.cbegin(); |
|
EXPECT_EQ(q[0], *cit); |
|
|
|
cit += q.size(); |
|
EXPECT_TRUE(cit == q.cend()); |
|
}
|
|
|