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<InvalidDataException>(()=>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);
}
}
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<InvalidDataException>(()=>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);
}
}