96 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|