5 song_free(G_GNUC_UNUSED
struct song
*song
)
11 dump_order(const struct queue
*queue
)
13 g_printerr("queue length=%u, order:\n", queue_length(queue
));
14 for (unsigned i
= 0; i
< queue_length(queue
); ++i
)
15 g_printerr(" [%u] -> %u (prio=%u)\n", i
, queue
->order
[i
],
16 queue
->items
[queue
->order
[i
]].priority
);
20 check_descending_priority(G_GNUC_UNUSED
const struct queue
*queue
,
23 assert(start_order
< queue_length(queue
));
25 uint8_t last_priority
= 0xff;
26 for (unsigned order
= start_order
; order
< queue_length(queue
); ++order
) {
27 unsigned position
= queue_order_to_position(queue
, order
);
28 uint8_t priority
= queue
->items
[position
].priority
;
29 assert(priority
<= last_priority
);
31 last_priority
= priority
;
36 main(G_GNUC_UNUSED
int argc
, G_GNUC_UNUSED
char **argv
)
38 struct song songs
[16];
41 queue_init(&queue
, 32);
43 for (unsigned i
= 0; i
< G_N_ELEMENTS(songs
); ++i
)
44 queue_append(&queue
, &songs
[i
]);
46 assert(queue_length(&queue
) == G_N_ELEMENTS(songs
));
48 /* priority=10 for 4 items */
50 queue_set_priority_range(&queue
, 4, 8, 10, -1);
53 queue_shuffle_order(&queue
);
54 check_descending_priority(&queue
, 0);
56 for (unsigned i
= 0; i
< 4; ++i
) {
57 assert(queue_position_to_order(&queue
, i
) >= 4);
60 for (unsigned i
= 4; i
< 8; ++i
) {
61 assert(queue_position_to_order(&queue
, i
) < 4);
64 for (unsigned i
= 8; i
< G_N_ELEMENTS(songs
); ++i
) {
65 assert(queue_position_to_order(&queue
, i
) >= 4);
68 /* priority=50 one more item */
70 queue_set_priority_range(&queue
, 15, 16, 50, -1);
71 check_descending_priority(&queue
, 0);
73 assert(queue_position_to_order(&queue
, 15) == 0);
75 for (unsigned i
= 0; i
< 4; ++i
) {
76 assert(queue_position_to_order(&queue
, i
) >= 4);
79 for (unsigned i
= 4; i
< 8; ++i
) {
80 assert(queue_position_to_order(&queue
, i
) >= 1 &&
81 queue_position_to_order(&queue
, i
) < 5);
84 for (unsigned i
= 8; i
< 15; ++i
) {
85 assert(queue_position_to_order(&queue
, i
) >= 5);
88 /* priority=20 for one of the 4 priority=10 items */
90 queue_set_priority_range(&queue
, 3, 4, 20, -1);
91 check_descending_priority(&queue
, 0);
93 assert(queue_position_to_order(&queue
, 3) == 1);
94 assert(queue_position_to_order(&queue
, 15) == 0);
96 for (unsigned i
= 0; i
< 3; ++i
) {
97 assert(queue_position_to_order(&queue
, i
) >= 5);
100 for (unsigned i
= 4; i
< 8; ++i
) {
101 assert(queue_position_to_order(&queue
, i
) >= 2 &&
102 queue_position_to_order(&queue
, i
) < 6);
105 for (unsigned i
= 8; i
< 15; ++i
) {
106 assert(queue_position_to_order(&queue
, i
) >= 6);
109 /* priority=20 for another one of the 4 priority=10 items;
110 pass "after_order" (with priority=10) and see if it's moved
113 unsigned current_order
= 4;
114 unsigned current_position
=
115 queue_order_to_position(&queue
, current_order
);
117 unsigned a_order
= 3;
118 unsigned a_position
= queue_order_to_position(&queue
, a_order
);
119 assert(queue
.items
[a_position
].priority
== 10);
120 queue_set_priority(&queue
, a_position
, 20, current_order
);
122 current_order
= queue_position_to_order(&queue
, current_position
);
123 assert(current_order
== 3);
125 a_order
= queue_position_to_order(&queue
, a_position
);
126 assert(a_order
== 4);
128 check_descending_priority(&queue
, current_order
+ 1);
130 /* priority=70 for one of the last items; must be inserted
131 right after the current song, before the priority=20 one we
134 unsigned b_order
= 10;
135 unsigned b_position
= queue_order_to_position(&queue
, b_order
);
136 assert(queue
.items
[b_position
].priority
== 0);
137 queue_set_priority(&queue
, b_position
, 70, current_order
);
139 current_order
= queue_position_to_order(&queue
, current_position
);
140 assert(current_order
== 3);
142 b_order
= queue_position_to_order(&queue
, b_position
);
143 assert(b_order
== 4);
145 check_descending_priority(&queue
, current_order
+ 1);
147 /* priority=60 for the old prio50 item; must not be moved,
148 because it's before the current song, and it's status
149 hasn't changed (it was already higher before) */
151 unsigned c_order
= 0;
152 unsigned c_position
= queue_order_to_position(&queue
, c_order
);
153 assert(queue
.items
[c_position
].priority
== 50);
154 queue_set_priority(&queue
, c_position
, 60, current_order
);
156 current_order
= queue_position_to_order(&queue
, current_position
);
157 assert(current_order
== 3);
159 c_order
= queue_position_to_order(&queue
, c_position
);
160 assert(c_order
== 0);
162 /* move the prio=20 item back */
164 a_order
= queue_position_to_order(&queue
, a_position
);
165 assert(a_order
== 5);
166 assert(queue
.items
[a_position
].priority
== 20);
167 queue_set_priority(&queue
, a_position
, 5, current_order
);
170 current_order
= queue_position_to_order(&queue
, current_position
);
171 assert(current_order
== 3);
173 a_order
= queue_position_to_order(&queue
, a_position
);
174 assert(a_order
== 6);