using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyCellQueryPlanTests
{
private static GalaxyCatalogueLodDescriptor Small(Coordinates centre)=>GalaxyOriginalCatalogueLod.Create(centre,1,500,.001,1,0);
[Test] public void OriginalMassPackingRoundTripsEveryCellAndDoesNotTreatSystemOrdinalsAsCells()
{
for(var mass=0;mass<8;mass++)
{
var cell=GalaxyCellQueryPlan.Encode(mass,12,7,23);
var system=cell|(99UL<<(44-3*mass));
Check.Equal(cell,GalaxyCellQueryPlan.CellAddress(system));
var box=GalaxyOriginalCatalogueLod.CellBounds(cell,new(0,0,0));var size=10d*(1<<mass);
Check.Equal(new Coordinates(12*size,7*size,23*size),box.Minimum);
Check.Equal(new Coordinates(13*size,8*size,24*size),box.Maximum);
}
}
[Test] public void WholeIntersectingCellIsRequestedEvenWhenItsFarCornerIsOutsideTheRadius()
{
var camera=GalaxyCamera.Create(new(5,5,5),1600,900,0,0,4);var lod=Small(new(5,5,5));
var plan=new GalaxyCellQueryPlan(camera,lod,new(0,0,0));
Check.That(plan.Cells.Any(c=>c.Address==0)&&!plan.Truncated);
Check.That(new Coordinates(9,9,9).DistanceTo(lod.Centre)>lod.InnerRadius);
Check.That(lod.IntersectsCell(0,new(0,0,0)),"Original loading retains the full cell; do not filter these stars by the small radius.");
}
[Test] public void OriginalCellFrustumDoesNotInheritTheToolsFourDistanceFarCutoff()
{
var camera=GalaxyCamera.Create(new(5,5,5),1600,900,0,0,4);
var focus=new Coordinates(5,5,1005);var plan=new GalaxyCellQueryPlan(camera,Small(focus),new(0,0,0));
Check.That(camera.Project(focus).IsVisible&&!camera.ProjectForCatalogue(focus).IsVisible);
Check.That(plan.Cells.Any(c=>c.Address==GalaxyCellQueryPlan.Encode(0,0,0,100)));
}
[Test] public void BehindEyeCellsAndZeroRadiusProduceNoRequestedCoverage()
{
var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4);var origin=new Coordinates(10000,10000,10000);
Check.Equal(0,new GalaxyCellQueryPlan(camera,Small(new(0,0,-2000)),origin).Cells.Count);
var zero=GalaxyOriginalCatalogueLod.Create(new(0,0,0),1,500,0,1,0);
var empty=new GalaxyCellQueryPlan(camera,zero,origin);
Check.Equal(0,empty.Cells.Count);Check.That(!empty.Truncated);
}
[Test] public void SchedulingLimitsKeepOmissionsExplicitInsteadOfProvingFalseCoverage()
{
var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4);
var lod=GalaxyOriginalCatalogueLod.Create(new(0,0,0),0,500,1,1,4);
var plan=new GalaxyCellQueryPlan(camera,lod,new(49985,40985,24105),maximumCells:1,maximumCandidates:1000000);
Check.That(plan.Truncated&&plan.OmittedCandidates>0&&plan.Cells.Count==1);
foreach(var cell in plan.Cells)Check.That(lod.IntersectsCell(cell.Bounds,cell.MassCode)&&GalaxyCellQueryPlan.IntersectsFrustum(camera,cell.Bounds));
}
}
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyCellQueryPlanTests
{
private static GalaxyCatalogueLodDescriptor Small(Coordinates centre)=>GalaxyOriginalCatalogueLod.Create(centre,1,500,.001,1,0);
[Test] public void OriginalMassPackingRoundTripsEveryCellAndDoesNotTreatSystemOrdinalsAsCells()
{
for(var mass=0;mass<8;mass++)
{
var cell=GalaxyCellQueryPlan.Encode(mass,12,7,23);
var system=cell|(99UL<<(44-3*mass));
Check.Equal(cell,GalaxyCellQueryPlan.CellAddress(system));
var box=GalaxyOriginalCatalogueLod.CellBounds(cell,new(0,0,0));var size=10d*(1<<mass);
Check.Equal(new Coordinates(12*size,7*size,23*size),box.Minimum);
Check.Equal(new Coordinates(13*size,8*size,24*size),box.Maximum);
}
}
[Test] public void WholeIntersectingCellIsRequestedEvenWhenItsFarCornerIsOutsideTheRadius()
{
var camera=GalaxyCamera.Create(new(5,5,5),1600,900,0,0,4);var lod=Small(new(5,5,5));
var plan=new GalaxyCellQueryPlan(camera,lod,new(0,0,0));
Check.That(plan.Cells.Any(c=>c.Address==0)&&!plan.Truncated);
Check.That(new Coordinates(9,9,9).DistanceTo(lod.Centre)>lod.InnerRadius);
Check.That(lod.IntersectsCell(0,new(0,0,0)),"Original loading retains the full cell; do not filter these stars by the small radius.");
}
[Test] public void OriginalCellFrustumDoesNotInheritTheToolsFourDistanceFarCutoff()
{
var camera=GalaxyCamera.Create(new(5,5,5),1600,900,0,0,4);
var focus=new Coordinates(5,5,1005);var plan=new GalaxyCellQueryPlan(camera,Small(focus),new(0,0,0));
Check.That(camera.Project(focus).IsVisible&&!camera.ProjectForCatalogue(focus).IsVisible);
Check.That(plan.Cells.Any(c=>c.Address==GalaxyCellQueryPlan.Encode(0,0,0,100)));
}
[Test] public void BehindEyeCellsAndZeroRadiusProduceNoRequestedCoverage()
{
var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4);var origin=new Coordinates(10000,10000,10000);
Check.Equal(0,new GalaxyCellQueryPlan(camera,Small(new(0,0,-2000)),origin).Cells.Count);
var zero=GalaxyOriginalCatalogueLod.Create(new(0,0,0),1,500,0,1,0);
var empty=new GalaxyCellQueryPlan(camera,zero,origin);
Check.Equal(0,empty.Cells.Count);Check.That(!empty.Truncated);
}
[Test] public void SchedulingLimitsKeepOmissionsExplicitInsteadOfProvingFalseCoverage()
{
var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4);
var lod=GalaxyOriginalCatalogueLod.Create(new(0,0,0),0,500,1,1,4);
var plan=new GalaxyCellQueryPlan(camera,lod,new(49985,40985,24105),maximumCells:1,maximumCandidates:1000000);
Check.That(plan.Truncated&&plan.OmittedCandidates>0&&plan.Cells.Count==1);
foreach(var cell in plan.Cells)Check.That(lod.IntersectsCell(cell.Bounds,cell.MassCode)&&GalaxyCellQueryPlan.IntersectsFrustum(camera,cell.Bounds));
}
}