#include "chre/util/priority_queue.h" #include "gtest/gtest.h" using chre::PriorityQueue; namespace { class FakeElement { public: FakeElement(){}; FakeElement(int index, int value) { mValue = value; mIndex = index; }; ~FakeElement(){}; 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 FakeElement &left, const FakeElement &right) { return left.getValue() > right.getValue(); }; class CompareClass { public: bool operator()(const FakeElement &left, const FakeElement &right) const { return left.getValue() > right.getValue(); } }; } // namespace TEST(PriorityQueueTest, IsEmptyInitially) { PriorityQueue q; EXPECT_TRUE(q.empty()); EXPECT_EQ(0, q.size()); EXPECT_EQ(0, q.capacity()); } TEST(PriorityQueueTest, SimplePushPop) { PriorityQueue 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 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 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 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 q; q.pop(); EXPECT_EQ(0, q.size()); } TEST(PriorityQueueDeathTest, TopWhenEmpty) { PriorityQueue q; EXPECT_DEATH(q.top(), ""); } TEST(PriorityQueueTest, TestTop) { PriorityQueue 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 q; EXPECT_DEATH(q[0], ""); } TEST(PriorityQueueTest, Subscript) { PriorityQueue 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 q; EXPECT_DEATH(q.remove(0), ""); EXPECT_EQ(0, q.size()); } TEST(PriorityQueueTest, RemoveWithIndex) { PriorityQueue 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> 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 FakeElement &left, const FakeElement &right) { return left.getValue() > right.getValue(); }; PriorityQueue 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> 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 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 q; q.push(0); q.push(1); q.push(2); PriorityQueue::iterator it = q.begin(); EXPECT_EQ(q[0], *it); it += q.size(); EXPECT_TRUE(it == q.end()); } TEST(PriorityQueuetest, ConstIterator) { PriorityQueue q; q.push(0); q.push(1); q.push(2); PriorityQueue::const_iterator cit = q.cbegin(); EXPECT_EQ(q[0], *cit); cit += q.size(); EXPECT_TRUE(cit == q.cend()); }