Files
bjarneo--cliamp/ui/model/speed_controls_test.go
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

126 lines
3.2 KiB
Go

package model
import (
"github.com/bjarneo/cliamp/config"
"github.com/bjarneo/cliamp/ui"
"os"
"path/filepath"
"strings"
"testing"
tea "charm.land/bubbletea/v2"
)
func TestHandleSpeedKeyUsesArrowKeysWhenSpeedFocused(t *testing.T) {
if sharedPlayer == nil {
t.Skip("audio hardware unavailable")
}
sharedPlayer.Stop()
origSpeed := sharedPlayer.Speed()
sharedPlayer.SetSpeed(1.0)
t.Cleanup(func() {
sharedPlayer.SetSpeed(origSpeed)
})
m := Model{
player: sharedPlayer,
configSaver: config.SaveFunc{},
focus: focusSpeed,
}
if cmd := m.handleKey(tea.KeyPressMsg{Code: tea.KeyRight}); cmd != nil {
t.Fatalf("handleKey(right) cmd = %v, want nil", cmd)
}
if got := sharedPlayer.Speed(); got != 1.25 {
t.Fatalf("speed after right = %.2f, want 1.25", got)
}
if got := m.speedSaveAfter; got != speedSaveDebounce {
t.Fatalf("speedSaveAfter after right = %v, want %v", got, speedSaveDebounce)
}
if cmd := m.handleKey(tea.KeyPressMsg{Code: tea.KeyLeft}); cmd != nil {
t.Fatalf("handleKey(left) cmd = %v, want nil", cmd)
}
if got := sharedPlayer.Speed(); got != 1.0 {
t.Fatalf("speed after left = %.2f, want 1.00", got)
}
if got := m.speedSaveAfter; got != speedSaveDebounce {
t.Fatalf("speedSaveAfter after left = %v, want %v", got, speedSaveDebounce)
}
}
func TestTickPendingSpeedSaveUsesElapsedTime(t *testing.T) {
if sharedPlayer == nil {
t.Skip("audio hardware unavailable")
}
home := t.TempDir()
t.Setenv("XDG_CONFIG_HOME", "")
t.Setenv("HOME", home)
sharedPlayer.Stop()
origSpeed := sharedPlayer.Speed()
sharedPlayer.SetSpeed(1.0)
t.Cleanup(func() {
sharedPlayer.SetSpeed(origSpeed)
})
m := Model{player: sharedPlayer, configSaver: config.SaveFunc{}}
m.changeSpeed(0.5)
configPath := filepath.Join(home, ".config", "cliamp", "config.toml")
for i := range 4 {
m.tickPendingSpeedSave(ui.TickSlow)
if _, err := os.Stat(configPath); !os.IsNotExist(err) {
t.Fatalf("config created after %d slow ticks, want no save before %v", i+1, speedSaveDebounce)
}
}
m.tickPendingSpeedSave(ui.TickSlow)
data, err := os.ReadFile(configPath)
if err != nil {
t.Fatalf("ReadFile(%q) error = %v", configPath, err)
}
if got := string(data); !strings.Contains(got, "speed = 1.50") {
t.Fatalf("config contents = %q, want speed = 1.50", got)
}
if got := m.speedSaveAfter; got != 0 {
t.Fatalf("speedSaveAfter after save = %v, want 0", got)
}
}
func TestFlushPendingSpeedSavePersistsImmediately(t *testing.T) {
if sharedPlayer == nil {
t.Skip("audio hardware unavailable")
}
home := t.TempDir()
t.Setenv("XDG_CONFIG_HOME", "")
t.Setenv("HOME", home)
sharedPlayer.Stop()
origSpeed := sharedPlayer.Speed()
sharedPlayer.SetSpeed(1.0)
t.Cleanup(func() {
sharedPlayer.SetSpeed(origSpeed)
})
m := Model{player: sharedPlayer, configSaver: config.SaveFunc{}}
m.changeSpeed(0.25)
m.flushPendingSpeedSave()
configPath := filepath.Join(home, ".config", "cliamp", "config.toml")
data, err := os.ReadFile(configPath)
if err != nil {
t.Fatalf("ReadFile(%q) error = %v", configPath, err)
}
if got := string(data); !strings.Contains(got, "speed = 1.25") {
t.Fatalf("config contents = %q, want speed = 1.25", got)
}
if got := m.speedSaveAfter; got != 0 {
t.Fatalf("speedSaveAfter after flush = %v, want 0", got)
}
}