74 lines
2.0 KiB
C#

using NSubstitute;
using SpatialCollections;
using System.Numerics;
namespace QuadtreeTests
{
public class Tests
{
private const float BoundingRadius = 1.0f;
private class TestEntity(Vector2 position)
{
public Vector2 Position { get; } = position;
public Rectangle BoundingBox { get; } = new Rectangle(position - Vector2.One, position + Vector2.One);
}
private List<Vector2> _positions;
private List<TestEntity> _entities;
private Quadtree<TestEntity> _quadtree;
[SetUp]
public void Setup()
{
_positions = [new Vector2(1.0f, 1.0f), new Vector2(3.0f, 3.0f), new Vector2(5.0f, 8.0f)];
_entities = new();
_quadtree = new(20, 4, e => e.Position, e => e.BoundingBox);
for (int i = 0; i < _positions.Count; i++)
{
var obj = new TestEntity(_positions[i]);
_entities.Add(obj);
}
}
[Test]
public void TestAdd()
{
AddObjectsAndAssertCount();
}
[Test]
public void TestAddRemove()
{
AddObjectsAndAssertCount();
for (int i = 0; i < _entities.Count; i++)
{
_quadtree.Remove(_entities[i]);
Assert.That(_quadtree.Count, Is.EqualTo(_entities.Count - i - 1));
}
}
[Test]
public void TestQuery()
{
AddObjectsAndAssertCount();
List<TestEntity> result = new();
_quadtree.Query(new Rectangle(new Vector2(3.5f, 3.5f), new Vector2(10.0f, 10.0f)), result);
Assert.That(result.Count, Is.EqualTo(2));
}
private void AddObjectsAndAssertCount()
{
for (int i = 0; i < _entities.Count; i++)
{
_quadtree.Add(_entities[i], BoundingRadius);
Assert.That(_quadtree.Count, Is.EqualTo(i + 1));
}
}
}
}