package common import ( "encoding/json" "os" "testing" ) func TestSaveNewInventoryItemsInitializesMissingCollections(t *testing.T) { t.Chdir(t.TempDir()) if err := os.WriteFile("freesr-data.json", []byte(`{"account_name":"test-player","player_uid":52022}`), 0600); err != nil { t.Fatal(err) } if err := SaveNewLightcones([]Lightcone{{ItemID: 23001, InternalUID: 1, Level: 1, Rank: 1}}); err != nil { t.Fatalf("SaveNewLightcones: %v", err) } if err := SaveNewRelics([]Relic{{RelicID: 31001, RelicSetID: 3101, MainAffixID: 1, InternalUID: 2}}); err != nil { t.Fatalf("SaveNewRelics: %v", err) } raw, err := os.ReadFile("freesr-data.json") if err != nil { t.Fatal(err) } var saved struct { AccountName string `json:"account_name"` PlayerUID uint32 `json:"player_uid"` Lightcones []Lightcone `json:"lightcones"` Relics []Relic `json:"relics"` } if err := json.Unmarshal(raw, &saved); err != nil { t.Fatal(err) } if saved.AccountName != "test-player" || saved.PlayerUID != 52022 { t.Fatalf("account fields were not preserved: %+v", saved) } if len(saved.Lightcones) != 1 || saved.Lightcones[0].ItemID != 23001 { t.Fatalf("missing Light Cone was not initialized: %+v", saved.Lightcones) } if len(saved.Relics) != 1 || saved.Relics[0].RelicID != 31001 { t.Fatalf("missing Relic collection was not initialized: %+v", saved.Relics) } } func TestReadInventoryEntriesTreatsNullAsEmptyAndRejectsMalformed(t *testing.T) { for _, root := range []map[string]json.RawMessage{ {}, {"lightcones": json.RawMessage("null")}, } { entries, err := readInventoryEntries(root, "lightcones") if err != nil || len(entries) != 0 { t.Fatalf("expected empty collection, got entries=%v err=%v", entries, err) } } if _, err := readInventoryEntries(map[string]json.RawMessage{"lightcones": json.RawMessage(`{"not":"an array"}`)}, "lightcones"); err == nil { t.Fatal("malformed inventory collection was accepted") } }