using XFEEDToolBox.Core.Session;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class SessionMaintenanceExitTests
{
[Test] public async Task AClosedPipeIsHarmlessOnlyAfterConfirmedMenuExit()
{
await SessionMaintenanceExit.ReleaseAfterExitAsync(()=>throw new InvalidDataException("Pipe closed with process"),()=>true);
var refused=false;
try{await SessionMaintenanceExit.ReleaseAfterExitAsync(()=>throw new InvalidDataException("Pipe closed before exit"),()=>false);}
catch(InvalidDataException){refused=true;}
Check.That(refused);
}
[Test] public void OnlyFreshStableOriginalMainMenuPermitsMaintenanceExit()
{
var now=DateTimeOffset.UtcNow;var frame=new NativeSessionFrame(1,now,"MainMenu","MainMenu",[]);
SessionMaintenanceExit.RequireMainMenu(frame,now);
foreach(var state in new[]{"InGame","Pause","ExitOptions","PrePauseMenu","SetupPlaySolo"})
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{State=state,NextState=state},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{NextState="ContinueMenu"},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{Sequence=0},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(-351)},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(101)},now));
}
}
using XFEEDToolBox.Core.Session;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class SessionMaintenanceExitTests
{
[Test] public async Task AClosedPipeIsHarmlessOnlyAfterConfirmedMenuExit()
{
await SessionMaintenanceExit.ReleaseAfterExitAsync(()=>throw new InvalidDataException("Pipe closed with process"),()=>true);
var refused=false;
try{await SessionMaintenanceExit.ReleaseAfterExitAsync(()=>throw new InvalidDataException("Pipe closed before exit"),()=>false);}
catch(InvalidDataException){refused=true;}
Check.That(refused);
}
[Test] public void OnlyFreshStableOriginalMainMenuPermitsMaintenanceExit()
{
var now=DateTimeOffset.UtcNow;var frame=new NativeSessionFrame(1,now,"MainMenu","MainMenu",[]);
SessionMaintenanceExit.RequireMainMenu(frame,now);
foreach(var state in new[]{"InGame","Pause","ExitOptions","PrePauseMenu","SetupPlaySolo"})
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{State=state,NextState=state},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{NextState="ContinueMenu"},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{Sequence=0},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(-351)},now));
Check.Throws<InvalidOperationException>(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(101)},now));
}
}