using NUnit.Framework; using UnityEngine; using YachtDice.Inventory; using YachtDice.Modifiers; namespace YachtDice.Tests { public sealed class InventoryModelTests { private InventoryModel inventory; [SetUp] public void SetUp() { inventory = new InventoryModel(3); } private ModifierData CreateTestData(string id = "test", ModifierDurability durability = ModifierDurability.Permanent, int maxUses = 0) { return ModifierData.CreateForTest(id, ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, durability: durability, maxUses: maxUses); } [Test] public void AddModifier_IncreasesCount() { inventory.AddModifier(CreateTestData()); Assert.AreEqual(1, inventory.OwnedModifiers.Count); } [Test] public void TryActivate_SucceedsWithinSlotLimit() { inventory.AddModifier(CreateTestData("a")); var mod = inventory.OwnedModifiers[0]; bool result = inventory.TryActivate(mod); Assert.IsTrue(result); Assert.IsTrue(mod.IsActive); Assert.AreEqual(1, inventory.ActiveCount); } [Test] public void TryActivate_FailsWhenSlotsFull() { for (int i = 0; i < 3; i++) { inventory.AddModifier(CreateTestData($"m{i}")); inventory.TryActivate(inventory.OwnedModifiers[i]); } inventory.AddModifier(CreateTestData("extra")); var extra = inventory.OwnedModifiers[3]; bool result = inventory.TryActivate(extra); Assert.IsFalse(result); Assert.IsFalse(extra.IsActive); Assert.AreEqual(3, inventory.ActiveCount); } [Test] public void Deactivate_FreesSlot() { inventory.AddModifier(CreateTestData()); var mod = inventory.OwnedModifiers[0]; inventory.TryActivate(mod); inventory.Deactivate(mod); Assert.IsFalse(mod.IsActive); Assert.AreEqual(0, inventory.ActiveCount); } [Test] public void RemoveModifier_DeactivatesAndRemoves() { inventory.AddModifier(CreateTestData()); var mod = inventory.OwnedModifiers[0]; inventory.TryActivate(mod); inventory.RemoveModifier(mod); Assert.AreEqual(0, inventory.OwnedModifiers.Count); Assert.AreEqual(0, inventory.ActiveCount); } [Test] public void ConsumeUseOnActive_DecrementsUses() { inventory.AddModifier(CreateTestData("ltd", ModifierDurability.LimitedUses, 3)); var mod = inventory.OwnedModifiers[0]; inventory.TryActivate(mod); inventory.ConsumeUseOnActive(); Assert.AreEqual(2, mod.RemainingUses); } [Test] public void ConsumeUseOnActive_RemovesExpired() { inventory.AddModifier(CreateTestData("ltd", ModifierDurability.LimitedUses, 1)); var mod = inventory.OwnedModifiers[0]; inventory.TryActivate(mod); inventory.ConsumeUseOnActive(); Assert.AreEqual(0, inventory.OwnedModifiers.Count); } [Test] public void ConsumeUseOnActive_IgnoresPermanent() { inventory.AddModifier(CreateTestData("perm", ModifierDurability.Permanent)); var mod = inventory.OwnedModifiers[0]; inventory.TryActivate(mod); inventory.ConsumeUseOnActive(); Assert.AreEqual(1, inventory.OwnedModifiers.Count); Assert.IsTrue(mod.IsActive); } [Test] public void GetActiveModifierData_ReturnsOnlyActive() { inventory.AddModifier(CreateTestData("a")); inventory.AddModifier(CreateTestData("b")); inventory.TryActivate(inventory.OwnedModifiers[0]); var active = inventory.GetActiveModifierData(); Assert.AreEqual(1, active.Count); } [Test] public void SetMaxActiveSlots_AllowsExpansion() { inventory.SetMaxActiveSlots(10); Assert.AreEqual(10, inventory.MaxActiveSlots); } [Test] public void OnActiveModifiersChanged_FiredOnActivate() { bool fired = false; inventory.OnActiveModifiersChanged += _ => fired = true; inventory.AddModifier(CreateTestData()); inventory.TryActivate(inventory.OwnedModifiers[0]); Assert.IsTrue(fired); } } }