using MrGameEng.AI; using Xunit; namespace MrGameEng.AI.Tests; public class SuitabilityTests { [Fact] public void Gaussian_PeaksAtOptimum() { Assert.Equal(1f, Suitability.Gaussian(18f, optimum: 18f, tolerance: 5f), 5); } [Fact] public void Gaussian_IsSymmetricAroundOptimum() { var below = Suitability.Gaussian(13f, optimum: 18f, tolerance: 5f); var above = Suitability.Gaussian(23f, optimum: 18f, tolerance: 5f); Assert.Equal(below, above, 5); } [Fact] public void Gaussian_AtOneToleranceAway_IsAboutPoint607() { Assert.Equal(MathF.Exp(-0.5f), Suitability.Gaussian(23f, 18f, 5f), 5); } [Fact] public void Gaussian_FallsOffWithDistance() { var near = Suitability.Gaussian(20f, 18f, 5f); var far = Suitability.Gaussian(30f, 18f, 5f); Assert.True(far < near && far > 0f); } [Fact] public void Gaussian_StaysWithinUnitRange() { for (var v = -50f; v <= 50f; v += 1f) { Assert.InRange(Suitability.Gaussian(v, 0f, 7f), 0f, 1f); } } [Fact] public void Gaussian_NonPositiveTolerance_IsExactMatch() { Assert.Equal(1f, Suitability.Gaussian(5f, 5f, 0f)); Assert.Equal(0f, Suitability.Gaussian(6f, 5f, 0f)); } }