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(()=>SessionMaintenanceExit.RequireMainMenu(frame with{State=state,NextState=state},now)); Check.Throws(()=>SessionMaintenanceExit.RequireMainMenu(frame with{NextState="ContinueMenu"},now)); Check.Throws(()=>SessionMaintenanceExit.RequireMainMenu(frame with{Sequence=0},now)); Check.Throws(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(-351)},now)); Check.Throws(()=>SessionMaintenanceExit.RequireMainMenu(frame with{ObservedAt=now.AddMilliseconds(101)},now)); } }