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 GalaxyOriginalCatalogueLodTests
{
    private static void Near(double expected,double actual,double tolerance=1e-8)=>
        Check.That(Math.Abs(expected-actual)<tolerance,$"expected {expected}, got {actual}");

    [Test] public void OriginalRangeUsesQualityAndDensityRatherThanCameraDistance()
    {
        var sparse=GalaxyOriginalCatalogueLod.BaseRadius(0,0);
        Near(200,sparse,.0001);Near(sparse,GalaxyOriginalCatalogueLod.BaseRadius(-1,500));
        var dense=GalaxyOriginalCatalogueLod.BaseRadius(1,500);
        Near(7.469007645958946,dense,.00001);
        Near(dense,GalaxyOriginalCatalogueLod.BaseRadius(2,500));
        Near(Math.Pow(8,GalaxyOriginalCatalogueLod.CubeRootExponent),
            GalaxyOriginalCatalogueLod.BaseRadius(1,4000)/dense);
    }

    [Test] public void OnlyMassSevenGetsTheOriginalSparseExpansion()
    {
        var lod=GalaxyOriginalCatalogueLod.Create(new(1,2,3),.3,1000,.5,2,4);
        Near(lod.BaseRadius,lod.InnerRadius);Near(5120,lod.OuterRadius-lod.InnerRadius);
        Check.Equal(8,lod.MassRadii.Count);
        for(var m=0;m<7;m++)Near(lod.InnerRadius,lod.RadiusForMassCode(m));
        Near(lod.OuterRadius,lod.RadiusForMassCode(7));
        var dense=GalaxyOriginalCatalogueLod.Create(new(1,2,3),1,1000,3.5,2,4);
        Near(dense.BaseRadius*7,dense.InnerRadius);Near(dense.InnerRadius,dense.OuterRadius);
        var middle=GalaxyOriginalCatalogueLod.Create(new(1,2,3),GalaxyOriginalCatalogueLod.DensityThreshold*1.5,1000,1,1,4);
        Near(3840,middle.OuterRadius-middle.InnerRadius);
    }

    [Test] public void OriginalCellIntersectionRetainsWholeCellsAndUsesStrictTangency()
    {
        var lod=GalaxyOriginalCatalogueLod.Create(new(0,0,0),1,500,1,1,4);
        var r=lod.InnerRadius;
        Check.That(lod.IntersectsCell(new(new(r-1,-1,-1),new(r+100,1,1)),0),"A cell straddling the radius must be loaded in full.");
        Check.That(!lod.IntersectsCell(new(new(r,-1,-1),new(r+100,1,1)),0),"The original predicate rejects exact tangency.");
        var zero=GalaxyOriginalCatalogueLod.Create(new(0,0,0),1,500,0,1,4);
        Check.That(!zero.IntersectsCell(new(new(-1,-1,-1),new(1,1,1)),0),"Zero radius rejects the containing cell too.");
    }

    [Test] public void CellBoundsDecodeMassCodeAndExplicitCoordinateOrigin()
    {
        var origin=new Coordinates(49985,40985,24105);
        for(var m=0;m<8;m++)
        {
            var cell=((ulong)3<<(30-2*m))|((ulong)2<<(17-m))|((ulong)5<<3)|(uint)m;
            var bounds=GalaxyOriginalCatalogueLod.CellBounds(cell,origin);var size=10d*(1<<m);
            Near(3*size-origin.X,bounds.Minimum.X);Near(2*size-origin.Y,bounds.Minimum.Y);Near(5*size-origin.Z,bounds.Minimum.Z);
            Near(size,bounds.Maximum.X-bounds.Minimum.X);Near(size,bounds.Maximum.Y-bounds.Minimum.Y);Near(size,bounds.Maximum.Z-bounds.Minimum.Z);
        }
    }

    [Test] public void UnknownConfigurationDoesNotBecomeACompleteOriginalDescriptor()
    {
        var centre=new Coordinates(0,0,0);
        Check.That(!GalaxyOriginalCatalogueLod.TryCreate(centre,1,null,1,1,4,out _));
        Check.That(!GalaxyOriginalCatalogueLod.TryCreate(centre,1,500,null,1,4,out _));
        Check.That(!GalaxyOriginalCatalogueLod.TryCreate(centre,1,500,1,null,4,out _));
        Check.That(!GalaxyOriginalCatalogueLod.TryCreate(centre,1,500,1,1,null,out _));
        Check.That(!GalaxyOriginalCatalogueLod.TryCreate(centre,double.NaN,500,1,1,4,out _));
        Check.That(GalaxyOriginalCatalogueLod.TryCreate(centre,1,0,1,1,4,out var descriptor));
        Check.Equal(500u,descriptor!.EffectiveQualityStarCount);Check.Equal(0u,descriptor.QualityStarCount);
    }

    [Test] public void OriginalViewModeChoosesEyeOrFocusWithoutChangingPose()
    {
        var camera=GalaxyCamera.Create(new(20,30,40),1200,800,.2,.4,3,0,0);
        Check.Equal(camera.Eye,GalaxyOriginalCatalogueLod.QueryCentre(camera,null));
        Check.Equal(camera.Eye,GalaxyOriginalCatalogueLod.QueryCentre(camera,0));
        Check.Equal(camera.Focus,GalaxyOriginalCatalogueLod.QueryCentre(camera,1));
        Check.Equal(camera.Focus,GalaxyOriginalCatalogueLod.QueryCentre(camera,4));
    }
}