// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package config import ( "fmt" "path/filepath" "reflect" "testing" ) func TestWineSettingsRoundTripAndValidation(t *testing.T) { settings := DefaultSettings() settings.Wine = WineSettings{ControllerOnly: true, ExcludedPrograms: []string{"Game.exe", "Another Game.exe"}} path := filepath.Join(t.TempDir(), "settings.toml") store, err := NewStore(path) if err != nil { t.Fatal(err) } if err := store.Save(settings); err != nil { t.Fatal(err) } loaded, err := Load(path) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(loaded.Wine, settings.Wine) { t.Fatalf("Wine settings = %+v", loaded.Wine) } cloned := cloneSettings(settings) cloned.Wine.ExcludedPrograms[0] = "Changed.exe" if settings.Wine.ExcludedPrograms[0] != "Game.exe" { t.Fatal("clone aliases exclusions") } for _, name := range []string{"", "../game.exe", `C:\game.exe`, "Game.exe\rOther.exe", "game.exe\n"} { settings.Wine.ExcludedPrograms = []string{name} if err := Validate(settings); err == nil { t.Fatalf("accepted exclusion %q", name) } } } func TestWineSettingsRejectEmbeddedControlCharacters(t *testing.T) { for character := rune(0); character < ' '; character++ { t.Run(fmt.Sprintf("U+%04X", character), func(t *testing.T) { settings := DefaultSettings() settings.Wine.ExcludedPrograms = []string{"Game" + string(character) + ".exe"} if err := Validate(settings); err == nil { t.Fatalf("accepted control character in exclusion %q", settings.Wine.ExcludedPrograms[0]) } }) } }