Implement per guild music queue and player
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
package music
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/disgoorg/disgolink/v4/lavalink"
|
||||
)
|
||||
|
||||
func TestQueuePushPop(t *testing.T) {
|
||||
q := NewQueue()
|
||||
|
||||
if _, ok := q.Pop(); ok {
|
||||
t.Fatal("expected empty queue to return ok=false")
|
||||
}
|
||||
|
||||
first := lavalink.Track{Info: lavalink.TrackInfo{Title: "first"}}
|
||||
second := lavalink.Track{Info: lavalink.TrackInfo{Title: "second"}}
|
||||
|
||||
q.Push(first)
|
||||
q.Push(second)
|
||||
|
||||
if got := q.Len(); got != 2 {
|
||||
t.Fatalf("expected length 2, got %d", got)
|
||||
}
|
||||
|
||||
track, ok := q.Pop()
|
||||
if !ok || track.Info.Title != "first" {
|
||||
t.Fatalf("expected first track, got %+v ok=%v", track, ok)
|
||||
}
|
||||
|
||||
track, ok = q.Pop()
|
||||
if !ok || track.Info.Title != "second" {
|
||||
t.Fatalf("expected second track, got %+v ok=%v", track, ok)
|
||||
}
|
||||
|
||||
if _, ok := q.Pop(); ok {
|
||||
t.Fatal("expected queue to be empty after popping all tracks")
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueClear(t *testing.T) {
|
||||
q := NewQueue()
|
||||
q.Push(lavalink.Track{})
|
||||
q.Push(lavalink.Track{})
|
||||
|
||||
q.Clear()
|
||||
|
||||
if got := q.Len(); got != 0 {
|
||||
t.Fatalf("expected length 0 after clear, got %d", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueRemoveAt(t *testing.T) {
|
||||
q := NewQueue()
|
||||
q.Push(lavalink.Track{Info: lavalink.TrackInfo{Title: "first"}})
|
||||
q.Push(lavalink.Track{Info: lavalink.TrackInfo{Title: "second"}})
|
||||
q.Push(lavalink.Track{Info: lavalink.TrackInfo{Title: "third"}})
|
||||
|
||||
track, ok := q.RemoveAt(1)
|
||||
if !ok || track.Info.Title != "second" {
|
||||
t.Fatalf("expected to remove second track, got %+v ok=%v", track, ok)
|
||||
}
|
||||
|
||||
if got := q.Len(); got != 2 {
|
||||
t.Fatalf("expected length 2 after removal, got %d", got)
|
||||
}
|
||||
|
||||
list := q.List()
|
||||
if list[0].Info.Title != "first" || list[1].Info.Title != "third" {
|
||||
t.Fatalf("unexpected queue order after removal: %+v", list)
|
||||
}
|
||||
|
||||
if _, ok := q.RemoveAt(5); ok {
|
||||
t.Fatal("expected out-of-range removal to return ok=false")
|
||||
}
|
||||
if _, ok := q.RemoveAt(-1); ok {
|
||||
t.Fatal("expected negative index removal to return ok=false")
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueShuffle(t *testing.T) {
|
||||
q := NewQueue()
|
||||
for i := 0; i < 5; i++ {
|
||||
q.Push(lavalink.Track{Info: lavalink.TrackInfo{Title: string(rune('a' + i))}})
|
||||
}
|
||||
|
||||
if count := q.Shuffle(); count != 5 {
|
||||
t.Fatalf("expected shuffle to report 5 tracks, got %d", count)
|
||||
}
|
||||
|
||||
if got := q.Len(); got != 5 {
|
||||
t.Fatalf("expected length to stay 5 after shuffle, got %d", got)
|
||||
}
|
||||
|
||||
seen := make(map[string]bool)
|
||||
for _, track := range q.List() {
|
||||
seen[track.Info.Title] = true
|
||||
}
|
||||
for i := 0; i < 5; i++ {
|
||||
title := string(rune('a' + i))
|
||||
if !seen[title] {
|
||||
t.Fatalf("expected shuffled queue to still contain %q", title)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueListReturnsCopy(t *testing.T) {
|
||||
q := NewQueue()
|
||||
q.Push(lavalink.Track{Info: lavalink.TrackInfo{Title: "only"}})
|
||||
|
||||
list := q.List()
|
||||
list[0].Info.Title = "mutated"
|
||||
|
||||
track, _ := q.Pop()
|
||||
if track.Info.Title != "only" {
|
||||
t.Fatalf("expected internal queue to be unaffected by mutation of returned list, got %q", track.Info.Title)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user