using System.IO.Pipes;
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class NativeGalaxyMissionsCatalogTests
{
private static async Task Serve(int pid,object result,CancellationToken token,Action<JsonElement>? inspect=null)
{
await using var server=new NamedPipeServerStream($"XFEEDToolBox.Navigation.{pid}",PipeDirection.InOut,1,PipeTransmissionMode.Byte,PipeOptions.Asynchronous);
await server.WaitForConnectionAsync(token);var request=new byte[4096];var count=await server.ReadAsync(request,token);
using(var json=JsonDocument.Parse(request.AsMemory(0,count)))inspect?.Invoke(json.RootElement);
await server.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(new{ok=true,result}),token);await server.WriteAsync(new byte[]{10},token);
if(OperatingSystem.IsWindows())server.WaitForPipeDrain();
}
private static object Row(ulong id)=>new{missionId=id.ToString(),markerType=4,systemAddresses=new[]{"9007199254740993","9007199254740994","9007199254740993"},selectedSystemAddress="9007199254740993"};
[Test] public async Task OriginalMissionIdsAndFullOrderedAddressSetsSurvivePagination()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(async()=>
{
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=Enumerable.Range(0,16).Select(i=>Row((ulong)i))},stop.Token,
r=>{Check.Equal("galaxy.missions",r.GetProperty("op").GetString());Check.Equal(16,r.GetProperty("limit").GetInt32());});
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=new[]{Row(ulong.MaxValue)}},stop.Token,
r=>Check.Equal(16,r.GetProperty("offset").GetInt32()));
});
var result=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(result.Available&&!result.Complete);Check.Equal(0UL,result.Missions[0].MissionId);Check.Equal(ulong.MaxValue,result.Missions[^1].MissionId);
Check.That(result.Missions[0].SystemAddresses.SequenceEqual(new[]{9007199254740993L,9007199254740994L,9007199254740993L}));
Check.Equal((long?)9007199254740993L,result.Missions[0].SelectedSystemAddress);
}
[Test] public async Task MissionSelectionCannotUseAnEarlierAddressAndPagesCannotChangeAccount()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(()=>Serve(pid,new{available=true,generation=4,total=1,entityId="42",items=new[]{new{missionId="9007199254740999",markerType=45,systemAddresses=new[]{"9007199254740993","9007199254740994"},selectedSystemAddress="9007199254740993"}}},stop.Token));
var rejected=false;try{await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);}catch(InvalidDataException){rejected=true;}await server;Check.That(rejected);
server=Task.Run(async()=>
{
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=Enumerable.Range(0,16).Select(i=>Row((ulong)i))},stop.Token);
await Serve(pid,new{available=true,generation=4,total=17,entityId="43",items=new[]{Row(17)}},stop.Token);
});
rejected=false;try{await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);}catch(InvalidDataException){rejected=true;}await server;Check.That(rejected);
}
[Test] public async Task MissingTargetsAndUnavailableListsNeverInventCoordinatesOrCompletion()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(()=>Serve(pid,new{available=false},stop.Token));var unavailable=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(!unavailable.Available&&!unavailable.Complete);
server=Task.Run(()=>Serve(pid,new{available=true,generation=1,total=1,entityId="42",items=new[]{new{missionId="18446744073709551615",markerType=45,systemAddresses=Array.Empty<string>(),selectedSystemAddress=(string?)null}}},stop.Token));
var result=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(result.Available&&!result.Complete&&result.Missions[0].SelectedSystemAddress is null&&result.Missions[0].SystemAddresses.Count==0);
}
}
using System.IO.Pipes;
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class NativeGalaxyMissionsCatalogTests
{
private static async Task Serve(int pid,object result,CancellationToken token,Action<JsonElement>? inspect=null)
{
await using var server=new NamedPipeServerStream($"XFEEDToolBox.Navigation.{pid}",PipeDirection.InOut,1,PipeTransmissionMode.Byte,PipeOptions.Asynchronous);
await server.WaitForConnectionAsync(token);var request=new byte[4096];var count=await server.ReadAsync(request,token);
using(var json=JsonDocument.Parse(request.AsMemory(0,count)))inspect?.Invoke(json.RootElement);
await server.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(new{ok=true,result}),token);await server.WriteAsync(new byte[]{10},token);
if(OperatingSystem.IsWindows())server.WaitForPipeDrain();
}
private static object Row(ulong id)=>new{missionId=id.ToString(),markerType=4,systemAddresses=new[]{"9007199254740993","9007199254740994","9007199254740993"},selectedSystemAddress="9007199254740993"};
[Test] public async Task OriginalMissionIdsAndFullOrderedAddressSetsSurvivePagination()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(async()=>
{
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=Enumerable.Range(0,16).Select(i=>Row((ulong)i))},stop.Token,
r=>{Check.Equal("galaxy.missions",r.GetProperty("op").GetString());Check.Equal(16,r.GetProperty("limit").GetInt32());});
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=new[]{Row(ulong.MaxValue)}},stop.Token,
r=>Check.Equal(16,r.GetProperty("offset").GetInt32()));
});
var result=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(result.Available&&!result.Complete);Check.Equal(0UL,result.Missions[0].MissionId);Check.Equal(ulong.MaxValue,result.Missions[^1].MissionId);
Check.That(result.Missions[0].SystemAddresses.SequenceEqual(new[]{9007199254740993L,9007199254740994L,9007199254740993L}));
Check.Equal((long?)9007199254740993L,result.Missions[0].SelectedSystemAddress);
}
[Test] public async Task MissionSelectionCannotUseAnEarlierAddressAndPagesCannotChangeAccount()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(()=>Serve(pid,new{available=true,generation=4,total=1,entityId="42",items=new[]{new{missionId="9007199254740999",markerType=45,systemAddresses=new[]{"9007199254740993","9007199254740994"},selectedSystemAddress="9007199254740993"}}},stop.Token));
var rejected=false;try{await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);}catch(InvalidDataException){rejected=true;}await server;Check.That(rejected);
server=Task.Run(async()=>
{
await Serve(pid,new{available=true,generation=4,total=17,entityId="42",items=Enumerable.Range(0,16).Select(i=>Row((ulong)i))},stop.Token);
await Serve(pid,new{available=true,generation=4,total=17,entityId="43",items=new[]{Row(17)}},stop.Token);
});
rejected=false;try{await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);}catch(InvalidDataException){rejected=true;}await server;Check.That(rejected);
}
[Test] public async Task MissingTargetsAndUnavailableListsNeverInventCoordinatesOrCompletion()
{
var pid=Random.Shared.Next(190000000,200000000);using var stop=new CancellationTokenSource(TimeSpan.FromSeconds(5));
var server=Task.Run(()=>Serve(pid,new{available=false},stop.Token));var unavailable=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(!unavailable.Available&&!unavailable.Complete);
server=Task.Run(()=>Serve(pid,new{available=true,generation=1,total=1,entityId="42",items=new[]{new{missionId="18446744073709551615",markerType=45,systemAddresses=Array.Empty<string>(),selectedSystemAddress=(string?)null}}},stop.Token));
var result=await new NativeGalaxyAccountCatalog(pid).ReadMissionsAsync(stop.Token);await server;
Check.That(result.Available&&!result.Complete&&result.Missions[0].SelectedSystemAddress is null&&result.Missions[0].SystemAddresses.Count==0);
}
}