forked from MoonsideGames/MoonTools.Bonk
117 lines
5.0 KiB
C#
117 lines
5.0 KiB
C#
using FluentAssertions;
|
|
using NUnit.Framework;
|
|
using MoonTools.Structs;
|
|
using MoonTools.Bonk;
|
|
using System.Numerics;
|
|
using System.Collections.Immutable;
|
|
|
|
namespace Tests
|
|
{
|
|
public class SpatialHashTest
|
|
{
|
|
[Test]
|
|
public void InsertAndRetrieve()
|
|
{
|
|
var spatialHash = new SpatialHash<int>(16);
|
|
|
|
var rectA = new Rectangle(-2, -2, 4, 4);
|
|
var rectATransform = new Transform2D(new Vector2(-8, -8));
|
|
|
|
var rectB = new Rectangle(-2, -2, 4, 4);
|
|
var rectBTransform = new Transform2D(new Vector2(8, 8));
|
|
|
|
var rectC = new Rectangle(-2, -2, 4, 4);
|
|
var rectCTransform = new Transform2D(new Vector2(24, -4));
|
|
|
|
var rectD = new Rectangle(-2, -2, 4, 4);
|
|
var rectDTransform = new Transform2D(new Vector2(24, 24));
|
|
|
|
var circleA = new Circle(2);
|
|
var circleATransform = new Transform2D(new Vector2(24, -8));
|
|
|
|
var circleB = new Circle(8);
|
|
var circleBTransform = new Transform2D(new Vector2(16, 16));
|
|
|
|
var line = new Line(new Position2D(20, -4), new Position2D(22, -12));
|
|
var lineTransform = new Transform2D(new Vector2(0, 0));
|
|
|
|
var point = new Point();
|
|
var pointTransform = new Transform2D(new Position2D(8, 8));
|
|
|
|
var multiRectangle = new MultiShape(
|
|
ImmutableArray.Create<(IShape2D, Transform2D)>(
|
|
(new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -2))),
|
|
(new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, -1))),
|
|
(new Rectangle(-2, 0, 4, 1), new Transform2D(new Position2D(-2, 0)))
|
|
)
|
|
);
|
|
var multiRectangleTransform = new Transform2D(new Position2D(8, 8));
|
|
|
|
spatialHash.Insert(0, rectA, rectATransform);
|
|
spatialHash.Insert(1, rectB, rectBTransform);
|
|
spatialHash.Insert(2, rectC, rectCTransform);
|
|
spatialHash.Insert(3, rectD, rectDTransform);
|
|
spatialHash.Insert(4, circleA, circleATransform);
|
|
spatialHash.Insert(9, circleB, circleBTransform);
|
|
spatialHash.Insert(6, line, lineTransform);
|
|
spatialHash.Insert(7, point, pointTransform);
|
|
spatialHash.Insert(8, multiRectangle, multiRectangleTransform);
|
|
|
|
spatialHash.Retrieve(0, rectA, rectATransform).Should().BeEmpty();
|
|
spatialHash.Retrieve(1, rectB, rectBTransform).Should().NotContain((1, circleB, circleBTransform));
|
|
spatialHash.Retrieve(1, rectB, rectBTransform).Should().Contain((7, point, pointTransform));
|
|
spatialHash.Retrieve(1, rectB, rectBTransform).Should().Contain((8, multiRectangle, multiRectangleTransform));
|
|
spatialHash.Retrieve(2, rectC, rectCTransform).Should().Contain((6, line, lineTransform)).And.Contain((4, circleA, circleATransform));
|
|
spatialHash.Retrieve(3, rectD, rectDTransform).Should().Contain((9, circleB, circleBTransform));
|
|
|
|
spatialHash.Retrieve(4, circleA, circleATransform).Should().Contain((6, line, lineTransform)).And.Contain((2, rectC, rectCTransform));
|
|
spatialHash.Retrieve(1, circleB, circleBTransform).Should().NotContain((1, rectB, rectBTransform)).And.Contain((3, rectD, rectDTransform));
|
|
|
|
spatialHash.Retrieve(6, line, lineTransform).Should().Contain((4, circleA, circleATransform)).And.Contain((2, rectC, rectCTransform));
|
|
|
|
spatialHash.Retrieve(8, multiRectangle, multiRectangleTransform).Should().Contain((1, rectB, rectBTransform));
|
|
spatialHash.Retrieve(8, multiRectangle, multiRectangleTransform).Should().NotContain((0, rectA, rectATransform));
|
|
}
|
|
|
|
[Test]
|
|
public void InsertAndRetrieveSameValues()
|
|
{
|
|
var spatialHash = new SpatialHash<int>(16);
|
|
|
|
var rectA = new Rectangle(-2, -2, 4, 4);
|
|
var rectATransform = new Transform2D(new Vector2(-8, -8));
|
|
|
|
var rectB = new Rectangle(-2, -2, 4, 4);
|
|
var rectBTransform = new Transform2D(new Vector2(-8, -8));
|
|
|
|
var rectC = new Rectangle(-2, -2, 2, 2);
|
|
var rectCTransform = new Transform2D(new Vector2(-8, -8));
|
|
|
|
spatialHash.Insert(0, rectA, rectATransform);
|
|
spatialHash.Insert(1, rectB, rectBTransform);
|
|
spatialHash.Insert(2, rectC, rectCTransform);
|
|
|
|
spatialHash.Retrieve(2, rectC, rectCTransform).Should().HaveCount(2);
|
|
}
|
|
|
|
[Test]
|
|
public void Clear()
|
|
{
|
|
var spatialHash = new SpatialHash<int>(16);
|
|
|
|
var rectA = new Rectangle(-2, -2, 4, 4);
|
|
var rectATransform = new Transform2D(new Vector2(-8, -8));
|
|
|
|
var rectB = new Rectangle(-2, -2, 4, 4);
|
|
var rectBTransform = new Transform2D(new Vector2(8, 8));
|
|
|
|
spatialHash.Insert(0, rectA, rectATransform);
|
|
spatialHash.Insert(1, rectB, rectBTransform);
|
|
|
|
spatialHash.Clear();
|
|
|
|
spatialHash.Retrieve(0, rectA, rectATransform).Should().HaveCount(0);
|
|
}
|
|
}
|
|
}
|