package settings import "testing" func TestDefault(t *testing.T) { got := Default() if got.ReadingSpeed != 300 { t.Errorf("ReadingSpeed = %d, want 300", got.ReadingSpeed) } if got.FontSize != 48 { t.Errorf("FontSize = %d, want 48", got.FontSize) } if got.Theme != ThemeDark { t.Errorf("Theme = %q, want %q", got.Theme, ThemeDark) } } func TestValidate(t *testing.T) { tests := []struct { name string settings Settings want bool }{ { name: "valid defaults", settings: Default(), want: true, }, { name: "minimum values", settings: Settings{ ReadingSpeed: MinReadingSpeed, FontSize: MinFontSize, Theme: ThemeDark, }, want: true, }, { name: "maximum values", settings: Settings{ ReadingSpeed: MaxReadingSpeed, FontSize: MaxFontSize, Theme: ThemeLight, }, want: true, }, { name: "invalid reading speed", settings: Settings{ ReadingSpeed: 50, FontSize: 48, Theme: ThemeDark, }, want: false, }, { name: "reading speed too high", settings: Settings{ ReadingSpeed: 1500, FontSize: 48, Theme: ThemeDark, }, want: false, }, { name: "invalid font size", settings: Settings{ ReadingSpeed: 300, FontSize: 10, Theme: ThemeDark, }, want: false, }, { name: "invalid theme", settings: Settings{ ReadingSpeed: 300, FontSize: 48, Theme: "purple", }, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.settings.Validate(); got != tt.want { t.Errorf("Validate() = %t, want %t", got, tt.want) } }) } } func TestNormalize(t *testing.T) { tests := []struct { name string input Settings want Settings }{ { name: "valid settings unchanged", input: Default(), want: Default(), }, { name: "speed below minimum clamped", input: Settings{ ReadingSpeed: 50, FontSize: 48, Theme: ThemeDark, }, want: Settings{ ReadingSpeed: MinReadingSpeed, FontSize: 48, Theme: ThemeDark, }, }, { name: "speed above maximum clamped", input: Settings{ ReadingSpeed: 1200, FontSize: 48, Theme: ThemeDark, }, want: Settings{ ReadingSpeed: MaxReadingSpeed, FontSize: 48, Theme: ThemeDark, }, }, { name: "font below minimum clamped", input: Settings{ ReadingSpeed: 400, FontSize: 10, Theme: ThemeLight, }, want: Settings{ ReadingSpeed: 400, FontSize: MinFontSize, Theme: ThemeLight, }, }, { name: "font above maximum clamped", input: Settings{ ReadingSpeed: 400, FontSize: 120, Theme: ThemeLight, }, want: Settings{ ReadingSpeed: 400, FontSize: MaxFontSize, Theme: ThemeLight, }, }, { name: "invalid theme replaced", input: Settings{ ReadingSpeed: 400, FontSize: 48, Theme: "purple", }, want: Settings{ ReadingSpeed: 400, FontSize: 48, Theme: ThemeDark, }, }, { name: "theme whitespace and case normalized", input: Settings{ ReadingSpeed: 400, FontSize: 48, Theme: " LIGHT ", }, want: Settings{ ReadingSpeed: 400, FontSize: 48, Theme: ThemeLight, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := tt.input.Normalize() if got != tt.want { t.Errorf("Normalize() = %+v, want %+v", got, tt.want) } }) } } func TestNormalizeAlwaysProducesValidSettings(t *testing.T) { tests := []Settings{ {}, {ReadingSpeed: -1, FontSize: -1, Theme: "invalid"}, {ReadingSpeed: 2000, FontSize: 200, Theme: " BLUE "}, {ReadingSpeed: 300, FontSize: 48, Theme: " LIGHT "}, } for _, input := range tests { got := input.Normalize() if !got.Validate() { t.Errorf("Normalize(%+v) produced invalid settings: %+v", input, got) } } }