queue: Test and clean up the delete track function

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2014-05-11 11:23:15 -04:00
parent 74bf30bec5
commit 5520472f6f
6 changed files with 102 additions and 27 deletions

View File

@ -34,6 +34,7 @@ protected:
unsigned int find_sorted_id(Track *);
unsigned int _add_at(Track *, unsigned int);
void _del_at(Track *, unsigned int);
void _add_sort(sort_t, bool);
public:
@ -50,8 +51,8 @@ public:
std::string get_length_str();
virtual unsigned int add(Track *);
void del(Track *);
void del(unsigned int);
void del_track(unsigned int);
void track_updated(unsigned int);
unsigned int size();

View File

@ -26,8 +26,14 @@ class RecentQueue : public Queue
{
public:
RecentQueue()
: Queue(Q_ENABLED | Q_REPEAT | Q_NO_SORT | Q_DISABLE_CHANGED_SIZE) {}
unsigned int add(Track *track) { return _add_at(track, 0); }
: Queue(Q_ENABLED | Q_REPEAT | Q_NO_SORT | Q_DISABLE_CHANGED_SIZE)
{}
unsigned int add(Track *track)
{
del(track);
return _add_at(track, 0);
}
};
static RecentQueue o_recently_played;
@ -207,7 +213,6 @@ void audio :: next()
cur_trackid = track->id;
save_state();
o_recently_played.del_track(track->id);
o_recently_played.add(track);
o_recently_played.set_cur(0);
}
@ -241,7 +246,6 @@ void audio :: load_trackid(unsigned int track_id)
cur_trackid = track_id;
save_state();
o_recently_played.del_track(track_id);
o_recently_played.add(track);
o_recently_played.set_cur(0);
}

View File

@ -20,7 +20,7 @@ static void add_library_track(unsigned int id)
static void del_library_track(unsigned int id)
{
library_playqueue.del_track(id);
library_playqueue.del(tagdb :: lookup(id));
}
static void change_library_track(unsigned int id)

View File

@ -60,7 +60,7 @@ void playlist :: del(const std::string &name, unsigned int track_id)
playlist_db.remove(name, track_id);
playlist_db.save();
if (name == cur_pq)
playlist_pq.del_track(track_id);
playlist_pq.del(tagdb :: lookup(track_id));
if (name == "Banned")
get_callbacks()->on_playlist_unban(track_id);
} else
@ -73,7 +73,7 @@ void playlist :: select(const std::string &name)
std::set<unsigned int>::iterator it;
while (playlist_pq.size() > 0)
playlist_pq.del(0);
playlist_pq.del((unsigned)0);
for (it = ids.begin(); it != ids.end(); it++)
playlist_pq.add(tagdb :: lookup(*it));

View File

@ -159,6 +159,15 @@ unsigned int Queue :: _add_at(Track *track, unsigned int pos)
return pos;
}
void Queue :: _del_at(Track *track, unsigned int pos)
{
_tracks.erase(_tracks.begin() + pos);
_length -= track->length;
get_callbacks()->on_queue_track_del(this, pos);
if (!(_flags & Q_DISABLE_CHANGED_SIZE))
get_callbacks()->on_queue_changed();
}
unsigned int Queue :: add(Track *track)
{
unsigned int id = _tracks.size();
@ -167,28 +176,17 @@ unsigned int Queue :: add(Track *track)
return _add_at(track, id);
}
void Queue :: del(unsigned int plist_id)
void Queue :: del(Track *track)
{
Track *track;
unsigned int track_id = _tracks[plist_id]->id;
_tracks.erase(_tracks.begin() + plist_id);
track = tagdb :: lookup(track_id);
_length -= track->length;
get_callbacks()->on_queue_track_del(this, plist_id);
if (!(_flags & Q_DISABLE_CHANGED_SIZE))
get_callbacks()->on_queue_changed();
for (unsigned int i = 0; i < _tracks.size(); i++) {
if (_tracks[i]->id == track->id)
_del_at(track, i);
}
}
void Queue :: del_track(unsigned int track_id)
void Queue :: del(unsigned int id)
{
unsigned int i = 0;
while (i < _tracks.size()) {
if (_tracks[i]->id == track_id)
del(i);
else
i++;
}
_del_at(_tracks[id], id);
}
void Queue :: track_updated(unsigned int track_id)

View File

@ -8,6 +8,7 @@
unsigned int count_add = 0;
unsigned int count_del = 0;
class TestQueue : public Queue
@ -70,21 +71,92 @@ void test_add_cb(Queue *q, unsigned int id)
count_add++;
}
void test_del_cb(Queue *q, unsigned int id)
{
if (count_del % 2 == 0)
check_equal(id, (unsigned)0);
else
check_equal(id, 24 - ((count_del + 1) / 2));
count_del++;
}
void test_del_cb2(Queue *q, unsigned int id)
{
check_equal(id, 23 - count_del);
count_del++;
}
void test_del_cb3(Queue *q, unsigned int id)
{
check_equal(id, (unsigned)0);
}
void test_add_remove()
{
Track *track;
TestQueue q(0);
unsigned int expected = 0;
get_callbacks()->on_queue_track_add = test_add_cb;
get_callbacks()->on_queue_track_del = test_del_cb;
/* Add tracks */
test :: begin();
for (unsigned int i = 0; i < 24; i++) {
check_equal(q.add(tagdb :: lookup(i)), i);
expected += 100 + (i * 10);
}
test :: success();
test_equal(q.get_length(), expected);
test :: equal(q.get_length(), expected);
/* Add everything again */
test :: begin();
for (unsigned int i = 0; i < 24; i++) {
check_equal(q.add(tagdb :: lookup(i)), i + 24);
expected += 100 + (i * 10);
}
test :: success();
test_equal(q.get_length(), expected);
test_equal(q.size(), (unsigned)48);
/* Test removing multiple tracks at once */
test :: begin();
for (unsigned int i = 0; i < 12; i++) {
track = tagdb :: lookup(i);
q.del(track);
expected -= 2 * (100 + (i * 10));
}
test :: success();
test_equal(q.get_length(), expected);
test_equal(q.size(), (unsigned)24);
/* Test removing tracks one at a time */
count_del = 0;
get_callbacks()->on_queue_track_del = test_del_cb2;
test :: begin();
for (unsigned int i = 23; i >= 12; i--) {
expected -= q[i]->length;
q.del(i);
}
test :: success();
test_equal(q.get_length(), expected);
test_equal(q.size(), (unsigned)12);
/* Remove remaining tracks */
get_callbacks()->on_queue_track_del = test_del_cb3;
test :: begin();
while (q.size() > 0)
q.del((unsigned)0);
test :: success();
test_equal(q.get_length(), (unsigned)0);
test_equal(q.size(), (unsigned)0);
}
int main(int argc, char **argv)