From 9580d76a53b7b05570f74c69d86fda554d1c72b3 Mon Sep 17 00:00:00 2001 From: Konstantin Dyachenko Date: Thu, 5 Mar 2026 10:21:05 +0700 Subject: [PATCH] [Add] Tests summary & fix scene --- Assets/Scenes/Scene.unity | 208 ++++++++++++++++++ .../Tests/Editor/DiceCollectionTests.cs | 33 +++ .../Tests/Editor/InventoryModelTests.cs | 33 +++ .../Editor/LimitedUseModifierFlowTests.cs | 9 + .../Tests/Editor/ModifierEffectTests.cs | 48 ++++ .../Tests/Editor/ModifierPipelineTests.cs | 39 ++++ .../Scripts/Tests/Editor/SaveSystemTests.cs | 21 ++ .../Editor/ScoringCurrencyIntegrationTests.cs | 3 + .../Tests/Editor/ScoringSystemTests.cs | 39 ++++ Assets/Scripts/Tests/Editor/ShopModelTests.cs | 33 +++ 10 files changed, 466 insertions(+) diff --git a/Assets/Scenes/Scene.unity b/Assets/Scenes/Scene.unity index 16918f5..6d6ea84 100644 --- a/Assets/Scenes/Scene.unity +++ b/Assets/Scenes/Scene.unity @@ -2284,6 +2284,166 @@ PrefabInstance: propertyPath: m_Name value: Score Card View objectReference: {fileID: 0} + - target: {fileID: 1670845647064153198, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1670845647064153198, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1670845647064153198, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1670845647064153198, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2474415673325444637, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2474415673325444637, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2474415673325444637, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2474415673325444637, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2731857693459813700, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2731857693459813700, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2731857693459813700, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2731857693459813700, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3331969014930894174, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3331969014930894174, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3331969014930894174, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3331969014930894174, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3950255194373208560, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3950255194373208560, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3950255194373208560, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3950255194373208560, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4391806977592397240, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4391806977592397240, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4391806977592397240, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4391806977592397240, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4511202064335526936, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4511202064335526936, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4511202064335526936, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4511202064335526936, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4757056082203798196, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4757056082203798196, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4757056082203798196, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4757056082203798196, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5951707766708524067, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5951707766708524067, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5951707766708524067, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5951707766708524067, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5956186723772896343, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5956186723772896343, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5956186723772896343, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5956186723772896343, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 6800447213512243019, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -2364,6 +2524,54 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 7290283509850403880, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7290283509850403880, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7290283509850403880, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7290283509850403880, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7455454773250163354, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7455454773250163354, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7455454773250163354, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7455454773250163354, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8016417439116995410, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8016417439116995410, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8016417439116995410, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8016417439116995410, guid: 04eac8e387d29ca4a8f4d5693c6b0167, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/Scripts/Tests/Editor/DiceCollectionTests.cs b/Assets/Scripts/Tests/Editor/DiceCollectionTests.cs index aae3750..4bbebd7 100644 --- a/Assets/Scripts/Tests/Editor/DiceCollectionTests.cs +++ b/Assets/Scripts/Tests/Editor/DiceCollectionTests.cs @@ -15,6 +15,9 @@ namespace YachtDice.Tests _collection = new DiceCollection(); } + /// + /// Добавление кости увеличивает размер коллекции. + /// [Test] public void Add_IncreasesCount() { @@ -25,6 +28,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _collection.OwnedDice.Count); } + /// + /// Повторное добавление кости с тем же ID игнорируется. + /// [Test] public void Add_DuplicateId_Ignored() { @@ -36,6 +42,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _collection.OwnedDice.Count); } + /// + /// Значение null не добавляется в коллекцию. + /// [Test] public void Add_Null_Ignored() { @@ -44,6 +53,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _collection.OwnedDice.Count); } + /// + /// Проверка владения по ID возвращает true для добавленной кости. + /// [Test] public void OwnsById_ReturnsTrueWhenOwned() { @@ -54,12 +66,18 @@ namespace YachtDice.Tests Assert.IsTrue(_collection.OwnsById("standard_d6")); } + /// + /// Проверка владения по ID возвращает false, если кость отсутствует. + /// [Test] public void OwnsById_ReturnsFalseWhenNotOwned() { Assert.IsFalse(_collection.OwnsById("standard_d6")); } + /// + /// Удаление кости уменьшает размер коллекции. + /// [Test] public void Remove_DecreasesCount() { @@ -71,6 +89,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _collection.OwnedDice.Count); } + /// + /// Данные сохранения возвращают корректный список ID костей. + /// [Test] public void GetSaveData_ReturnsIds() { @@ -83,6 +104,9 @@ namespace YachtDice.Tests Assert.AreEqual("standard_d6", ids[0]); } + /// + /// Загрузка по сохраненным ID восстанавливает кости из каталога. + /// [Test] public void LoadSaveData_RestoresDice() { @@ -96,6 +120,9 @@ namespace YachtDice.Tests Assert.AreEqual("standard_d6", _collection.OwnedDice[0].Id); } + /// + /// При загрузке отсутствующие в каталоге ID пропускаются. + /// [Test] public void LoadSaveData_SkipsMissingIds() { @@ -107,6 +134,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _collection.OwnedDice.Count); } + /// + /// Очистка коллекции удаляет все кости. + /// [Test] public void Clear_RemovesAll() { @@ -118,6 +148,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _collection.OwnedDice.Count); } + /// + /// При добавлении кости вызывается событие изменения коллекции. + /// [Test] public void Add_FiresOnChanged() { diff --git a/Assets/Scripts/Tests/Editor/InventoryModelTests.cs b/Assets/Scripts/Tests/Editor/InventoryModelTests.cs index d1d0348..52ca6c0 100644 --- a/Assets/Scripts/Tests/Editor/InventoryModelTests.cs +++ b/Assets/Scripts/Tests/Editor/InventoryModelTests.cs @@ -24,6 +24,9 @@ namespace YachtDice.Tests hasLimitedUses: hasLimitedUses, maxUses: maxUses); } + /// + /// Добавление модификатора увеличивает количество элементов в инвентаре. + /// [Test] public void AddModifier_IncreasesCount() { @@ -32,6 +35,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _inventory.OwnedModifiers.Count); } + /// + /// Активация модификатора проходит успешно, если есть свободные слоты. + /// [Test] public void TryActivate_SucceedsWithinSlotLimit() { @@ -45,6 +51,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _inventory.ActiveCount); } + /// + /// Активация не выполняется, когда лимит активных слотов исчерпан. + /// [Test] public void TryActivate_FailsWhenSlotsFull() { @@ -63,6 +72,9 @@ namespace YachtDice.Tests Assert.AreEqual(3, _inventory.ActiveCount); } + /// + /// Деактивация модификатора освобождает активный слот. + /// [Test] public void Deactivate_FreesSlot() { @@ -76,6 +88,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _inventory.ActiveCount); } + /// + /// Удаление модификатора снимает его активность и убирает из инвентаря. + /// [Test] public void RemoveModifier_DeactivatesAndRemoves() { @@ -89,6 +104,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _inventory.ActiveCount); } + /// + /// Расход использования уменьшает число оставшихся зарядов активного модификатора. + /// [Test] public void ConsumeUseOnActive_DecrementsUses() { @@ -101,6 +119,9 @@ namespace YachtDice.Tests Assert.AreEqual(2, mod.RemainingUses); } + /// + /// Модификатор удаляется из инвентаря после расхода последнего заряда. + /// [Test] public void ConsumeUseOnActive_RemovesExpired() { @@ -113,6 +134,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _inventory.OwnedModifiers.Count); } + /// + /// Постоянные модификаторы не расходуют заряды при использовании. + /// [Test] public void ConsumeUseOnActive_IgnoresPermanent() { @@ -126,6 +150,9 @@ namespace YachtDice.Tests Assert.IsTrue(mod.IsActive); } + /// + /// Список активных определений содержит только активированные модификаторы. + /// [Test] public void GetActiveModifierDefinitions_ReturnsOnlyActive() { @@ -138,6 +165,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, active.Count); } + /// + /// Изменение максимума активных слотов позволяет расширить лимит. + /// [Test] public void SetMaxActiveSlots_AllowsExpansion() { @@ -146,6 +176,9 @@ namespace YachtDice.Tests Assert.AreEqual(10, _inventory.MaxActiveSlots); } + /// + /// Событие изменения активных модификаторов срабатывает при активации. + /// [Test] public void OnActiveModifiersChanged_FiredOnActivate() { diff --git a/Assets/Scripts/Tests/Editor/LimitedUseModifierFlowTests.cs b/Assets/Scripts/Tests/Editor/LimitedUseModifierFlowTests.cs index b457fc7..4c472bb 100644 --- a/Assets/Scripts/Tests/Editor/LimitedUseModifierFlowTests.cs +++ b/Assets/Scripts/Tests/Editor/LimitedUseModifierFlowTests.cs @@ -98,6 +98,9 @@ namespace YachtDice.Tests _createdAssets.Clear(); } + /// + /// Предпросмотр очков не расходует заряды ограниченного модификатора. + /// [Test] public void PreviewScore_DoesNotConsumeCharges() { @@ -109,6 +112,9 @@ namespace YachtDice.Tests Assert.IsTrue(_instance.IsActive); } + /// + /// Подтверждение категории расходует ровно один заряд модификатора. + /// [Test] public void ScoreCategory_ConsumesExactlyOneCharge() { @@ -118,6 +124,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _registry.All.Count); } + /// + /// Модификатор удаляется из реестра после полного исчерпания зарядов. + /// [Test] public void ScoreCategory_RemovesModifier_WhenChargesExhausted() { diff --git a/Assets/Scripts/Tests/Editor/ModifierEffectTests.cs b/Assets/Scripts/Tests/Editor/ModifierEffectTests.cs index 8d92f8b..cde3606 100644 --- a/Assets/Scripts/Tests/Editor/ModifierEffectTests.cs +++ b/Assets/Scripts/Tests/Editor/ModifierEffectTests.cs @@ -42,6 +42,9 @@ namespace YachtDice.Tests // ── AddPerDiceEffect ───────────────────────────────────────── + /// + /// Эффект добавляет бонус за каждую кость с целевым значением. + /// [Test] public void AddPerDiceEffect_CountsMatchingDice() { @@ -54,6 +57,9 @@ namespace YachtDice.Tests Assert.AreEqual(30, ctx.FlatBonus); // 10 * 3 matching dice } + /// + /// При целевом значении 0 бонус начисляется за все кости. + /// [Test] public void AddPerDiceEffect_ZeroTarget_CountsAllDice() { @@ -66,6 +72,9 @@ namespace YachtDice.Tests Assert.AreEqual(10, ctx.FlatBonus); // 2 * 5 dice } + /// + /// При отсутствии совпадений по значению бонус остается нулевым. + /// [Test] public void AddPerDiceEffect_NoMatches_ZeroBonus() { @@ -78,6 +87,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, ctx.FlatBonus); } + /// + /// Бонус AddPerDice масштабируется количеством стаков модификатора. + /// [Test] public void AddPerDiceEffect_ScalesWithStacks() { @@ -93,6 +105,9 @@ namespace YachtDice.Tests // ── AddFlatScoreEffect ────────────────────────────────────── + /// + /// Эффект AddFlatScore добавляет фиксированный бонус к очкам. + /// [Test] public void AddFlatScoreEffect_AddsFlat() { @@ -105,6 +120,9 @@ namespace YachtDice.Tests Assert.AreEqual(15, ctx.FlatBonus); } + /// + /// Фиксированный бонус AddFlatScore масштабируется стаками. + /// [Test] public void AddFlatScoreEffect_ScalesWithStacks() { @@ -120,6 +138,9 @@ namespace YachtDice.Tests // ── MultiplyPerDiceEffect ──────────────────────────────────── + /// + /// MultiplyPerDice увеличивает множитель за каждое совпадение по кости. + /// [Test] public void MultiplyPerDiceEffect_MultipliesPerMatch() { @@ -132,6 +153,9 @@ namespace YachtDice.Tests Assert.AreEqual(8f, ctx.Multiplier, 0.001f); // 1 * 2 * 2 * 2 = 8 } + /// + /// Без совпадений MultiplyPerDice не изменяет множитель. + /// [Test] public void MultiplyPerDiceEffect_NoMatches_MultiplierUnchanged() { @@ -146,6 +170,9 @@ namespace YachtDice.Tests // ── MultiplyScoreEffect ───────────────────────────────────── + /// + /// MultiplyScore применяет заданный множитель один раз. + /// [Test] public void MultiplyScoreEffect_MultipliesOnce() { @@ -158,6 +185,9 @@ namespace YachtDice.Tests Assert.AreEqual(1.5f, ctx.Multiplier, 0.001f); } + /// + /// MultiplyScore масштабирует множитель в зависимости от стаков. + /// [Test] public void MultiplyScoreEffect_ScalesWithStacks() { @@ -174,6 +204,9 @@ namespace YachtDice.Tests // ── PostMultiplyEffect ────────────────────────────────────── + /// + /// PostMultiply изменяет пост-множитель контекста. + /// [Test] public void PostMultiplyEffect_MultipliesPostMultiplier() { @@ -188,6 +221,9 @@ namespace YachtDice.Tests // ── AddCurrencyEffect ─────────────────────────────────────── + /// + /// AddCurrency увеличивает дельту валюты в контексте. + /// [Test] public void AddCurrencyEffect_AddsToCurrencyDelta() { @@ -200,6 +236,9 @@ namespace YachtDice.Tests Assert.AreEqual(25, ctx.CurrencyDelta); } + /// + /// Эффект добавления валюты масштабируется стаками. + /// [Test] public void AddCurrencyEffect_ScalesWithStacks() { @@ -215,6 +254,9 @@ namespace YachtDice.Tests // ── ConsumeChargeEffect ───────────────────────────────────── + /// + /// ConsumeCharge уменьшает число оставшихся использований ограниченного модификатора. + /// [Test] public void ConsumeChargeEffect_DecrementsRemainingUses() { @@ -229,6 +271,9 @@ namespace YachtDice.Tests Assert.AreEqual(2, inst.RemainingUses); } + /// + /// Постоянный модификатор игнорирует расход зарядов. + /// [Test] public void ConsumeChargeEffect_IgnoresPermanent() { @@ -243,6 +288,9 @@ namespace YachtDice.Tests // ── FinalScore Integration ────────────────────────────────── + /// + /// Финальный счет корректно учитывает базу, бонус и множители. + /// [Test] public void FinalScore_CombinesBaseAndFlatAndMultiplier() { diff --git a/Assets/Scripts/Tests/Editor/ModifierPipelineTests.cs b/Assets/Scripts/Tests/Editor/ModifierPipelineTests.cs index e54ea90..d23a1a7 100644 --- a/Assets/Scripts/Tests/Editor/ModifierPipelineTests.cs +++ b/Assets/Scripts/Tests/Editor/ModifierPipelineTests.cs @@ -80,6 +80,9 @@ namespace YachtDice.Tests // ── Phase Ordering ────────────────────────────────────────── + /// + /// Аддитивные эффекты применяются раньше мультипликативных. + /// [Test] public void Execute_AdditiveBeforeMultiplicative() { @@ -101,6 +104,9 @@ namespace YachtDice.Tests Assert.AreEqual(60, result.FinalScore); } + /// + /// Пост-мультипликативная фаза выполняется после мультипликативной. + /// [Test] public void Execute_PostMultiplicativeAfterMultiplicative() { @@ -124,6 +130,9 @@ namespace YachtDice.Tests // ── Condition Filtering ───────────────────────────────────── + /// + /// Эффект пропускается, если условие модификатора не выполнено. + /// [Test] public void Execute_ConditionFails_SkipsEffect() { @@ -144,6 +153,9 @@ namespace YachtDice.Tests Assert.AreEqual(5, result.FinalScore); } + /// + /// Эффект применяется, когда условие модификатора выполняется. + /// [Test] public void Execute_ConditionPasses_AppliesEffect() { @@ -165,6 +177,9 @@ namespace YachtDice.Tests // ── Trigger Filtering ─────────────────────────────────────── + /// + /// Модификатор пропускается при несовпадении триггера события. + /// [Test] public void Execute_WrongTrigger_SkipsModifier() { @@ -183,6 +198,9 @@ namespace YachtDice.Tests // ── Multiple Modifiers ────────────────────────────────────── + /// + /// Несколько модификаторов применяются в правильном порядке фаз и приоритетов. + /// [Test] public void Execute_MultipleModifiers_CorrectOrder() { @@ -215,6 +233,9 @@ namespace YachtDice.Tests // ── Empty / Null Cases ────────────────────────────────────── + /// + /// При отсутствии активных модификаторов результат не изменяется. + /// [Test] public void Execute_NoActiveModifiers_NoChange() { @@ -226,6 +247,9 @@ namespace YachtDice.Tests Assert.AreEqual(1f, result.Multiplier); } + /// + /// Неактивный модификатор не влияет на вычисление результата. + /// [Test] public void Execute_InactiveModifier_Skipped() { @@ -244,6 +268,9 @@ namespace YachtDice.Tests // ── Side Effects ──────────────────────────────────────────── + /// + /// Побочные эффекты выполняются в фазе SideEffect и сохраняют корректный результат. + /// [Test] public void Execute_SideEffectsInSideEffectPhase() { @@ -265,6 +292,9 @@ namespace YachtDice.Tests // ── Tracing ───────────────────────────────────────────────── + /// + /// При включенном трейсинге pipeline наполняет отладочный лог. + /// [Test] public void Execute_TracingEnabled_PopulatesDebugLog() { @@ -285,6 +315,9 @@ namespace YachtDice.Tests // ── DiceValue Condition ────────────────────────────────────── + /// + /// Условие по значению костей срабатывает только при достижении нужного количества совпадений. + /// [Test] public void Execute_DiceValueCondition_OnlyTriggersOnMatch() { @@ -312,6 +345,9 @@ namespace YachtDice.Tests // ── MinScore Condition ────────────────────────────────────── + /// + /// Условие минимального базового счета работает ниже и на пороговом значении. + /// [Test] public void Execute_MinScoreCondition_ThresholdWorks() { @@ -339,6 +375,9 @@ namespace YachtDice.Tests // ── ToScoreResult ─────────────────────────────────────────── + /// + /// Преобразование контекста в ScoreResult корректно переносит все поля. + /// [Test] public void ToScoreResult_ConvertsCorrectly() { diff --git a/Assets/Scripts/Tests/Editor/SaveSystemTests.cs b/Assets/Scripts/Tests/Editor/SaveSystemTests.cs index 1835859..cb4ea09 100644 --- a/Assets/Scripts/Tests/Editor/SaveSystemTests.cs +++ b/Assets/Scripts/Tests/Editor/SaveSystemTests.cs @@ -20,6 +20,9 @@ namespace YachtDice.Tests SaveSystem.Delete(); } + /// + /// Сохранение и последующая загрузка сохраняют валюту и модификаторы без потерь. + /// [Test] public void SaveAndLoad_RoundTrip_PreservesData() { @@ -45,6 +48,9 @@ namespace YachtDice.Tests Assert.IsFalse(loaded.ownedModifiers[1].isActive); } + /// + /// При отсутствии ключа сохранения возвращаются значения по умолчанию. + /// [Test] public void Load_MissingKey_ReturnsDefault() { @@ -55,12 +61,18 @@ namespace YachtDice.Tests Assert.AreEqual(0, loaded.ownedModifiers.Count); } + /// + /// Метод HasSave возвращает false, когда сохранение отсутствует. + /// [Test] public void HasSave_ReturnsFalseWhenEmpty() { Assert.IsFalse(SaveSystem.HasSave()); } + /// + /// После сохранения метод HasSave возвращает true. + /// [Test] public void HasSave_ReturnsTrueAfterSave() { @@ -69,6 +81,9 @@ namespace YachtDice.Tests Assert.IsTrue(SaveSystem.HasSave()); } + /// + /// Удаление сохранения убирает данные из хранилища. + /// [Test] public void Delete_RemovesSaveData() { @@ -78,6 +93,9 @@ namespace YachtDice.Tests Assert.IsFalse(SaveSystem.HasSave()); } + /// + /// Поврежденный JSON при загрузке безопасно заменяется данными по умолчанию. + /// [Test] public void Load_CorruptJson_ReturnsDefault() { @@ -90,6 +108,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, loaded.currency); } + /// + /// Сохранение и загрузка корректно сохраняют список ID костей. + /// [Test] public void SaveAndLoad_RoundTrip_PreservesDiceIds() { diff --git a/Assets/Scripts/Tests/Editor/ScoringCurrencyIntegrationTests.cs b/Assets/Scripts/Tests/Editor/ScoringCurrencyIntegrationTests.cs index 51c6506..4bbeb05 100644 --- a/Assets/Scripts/Tests/Editor/ScoringCurrencyIntegrationTests.cs +++ b/Assets/Scripts/Tests/Editor/ScoringCurrencyIntegrationTests.cs @@ -66,6 +66,9 @@ namespace YachtDice.Tests _createdAssets.Clear(); } + /// + /// Валютный модификатор увеличивает баланс и вызывает событие изменения баланса. + /// [Test] public void ScoreCategory_WithCurrencyModifier_AddsCurrencyAndFiresBalanceChanged() { diff --git a/Assets/Scripts/Tests/Editor/ScoringSystemTests.cs b/Assets/Scripts/Tests/Editor/ScoringSystemTests.cs index 89b1c56..7e1c274 100644 --- a/Assets/Scripts/Tests/Editor/ScoringSystemTests.cs +++ b/Assets/Scripts/Tests/Editor/ScoringSystemTests.cs @@ -60,6 +60,9 @@ namespace YachtDice.Tests return dice; } + /// + /// Без модификаторов результат равен базовому расчету категории. + /// [Test] public void ScoreCategory_WithNoModifiers_CalculatesBaseOnly() { @@ -73,6 +76,9 @@ namespace YachtDice.Tests Assert.AreEqual(50, result.FinalScore); } + /// + /// Подтверждение категории вызывает событие с корректной категорией и результатом. + /// [Test] public void ScoreCategory_FiresOnCategoryConfirmed() { @@ -93,6 +99,9 @@ namespace YachtDice.Tests Assert.AreEqual(5, firedResult.baseScore); } + /// + /// Повторное подтверждение уже использованной категории вызывает исключение. + /// [Test] public void ScoreCategory_PreventsDuplicateCategory() { @@ -104,6 +113,9 @@ namespace YachtDice.Tests system.ScoreCategory(dice, _chanceCategory)); } + /// + /// Предпросмотр без модификаторов возвращает только базовый счет. + /// [Test] public void PreviewScore_WithNoModifiers_CalculatesBaseOnly() { @@ -116,6 +128,9 @@ namespace YachtDice.Tests Assert.AreEqual(15, result.FinalScore); } + /// + /// Общий счет суммирует результаты всех подтвержденных категорий. + /// [Test] public void TotalScore_SumsAllScoredCategories() { @@ -126,6 +141,9 @@ namespace YachtDice.Tests Assert.AreEqual(15, system.TotalScore); // 5 + 10 } + /// + /// Сброс карточки очищает счет и отметки использованных категорий. + /// [Test] public void ResetScorecard_ClearsAll() { @@ -140,6 +158,9 @@ namespace YachtDice.Tests // ── Category SO Unit Tests ────────────────────────────────── + /// + /// Категория суммы значения корректно складывает подходящие кости. + /// [Test] public void SumOfValueCategory_SumsCorrectly() { @@ -151,6 +172,9 @@ namespace YachtDice.Tests Object.DestroyImmediate(cat); } + /// + /// N-of-a-kind возвращает сумму костей при совпадении и ноль при его отсутствии. + /// [Test] public void NOfAKindCategory_ThreeOfAKind_ReturnsSumOrZero() { @@ -162,6 +186,9 @@ namespace YachtDice.Tests Object.DestroyImmediate(cat); } + /// + /// Категория яхты возвращает фиксированный счет только при пяти одинаковых костях. + /// [Test] public void NOfAKindCategory_Yacht_ReturnsFixedScore() { @@ -169,6 +196,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _yachtCategory.Calculate(CreateDice(6, 6, 6, 6, 1))); } + /// + /// Категория фулл-хауса корректно определяет валидную комбинацию. + /// [Test] public void FullHouseCategory_CalculatesCorrectly() { @@ -180,6 +210,9 @@ namespace YachtDice.Tests Object.DestroyImmediate(cat); } + /// + /// Малый стрит распознается и оценивается корректно. + /// [Test] public void StraightCategory_SmallStraight() { @@ -191,6 +224,9 @@ namespace YachtDice.Tests Object.DestroyImmediate(cat); } + /// + /// Большой стрит распознается на обеих валидных последовательностях. + /// [Test] public void StraightCategory_LargeStraight() { @@ -203,6 +239,9 @@ namespace YachtDice.Tests Object.DestroyImmediate(cat); } + /// + /// Категория шанса суммирует значения всех костей. + /// [Test] public void SumAllCategory_SumsEverything() { diff --git a/Assets/Scripts/Tests/Editor/ShopModelTests.cs b/Assets/Scripts/Tests/Editor/ShopModelTests.cs index 2f93555..abcd1c5 100644 --- a/Assets/Scripts/Tests/Editor/ShopModelTests.cs +++ b/Assets/Scripts/Tests/Editor/ShopModelTests.cs @@ -47,6 +47,9 @@ namespace YachtDice.Tests shopPrice: shopPrice, sellPrice: sellPrice); } + /// + /// Покупка проходит успешно при достаточном балансе. + /// [Test] public void TryPurchase_SucceedsWithSufficientCurrency() { @@ -59,6 +62,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _inventory.OwnedModifiers.Count); } + /// + /// Покупка отклоняется при нехватке валюты. + /// [Test] public void TryPurchase_FailsWhenBroke() { @@ -72,6 +78,9 @@ namespace YachtDice.Tests Assert.AreEqual(0, _inventory.OwnedModifiers.Count); } + /// + /// Постоянный модификатор нельзя приобрести повторно. + /// [Test] public void TryPurchase_PermanentCannotBeBoughtTwice() { @@ -85,6 +94,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _inventory.OwnedModifiers.Count); } + /// + /// Ограниченный модификатор можно купить несколько раз. + /// [Test] public void TryPurchase_LimitedCanBeReBought() { @@ -98,6 +110,9 @@ namespace YachtDice.Tests Assert.AreEqual(2, _inventory.OwnedModifiers.Count); } + /// + /// Успешная покупка вызывает событие OnItemPurchased. + /// [Test] public void TryPurchase_FiresPurchaseEvent() { @@ -112,6 +127,9 @@ namespace YachtDice.Tests Assert.AreEqual("test", purchased.Id); } + /// + /// Товар имеет состояние Available, когда его можно позволить себе купить. + /// [Test] public void GetItemState_Available_WhenCanAfford() { @@ -120,6 +138,9 @@ namespace YachtDice.Tests Assert.AreEqual(ShopItemState.Available, _shop.GetItemState(mod)); } + /// + /// Товар имеет состояние TooExpensive при недостатке валюты. + /// [Test] public void GetItemState_TooExpensive_WhenCannotAfford() { @@ -129,6 +150,9 @@ namespace YachtDice.Tests Assert.AreEqual(ShopItemState.TooExpensive, _shop.GetItemState(mod)); } + /// + /// После покупки постоянного модификатора его состояние становится Owned. + /// [Test] public void GetItemState_Owned_WhenPermanentPurchased() { @@ -139,6 +163,9 @@ namespace YachtDice.Tests Assert.AreEqual(ShopItemState.Owned, _shop.GetItemState(mod)); } + /// + /// Покупка кости добавляет ее в коллекцию игрока. + /// [Test] public void TryPurchase_DiceItem_AddsToDiceCollection() { @@ -151,6 +178,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _diceCollection.OwnedDice.Count); } + /// + /// Одну и ту же кость нельзя купить повторно. + /// [Test] public void TryPurchase_DiceItem_CannotBeBoughtTwice() { @@ -164,6 +194,9 @@ namespace YachtDice.Tests Assert.AreEqual(1, _diceCollection.OwnedDice.Count); } + /// + /// После покупки кость отображается в магазине как Owned. + /// [Test] public void GetItemState_Dice_Owned_AfterPurchase() {