XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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));
    }
}