From 9cb08df11d7446357c5d480d08d256b906d4988e Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 21 Jul 2023 10:50:07 +0200 Subject: implement playlist in order traversal This ensures that the initial reported song array is in order. --- playlist.go | 13 +++++++++++++ wrms.go | 6 +++--- wrms_test.go | 42 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/playlist.go b/playlist.go index becc85e..1fbd344 100644 --- a/playlist.go +++ b/playlist.go @@ -61,3 +61,16 @@ func (pl *Playlist) RemoveSong(s *Song) { heap.Remove(pl, s.index) llog.DDebug("removing song %p in the playlist (%p) -> %v", s, pl, pl) } + +func (pl *Playlist) OrderedList() []*Song { + songs := make([]*Song, 0, pl.Len()) + + cpy := make(Playlist, 0, pl.Len()) + copy(cpy, *pl) + + for cpy.Len() > 0 { + songs = append(songs, heap.Pop(&cpy).(*Song)) + } + + return songs +} diff --git a/wrms.go b/wrms.go index cd6cb70..a345767 100644 --- a/wrms.go +++ b/wrms.go @@ -240,11 +240,11 @@ func (wrms *Wrms) initConn(conn *Connection) error { if len(wrms.Songs) > 0 { initialCmds = append(initialCmds, newEvent("add", wrms.Songs)) - for _, song := range wrms.Songs { + for _, song := range wrms.queue.OrderedList() { if _, ok := song.Upvotes[conn.Id]; ok { - upvoted = append(upvoted, song) + upvoted = append(upvoted, *song) } else if _, ok := song.Downvotes[conn.Id]; ok { - downvoted = append(downvoted, song) + downvoted = append(downvoted, *song) } } } diff --git a/wrms_test.go b/wrms_test.go index e2f5412..08a94bf 100644 --- a/wrms_test.go +++ b/wrms_test.go @@ -9,14 +9,14 @@ import ( type mockPlayer struct{} -func (p *mockPlayer) Play(*Song) {} -func (p *mockPlayer) PlayUri(string) {} -func (p *mockPlayer) PlayData(io.Reader) {} -func (p *mockPlayer) Search(pattern string) (res chan []Song) { return } -func (p *mockPlayer) Playing() bool { return false } -func (p *mockPlayer) Pause() {} -func (p *mockPlayer) Continue() {} -func (p *mockPlayer) Stop() {} +func (p *mockPlayer) Play(*Song) {} +func (p *mockPlayer) PlayUri(string) {} +func (p *mockPlayer) PlayData(io.Reader) {} +func (p *mockPlayer) Search(pattern map[string]string) (res chan []Song) { return } +func (p *mockPlayer) Playing() bool { return false } +func (p *mockPlayer) Pause() {} +func (p *mockPlayer) Continue() {} +func (p *mockPlayer) Stop() {} var alice, _ = uuid.NewRandom() @@ -31,6 +31,32 @@ func TestWrmsAdd(t *testing.T) { } } +func TestWrmsAdd3Next3(t *testing.T) { + wrms := Wrms{Player: &mockPlayer{}} + songs := []Song{ + NewDummySong("song1", "snfmt"), + NewDummySong("song2", "snfmt"), + NewDummySong("song3", "snfmt"), + } + + for _, s := range songs { + wrms.AddSong(s) + } + + if len(wrms.queue) != len(songs) { + t.Log("len should be 3") + t.Fail() + } + + for _, s := range wrms.queue.OrderedList() { + wrms.Next() + if wrms.CurrentSong.Load().Uri != s.Uri { + t.Log("Not returning the next song") + t.Fail() + } + } +} + func TestWrmsAdjust(t *testing.T) { wrms := Wrms{Player: &mockPlayer{}} s1 := NewDummySong("song1", "snfmt") -- cgit v1.2.3