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));
}
}
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));
}
}