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) } }