feat: add IChunkModificationStore and in-memory implementation

This commit is contained in:
2026-06-01 10:10:23 +02:00
parent 6f6fd7ecc5
commit 7c310ebc6a
3 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
using OpenTK.Mathematics;
using VoxelEngine.World.Persistence;
using Xunit;
namespace VoxelEngine.Tests.Persistence;
public class InMemoryChunkModificationStoreTests
{
[Fact]
public void NewStore_HasNoDiffs()
{
var s = new InMemoryChunkModificationStore();
Assert.False(s.HasDiff(new Vector3i(0, 0, 0)));
Assert.False(s.TryGetDiff(new Vector3i(0, 0, 0), out _));
}
[Fact]
public void RecordEdit_StoresAndIsRetrievable()
{
var s = new InMemoryChunkModificationStore();
Vector3i pos = new(1, 2, 3);
s.RecordEdit(pos, 42, 7);
Assert.True(s.HasDiff(pos));
Assert.True(s.TryGetDiff(pos, out var diff));
Assert.Single(diff!);
Assert.Equal((ushort)7, diff![42]);
}
[Fact]
public void RecordEdit_OverwritesSameLocalIndex()
{
var s = new InMemoryChunkModificationStore();
Vector3i pos = new(0, 0, 0);
s.RecordEdit(pos, 10, 1);
s.RecordEdit(pos, 10, 2);
Assert.True(s.TryGetDiff(pos, out var diff));
Assert.Single(diff!);
Assert.Equal((ushort)2, diff![10]);
}
[Fact]
public void RecordEdit_MultipleChunks_AreIndependent()
{
var s = new InMemoryChunkModificationStore();
s.RecordEdit(new Vector3i(0, 0, 0), 0, 1);
s.RecordEdit(new Vector3i(1, 0, 0), 0, 2);
Assert.True(s.TryGetDiff(new Vector3i(0, 0, 0), out var a));
Assert.True(s.TryGetDiff(new Vector3i(1, 0, 0), out var b));
Assert.Equal((ushort)1, a![0]);
Assert.Equal((ushort)2, b![0]);
}
[Fact]
public void ClearDiff_RemovesChunk()
{
var s = new InMemoryChunkModificationStore();
Vector3i pos = new(5, 5, 5);
s.RecordEdit(pos, 0, 1);
s.ClearDiff(pos);
Assert.False(s.HasDiff(pos));
}
}