blob: f0f65a6014974d9598e9b3ffaaf113ad512bd731 [file] [log] [blame]
[email protected]ba79eca2012-01-06 21:03:561// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/base/priority_queue.h"
6#include "testing/gtest/include/gtest/gtest.h"
7
8namespace net {
9
10namespace {
11
12typedef PriorityQueue<int>::Priority Priority;
13const Priority kPriorities[] = { 2, 1, 2, 0, 4, 3, 1, 4, 0 };
14const Priority kNumPriorities = 5; // max(kPriorities) + 1
15const size_t kNumElements = arraysize(kPriorities);
16const int kFirstMinOrder[kNumElements] = { 3, 8, 1, 6, 0, 2, 5, 4, 7 };
17const int kLastMaxOrder[kNumElements] = { 7, 4, 5, 2, 0, 6, 1, 8, 3 };
18const int kFirstMaxOrder[kNumElements] = { 4, 7, 5, 0, 2, 1, 6, 3, 8 };
19const int kLastMinOrder[kNumElements] = { 8, 3, 6, 1, 2, 0, 5, 7, 4 };
20
21void CheckEmpty(PriorityQueue<int>* queue) {
22 EXPECT_EQ(0u, queue->size());
23 EXPECT_TRUE(queue->FirstMin().is_null());
24 EXPECT_TRUE(queue->LastMin().is_null());
25 EXPECT_TRUE(queue->FirstMax().is_null());
26 EXPECT_TRUE(queue->LastMax().is_null());
27}
28
29TEST(PriorityQueueTest, AddAndClear) {
30 PriorityQueue<int> queue(kNumPriorities);
31 PriorityQueue<int>::Pointer pointers[kNumElements];
32
33 CheckEmpty(&queue);
34 for (size_t i = 0; i < kNumElements; ++i) {
35 EXPECT_EQ(i, queue.size());
36 pointers[i] = queue.Insert(static_cast<int>(i), kPriorities[i]);
37 }
38 EXPECT_EQ(kNumElements, queue.size());
39
40 for (size_t i = 0; i < kNumElements; ++i) {
41 EXPECT_EQ(kPriorities[i], pointers[i].priority());
42 EXPECT_EQ(static_cast<int>(i), pointers[i].value());
43 }
44
45 queue.Clear();
46 CheckEmpty(&queue);
47}
48
49TEST(PriorityQueueTest, FirstMinOrder) {
50 PriorityQueue<int> queue(kNumPriorities);
51 PriorityQueue<int>::Pointer pointers[kNumElements];
52
53 for (size_t i = 0; i < kNumElements; ++i) {
54 pointers[i] = queue.Insert(static_cast<int>(i), kPriorities[i]);
55 }
56
57 for (size_t i = 0; i < kNumElements; ++i) {
58 EXPECT_EQ(kNumElements - i, queue.size());
59 // Also check Equals.
60 EXPECT_TRUE(queue.FirstMin().Equals(pointers[kFirstMinOrder[i]]));
61 EXPECT_EQ(kFirstMinOrder[i], queue.FirstMin().value());
62 queue.Erase(queue.FirstMin());
63 }
64 CheckEmpty(&queue);
65}
66
67TEST(PriorityQueueTest, LastMinOrder) {
68 PriorityQueue<int> queue(kNumPriorities);
69
70 for (size_t i = 0; i < kNumElements; ++i) {
71 queue.Insert(static_cast<int>(i), kPriorities[i]);
72 }
73
74 for (size_t i = 0; i < kNumElements; ++i) {
75 EXPECT_EQ(kLastMinOrder[i], queue.LastMin().value());
76 queue.Erase(queue.LastMin());
77 }
78 CheckEmpty(&queue);
79}
80
81TEST(PriorityQueueTest, FirstMaxOrder) {
82 PriorityQueue<int> queue(kNumPriorities);
83
84 for (size_t i = 0; i < kNumElements; ++i) {
85 queue.Insert(static_cast<int>(i), kPriorities[i]);
86 }
87
88 for (size_t i = 0; i < kNumElements; ++i) {
89 EXPECT_EQ(kFirstMaxOrder[i], queue.FirstMax().value());
90 queue.Erase(queue.FirstMax());
91 }
92 CheckEmpty(&queue);
93}
94
95TEST(PriorityQueueTest, LastMaxOrder) {
96 PriorityQueue<int> queue(kNumPriorities);
97
98 for (size_t i = 0; i < kNumElements; ++i) {
99 queue.Insert(static_cast<int>(i), kPriorities[i]);
100 }
101
102 for (size_t i = 0; i < kNumElements; ++i) {
103 EXPECT_EQ(kLastMaxOrder[i], queue.LastMax().value());
104 queue.Erase(queue.LastMax());
105 }
106 CheckEmpty(&queue);
107}
108
109TEST(PriorityQueueTest, EraseFromMiddle) {
110 PriorityQueue<int> queue(kNumPriorities);
111 PriorityQueue<int>::Pointer pointers[kNumElements];
112
113 for (size_t i = 0; i < kNumElements; ++i) {
114 pointers[i] = queue.Insert(static_cast<int>(i), kPriorities[i]);
115 }
116
117 queue.Erase(pointers[2]);
118 queue.Erase(pointers[3]);
119
120 int expected_order[] = { 8, 1, 6, 0, 5, 4, 7 };
121
122 for (size_t i = 0; i < arraysize(expected_order); ++i) {
123 EXPECT_EQ(expected_order[i], queue.FirstMin().value());
124 queue.Erase(queue.FirstMin());
125 }
126 CheckEmpty(&queue);
127}
128
129} // namespace
130
131} // namespace net
132