This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
CultMath/tests/CultMath.Tests/PlanetaryResidencyTests.cs
2026-07-13 02:14:11 +01:00

57 lines
2.9 KiB
C#

using Xunit;
namespace CultMath.Tests;
public sealed class PlanetaryResidencyTests
{
private static readonly PlanetaryFieldDefinition Field = new(
1, 8.4f, 0, AdvancedErosionParameters.Default with { Scale = 0.63f, Strength = 0.12f, Octaves = 7 });
private static readonly PlanetaryLodParameters Lod = new(5, 17, 2, 720, 8.4f / 65536);
[Fact]
public void SelectorReturnsSixRootsAndOneAncestorChain()
{
var direction = math.normalize(new float3(-0.2f, 0.91f, 0.37f));
var selected = PlanetaryLodSelector.SelectAncestorChain(Field, direction, 8.45f, Lod);
Assert.Equal(6, selected.Count(tile => tile.Level == 0));
var descendants = selected.Where(tile => tile.Level > 0).OrderBy(tile => tile.Level).ToArray();
for (var i = 1; i < descendants.Length; i++) Assert.Equal(descendants[i - 1], descendants[i].Parent());
if (descendants.Length > 0) Assert.Equal(PlanetaryTopology.TileAt(direction, descendants[^1].Level), descendants[^1]);
}
[Fact]
public void ResidencyFadesResidualsWithoutChangingContentDuringPresentation()
{
var root = new PlanetaryTileAddress(PlanetaryCubeFace.PositiveX, 0, 0, 0);
var child = root.Child(1, 0);
var residency = new PlanetaryResidualResidency();
var arrival = residency.Update(new[] { root, child }, 0, 1);
var midpoint = residency.Update(new[] { root, child }, 0.5f, 1);
var settled = residency.Update(new[] { root, child }, 1, 1);
Assert.Equal(arrival.ContentVersion, midpoint.ContentVersion);
Assert.Equal(midpoint.ContentVersion, settled.ContentVersion);
Assert.Equal(0, arrival.Tiles.Single(tile => tile.Tile == child).Blend);
Assert.Equal(0.5f, midpoint.Tiles.Single(tile => tile.Tile == child).Blend);
Assert.Equal(1, settled.Tiles.Single(tile => tile.Tile == child).Blend);
var leaving = residency.Update(new[] { root }, 1.25f, 1);
Assert.True(leaving.Tiles.Single(tile => tile.Tile == child).Departing);
Assert.Equal(1, leaving.Tiles.Single(tile => tile.Tile == child).Blend);
var gone = residency.Update(new[] { root }, 2.25f, 1);
Assert.DoesNotContain(gone.Tiles, tile => tile.Tile == child);
}
[Fact]
public void ReversingAnArrivalDepartsFromItsCurrentWeightWithoutJumping()
{
var root = new PlanetaryTileAddress(PlanetaryCubeFace.PositiveX, 0, 0, 0);
var child = root.Child(0, 1);
var residency = new PlanetaryResidualResidency();
_ = residency.Update(new[] { root, child }, 0, 1);
var arriving = residency.Update(new[] { root, child }, 0.25f, 1);
var departing = residency.Update(new[] { root }, 0.25f, 1);
Assert.Equal(0.25f, arriving.Tiles.Single(tile => tile.Tile == child).Blend);
Assert.Equal(0.25f, departing.Tiles.Single(tile => tile.Tile == child).Blend);
Assert.True(departing.Tiles.Single(tile => tile.Tile == child).Departing);
}
}