Svart hål
This commit is contained in:
65
tests/Universe.Tests/BlackHoleTests.cs
Normal file
65
tests/Universe.Tests/BlackHoleTests.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
using Universe.App.Runtime;
|
||||
using Universe.Core.Generation;
|
||||
using Universe.Core.Math;
|
||||
using Universe.Core.World;
|
||||
|
||||
namespace Universe.Tests;
|
||||
|
||||
public sealed class BlackHoleTests
|
||||
{
|
||||
[Fact]
|
||||
public void ReplacementIsDeterministicAndPlanetsClearTheDisk()
|
||||
{
|
||||
var generator = new UniverseGenerator(123, blackHoles: new() { OccurrenceChance = 1 });
|
||||
var first = generator.Generate(new(-2, 1, 3));
|
||||
var second = generator.Generate(first.Coordinate);
|
||||
var hole = Assert.Single(first.Stars);
|
||||
Assert.True(hole.IsBlackHole);
|
||||
Assert.Equal(hole, Assert.Single(second.Stars));
|
||||
Assert.Equal(hole.RadiusMeters, hole.BlackHole!.HorizonRadiusMeters);
|
||||
Assert.All(first.Planets, p => Assert.True((p.PositionMeters - hole.PositionMeters).Length >
|
||||
hole.RadiusMeters * hole.BlackHole.DiskOuterRadiusInHorizons));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NearestSearchMatchesWideExhaustiveSearchAndFlightReachesTheHole()
|
||||
{
|
||||
var generator = new UniverseGenerator(0x554E495645525345UL);
|
||||
var streamer = new UniverseStreamer(generator);
|
||||
var start = UniversePosition.AtCellCenter(new(0, 0, 0), generator.CellSizeMeters);
|
||||
var found = streamer.FindNearestBlackHole(start);
|
||||
Assert.True(found.HasValue);
|
||||
var target = found!.Value;
|
||||
var exhaustive = generator.GenerateNeighborhood(start.Sector, 3)
|
||||
.SelectMany(s => s.Stars.Where(h => h.IsBlackHole).Select(h => (System: s, Hole: h)))
|
||||
.MinBy(b => UniversePosition.AtCellCenter(b.System.Coordinate, generator.CellSizeMeters)
|
||||
.Add(b.Hole.PositionMeters, generator.CellSizeMeters).RelativeTo(start, generator.CellSizeMeters).Length);
|
||||
Assert.Equal(exhaustive.Hole.Id, target.Hole.Id);
|
||||
var neighborhood = streamer.Load(start.Sector);
|
||||
var groundPlanet = neighborhood.ActiveSystem.Planets[0];
|
||||
var groundBody = start.Add(groundPlanet.PositionMeters, generator.CellSizeMeters);
|
||||
var groundRadial = new DVector3(1, .3, -.2).Normalized();
|
||||
var groundPosition = groundBody.Add(groundRadial * (TerrainHeight.Sample(groundPlanet, groundRadial) + 1.8), generator.CellSizeMeters);
|
||||
var camera = new FlyCamera(groundPosition, generator.CellSizeMeters);
|
||||
camera.RequestBlackHoleView(target.System, target.Hole, neighborhood.NearbySystems.Append(neighborhood.ActiveSystem));
|
||||
for (var i = 0; i < 650; i++)
|
||||
{
|
||||
camera.Update(1d / 60, DVector3.Zero, neighborhood);
|
||||
if (camera.Position.Sector != neighborhood.ActiveSystem.Coordinate) neighborhood = streamer.Load(camera.Position.Sector);
|
||||
}
|
||||
var body = UniversePosition.AtCellCenter(target.System.Coordinate, generator.CellSizeMeters)
|
||||
.Add(target.Hole.PositionMeters, generator.CellSizeMeters);
|
||||
var relative = body.RelativeTo(camera.Position, generator.CellSizeMeters);
|
||||
Assert.False(camera.IsFocusing);
|
||||
Assert.InRange(relative.Length / target.Hole.RadiusMeters, 25.99, 26.01);
|
||||
Assert.InRange(DVector3.Dot(relative.Normalized(), camera.Forward), .999, 1.001);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ZeroChanceDisablesGenerationAndSearch()
|
||||
{
|
||||
var generator = new UniverseGenerator(123, blackHoles: new() { OccurrenceChance = 0 });
|
||||
Assert.All(generator.GenerateNeighborhood(new()), s => Assert.All(s.Stars, h => Assert.False(h.IsBlackHole)));
|
||||
Assert.Null(new UniverseStreamer(generator).FindNearestBlackHole(UniversePosition.AtCellCenter(new(), generator.CellSizeMeters)));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user