From 5520472f6f603c4c421d3327412606513985f1a7 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 11 May 2014 11:23:15 -0400 Subject: [PATCH] queue: Test and clean up the delete track function Signed-off-by: Anna Schumaker --- include/queue.h | 3 +- lib/audio.cpp | 12 +++++--- lib/deck.cpp | 2 +- lib/playlist.cpp | 4 +-- lib/queue.cpp | 34 +++++++++++----------- tests/queue.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 102 insertions(+), 27 deletions(-) diff --git a/include/queue.h b/include/queue.h index 9a05eef0..099695a5 100644 --- a/include/queue.h +++ b/include/queue.h @@ -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(); diff --git a/lib/audio.cpp b/lib/audio.cpp index 162ca3c2..6babf4f0 100644 --- a/lib/audio.cpp +++ b/lib/audio.cpp @@ -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); } diff --git a/lib/deck.cpp b/lib/deck.cpp index c4ccb658..94608094 100644 --- a/lib/deck.cpp +++ b/lib/deck.cpp @@ -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) diff --git a/lib/playlist.cpp b/lib/playlist.cpp index 1b8e952e..8f902e72 100644 --- a/lib/playlist.cpp +++ b/lib/playlist.cpp @@ -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::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)); diff --git a/lib/queue.cpp b/lib/queue.cpp index 5f011ead..b81f860f 100644 --- a/lib/queue.cpp +++ b/lib/queue.cpp @@ -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) diff --git a/tests/queue.cpp b/tests/queue.cpp index 178a697f..446d5be0 100644 --- a/tests/queue.cpp +++ b/tests/queue.cpp @@ -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)