Blender V4.3
BLI_inplace_priority_queue_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
8#include "BLI_rand.hh"
9
10namespace blender::tests {
11
12TEST(inplace_priority_queue, BuildSmall)
13{
14 Array<int> values = {1, 5, 2, 8, 5, 6, 5, 4, 3, 6, 7, 3};
15 InplacePriorityQueue<int> priority_queue{values};
16
17 EXPECT_EQ(priority_queue.peek(), 8);
18 EXPECT_EQ(priority_queue.pop(), 8);
19 EXPECT_EQ(priority_queue.peek(), 7);
20 EXPECT_EQ(priority_queue.pop(), 7);
21 EXPECT_EQ(priority_queue.pop(), 6);
22 EXPECT_EQ(priority_queue.pop(), 6);
23 EXPECT_EQ(priority_queue.pop(), 5);
24}
25
26TEST(inplace_priority_queue, DecreasePriority)
27{
28 Array<int> values = {5, 2, 7, 4};
29 InplacePriorityQueue<int> priority_queue(values);
30
31 EXPECT_EQ(priority_queue.peek(), 7);
32 values[2] = 0;
33 EXPECT_EQ(priority_queue.peek(), 0);
34 priority_queue.priority_decreased(2);
35 EXPECT_EQ(priority_queue.peek(), 5);
36}
37
38TEST(inplace_priority_queue, IncreasePriority)
39{
40 Array<int> values = {5, 2, 7, 4};
41 InplacePriorityQueue<int> priority_queue(values);
42
43 EXPECT_EQ(priority_queue.peek(), 7);
44 values[1] = 10;
45 EXPECT_EQ(priority_queue.peek(), 7);
46 priority_queue.priority_increased(1);
47 EXPECT_EQ(priority_queue.peek(), 10);
48}
49
50TEST(inplace_priority_queue, PopAll)
51{
53 Vector<int> values;
54 const int amount = 1000;
55 for (int i = 0; i < amount; i++) {
56 values.append(rng.get_int32() % amount);
57 }
58
59 InplacePriorityQueue<int> priority_queue(values);
60
61 int last_value = amount;
62 while (!priority_queue.is_empty()) {
63 const int value = priority_queue.pop();
64 EXPECT_LE(value, last_value);
65 last_value = value;
66 }
67}
68
69TEST(inplace_priority_queue, ManyPriorityChanges)
70{
72 Vector<int> values;
73 const int amount = 1000;
74 for (int i = 0; i < amount; i++) {
75 values.append(rng.get_int32() % amount);
76 }
77
78 InplacePriorityQueue<int> priority_queue(values);
79
80 for (int i = 0; i < amount; i++) {
81 const int index = rng.get_int32() % amount;
82 const int new_priority = rng.get_int32() % amount;
83 values[index] = new_priority;
84 priority_queue.priority_changed(index);
85 }
86
87 int last_value = amount;
88 while (!priority_queue.is_empty()) {
89 const int value = priority_queue.pop();
90 EXPECT_LE(value, last_value);
91 last_value = value;
92 }
93}
94
95TEST(inplace_priority_queue, IndicesAccess)
96{
97 Array<int> values = {4, 6, 2, 4, 8, 1, 10, 2, 5};
98 InplacePriorityQueue<int> priority_queue(values);
99
100 EXPECT_EQ(priority_queue.active_indices().size(), 9);
101 EXPECT_EQ(priority_queue.inactive_indices().size(), 0);
102 EXPECT_EQ(priority_queue.all_indices().size(), 9);
103 EXPECT_EQ(priority_queue.pop(), 10);
104 EXPECT_EQ(priority_queue.active_indices().size(), 8);
105 EXPECT_EQ(priority_queue.inactive_indices().size(), 1);
106 EXPECT_EQ(values[priority_queue.inactive_indices()[0]], 10);
107 EXPECT_EQ(priority_queue.all_indices().size(), 9);
108 EXPECT_EQ(priority_queue.pop(), 8);
109 EXPECT_EQ(priority_queue.inactive_indices().size(), 2);
110 EXPECT_EQ(values[priority_queue.inactive_indices()[0]], 8);
111 EXPECT_EQ(values[priority_queue.inactive_indices()[1]], 10);
112 EXPECT_EQ(priority_queue.all_indices().size(), 9);
113}
114
115} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void priority_decreased(const int64_t index)
void priority_increased(const int64_t index)
void append(const T &value)
TEST(any, DefaultConstructor)