using System.IO.Pipes; using System.Text.Json; using XFEEDToolBox.Core.Galaxy; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class GalaxyNavRouteMembershipWireTests { [Test] public void ProfileKeepsItsMembershipIndexDistinctFromSmallSizeModeAndCopiesItToSelection() { using var source=JsonDocument.Parse("{\"origin\":[0,0,0],\"queryCentre\":[0,0,0],\"surfaceDensity\":1,\"qualityStarCount\":100,\"runtimeRadiusMultiplier\":1,\"sparseExpansion\":1,\"smallMode\":false,\"originalViewMode\":0,\"debugEnabled\":false,\"navRouteViewMode\":1,\"navRouteMembershipMode\":1,\"referenceKind\":\"camera-eye\"}"); var profile=NativeGalaxyCatalog.ReadCatalogueProfile(source.RootElement); Check.Equal(false,profile.SmallMode!.Value);Check.Equal(1,profile.NavRouteViewMode!.Value);Check.Equal(1,profile.NavRouteMembershipMode!.Value); var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,.3,10); profile=profile with{QueryCentre=GalaxyOriginalCatalogueLod.ClampCentre(GalaxyOriginalCatalogueLod.QueryCentre(camera,profile.OriginalViewMode),profile.Origin)}; Check.That(profile.TrySelection(camera,out var selection)); Check.Equal(1,selection!.NavRouteViewMode!.Value);Check.Equal(1,selection.NavRouteMembershipMode!.Value); } [Test] public void ProfileRejectsMismatchedOrPartialMembershipContext() { foreach(var fields in new[]{"\"navRouteViewMode\":1,\"navRouteMembershipMode\":0","\"navRouteViewMode\":1","\"navRouteMembershipMode\":1"}) { using var source=JsonDocument.Parse("{\"origin\":[0,0,0],\"referenceKind\":\"camera-eye\","+fields+"}"); Check.Throws(()=>NativeGalaxyCatalog.ReadCatalogueProfile(source.RootElement)); } } [Test] public async Task AppearanceWirePreservesKnownFalseAndModeOneSeparatelyFromUnavailableMembership() { var id=Random.Shared.Next(170000000,180000000);using var deadline=new CancellationTokenSource(TimeSpan.FromSeconds(5)); var server=Task.Run(async()=> { await using var pipe=new NamedPipeServerStream($"XFEEDToolBox.Navigation.{id}",PipeDirection.InOut,1,PipeTransmissionMode.Byte,PipeOptions.Asynchronous); await pipe.WaitForConnectionAsync(deadline.Token);var bytes=new byte[65536];await pipe.ReadAsync(bytes,deadline.Token); var result=new{generation=1,done=true,error="",items=new[]{new{name="Recorded",systemAddress="9007199254740995",position=new[]{0d,0d,0d},starClass="G", originalAppearance=new{typeRgba=0xffffffffu,realisticRgba=(uint?)null,colourBlend=(float?)null,rawScale=32768u,classification=(ushort)4,size=.5f,smallSize=.2f,smallSizeActive=(bool?)false, navRouteMembership=(bool?)false,navRouteMembershipMode=(int?)1,navRouteViewMode=(int?)1}}}}; await pipe.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(new{ok=true,result}),deadline.Token);await pipe.WriteAsync(new byte[]{10},deadline.Token); }); var row=await new NativeGalaxyCatalog(id).FindAsync("Recorded",deadline.Token);await server; Check.Equal(false,row.OriginalAppearance!.NavRouteMembership!.Value);Check.Equal(1,row.OriginalAppearance.NavRouteMembershipMode!.Value); Check.Equal(1,row.OriginalAppearance.NavRouteViewMode!.Value);Check.Equal(false,row.OriginalAppearance.SmallSizeActive!.Value); } }