using System.Collections.Generic; using NUnit.Framework; using UnityEngine; using YachtDice.Modifiers.Runtime; using YachtDice.Persistence; namespace YachtDice.Tests { public class SaveSystemTests { [SetUp] public void SetUp() { SaveSystem.Delete(); } [TearDown] public void TearDown() { SaveSystem.Delete(); } /// /// Сохранение и последующая загрузка сохраняют валюту и модификаторы без потерь. /// [Test] public void SaveAndLoad_RoundTrip_PreservesData() { var data = new SaveData { currency = 999, ownedModifiers = new List { new() { modifierId = "mod1", isActive = true, remainingUses = 3 }, new() { modifierId = "mod2", isActive = false, remainingUses = -1 } } }; SaveSystem.Save(data); var loaded = SaveSystem.Load(); Assert.AreEqual(999, loaded.currency); Assert.AreEqual(2, loaded.ownedModifiers.Count); Assert.AreEqual("mod1", loaded.ownedModifiers[0].modifierId); Assert.IsTrue(loaded.ownedModifiers[0].isActive); Assert.AreEqual(3, loaded.ownedModifiers[0].remainingUses); Assert.AreEqual("mod2", loaded.ownedModifiers[1].modifierId); Assert.IsFalse(loaded.ownedModifiers[1].isActive); } /// /// При отсутствии ключа сохранения возвращаются значения по умолчанию. /// [Test] public void Load_MissingKey_ReturnsDefault() { var loaded = SaveSystem.Load(); Assert.IsNotNull(loaded); Assert.AreEqual(0, loaded.currency); Assert.AreEqual(0, loaded.ownedModifiers.Count); } /// /// Метод HasSave возвращает false, когда сохранение отсутствует. /// [Test] public void HasSave_ReturnsFalseWhenEmpty() { Assert.IsFalse(SaveSystem.HasSave()); } /// /// После сохранения метод HasSave возвращает true. /// [Test] public void HasSave_ReturnsTrueAfterSave() { SaveSystem.Save(new SaveData { currency = 100 }); Assert.IsTrue(SaveSystem.HasSave()); } /// /// Удаление сохранения убирает данные из хранилища. /// [Test] public void Delete_RemovesSaveData() { SaveSystem.Save(new SaveData { currency = 100 }); SaveSystem.Delete(); Assert.IsFalse(SaveSystem.HasSave()); } /// /// Поврежденный JSON при загрузке безопасно заменяется данными по умолчанию. /// [Test] public void Load_CorruptJson_ReturnsDefault() { PlayerPrefs.SetString("YachtDice_SaveData", "{invalid json!!!"); PlayerPrefs.Save(); var loaded = SaveSystem.Load(); Assert.IsNotNull(loaded); Assert.AreEqual(0, loaded.currency); } /// /// Сохранение и загрузка корректно сохраняют список ID костей. /// [Test] public void SaveAndLoad_RoundTrip_PreservesDiceIds() { var data = new SaveData { currency = 100, ownedDiceIds = new List { "standard_d6", "chaos_d6" } }; SaveSystem.Save(data); var loaded = SaveSystem.Load(); Assert.AreEqual(2, loaded.ownedDiceIds.Count); Assert.AreEqual("standard_d6", loaded.ownedDiceIds[0]); Assert.AreEqual("chaos_d6", loaded.ownedDiceIds[1]); } } }