133 lines
4.3 KiB
C#
133 lines
4.3 KiB
C#
using AcDream.App.Streaming;
|
|
|
|
namespace AcDream.App.Tests.Streaming;
|
|
|
|
public sealed class TeleportTransitCoordinatorTests
|
|
{
|
|
[Fact]
|
|
public void ReplacementRejectsDelayedPriorDestinationAndAcceptsCurrentAdvance()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
Assert.True(transit.QueueStart(10));
|
|
Assert.False(transit.Activate(out _));
|
|
transit.EndActive();
|
|
Assert.True(transit.QueueStart(11));
|
|
Assert.False(transit.Activate(out _));
|
|
|
|
Assert.False(transit.OfferDestination(10, true, 100, out _));
|
|
Assert.True(transit.OfferDestination(11, true, 110, out int accepted));
|
|
Assert.Equal(110, accepted);
|
|
}
|
|
|
|
[Fact]
|
|
public void PositionBeforeF751IsBufferedAndEqualFollowupCannotReplaceIt()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
|
|
Assert.False(transit.OfferDestination(11, true, 110, out _));
|
|
Assert.True(transit.QueueStart(11));
|
|
Assert.True(transit.Activate(out int buffered));
|
|
Assert.Equal(110, buffered);
|
|
Assert.False(transit.OfferDestination(11, false, 111, out _));
|
|
}
|
|
|
|
[Fact]
|
|
public void InactiveOrdinaryPositionIsNeverBuffered()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
|
|
Assert.False(transit.OfferDestination(11, false, 110, out _));
|
|
Assert.True(transit.QueueStart(11));
|
|
Assert.False(transit.Activate(out _));
|
|
}
|
|
|
|
[Fact]
|
|
public void DuplicateStartIsRejectedButSequenceWrapIsFresh()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
Assert.True(transit.QueueStart(ushort.MaxValue));
|
|
Assert.False(transit.Activate(out _));
|
|
transit.EndActive();
|
|
|
|
Assert.False(transit.CanBegin(ushort.MaxValue));
|
|
Assert.False(transit.QueueStart(ushort.MaxValue));
|
|
Assert.True(transit.CanBegin(0));
|
|
Assert.True(transit.QueueStart(0));
|
|
Assert.True(transit.HasPendingStart);
|
|
}
|
|
|
|
[Fact]
|
|
public void ExactHalfRangeUsesRetailLowerStampTieBreak()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
Assert.True(transit.QueueStart(0x8000));
|
|
Assert.False(transit.Activate(out _));
|
|
transit.EndActive();
|
|
|
|
Assert.True(transit.CanBegin(0x0000));
|
|
Assert.True(transit.QueueStart(0x0000));
|
|
}
|
|
|
|
[Fact]
|
|
public void ClearSessionAllowsSameSequenceInNewSession()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
Assert.True(transit.QueueStart(7));
|
|
Assert.False(transit.Activate(out _));
|
|
|
|
transit.ClearSession();
|
|
|
|
Assert.False(transit.IsActive);
|
|
Assert.True(transit.CanBegin(7));
|
|
}
|
|
|
|
[Fact]
|
|
public void PendingStartAcceptsEqualPositionUntilPresentationCanActivate()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
Assert.True(transit.QueueStart(11));
|
|
|
|
Assert.False(transit.OfferDestination(11, false, 110, out _));
|
|
Assert.True(transit.Activate(out int buffered));
|
|
|
|
Assert.Equal(110, buffered);
|
|
Assert.True(transit.IsActive);
|
|
}
|
|
|
|
[Fact]
|
|
public void AdvancingPositionPrunesSkippedDestination()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
|
|
Assert.False(transit.OfferDestination(11, true, 110, out _));
|
|
Assert.False(transit.OfferDestination(12, true, 120, out _));
|
|
Assert.True(transit.QueueStart(12));
|
|
Assert.True(transit.Activate(out int buffered));
|
|
|
|
Assert.Equal(120, buffered);
|
|
}
|
|
|
|
[Fact]
|
|
public void ObsoleteDestinationCannotSurviveSequenceWrap()
|
|
{
|
|
var transit = new TeleportTransitCoordinator<int>();
|
|
|
|
Assert.False(transit.OfferDestination(ushort.MaxValue, true, 999, out _));
|
|
Assert.False(transit.OfferDestination(0, true, 0, out _));
|
|
Assert.True(transit.QueueStart(0));
|
|
Assert.True(transit.Activate(out int wrapped));
|
|
Assert.Equal(0, wrapped);
|
|
transit.EndActive();
|
|
|
|
// Advance in legal retail-newer hops until 0xFFFF is current again.
|
|
Assert.True(transit.QueueStart(0x7FFF));
|
|
Assert.False(transit.Activate(out _));
|
|
transit.EndActive();
|
|
Assert.True(transit.QueueStart(0xFFFE));
|
|
Assert.False(transit.Activate(out _));
|
|
transit.EndActive();
|
|
Assert.True(transit.QueueStart(ushort.MaxValue));
|
|
|
|
Assert.False(transit.Activate(out _));
|
|
}
|
|
}
|