82 lines
3.5 KiB
Go
82 lines
3.5 KiB
Go
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)
|
||
}
|
||
}
|