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()
{