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 _));
}
}
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 _));
}
}