using NUnit.Framework; using UnityEngine; using YachtDice.Economy; using YachtDice.Inventory; using YachtDice.Shop; using YachtDice.Modifiers; namespace YachtDice.Tests { public sealed class ShopModelTests { private CurrencyBank bank; private InventoryModel inventory; private ShopModel shop; [SetUp] public void SetUp() { var go = new GameObject("Bank"); bank = go.AddComponent(); bank.SetBalance(500); inventory = new InventoryModel(5); shop = new ShopModel(bank, inventory); } [TearDown] public void TearDown() { foreach (var go in Object.FindObjectsByType(FindObjectsSortMode.None)) Object.DestroyImmediate(go.gameObject); } [Test] public void TryPurchase_SucceedsWithSufficientCurrency() { var mod = ModifierData.CreateForTest("test", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, shopPrice: 100); bool result = shop.TryPurchase(mod); Assert.IsTrue(result); Assert.AreEqual(400, bank.Balance); Assert.AreEqual(1, inventory.OwnedModifiers.Count); } [Test] public void TryPurchase_FailsWhenBroke() { bank.SetBalance(10); var mod = ModifierData.CreateForTest("test", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, shopPrice: 100); bool result = shop.TryPurchase(mod); Assert.IsFalse(result); Assert.AreEqual(10, bank.Balance); Assert.AreEqual(0, inventory.OwnedModifiers.Count); } [Test] public void TryPurchase_PermanentCannotBeBoughtTwice() { var mod = ModifierData.CreateForTest("perm", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, durability: ModifierDurability.Permanent, shopPrice: 100); shop.TryPurchase(mod); bool secondResult = shop.TryPurchase(mod); Assert.IsFalse(secondResult); Assert.AreEqual(400, bank.Balance); Assert.AreEqual(1, inventory.OwnedModifiers.Count); } [Test] public void TryPurchase_LimitedCanBeReBought() { var mod = ModifierData.CreateForTest("limited", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, durability: ModifierDurability.LimitedUses, maxUses: 3, shopPrice: 100); shop.TryPurchase(mod); bool secondResult = shop.TryPurchase(mod); Assert.IsTrue(secondResult); Assert.AreEqual(300, bank.Balance); Assert.AreEqual(2, inventory.OwnedModifiers.Count); } [Test] public void TryPurchase_FiresPurchaseEvent() { ModifierData purchased = null; shop.OnItemPurchased += data => purchased = data; var mod = ModifierData.CreateForTest("test", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, shopPrice: 100); shop.TryPurchase(mod); Assert.IsNotNull(purchased); Assert.AreEqual("test", purchased.Id); } [Test] public void GetItemState_Available_WhenCanAfford() { var mod = ModifierData.CreateForTest("test", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, shopPrice: 100); Assert.AreEqual(ShopItemState.Available, shop.GetItemState(mod)); } [Test] public void GetItemState_TooExpensive_WhenCannotAfford() { bank.SetBalance(10); var mod = ModifierData.CreateForTest("test", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, shopPrice: 100); Assert.AreEqual(ShopItemState.TooExpensive, shop.GetItemState(mod)); } [Test] public void GetItemState_Owned_WhenPermanentPurchased() { var mod = ModifierData.CreateForTest("perm", ModifierScope.SelectedCategory, ModifierEffectType.AddFlatToFinalScore, 10f, durability: ModifierDurability.Permanent, shopPrice: 100); shop.TryPurchase(mod); Assert.AreEqual(ShopItemState.Owned, shop.GetItemState(mod)); } } }