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) } }