diff --git a/client_notification_test.go b/client_notification_test.go index c39eba6..86d2c37 100644 --- a/client_notification_test.go +++ b/client_notification_test.go @@ -95,6 +95,16 @@ func TestCleanupConnectionAudioIsIdempotent(t *testing.T) { b.cleanupConnectionAudio() } +// Tone test mode intentionally does not create an OpenAL stream. Tree +// controls must therefore keep local mute state without trying to update one. +func TestUpdateUserGainAllowsToneTestWithoutStream(t *testing.T) { + (&Barnard{ToneTest: true}).updateUserGain(&gumble.User{}) +} + +func TestToneTestRejectsFilePlayback(t *testing.T) { + (&Barnard{ToneTest: true, Connected: true}).CommandPlayFile(nil, "https://example.invalid/audio") +} + func TestUserChangeNotification(t *testing.T) { current := &gumble.Channel{ID: 1, Name: "Current"} other := &gumble.Channel{ID: 2, Name: "Other"} diff --git a/ui.go b/ui.go index 8d715bd..f04dd66 100644 --- a/ui.go +++ b/ui.go @@ -240,11 +240,19 @@ func (b *Barnard) CommandPlayFile(ui *uiterm.Ui, cmd string) { b.AddOutputLine("Not connected to server") return } + if b.ToneTest { + b.AddOutputLine("File playback is unavailable in tone test mode") + return + } b.FileStreamMutex.Lock() defer b.FileStreamMutex.Unlock() + if b.FileStream == nil { + b.AddOutputLine("File playback is unavailable while reconnecting") + return + } - if b.FileStream != nil && b.FileStream.IsPlaying() { + if b.FileStream.IsPlaying() { b.AddOutputLine("Already playing a file. Use /stop first.") return }