acdream/tests/AcDream.Core.Tests/World/ProceduralSceneryIdAllocatorTests.cs

54 lines
1.8 KiB
C#

using AcDream.Core.World;
namespace AcDream.Core.Tests.World;
public sealed class ProceduralSceneryIdAllocatorTests
{
[Fact]
public void Base_AlwaysSetsSceneryBitAndAvoidsStabPrefix()
{
for (uint y = 0; y <= 255; y += 51)
for (uint x = 0; x <= 255; x += 51)
{
uint value = ProceduralSceneryIdAllocator.Base(x, y);
Assert.NotEqual(0u, value & 0x80000000u);
Assert.NotEqual(0xC0000000u, value & 0xC0000000u);
}
}
[Fact]
public void MoreThan256SceneryEntriesRemainInOwningLandblockRange()
{
uint id = ProceduralSceneryIdAllocator.Base(0x12u, 0x36u) + 300u;
Assert.True(id < ProceduralSceneryIdAllocator.Base(0x12u, 0x37u));
Assert.NotEqual(0u, id & 0x80000000u);
}
[Fact]
public void MaximumCounterDoesNotAliasAdjacentLandblock()
{
for (uint y = 0; y < 255; y++)
{
uint current = ProceduralSceneryIdAllocator.Base(0, y);
uint next = ProceduralSceneryIdAllocator.Base(0, y + 1);
Assert.True(current + ProceduralSceneryIdAllocator.MaxCounter < next);
}
}
[Fact]
public void Allocate_AcceptsLastCounterThenFailsBeforeNamespaceWrap()
{
uint counter = ProceduralSceneryIdAllocator.MaxCounter;
uint last = ProceduralSceneryIdAllocator.Allocate(0x12u, 0x36u, ref counter);
Assert.Equal(
ProceduralSceneryIdAllocator.Base(0x12u, 0x36u)
+ ProceduralSceneryIdAllocator.MaxCounter,
last);
InvalidDataException error = Assert.Throws<InvalidDataException>(
() => ProceduralSceneryIdAllocator.Allocate(0x12u, 0x36u, ref counter));
Assert.Contains("4096-entry", error.Message, StringComparison.Ordinal);
}
}