All checks were successful
release / build-release (push) Successful in 1m35s
tools/gensound syntetiserar 21 ljud: fyra stationsmelodier i klockklang (en per station via melody-fältet eller banans id), ankomstjingel, ding-dong vid inrullning, dörrsignal vid avgång, spärrens pip och nekande, kiosk, toalett, lärt ord, bekräfta/varning, byte, personal, vinst, förlust, flygplan, sorl och menymusik. sfx.go spelar effekter utifrån vad som hänt i sim.Run sedan förra bildrutan. Ljudlagret har huvudvolym × effekter/musik och byter inte slinga i onödan. Inställningar (S på bankartan, sparas): volymer, språk sv/en som laddas om direkt, fönsterskala, fullskärm (F11 överallt) och tangentöversikt. Fönsterikon från genart. CHANGELOG.md. Tester för ljudfiler, melodival och inställningar. Docs, wiki och skärmdumpar uppdaterade. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
119 lines
4.0 KiB
Go
119 lines
4.0 KiB
Go
package save
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim"
|
|
)
|
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "save.json")
|
|
st, exists, err := Load(path)
|
|
if err != nil || exists || st.Version != Version || st.Progress == nil || st.Know.Count() != 0 {
|
|
t.Fatalf("saknad fil ska ge nytt spel: exists=%v err=%v", exists, err)
|
|
}
|
|
st.Know.Learn("改札")
|
|
st.Know.Points = 3
|
|
st.Wallet.Card = 1234
|
|
st.Wallet.Phone = true
|
|
st.Profile.Add(sim.Tired, 2)
|
|
st.Progress.AddXP(500)
|
|
st.Progress.Skills["kana"] = true
|
|
st.Progress.Items["geta"] = true
|
|
st.Progress.Equipped["feet"] = "geta"
|
|
st.Progress.RecordLevel("001-flygplatsen", true, 3, 941)
|
|
st.Current = &RunRef{LevelID: "002-shinjuku", Seed: [2]uint64{7, 99}}
|
|
if err := Store(path, st); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(path + ".tmp"); err == nil {
|
|
t.Fatal("tempfilen ska vara borta")
|
|
}
|
|
got, exists, err := Load(path)
|
|
if err != nil || !exists {
|
|
t.Fatalf("exists=%v err=%v", exists, err)
|
|
}
|
|
if !got.Know.Knows("改札") || got.Know.Points != 3 || got.Wallet.Card != 1234 || !got.Wallet.Phone {
|
|
t.Fatal("kunskap/plånbok")
|
|
}
|
|
if !got.Profile.Has(sim.Tired) || got.Progress.XP != 500 || got.Progress.Level() != 3 || !got.Progress.Has("kana") || got.Progress.Equipped["feet"] != "geta" {
|
|
t.Fatalf("profil/progression: %+v", got.Progress)
|
|
}
|
|
if !got.Progress.Cleared("001-flygplatsen") || got.Progress.Levels["001-flygplatsen"].Score != 941 {
|
|
t.Fatal("banresultat")
|
|
}
|
|
if got.Current == nil || got.Current.LevelID != "002-shinjuku" || got.Current.Seed != [2]uint64{7, 99} {
|
|
t.Fatalf("pågående omgång: %+v", got.Current)
|
|
}
|
|
if got.SavedAt.IsZero() {
|
|
t.Fatal("SavedAt")
|
|
}
|
|
}
|
|
|
|
func TestCorruptAndFutureVersions(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "save.json")
|
|
os.WriteFile(path, []byte("{nope"), 0o644)
|
|
if _, _, err := Load(path); err == nil {
|
|
t.Fatal("trasig fil ska ge fel")
|
|
}
|
|
os.WriteFile(path, []byte(`{"version": 99}`), 0o644)
|
|
if _, _, err := Load(path); err == nil {
|
|
t.Fatal("nyare version ska ge fel")
|
|
}
|
|
// Version 0 utan fält migreras till ett komplett tillstånd.
|
|
os.WriteFile(path, []byte(`{"knowledge": {"words": {"改札": true}}}`), 0o644)
|
|
st, exists, err := Load(path)
|
|
if err != nil || !exists || st.Version != Version || !st.Know.Knows("改札") || st.Wallet == nil || st.Progress == nil || st.Profile == nil {
|
|
t.Fatalf("migrering: %+v err=%v", st, err)
|
|
}
|
|
}
|
|
|
|
func TestDefaultPath(t *testing.T) {
|
|
p, err := DefaultPath()
|
|
if err != nil || filepath.Base(p) != "save.json" || filepath.Base(filepath.Dir(p)) != AppDir {
|
|
t.Fatalf("path=%q err=%v", p, err)
|
|
}
|
|
}
|
|
|
|
func TestEndlessRecords(t *testing.T) {
|
|
s := New()
|
|
if s.BestEndless() != nil {
|
|
t.Fatal("tom lista")
|
|
}
|
|
if !s.AddEndless(EndlessRecord{Score: 100, Goals: 1}) || s.AddEndless(EndlessRecord{Score: 50, Goals: 1}) || !s.AddEndless(EndlessRecord{Score: 300, Goals: 3}) {
|
|
t.Fatal("ny bästa ska rapporteras bara när poängen slår listans topp")
|
|
}
|
|
for i := 0; i < 10; i++ {
|
|
s.AddEndless(EndlessRecord{Score: 10 + i})
|
|
}
|
|
if len(s.Endless) != MaxEndlessRecords || s.BestEndless().Score != 300 || s.Endless[1].Score != 100 {
|
|
t.Fatalf("listan: %+v", s.Endless)
|
|
}
|
|
}
|
|
|
|
func TestSettingsDefaultsAndNormalize(t *testing.T) {
|
|
s := New()
|
|
if s.Settings == nil || s.Settings.Master != 8 || s.Settings.Lang != "sv" {
|
|
t.Fatalf("standardinställningar: %+v", s.Settings)
|
|
}
|
|
path := filepath.Join(t.TempDir(), "save.json")
|
|
if err := os.WriteFile(path, []byte(`{"version":1,"settings":{"master":99,"music":-3,"lang":"xx","scale":12}}`), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
st, _, err := Load(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if st.Settings.Master != 10 || st.Settings.Music != 0 || st.Settings.Lang != "sv" || st.Settings.Scale != 6 {
|
|
t.Fatalf("normaliserade: %+v", st.Settings)
|
|
}
|
|
if err := os.WriteFile(path, []byte(`{"version":1}`), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if st, _, err = Load(path); err != nil || st.Settings == nil || st.Settings.Effects != 8 {
|
|
t.Fatalf("saknade inställningar ska bli standard: %+v %v", st.Settings, err)
|
|
}
|
|
}
|