Files
GridCasting/GridCastingTests/GridResolverTests.cs
2026-04-17 16:38:06 +03:00

127 lines
3.6 KiB
C#

using GridCasting.Models.GridGraph;
using GridCasting.Transform;
using IgdrasilEngine.Engine.Math.Boxes;
using IgdrasilEngine.Engine.Math.Vectors;
namespace GridCastingTests;
public class GridResolverTests
{
private GridResolver _resolver;
private static readonly int[] Expected = [0, 2, 1];
[SetUp]
public void Setup()
{
// Create a simple hex grid
var graph = new GridGraph();
var node = new GridGraphNode();
for (var i = 0; i < 6; i++)
node.Edges.Add(new GridGraphEdge(node, node, MathF.PI * i / 3, 1));
graph.Nodes.Add(node);
_resolver = new GridResolver(
graph,
0.1f
);
}
[Test]
public void TestWorkingPath()
{
IVector3[] points = [
new(7, 2, 5),
new(7, 2, 6),
new(7, 3, 6)
];
var positions = points.Select(p =>
{
var result = FVector2.Zero;
for (var i = 0; i < 3; i++)
{
var angle = MathF.PI * i / 3;
var value = i switch
{
0 => p.X,
1 => p.Y,
2 => p.Z,
_ => throw new ArgumentOutOfRangeException(nameof(i))
};
result += new FVector2(
value * MathF.Cos(angle),
value * MathF.Sin(angle)
);
}
return result;
}).ToArray();
var path = _resolver.GetPath(positions);
Assert.Multiple(() =>
{
Assert.That(path.HasValue, Is.True, "Path is null");
Assert.That(path.Value, Is.EqualTo(Expected), "Path is incorrect");
});
}
[Test]
public void TestRippedPath()
{
IVector3[] points = [
new(7, 2, 5),
new(7, 2, 6),
new(7, 4, 6)
];
var positions = points.Select(p =>
{
var result = FVector2.Zero;
for (var i = 0; i < 3; i++)
{
var angle = MathF.PI * i / 3;
var value = i switch
{
0 => p.X,
1 => p.Y,
2 => p.Z,
_ => throw new ArgumentOutOfRangeException(nameof(i))
};
result += new FVector2(
value * MathF.Cos(angle),
value * MathF.Sin(angle)
);
}
return result;
}).ToArray();
var path = _resolver.GetPath(positions);
Assert.That(path.HasValue, Is.False, "Path is not null");
}
[Test]
public void TestEmptyPath()
{
FVector2[] positions = [];
var path = _resolver.GetPath(positions);
Assert.That(path.HasValue, Is.False, "Path is not null");
}
[Test]
public void TestGrid()
{
var positions = _resolver.GetGridPositions(new FBox2(FVector2.One * -5, FVector2.One * 5));
var invSqrt3 = 1f / MathF.Sqrt(3);
Assert.Multiple(() =>
{
foreach (var pos in positions)
{
var x = float.Abs(pos.X - invSqrt3 * pos.Y);
var y = float.Abs(2 * invSqrt3 * pos.Y);
x -= (int)x;
y -= (int)y;
if (x > 0.5) x -= 1;
if (y > 0.5) y -= 1;
Assert.That(x, Is.EqualTo(0).Within(0.001f), $"Position {pos} is not on the grid");
Assert.That(y, Is.EqualTo(0).Within(0.001f), $"Position {pos} is not on the grid");
}
});
}
}