Files
GaCy-GO/internal/common/stella_jump_test.go
T
2026-10-28 18:54:43 +07:00

96 lines
2.5 KiB
Go

package common
import (
"bytes"
"encoding/json"
"os"
"path/filepath"
"testing"
)
func TestStellaJumpResultMergesCasesAndPreservesOtherSaves(t *testing.T) {
raw, err := os.ReadFile(filepath.Join("..", "..", "resources", "StellaJumpConfig.json"))
if err != nil {
t.Fatal(err)
}
t.Chdir(t.TempDir())
if err = os.Mkdir("resources", 0755); err != nil {
t.Fatal(err)
}
if err = os.WriteFile(filepath.Join("resources", "StellaJumpConfig.json"), raw, 0644); err != nil {
t.Fatal(err)
}
initial := []byte(`{"currency_wars":{"saved_run":42},"aha_help_level":0,"ex_ranks_unlocked":{"1204":false}}`)
if err = os.WriteFile("persistent", initial, 0644); err != nil {
t.Fatal(err)
}
cases, err := LoadStellaJumpCases()
if err != nil {
t.Fatal(err)
}
var selected []StellaJumpCase
for _, row := range cases {
if len(row.Challenges) > 0 {
selected = append(selected, row)
}
if len(selected) == 2 {
break
}
}
if len(selected) != 2 {
t.Fatal("need multiple captured cases")
}
a, b := selected[0], selected[1]
if _, err = ReadStellaJumpRecord(a.ID); err != nil {
t.Fatal(err)
}
afterRead, _ := os.ReadFile("persistent")
if !bytes.Equal(initial, afterRead) {
t.Fatal("read rewrote persistent")
}
first, err := SaveStellaJumpResult(a.ID, 100, []uint32{a.Challenges[0]})
if err != nil || first.BestTime != 100 {
t.Fatalf("first finish: %+v %v", first, err)
}
if _, err = SaveStellaJumpResult(b.ID, 80, nil); err != nil {
t.Fatal(err)
}
if _, err = SaveStellaJumpResult(a.ID, 120, []uint32{a.Challenges[0]}); err != nil {
t.Fatal(err)
}
beforeBad, _ := os.ReadFile("persistent")
if _, err = SaveStellaJumpResult(a.ID, 1, []uint32{^uint32(0)}); err == nil {
t.Fatal("accepted invalid challenge")
}
afterBad, _ := os.ReadFile("persistent")
if !bytes.Equal(beforeBad, afterBad) {
t.Fatal("invalid request mutated save")
}
result, err := ReadStellaJumpRecord(a.ID)
if err != nil || result.BestTime != 100 || len(result.FinishedChallenges) != 1 {
t.Fatalf("merged record: %+v %v", result, err)
}
other, _ := ReadStellaJumpRecord(b.ID)
if other.BestTime != 80 {
t.Fatal("lost other case")
}
root, err := readCurrencyWarsPersistentRoot()
if err != nil {
t.Fatal(err)
}
var original map[string]json.RawMessage
if err = json.Unmarshal(initial, &original); err != nil {
t.Fatal(err)
}
for key, value := range original {
var a, b any
json.Unmarshal(value, &a)
json.Unmarshal(root[key], &b)
left, _ := json.Marshal(a)
right, _ := json.Marshal(b)
if !bytes.Equal(left, right) {
t.Fatalf("changed %s", key)
}
}
}