Streams H.264 to the Galahad II LCD via USB (gousb) with: - ffmpeg CLI transcoding (no fragile FFmpeg C-ABI bindings) - pure-Go Annex-B access-unit splitting - framerate pacing with graceful shutdown and USB reconnect - TOML config, cobra CLI, structured slog logging, unit tests
108 lines
2.8 KiB
Go
108 lines
2.8 KiB
Go
package cli
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"galahad2lcd/internal/config"
|
|
)
|
|
|
|
func TestApplyOverridesChangedFlags(t *testing.T) {
|
|
dir := t.TempDir()
|
|
src := filepath.Join(dir, "media.gif")
|
|
if err := os.WriteFile(src, []byte("gif"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
cmd := &cobra.Command{}
|
|
var input string
|
|
var rotate int
|
|
var speed, fps float64
|
|
cmd.Flags().StringVar(&input, "input", "", "")
|
|
cmd.Flags().IntVar(&rotate, "rotate", 0, "")
|
|
cmd.Flags().Float64Var(&speed, "speed", 0, "")
|
|
cmd.Flags().Float64Var(&fps, "fps", 0, "")
|
|
_ = cmd.Flags().Set("input", src)
|
|
_ = cmd.Flags().Set("rotate", "180")
|
|
_ = cmd.Flags().Set("speed", "1.5")
|
|
_ = cmd.Flags().Set("fps", "24")
|
|
|
|
cfg := config.Default()
|
|
if err := applyOverrides(cmd, &cfg, input, rotate, speed, fps); err != nil {
|
|
t.Fatalf("applyOverrides error = %v", err)
|
|
}
|
|
if cfg.Display.Input != src {
|
|
t.Errorf("input = %q, want %q", cfg.Display.Input, src)
|
|
}
|
|
if cfg.Display.Rotate != 180 {
|
|
t.Errorf("rotate = %d, want 180", cfg.Display.Rotate)
|
|
}
|
|
if cfg.Display.Speed != 1.5 {
|
|
t.Errorf("speed = %v, want 1.5", cfg.Display.Speed)
|
|
}
|
|
if cfg.Stream.FPS != 24 {
|
|
t.Errorf("fps = %v, want 24", cfg.Stream.FPS)
|
|
}
|
|
}
|
|
|
|
func TestApplyOverridesUnchangedFlags(t *testing.T) {
|
|
cmd := &cobra.Command{}
|
|
var input string
|
|
var rotate int
|
|
var speed, fps float64
|
|
cmd.Flags().StringVar(&input, "input", "", "")
|
|
cmd.Flags().IntVar(&rotate, "rotate", 0, "")
|
|
cmd.Flags().Float64Var(&speed, "speed", 0, "")
|
|
cmd.Flags().Float64Var(&fps, "fps", 0, "")
|
|
|
|
cfg := config.Default()
|
|
if err := applyOverrides(cmd, &cfg, input, rotate, speed, fps); err != nil {
|
|
t.Fatalf("applyOverrides error = %v", err)
|
|
}
|
|
if cfg.Display.Input != "" || cfg.Display.Rotate != 0 {
|
|
t.Errorf("unset flags changed config: %+v", cfg)
|
|
}
|
|
}
|
|
|
|
func TestResolveInput(t *testing.T) {
|
|
dir := t.TempDir()
|
|
file := filepath.Join(dir, "x.gif")
|
|
if err := os.WriteFile(file, nil, 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
abs, err := resolveInput(file)
|
|
if err != nil {
|
|
t.Fatalf("resolveInput error = %v", err)
|
|
}
|
|
if abs != file {
|
|
t.Errorf("resolveInput = %q, want %q", abs, file)
|
|
}
|
|
|
|
if _, err := resolveInput(filepath.Join(dir, "missing.gif")); err == nil {
|
|
t.Error("resolveInput returned nil error for missing file")
|
|
}
|
|
if _, err := resolveInput(dir); err == nil {
|
|
t.Error("resolveInput returned nil error for a directory")
|
|
}
|
|
}
|
|
|
|
func TestRootVersionCommand(t *testing.T) {
|
|
root := newRootCmd("1.2.3")
|
|
root.SetArgs([]string{"version"})
|
|
if err := root.Execute(); err != nil {
|
|
t.Fatalf("version command error = %v", err)
|
|
}
|
|
}
|
|
|
|
func TestRootSetCommandRequiresFlags(t *testing.T) {
|
|
root := newRootCmd("dev")
|
|
root.SetArgs([]string{"set"})
|
|
if err := root.Execute(); err == nil {
|
|
t.Error("set with no flags returned nil error")
|
|
}
|
|
}
|