test_queue_priority.cxx 4.1 KB
Newer Older
Max Kellermann's avatar
Max Kellermann committed
1
#include "queue/Queue.hxx"
2
#include "song/DetachedSong.hxx"
3

4
#include <gtest/gtest.h>
5

6 7
#include <iterator>

8
Tag::Tag(const Tag &) noexcept {}
9
void Tag::Clear() noexcept {}
10 11

static void
12
check_descending_priority(const Queue *queue,
13
			  unsigned start_order)
14
{
15
	assert(start_order < queue->GetLength());
16 17

	uint8_t last_priority = 0xff;
18 19
	for (unsigned order = start_order; order < queue->GetLength(); ++order) {
		unsigned position = queue->OrderToPosition(order);
20 21
		uint8_t priority = queue->items[position].priority;
		assert(priority <= last_priority);
22
		(void)last_priority;
23 24 25 26
		last_priority = priority;
	}
}

27
TEST(QueuePriority, Priority)
28
{
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
	DetachedSong songs[16] = {
		DetachedSong("0.ogg"),
		DetachedSong("1.ogg"),
		DetachedSong("2.ogg"),
		DetachedSong("3.ogg"),
		DetachedSong("4.ogg"),
		DetachedSong("5.ogg"),
		DetachedSong("6.ogg"),
		DetachedSong("7.ogg"),
		DetachedSong("8.ogg"),
		DetachedSong("9.ogg"),
		DetachedSong("a.ogg"),
		DetachedSong("b.ogg"),
		DetachedSong("c.ogg"),
		DetachedSong("d.ogg"),
		DetachedSong("e.ogg"),
		DetachedSong("f.ogg"),
	};
47

48
	Queue queue(32);
49

50
	for (unsigned i = 0; i < std::size(songs); ++i)
51
		queue.Append(DetachedSong(songs[i]), 0);
52

53
	EXPECT_EQ(unsigned(std::size(songs)), queue.GetLength());
54 55 56

	/* priority=10 for 4 items */

57
	queue.SetPriorityRange(4, 8, 10, -1);
58 59

	queue.random = true;
60
	queue.ShuffleOrder();
61 62 63
	check_descending_priority(&queue, 0);

	for (unsigned i = 0; i < 4; ++i) {
64
		assert(queue.PositionToOrder(i) >= 4);
65 66 67
	}

	for (unsigned i = 4; i < 8; ++i) {
68
		assert(queue.PositionToOrder(i) < 4);
69 70
	}

71
	for (unsigned i = 8; i < std::size(songs); ++i) {
72
		assert(queue.PositionToOrder(i) >= 4);
73 74 75 76
	}

	/* priority=50 one more item */

77
	queue.SetPriorityRange(15, 16, 50, -1);
78 79
	check_descending_priority(&queue, 0);

80
	EXPECT_EQ(0u, queue.PositionToOrder(15));
81 82

	for (unsigned i = 0; i < 4; ++i) {
83
		assert(queue.PositionToOrder(i) >= 4);
84 85 86
	}

	for (unsigned i = 4; i < 8; ++i) {
87 88
		assert(queue.PositionToOrder(i) >= 1 &&
		       queue.PositionToOrder(i) < 5);
89 90 91
	}

	for (unsigned i = 8; i < 15; ++i) {
92
		assert(queue.PositionToOrder(i) >= 5);
93 94 95 96
	}

	/* priority=20 for one of the 4 priority=10 items */

97
	queue.SetPriorityRange(3, 4, 20, -1);
98 99
	check_descending_priority(&queue, 0);

100 101
	EXPECT_EQ(1u, queue.PositionToOrder(3));
	EXPECT_EQ(0u, queue.PositionToOrder(15));
102 103

	for (unsigned i = 0; i < 3; ++i) {
104
		assert(queue.PositionToOrder(i) >= 5);
105 106 107
	}

	for (unsigned i = 4; i < 8; ++i) {
108 109
		assert(queue.PositionToOrder(i) >= 2 &&
		       queue.PositionToOrder(i) < 6);
110 111 112
	}

	for (unsigned i = 8; i < 15; ++i) {
113
		assert(queue.PositionToOrder(i) >= 6);
114 115 116 117 118 119 120 121
	}

	/* priority=20 for another one of the 4 priority=10 items;
	   pass "after_order" (with priority=10) and see if it's moved
	   after that one */

	unsigned current_order = 4;
	unsigned current_position =
122
		queue.OrderToPosition(current_order);
123 124

	unsigned a_order = 3;
125
	unsigned a_position = queue.OrderToPosition(a_order);
126
	EXPECT_EQ(10u, unsigned(queue.items[a_position].priority));
127
	queue.SetPriority(a_position, 20, current_order);
128

129
	current_order = queue.PositionToOrder(current_position);
130
	EXPECT_EQ(3u, current_order);
131

132
	a_order = queue.PositionToOrder(a_position);
133
	EXPECT_EQ(4u, a_order);
134 135 136 137 138 139 140 141

	check_descending_priority(&queue, current_order + 1);

	/* priority=70 for one of the last items; must be inserted
	   right after the current song, before the priority=20 one we
	   just created */

	unsigned b_order = 10;
142
	unsigned b_position = queue.OrderToPosition(b_order);
143
	EXPECT_EQ(0u, unsigned(queue.items[b_position].priority));
144
	queue.SetPriority(b_position, 70, current_order);
145

146
	current_order = queue.PositionToOrder(current_position);
147
	EXPECT_EQ(3u, current_order);
148

149
	b_order = queue.PositionToOrder(b_position);
150
	EXPECT_EQ(4u, b_order);
151 152 153 154 155

	check_descending_priority(&queue, current_order + 1);

	/* move the prio=20 item back */

156
	a_order = queue.PositionToOrder(a_position);
157 158
	EXPECT_EQ(5u, a_order);
	EXPECT_EQ(20u, unsigned(queue.items[a_position].priority));
159
	queue.SetPriority(a_position, 5, current_order);
160

161
	current_order = queue.PositionToOrder(current_position);
162
	EXPECT_EQ(3u, current_order);
163

164
	a_order = queue.PositionToOrder(a_position);
165
	EXPECT_EQ(6u, a_order);
166
}