[Add] Master Category

This commit is contained in:
2026-03-06 23:29:46 +07:00
parent 9580d76a53
commit 73b941d5eb
42 changed files with 817 additions and 21 deletions
@@ -0,0 +1,153 @@
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using YachtDice.Categories;
using YachtDice.Dice;
using YachtDice.Scoring;
using YachtDice.UI.Presentation;
namespace YachtDice.Tests
{
public class MasterCategoryTests
{
private readonly List<Object> _createdAssets = new();
private DiceDefinition _standardDice;
[SetUp]
public void SetUp()
{
_standardDice = DiceDefinition.CreateForTest<StandardDice>("d6", "d6");
_createdAssets.Add(_standardDice);
}
[TearDown]
public void TearDown()
{
foreach (var scoring in Object.FindObjectsByType<ScoringSystem>(FindObjectsSortMode.None))
Object.DestroyImmediate(scoring.gameObject);
for (var i = 0; i < _createdAssets.Count; i++)
{
if (_createdAssets[i] != null)
Object.DestroyImmediate(_createdAssets[i]);
}
_createdAssets.Clear();
}
private IReadOnlyList<IDice> CreateDice(params int[] values)
{
var dice = new DiceInstance[values.Length];
for (var i = 0; i < values.Length; i++)
dice[i] = new DiceInstance(_standardDice, values[i]);
return dice;
}
[Test]
public void MasterValueCategory_AddsConfiguredBonus_AndKeepsDefaultZero()
{
var withBonus = MasterValueCategory.CreateForTest("ones_bonus", "Единицы", 1, categoryBonus: 1);
var noBonus = MasterValueCategory.CreateForTest("ones_plain", "Единицы", 1);
_createdAssets.Add(withBonus);
_createdAssets.Add(noBonus);
Assert.AreEqual(5, withBonus.Calculate(CreateDice(1, 1, 1, 2, 3, 4)));
Assert.AreEqual(4, noBonus.Calculate(CreateDice(1, 1, 1, 1, 5, 6)));
Assert.AreEqual(0, withBonus.Calculate(CreateDice(2, 2, 3, 4, 5, 6)));
}
[Test]
public void MasterStraightCategory_RequiresExactOneToSix()
{
var category = MasterStraightCategory.CreateForTest("straight", "Стрит", flatBonus: 20);
_createdAssets.Add(category);
Assert.AreEqual(41, category.Calculate(CreateDice(1, 2, 3, 4, 5, 6)));
Assert.AreEqual(0, category.Calculate(CreateDice(1, 2, 3, 4, 5, 5)));
Assert.AreEqual(0, category.Calculate(CreateDice(1, 2, 3, 4, 5, 6, 6)));
}
[Test]
public void MasterGroupedSetsCategory_SmallFullScoresThreePairs()
{
var category = MasterGroupedSetsCategory.CreateForTest("small_full", "Малый фул", 2, 3, flatBonus: 10);
_createdAssets.Add(category);
Assert.AreEqual(40, category.Calculate(CreateDice(4, 4, 5, 5, 6, 6)));
Assert.AreEqual(28, category.Calculate(CreateDice(1, 1, 3, 3, 5, 5)));
Assert.AreEqual(0, category.Calculate(CreateDice(1, 1, 1, 3, 3, 5)));
}
[Test]
public void MasterGroupedSetsCategory_BigFullScoresTwoTriples()
{
var category = MasterGroupedSetsCategory.CreateForTest("big_full", "Большой фул", 3, 2, flatBonus: 10);
_createdAssets.Add(category);
Assert.AreEqual(43, category.Calculate(CreateDice(5, 5, 5, 6, 6, 6)));
Assert.AreEqual(34, category.Calculate(CreateDice(3, 3, 3, 4, 4, 4)));
Assert.AreEqual(0, category.Calculate(CreateDice(5, 5, 5, 6, 6, 1)));
}
[Test]
public void MasterKindCategory_UsesOnlyRequiredGroup()
{
var kare = MasterKindCategory.CreateForTest("kare", "Каре", 4, valueBonusMultiplier: 1);
var poker = MasterKindCategory.CreateForTest("poker", "Покер", 5, valueBonusMultiplier: 2);
var master = MasterKindCategory.CreateForTest("master", "Мастер", 6, valueBonusMultiplier: 3);
_createdAssets.Add(kare);
_createdAssets.Add(poker);
_createdAssets.Add(master);
Assert.AreEqual(30, kare.Calculate(CreateDice(6, 6, 6, 6, 2, 1)));
Assert.AreEqual(42, poker.Calculate(CreateDice(6, 6, 6, 6, 6, 1)));
Assert.AreEqual(54, master.Calculate(CreateDice(6, 6, 6, 6, 6, 6)));
}
[Test]
public void MasterKindCategory_ScalesToMoreDice_AndPicksBestAvailableGroup()
{
var category = MasterKindCategory.CreateForTest("kare", "Каре", 4, valueBonusMultiplier: 1, flatBonus: 3);
_createdAssets.Add(category);
Assert.AreEqual(33, category.Calculate(CreateDice(6, 6, 6, 6, 6, 2, 1, 1)));
Assert.AreEqual(0, category.Calculate(CreateDice(2, 2, 2, 3, 3, 3, 4, 5)));
}
[Test]
public void ChanceCategory_RemainsUnchanged_WithSixDice()
{
var chance = SumAllCategory.CreateForTest("chance", "Шанс");
_createdAssets.Add(chance);
Assert.AreEqual(21, chance.Calculate(CreateDice(1, 2, 3, 4, 5, 6)));
}
[Test]
public void ScoreSummaryService_UsesCatalogConfiguredUpperBonus()
{
var ones = MasterValueCategory.CreateForTest("ones", "Единицы", 1, categoryBonus: 1);
var twos = MasterValueCategory.CreateForTest("twos", "Двойки", 2, categoryBonus: 2);
var catalog = CategoryCatalog.CreateForTest(new List<CategoryDefinition> { ones, twos }, upperBonusThreshold: 15, upperBonusValue: 50);
_createdAssets.Add(ones);
_createdAssets.Add(twos);
_createdAssets.Add(catalog);
var go = new GameObject("ScoringSystem");
var scoringSystem = go.AddComponent<ScoringSystem>();
scoringSystem.Construct(null, null, catalog, null);
scoringSystem.ScoreCategory(CreateDice(1, 1, 1, 1, 2, 3), ones);
scoringSystem.ScoreCategory(CreateDice(2, 2, 2, 2, 5, 6), twos);
var summaryService = new ScoreSummaryService(scoringSystem, catalog);
var summary = summaryService.Calculate();
Assert.AreEqual(16, summary.UpperSum);
Assert.IsTrue(summary.HasUpperBonus);
Assert.AreEqual(66, summary.DisplayTotal);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8f1f7c8d8f3a4a34bb5327f9fd0dc101