@
CI / build-test (push) Failing after 1m8s

Add MrGameEng.AI utility-AI module; format codebase with CSharpier

New MrGameEng.AI module (ResponseCurve, Consideration, UtilityAction,
UtilityAi selector, Blackboard) plus CSharpier formatting applied across
the whole engine. Documents the CSharpier convention in CLAUDE.md.
@
This commit is contained in:
Leonid Pershin
2026-06-12 07:19:10 +03:00
parent 4ae730cafa
commit fd6343bd09
96 changed files with 2066 additions and 589 deletions
@@ -0,0 +1,75 @@
using MrGameEng.AI;
using Xunit;
namespace MrGameEng.AI.Tests;
public class ResponseCurveTests
{
[Fact]
public void Identity_ReturnsInputUnchanged()
{
var curve = ResponseCurve.Identity;
Assert.Equal(0f, curve.Evaluate(0f));
Assert.Equal(0.5f, curve.Evaluate(0.5f), 5);
Assert.Equal(1f, curve.Evaluate(1f));
}
[Fact]
public void Default_HasZeroSlope_SoIdentityMustBeUsedExplicitly()
{
// Guards the gotcha that default(ResponseCurve) is NOT the identity curve.
var zero = default(ResponseCurve);
Assert.Equal(0f, zero.Evaluate(0.5f));
}
[Fact]
public void Evaluate_ClampsInputAndOutputToUnitRange()
{
var curve = ResponseCurve.Linear();
Assert.Equal(0f, curve.Evaluate(-2f));
Assert.Equal(1f, curve.Evaluate(5f));
}
[Fact]
public void Linear_NegativeSlope_InvertsTheInput()
{
var curve = ResponseCurve.Linear(slope: -1f, yShift: 1f);
Assert.Equal(1f, curve.Evaluate(0f), 5);
Assert.Equal(0.75f, curve.Evaluate(0.25f), 5);
Assert.Equal(0f, curve.Evaluate(1f), 5);
}
[Fact]
public void Polynomial_Quadratic_EasesInFromZero()
{
var curve = ResponseCurve.Polynomial(exponent: 2f);
Assert.Equal(0.25f, curve.Evaluate(0.5f), 5);
Assert.True(curve.Evaluate(0.25f) < 0.25f); // below the linear line: slow start
}
[Fact]
public void Logistic_IsMonotonicAndCentredOnMidpoint()
{
var curve = ResponseCurve.Logistic(steepness: 12f, midpoint: 0.5f);
Assert.Equal(0.5f, curve.Evaluate(0.5f), 2);
Assert.True(curve.Evaluate(0.2f) < 0.5f);
Assert.True(curve.Evaluate(0.8f) > 0.5f);
Assert.True(curve.Evaluate(0.6f) > curve.Evaluate(0.4f));
}
[Fact]
public void SmoothStep_IsFlatAtTheEnds()
{
var curve = ResponseCurve.SmoothStep();
Assert.Equal(0f, curve.Evaluate(0f), 5);
Assert.Equal(1f, curve.Evaluate(1f), 5);
Assert.Equal(0.5f, curve.Evaluate(0.5f), 5);
}
}