[Add] Tests summary & fix scene
This commit is contained in:
@@ -15,6 +15,9 @@ namespace YachtDice.Tests
|
||||
_collection = new DiceCollection();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Добавление кости увеличивает размер коллекции.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Add_IncreasesCount()
|
||||
{
|
||||
@@ -25,6 +28,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Повторное добавление кости с тем же ID игнорируется.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Add_DuplicateId_Ignored()
|
||||
{
|
||||
@@ -36,6 +42,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Значение null не добавляется в коллекцию.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Add_Null_Ignored()
|
||||
{
|
||||
@@ -44,6 +53,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Проверка владения по ID возвращает true для добавленной кости.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void OwnsById_ReturnsTrueWhenOwned()
|
||||
{
|
||||
@@ -54,12 +66,18 @@ namespace YachtDice.Tests
|
||||
Assert.IsTrue(_collection.OwnsById("standard_d6"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Проверка владения по ID возвращает false, если кость отсутствует.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void OwnsById_ReturnsFalseWhenNotOwned()
|
||||
{
|
||||
Assert.IsFalse(_collection.OwnsById("standard_d6"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Удаление кости уменьшает размер коллекции.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Remove_DecreasesCount()
|
||||
{
|
||||
@@ -71,6 +89,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Данные сохранения возвращают корректный список ID костей.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetSaveData_ReturnsIds()
|
||||
{
|
||||
@@ -83,6 +104,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual("standard_d6", ids[0]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Загрузка по сохраненным ID восстанавливает кости из каталога.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void LoadSaveData_RestoresDice()
|
||||
{
|
||||
@@ -96,6 +120,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual("standard_d6", _collection.OwnedDice[0].Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// При загрузке отсутствующие в каталоге ID пропускаются.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void LoadSaveData_SkipsMissingIds()
|
||||
{
|
||||
@@ -107,6 +134,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Очистка коллекции удаляет все кости.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Clear_RemovesAll()
|
||||
{
|
||||
@@ -118,6 +148,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _collection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// При добавлении кости вызывается событие изменения коллекции.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Add_FiresOnChanged()
|
||||
{
|
||||
|
||||
@@ -24,6 +24,9 @@ namespace YachtDice.Tests
|
||||
hasLimitedUses: hasLimitedUses, maxUses: maxUses);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Добавление модификатора увеличивает количество элементов в инвентаре.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddModifier_IncreasesCount()
|
||||
{
|
||||
@@ -32,6 +35,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Активация модификатора проходит успешно, если есть свободные слоты.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryActivate_SucceedsWithinSlotLimit()
|
||||
{
|
||||
@@ -45,6 +51,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _inventory.ActiveCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Активация не выполняется, когда лимит активных слотов исчерпан.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryActivate_FailsWhenSlotsFull()
|
||||
{
|
||||
@@ -63,6 +72,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(3, _inventory.ActiveCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Деактивация модификатора освобождает активный слот.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Deactivate_FreesSlot()
|
||||
{
|
||||
@@ -76,6 +88,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _inventory.ActiveCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Удаление модификатора снимает его активность и убирает из инвентаря.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void RemoveModifier_DeactivatesAndRemoves()
|
||||
{
|
||||
@@ -89,6 +104,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _inventory.ActiveCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Расход использования уменьшает число оставшихся зарядов активного модификатора.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ConsumeUseOnActive_DecrementsUses()
|
||||
{
|
||||
@@ -101,6 +119,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(2, mod.RemainingUses);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Модификатор удаляется из инвентаря после расхода последнего заряда.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ConsumeUseOnActive_RemovesExpired()
|
||||
{
|
||||
@@ -113,6 +134,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Постоянные модификаторы не расходуют заряды при использовании.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ConsumeUseOnActive_IgnoresPermanent()
|
||||
{
|
||||
@@ -126,6 +150,9 @@ namespace YachtDice.Tests
|
||||
Assert.IsTrue(mod.IsActive);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Список активных определений содержит только активированные модификаторы.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetActiveModifierDefinitions_ReturnsOnlyActive()
|
||||
{
|
||||
@@ -138,6 +165,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, active.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Изменение максимума активных слотов позволяет расширить лимит.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SetMaxActiveSlots_AllowsExpansion()
|
||||
{
|
||||
@@ -146,6 +176,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(10, _inventory.MaxActiveSlots);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Событие изменения активных модификаторов срабатывает при активации.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void OnActiveModifiersChanged_FiredOnActivate()
|
||||
{
|
||||
|
||||
@@ -98,6 +98,9 @@ namespace YachtDice.Tests
|
||||
_createdAssets.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Предпросмотр очков не расходует заряды ограниченного модификатора.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void PreviewScore_DoesNotConsumeCharges()
|
||||
{
|
||||
@@ -109,6 +112,9 @@ namespace YachtDice.Tests
|
||||
Assert.IsTrue(_instance.IsActive);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Подтверждение категории расходует ровно один заряд модификатора.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_ConsumesExactlyOneCharge()
|
||||
{
|
||||
@@ -118,6 +124,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _registry.All.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Модификатор удаляется из реестра после полного исчерпания зарядов.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_RemovesModifier_WhenChargesExhausted()
|
||||
{
|
||||
|
||||
@@ -42,6 +42,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── AddPerDiceEffect ─────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Эффект добавляет бонус за каждую кость с целевым значением.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddPerDiceEffect_CountsMatchingDice()
|
||||
{
|
||||
@@ -54,6 +57,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(30, ctx.FlatBonus); // 10 * 3 matching dice
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// При целевом значении 0 бонус начисляется за все кости.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddPerDiceEffect_ZeroTarget_CountsAllDice()
|
||||
{
|
||||
@@ -66,6 +72,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(10, ctx.FlatBonus); // 2 * 5 dice
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// При отсутствии совпадений по значению бонус остается нулевым.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddPerDiceEffect_NoMatches_ZeroBonus()
|
||||
{
|
||||
@@ -78,6 +87,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, ctx.FlatBonus);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Бонус AddPerDice масштабируется количеством стаков модификатора.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddPerDiceEffect_ScalesWithStacks()
|
||||
{
|
||||
@@ -93,6 +105,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── AddFlatScoreEffect ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Эффект AddFlatScore добавляет фиксированный бонус к очкам.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddFlatScoreEffect_AddsFlat()
|
||||
{
|
||||
@@ -105,6 +120,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(15, ctx.FlatBonus);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Фиксированный бонус AddFlatScore масштабируется стаками.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddFlatScoreEffect_ScalesWithStacks()
|
||||
{
|
||||
@@ -120,6 +138,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── MultiplyPerDiceEffect ────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// MultiplyPerDice увеличивает множитель за каждое совпадение по кости.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void MultiplyPerDiceEffect_MultipliesPerMatch()
|
||||
{
|
||||
@@ -132,6 +153,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(8f, ctx.Multiplier, 0.001f); // 1 * 2 * 2 * 2 = 8
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Без совпадений MultiplyPerDice не изменяет множитель.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void MultiplyPerDiceEffect_NoMatches_MultiplierUnchanged()
|
||||
{
|
||||
@@ -146,6 +170,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── MultiplyScoreEffect ─────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// MultiplyScore применяет заданный множитель один раз.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void MultiplyScoreEffect_MultipliesOnce()
|
||||
{
|
||||
@@ -158,6 +185,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1.5f, ctx.Multiplier, 0.001f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MultiplyScore масштабирует множитель в зависимости от стаков.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void MultiplyScoreEffect_ScalesWithStacks()
|
||||
{
|
||||
@@ -174,6 +204,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── PostMultiplyEffect ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// PostMultiply изменяет пост-множитель контекста.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void PostMultiplyEffect_MultipliesPostMultiplier()
|
||||
{
|
||||
@@ -188,6 +221,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── AddCurrencyEffect ───────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// AddCurrency увеличивает дельту валюты в контексте.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddCurrencyEffect_AddsToCurrencyDelta()
|
||||
{
|
||||
@@ -200,6 +236,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(25, ctx.CurrencyDelta);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Эффект добавления валюты масштабируется стаками.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void AddCurrencyEffect_ScalesWithStacks()
|
||||
{
|
||||
@@ -215,6 +254,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── ConsumeChargeEffect ─────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// ConsumeCharge уменьшает число оставшихся использований ограниченного модификатора.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ConsumeChargeEffect_DecrementsRemainingUses()
|
||||
{
|
||||
@@ -229,6 +271,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(2, inst.RemainingUses);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Постоянный модификатор игнорирует расход зарядов.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ConsumeChargeEffect_IgnoresPermanent()
|
||||
{
|
||||
@@ -243,6 +288,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── FinalScore Integration ──────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Финальный счет корректно учитывает базу, бонус и множители.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void FinalScore_CombinesBaseAndFlatAndMultiplier()
|
||||
{
|
||||
|
||||
@@ -80,6 +80,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Phase Ordering ──────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Аддитивные эффекты применяются раньше мультипликативных.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_AdditiveBeforeMultiplicative()
|
||||
{
|
||||
@@ -101,6 +104,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(60, result.FinalScore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Пост-мультипликативная фаза выполняется после мультипликативной.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_PostMultiplicativeAfterMultiplicative()
|
||||
{
|
||||
@@ -124,6 +130,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Condition Filtering ─────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Эффект пропускается, если условие модификатора не выполнено.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_ConditionFails_SkipsEffect()
|
||||
{
|
||||
@@ -144,6 +153,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(5, result.FinalScore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Эффект применяется, когда условие модификатора выполняется.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_ConditionPasses_AppliesEffect()
|
||||
{
|
||||
@@ -165,6 +177,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Trigger Filtering ───────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Модификатор пропускается при несовпадении триггера события.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_WrongTrigger_SkipsModifier()
|
||||
{
|
||||
@@ -183,6 +198,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Multiple Modifiers ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Несколько модификаторов применяются в правильном порядке фаз и приоритетов.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_MultipleModifiers_CorrectOrder()
|
||||
{
|
||||
@@ -215,6 +233,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Empty / Null Cases ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// При отсутствии активных модификаторов результат не изменяется.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_NoActiveModifiers_NoChange()
|
||||
{
|
||||
@@ -226,6 +247,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1f, result.Multiplier);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Неактивный модификатор не влияет на вычисление результата.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_InactiveModifier_Skipped()
|
||||
{
|
||||
@@ -244,6 +268,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Side Effects ────────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Побочные эффекты выполняются в фазе SideEffect и сохраняют корректный результат.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_SideEffectsInSideEffectPhase()
|
||||
{
|
||||
@@ -265,6 +292,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Tracing ─────────────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// При включенном трейсинге pipeline наполняет отладочный лог.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_TracingEnabled_PopulatesDebugLog()
|
||||
{
|
||||
@@ -285,6 +315,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── DiceValue Condition ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Условие по значению костей срабатывает только при достижении нужного количества совпадений.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_DiceValueCondition_OnlyTriggersOnMatch()
|
||||
{
|
||||
@@ -312,6 +345,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── MinScore Condition ──────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Условие минимального базового счета работает ниже и на пороговом значении.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Execute_MinScoreCondition_ThresholdWorks()
|
||||
{
|
||||
@@ -339,6 +375,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── ToScoreResult ───────────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Преобразование контекста в ScoreResult корректно переносит все поля.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ToScoreResult_ConvertsCorrectly()
|
||||
{
|
||||
|
||||
@@ -20,6 +20,9 @@ namespace YachtDice.Tests
|
||||
SaveSystem.Delete();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Сохранение и последующая загрузка сохраняют валюту и модификаторы без потерь.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SaveAndLoad_RoundTrip_PreservesData()
|
||||
{
|
||||
@@ -45,6 +48,9 @@ namespace YachtDice.Tests
|
||||
Assert.IsFalse(loaded.ownedModifiers[1].isActive);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// При отсутствии ключа сохранения возвращаются значения по умолчанию.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Load_MissingKey_ReturnsDefault()
|
||||
{
|
||||
@@ -55,12 +61,18 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, loaded.ownedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Метод HasSave возвращает false, когда сохранение отсутствует.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void HasSave_ReturnsFalseWhenEmpty()
|
||||
{
|
||||
Assert.IsFalse(SaveSystem.HasSave());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// После сохранения метод HasSave возвращает true.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void HasSave_ReturnsTrueAfterSave()
|
||||
{
|
||||
@@ -69,6 +81,9 @@ namespace YachtDice.Tests
|
||||
Assert.IsTrue(SaveSystem.HasSave());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Удаление сохранения убирает данные из хранилища.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Delete_RemovesSaveData()
|
||||
{
|
||||
@@ -78,6 +93,9 @@ namespace YachtDice.Tests
|
||||
Assert.IsFalse(SaveSystem.HasSave());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Поврежденный JSON при загрузке безопасно заменяется данными по умолчанию.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Load_CorruptJson_ReturnsDefault()
|
||||
{
|
||||
@@ -90,6 +108,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, loaded.currency);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Сохранение и загрузка корректно сохраняют список ID костей.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SaveAndLoad_RoundTrip_PreservesDiceIds()
|
||||
{
|
||||
|
||||
@@ -66,6 +66,9 @@ namespace YachtDice.Tests
|
||||
_createdAssets.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Валютный модификатор увеличивает баланс и вызывает событие изменения баланса.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_WithCurrencyModifier_AddsCurrencyAndFiresBalanceChanged()
|
||||
{
|
||||
|
||||
@@ -60,6 +60,9 @@ namespace YachtDice.Tests
|
||||
return dice;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Без модификаторов результат равен базовому расчету категории.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_WithNoModifiers_CalculatesBaseOnly()
|
||||
{
|
||||
@@ -73,6 +76,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(50, result.FinalScore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Подтверждение категории вызывает событие с корректной категорией и результатом.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_FiresOnCategoryConfirmed()
|
||||
{
|
||||
@@ -93,6 +99,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(5, firedResult.baseScore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Повторное подтверждение уже использованной категории вызывает исключение.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ScoreCategory_PreventsDuplicateCategory()
|
||||
{
|
||||
@@ -104,6 +113,9 @@ namespace YachtDice.Tests
|
||||
system.ScoreCategory(dice, _chanceCategory));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Предпросмотр без модификаторов возвращает только базовый счет.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void PreviewScore_WithNoModifiers_CalculatesBaseOnly()
|
||||
{
|
||||
@@ -116,6 +128,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(15, result.FinalScore);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Общий счет суммирует результаты всех подтвержденных категорий.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TotalScore_SumsAllScoredCategories()
|
||||
{
|
||||
@@ -126,6 +141,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(15, system.TotalScore); // 5 + 10
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Сброс карточки очищает счет и отметки использованных категорий.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ResetScorecard_ClearsAll()
|
||||
{
|
||||
@@ -140,6 +158,9 @@ namespace YachtDice.Tests
|
||||
|
||||
// ── Category SO Unit Tests ──────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Категория суммы значения корректно складывает подходящие кости.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SumOfValueCategory_SumsCorrectly()
|
||||
{
|
||||
@@ -151,6 +172,9 @@ namespace YachtDice.Tests
|
||||
Object.DestroyImmediate(cat);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// N-of-a-kind возвращает сумму костей при совпадении и ноль при его отсутствии.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void NOfAKindCategory_ThreeOfAKind_ReturnsSumOrZero()
|
||||
{
|
||||
@@ -162,6 +186,9 @@ namespace YachtDice.Tests
|
||||
Object.DestroyImmediate(cat);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Категория яхты возвращает фиксированный счет только при пяти одинаковых костях.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void NOfAKindCategory_Yacht_ReturnsFixedScore()
|
||||
{
|
||||
@@ -169,6 +196,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _yachtCategory.Calculate(CreateDice(6, 6, 6, 6, 1)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Категория фулл-хауса корректно определяет валидную комбинацию.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void FullHouseCategory_CalculatesCorrectly()
|
||||
{
|
||||
@@ -180,6 +210,9 @@ namespace YachtDice.Tests
|
||||
Object.DestroyImmediate(cat);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Малый стрит распознается и оценивается корректно.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void StraightCategory_SmallStraight()
|
||||
{
|
||||
@@ -191,6 +224,9 @@ namespace YachtDice.Tests
|
||||
Object.DestroyImmediate(cat);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Большой стрит распознается на обеих валидных последовательностях.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void StraightCategory_LargeStraight()
|
||||
{
|
||||
@@ -203,6 +239,9 @@ namespace YachtDice.Tests
|
||||
Object.DestroyImmediate(cat);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Категория шанса суммирует значения всех костей.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SumAllCategory_SumsEverything()
|
||||
{
|
||||
|
||||
@@ -47,6 +47,9 @@ namespace YachtDice.Tests
|
||||
shopPrice: shopPrice, sellPrice: sellPrice);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Покупка проходит успешно при достаточном балансе.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_SucceedsWithSufficientCurrency()
|
||||
{
|
||||
@@ -59,6 +62,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Покупка отклоняется при нехватке валюты.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_FailsWhenBroke()
|
||||
{
|
||||
@@ -72,6 +78,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(0, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Постоянный модификатор нельзя приобрести повторно.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_PermanentCannotBeBoughtTwice()
|
||||
{
|
||||
@@ -85,6 +94,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ограниченный модификатор можно купить несколько раз.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_LimitedCanBeReBought()
|
||||
{
|
||||
@@ -98,6 +110,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(2, _inventory.OwnedModifiers.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Успешная покупка вызывает событие OnItemPurchased.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_FiresPurchaseEvent()
|
||||
{
|
||||
@@ -112,6 +127,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual("test", purchased.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Товар имеет состояние Available, когда его можно позволить себе купить.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetItemState_Available_WhenCanAfford()
|
||||
{
|
||||
@@ -120,6 +138,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(ShopItemState.Available, _shop.GetItemState(mod));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Товар имеет состояние TooExpensive при недостатке валюты.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetItemState_TooExpensive_WhenCannotAfford()
|
||||
{
|
||||
@@ -129,6 +150,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(ShopItemState.TooExpensive, _shop.GetItemState(mod));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// После покупки постоянного модификатора его состояние становится Owned.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetItemState_Owned_WhenPermanentPurchased()
|
||||
{
|
||||
@@ -139,6 +163,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(ShopItemState.Owned, _shop.GetItemState(mod));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Покупка кости добавляет ее в коллекцию игрока.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_DiceItem_AddsToDiceCollection()
|
||||
{
|
||||
@@ -151,6 +178,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _diceCollection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Одну и ту же кость нельзя купить повторно.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TryPurchase_DiceItem_CannotBeBoughtTwice()
|
||||
{
|
||||
@@ -164,6 +194,9 @@ namespace YachtDice.Tests
|
||||
Assert.AreEqual(1, _diceCollection.OwnedDice.Count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// После покупки кость отображается в магазине как Owned.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetItemState_Dice_Owned_AfterPurchase()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user