using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class OriginalCruiseCycleQualificationTests
{
private static readonly OriginalCruiseCycleIdentity Id=new(new('a',32),new('b',32),4,12,24);
private static readonly string StopId=new('c',32);
private static OriginalCruiseCycleQualification Started(int count=5)
{var proof=new OriginalCruiseCycleQualification();Check.That(proof.Begin(Id,1000,true,1));for(var i=1;i<=count;i++)proof.Observe(12,24,(ulong)(1000+i*20),2);return proof;}
[Test]public void OneOriginalCycleRequiresFiveUpdatesAndLaterOff()
{var proof=Started();Check.That(proof.Stop(Id,StopId,1120,true,2,3,true));Check.That(!proof.Qualified);proof.Observe(12,24,1140,3);Check.That(proof.Qualified);Check.Equal(5,proof.Completed!.ActiveSamples);}
[Test]public void DuplicateAndReversedTimestampsCannotCountAsFiveUpdates()
{var proof=Started(0);for(var i=0;i<8;i++){proof.Observe(12,24,1020,2);proof.Observe(12,24,1010,2);}Check.Equal(1,proof.ActiveSamples);Check.That(!proof.Stop(Id,StopId,1120,true,2,0,true));}
[Test]public void AnotherShipOrReferenceCannotSupplyActiveFrames()
{var proof=Started(0);for(var i=1;i<8;i++){proof.Observe(13,24,(ulong)(1000+i*20),2);proof.Observe(12,25,(ulong)(1000+i*20),2);}Check.Equal(0,proof.ActiveSamples);}
[Test]public void ASecondEnableCannotBorrowTheEarlierCyclesFrames()
{var proof=Started();var next=Id with{StartRequestId=new('d',32)};Check.That(proof.Begin(next,1200,true,1));Check.Equal(0,proof.ActiveSamples);Check.That(!proof.Stop(next,StopId,1250,true,2,0,true));}
[Test]public void AcknowledgedEnableWithoutOriginalCallCannotQualify()
{var proof=new OriginalCruiseCycleQualification();Check.That(!proof.Begin(Id,1000,false,1));for(var i=1;i<8;i++)proof.Observe(12,24,(ulong)(1000+i*20),2);Check.That(!proof.Stop(Id,StopId,1200,true,2,0,true));}
[Test]public void StopMustMatchOwnerRequestSelectionAndShip()
{foreach(var different in new[]{Id with{Owner=new('d',32)},Id with{StartRequestId=new('d',32)},Id with{SelectionGeneration=5},Id with{Entity=13},Id with{World=25}}){var proof=Started();Check.That(!proof.Stop(different,StopId,1120,true,2,0,true));proof.Observe(12,24,1140,0);Check.That(!proof.Qualified);}}
[Test]public void IdleObservationAndGlobalDisableCountsCannotReplaceAnOriginalStop()
{var proof=Started();Check.That(!proof.Stop(Id,StopId,1120,false,0,0,true));proof.Observe(12,24,1140,0);Check.That(!proof.Qualified);}
[Test]public void AutomaticExpiryIsNotTheExplicitReleaseQualification()
{var proof=Started();Check.That(!proof.Stop(Id,StopId,1120,true,2,3,false));proof.Observe(12,24,1140,3);Check.That(!proof.Qualified);}
[Test]public void OffMustFollowTheCallAndBelongToTheSameMainShip()
{var proof=Started();Check.That(proof.Stop(Id,StopId,1120,true,2,3,true));proof.Observe(12,24,1120,3);proof.Observe(13,24,1140,3);proof.Observe(12,25,1140,3);Check.That(!proof.Qualified);proof.Observe(12,24,1160,0);Check.That(proof.Qualified);}
}
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class OriginalCruiseCycleQualificationTests
{
private static readonly OriginalCruiseCycleIdentity Id=new(new('a',32),new('b',32),4,12,24);
private static readonly string StopId=new('c',32);
private static OriginalCruiseCycleQualification Started(int count=5)
{var proof=new OriginalCruiseCycleQualification();Check.That(proof.Begin(Id,1000,true,1));for(var i=1;i<=count;i++)proof.Observe(12,24,(ulong)(1000+i*20),2);return proof;}
[Test]public void OneOriginalCycleRequiresFiveUpdatesAndLaterOff()
{var proof=Started();Check.That(proof.Stop(Id,StopId,1120,true,2,3,true));Check.That(!proof.Qualified);proof.Observe(12,24,1140,3);Check.That(proof.Qualified);Check.Equal(5,proof.Completed!.ActiveSamples);}
[Test]public void DuplicateAndReversedTimestampsCannotCountAsFiveUpdates()
{var proof=Started(0);for(var i=0;i<8;i++){proof.Observe(12,24,1020,2);proof.Observe(12,24,1010,2);}Check.Equal(1,proof.ActiveSamples);Check.That(!proof.Stop(Id,StopId,1120,true,2,0,true));}
[Test]public void AnotherShipOrReferenceCannotSupplyActiveFrames()
{var proof=Started(0);for(var i=1;i<8;i++){proof.Observe(13,24,(ulong)(1000+i*20),2);proof.Observe(12,25,(ulong)(1000+i*20),2);}Check.Equal(0,proof.ActiveSamples);}
[Test]public void ASecondEnableCannotBorrowTheEarlierCyclesFrames()
{var proof=Started();var next=Id with{StartRequestId=new('d',32)};Check.That(proof.Begin(next,1200,true,1));Check.Equal(0,proof.ActiveSamples);Check.That(!proof.Stop(next,StopId,1250,true,2,0,true));}
[Test]public void AcknowledgedEnableWithoutOriginalCallCannotQualify()
{var proof=new OriginalCruiseCycleQualification();Check.That(!proof.Begin(Id,1000,false,1));for(var i=1;i<8;i++)proof.Observe(12,24,(ulong)(1000+i*20),2);Check.That(!proof.Stop(Id,StopId,1200,true,2,0,true));}
[Test]public void StopMustMatchOwnerRequestSelectionAndShip()
{foreach(var different in new[]{Id with{Owner=new('d',32)},Id with{StartRequestId=new('d',32)},Id with{SelectionGeneration=5},Id with{Entity=13},Id with{World=25}}){var proof=Started();Check.That(!proof.Stop(different,StopId,1120,true,2,0,true));proof.Observe(12,24,1140,0);Check.That(!proof.Qualified);}}
[Test]public void IdleObservationAndGlobalDisableCountsCannotReplaceAnOriginalStop()
{var proof=Started();Check.That(!proof.Stop(Id,StopId,1120,false,0,0,true));proof.Observe(12,24,1140,0);Check.That(!proof.Qualified);}
[Test]public void AutomaticExpiryIsNotTheExplicitReleaseQualification()
{var proof=Started();Check.That(!proof.Stop(Id,StopId,1120,true,2,3,false));proof.Observe(12,24,1140,3);Check.That(!proof.Qualified);}
[Test]public void OffMustFollowTheCallAndBelongToTheSameMainShip()
{var proof=Started();Check.That(proof.Stop(Id,StopId,1120,true,2,3,true));proof.Observe(12,24,1120,3);proof.Observe(13,24,1140,3);proof.Observe(12,25,1140,3);Check.That(!proof.Qualified);proof.Observe(12,24,1160,0);Check.That(proof.Qualified);}
}