Blender
V4.3
source
blender
blenlib
tests
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
7
#include "
BLI_inplace_priority_queue.hh
"
8
#include "
BLI_rand.hh
"
9
10
namespace
blender::tests
{
11
12
TEST
(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
26
TEST
(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
38
TEST
(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
50
TEST
(inplace_priority_queue, PopAll)
51
{
52
RandomNumberGenerator
rng;
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
69
TEST
(inplace_priority_queue, ManyPriorityChanges)
70
{
71
RandomNumberGenerator
rng;
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
95
TEST
(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
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BLI_inplace_priority_queue.hh
BLI_rand.hh
blender::Array
Definition
BLI_array.hh:50
blender::InplacePriorityQueue
Definition
BLI_inplace_priority_queue.hh:29
blender::InplacePriorityQueue::is_empty
bool is_empty() const
Definition
BLI_inplace_priority_queue.hh:86
blender::InplacePriorityQueue::active_indices
Span< int64_t > active_indices() const
Definition
BLI_inplace_priority_queue.hh:187
blender::InplacePriorityQueue::priority_decreased
void priority_decreased(const int64_t index)
Definition
BLI_inplace_priority_queue.hh:139
blender::InplacePriorityQueue::all_indices
Span< int64_t > all_indices() const
Definition
BLI_inplace_priority_queue.hh:205
blender::InplacePriorityQueue::inactive_indices
Span< int64_t > inactive_indices() const
Definition
BLI_inplace_priority_queue.hh:197
blender::InplacePriorityQueue::priority_increased
void priority_increased(const int64_t index)
Definition
BLI_inplace_priority_queue.hh:153
blender::InplacePriorityQueue::peek
const T & peek() const
Definition
BLI_inplace_priority_queue.hh:96
blender::InplacePriorityQueue::pop
const T & pop()
Definition
BLI_inplace_priority_queue.hh:106
blender::InplacePriorityQueue::priority_changed
void priority_changed(const int64_t index)
Definition
BLI_inplace_priority_queue.hh:177
blender::RandomNumberGenerator
Definition
BLI_rand.hh:17
blender::RandomNumberGenerator::get_int32
int32_t get_int32()
Definition
BLI_rand.hh:53
blender::Vector
Definition
BLI_vector.hh:65
blender::Vector::append
void append(const T &value)
Definition
BLI_vector.hh:430
blender::tests
Definition
BLI_any_test.cc:10
blender::tests::TEST
TEST(any, DefaultConstructor)
Definition
BLI_any_test.cc:12
Generated on Thu Feb 6 2025 07:36:39 for Blender by
doxygen
1.11.0