XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;

namespace XFEEDToolBox.Test;

[TestFixture]
public class OriginalCurveBoundsTests
{
    private static OriginalCurveRange Bound(int mode,OriginalCurveKnot[] points,double low=0,double high=1)
    {Check.That(OriginalCurveBounds.TryBound(points,mode,low,high,out var range));return range;}
    [Test]public void ConstantCurveIncludesEveryStepAndTheLastPoint()
    {var value=Bound(0,[new(0,1,0,0),new(.5,4,0,0),new(1,2,0,0)]);Check.That(value.Maximum>=4&&value.Maximum<4.001&&value.Minimum<=1);}
    [Test]public void LinearCurveUsesOriginalIntervals()
    {var value=Bound(1,[new(0,2,2,0),new(.5,8,2,0),new(1,3,0,0)]);Check.That(value.Maximum>=8&&value.Maximum<8.001&&value.Minimum<=2);}
    [Test]public void CubicPeakBetweenEqualEndpointsCannotBeMissed()
    {var value=Bound(2,[new(0,0,1,-12),new(1,0,0,-12)]);Check.That(value.Maximum>=1.5&&value.Maximum<1.501);}
    [Test]public void BothCubicDerivativeRootsAreConsidered()
    {var value=Bound(2,[new(0,0,1,6),new(1,0,0,-6)]);Check.That(value.Maximum>.096&&value.Maximum<.097&&value.Minimum<-.096&&value.Minimum>-.097);}
    [Test]public void SubrangeDoesNotUseAnExtremumOutsideItsDomain()
    {var value=Bound(2,[new(0,0,1,-12),new(1,0,0,-12)],0,.1);Check.That(value.Maximum>=.54&&value.Maximum<.541);}
    [Test]public void NativeLeftExtrapolationAndRightClampingArePreserved()
    {
        var value=Bound(1,[new(.25,2,2,0),new(.75,4,0,0)]);Check.That(value.Minimum<=1&&value.Minimum>.999&&value.Maximum>=4&&value.Maximum<4.001);
        value=Bound(2,[new(.25,2,2,0),new(.75,4,0,0)],.8,1);Check.That(value.Minimum<4&&value.Minimum>3.999&&value.Maximum>4&&value.Maximum<4.001);
    }
    [Test]public void OnePointAndFloatRoundingAreConservativelyBounded()
    {var value=Bound(2,[new(.5,3,0,0)]);Check.That(value.Minimum<3&&value.Maximum>3&&value.Maximum<3.001);}
    [Test]public void UnknownModesReversedKnotsAndCorruptFieldsFailClosed()
    {
        OriginalCurveKnot[] good=[new(0,1,1,0),new(1,2,0,0)];
        Check.That(!OriginalCurveBounds.TryBound(good,3,0,1,out _));Check.That(!OriginalCurveBounds.TryBound([],1,0,1,out _));
        Check.That(!OriginalCurveBounds.TryBound([good[1],good[0]],2,0,1,out _));
        Check.That(!OriginalCurveBounds.TryBound([good[0],new(0,2,0,0)],2,0,1,out _));
        Check.That(!OriginalCurveBounds.TryBound([new(0,1,2,0),good[1]],1,0,1,out _));
        Check.That(!OriginalCurveBounds.TryBound([new(0,double.NaN,1,0),good[1]],2,0,1,out _));
        Check.That(!OriginalCurveBounds.TryBound(good,2,-.1,1,out _));Check.That(!OriginalCurveBounds.TryBound(good,2,.8,.2,out _));
    }
}