Files
Workspace/Assets/Demos/Demo2/Tests/EditMode/Demo2DomainTests.cs
T
2026-08-18 02:03:34 +08:00

75 lines
3.3 KiB
C#

#nullable enable
using System.Linq;
using Demo2.Domain;
using NightShiftProtocol;
using NUnit.Framework;
namespace Demo2.Tests
{
public sealed class Demo2DomainTests
{
[Test]
public void BuiltInContent_HasFiveCyclesEighteenRulesAndFiveCategories()
{
var content = Demo2BuiltInContent.Create();
Assert.That(content.Rules.Count, Is.EqualTo(18));
Assert.That(content.Rules.Values.Select(rule => rule.Category).Distinct().Count(), Is.EqualTo(5));
Assert.That(content.Waves.Select(wave => wave.TotalHealth), Is.EqualTo(new long[] { 500, 900, 1620, 2916, 5248 }));
Assert.That(content.ComputeContentHash(), Has.Length.EqualTo(64));
}
[Test]
public void SaturatingMath_ClampsBothDirectionsAndFormatsLargeValues()
{
Assert.That(SaturatingMath.Add(long.MaxValue, 1), Is.EqualTo(long.MaxValue));
Assert.That(SaturatingMath.Add(long.MinValue, -1), Is.EqualTo(long.MinValue));
Assert.That(SaturatingMath.Multiply(long.MaxValue, 2), Is.EqualTo(long.MaxValue));
Assert.That(SaturatingMath.MultiplyScaled(200, 1500), Is.EqualTo(300));
Assert.That(SaturatingMath.Format(1_250_000_000), Is.EqualTo("1.25e9"));
}
[Test]
public void RuleOrder_IsStrictlyLeftToRight()
{
var rules = Demo2BuiltInContent.BuildRules().ToDictionary(rule => rule.Id);
var initial = new Demo2RuleContext { Payload = 100, MultiplierMilli = 1000 };
var addThenMultiply = Demo2RuleEngine.Evaluate(initial, new[] { rules["production.dense-ammo"], rules["machine.overclock"] });
var multiplyThenAdd = Demo2RuleEngine.Evaluate(initial, new[] { rules["machine.overclock"], rules["production.dense-ammo"] });
Assert.That(addThenMultiply.Payload, Is.EqualTo(420));
Assert.That(multiplyThenAdd.Payload, Is.EqualTo(330));
Assert.That(addThenMultiply.Faults, Is.EqualTo(1));
}
[Test]
public void ConditionalRule_OnlyRunsWhenEveryFlagMatches()
{
var content = Demo2BuiltInContent.Create();
var rule = content.Rules["logistics.long-haul"];
var missesFaultCondition = new Demo2RuleContext { Payload = 100, MultiplierMilli = 1000, BeltBelowEightyPercent = true, Faults = 1 };
var matches = missesFaultCondition;
matches.Faults = 0;
Assert.That(Demo2RuleEngine.Evaluate(missesFaultCondition, new[] { rule }).MultiplierMilli, Is.EqualTo(1000));
Assert.That(Demo2RuleEngine.Evaluate(matches, new[] { rule }).MultiplierMilli, Is.EqualTo(1200));
}
[Test]
public void NightShiftMod_AddsMachineRecipeAndConditionalRule()
{
var content = Demo2BuiltInContent.Create();
var before = content.ComputeContentHash();
new NightShiftContent().Register(content);
Assert.That(content.Machines.ContainsKey(Demo2MachineKind.NightShiftSmelter), Is.True);
Assert.That(content.Recipes.ContainsKey(100), Is.True);
Assert.That(content.Rules.ContainsKey("night-shift.continuous-production"), Is.True);
Assert.That(content.ComputeContentHash(), Is.Not.EqualTo(before));
}
}
}