Implement per guild music queue and player

This commit is contained in:
2026-09-21 18:48:06 +02:00
parent d5f81252b2
commit c4757933e1
4 changed files with 461 additions and 0 deletions
+118
View File
@@ -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)
}
}