package main import ( "os" "path/filepath" "testing" ) func TestSaveLoadWayfarerShipRoundTrip(t *testing.T) { withTempConfigDir(t) s := NewWayfarerShip(wayfarerStartSystem) s.Credits = 12345 s.RegularMissiles = 1 if err := SaveWayfarerShip(s); err != nil { t.Fatalf("неожиданная ошибка сохранения: %v", err) } loaded, err := LoadWayfarerShip() if err != nil { t.Fatalf("неожиданная ошибка загрузки: %v", err) } if loaded.Credits != 12345 { t.Errorf("кредиты не сохранились корректно, получено %v", loaded.Credits) } if loaded.MissileCapacity != 2 { t.Errorf("ожидалась вместимость ракетных слотов 2, получено %d", loaded.MissileCapacity) } if loaded.RegularMissiles != 1 { t.Errorf("боезапас ракет не сохранился корректно, получено %d", loaded.RegularMissiles) } } // TestLoadWayfarerShipMigratesMissingMissileCapacity — регрессия: // поле MissileCapacity появилось позже, чем базовое сохранение // Странника. У сохранений, созданных ДО этого, поле в JSON // отсутствует вовсе, и при десериализации остаётся нулевым — из-за // чего "свободных ракетных слотов" не было НИКОГДА, даже если ракет // на борту нет вовсе (0 >= 0). Загрузка должна восстанавливать // разумное значение по умолчанию. func TestLoadWayfarerShipMigratesMissingMissileCapacity(t *testing.T) { withTempConfigDir(t) oldSaveJSON := `{ "Credits": 500, "FuelCapacity": 7, "Fuel": 7, "CargoCapacity": 20, "MaxHull": 100, "Hull": 100, "MaxShield": 50, "Shield": 50, "LaserPower": 12, "CurrentSystem": "0:0" }` path, err := wayfarerSavePath() if err != nil { t.Fatalf("неожиданная ошибка получения пути сохранения: %v", err) } if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { t.Fatalf("не удалось создать директорию сохранения: %v", err) } if err := os.WriteFile(path, []byte(oldSaveJSON), 0o644); err != nil { t.Fatalf("не удалось записать тестовое сохранение: %v", err) } loaded, err := LoadWayfarerShip() if err != nil { t.Fatalf("неожиданная ошибка загрузки старого сохранения: %v", err) } if loaded.MissileCapacity != 2 { t.Errorf("ожидалась миграция вместимости ракетных слотов к значению по умолчанию (2), получено %d", loaded.MissileCapacity) } if loaded.RegularMissiles != 0 || loaded.HomingMissiles != 0 { t.Errorf("в старом сохранении ракет не было — ожидались нулевые значения") } if loaded.MissilesLoaded() >= loaded.MissileCapacity { t.Errorf("после миграции покупка ракеты должна была стать возможной, но MissilesLoaded()=%d >= MissileCapacity=%d", loaded.MissilesLoaded(), loaded.MissileCapacity) } if err := loaded.BuyMissile(WayfarerWeaponMissileRegular, 1); err != nil { t.Errorf("покупка ракеты после миграции должна была пройти успешно, получено: %v", err) } }