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