using System; using NUnit.Framework; using TrueCraft.Core.TerrainGen; using TrueCraft.API; using TrueCraft.Core.AI; using TrueCraft.API.World; using TrueCraft.Core.World; using System.Linq; namespace TrueCraft.Core.Test.AI { [TestFixture] public class PathFindingTest { private void DrawGrid(PathResult path, IWorld world) { for (int z = -8; z < 8; z++) { for (int x = -8; x < 8; x++) { var coords = new Coordinates3D(x, 4, z); if (path.Waypoints.Contains(coords)) Console.Write("o"); else { var id = world.GetBlockID(coords); if (id != 0) Console.Write("x"); else Console.Write("_"); } } Console.WriteLine(); } } [Test] public void TestAStarLinearPath() { var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var astar = new AStarPathFinder(); var path = astar.FindPath(world, new BoundingBox(), new Coordinates3D(0, 4, 0), new Coordinates3D(5, 4, 0)); DrawGrid(path, world); var expected = new[] { new Coordinates3D(0, 4, 0), new Coordinates3D(1, 4, 0), new Coordinates3D(2, 4, 0), new Coordinates3D(3, 4, 0), new Coordinates3D(4, 4, 0), new Coordinates3D(5, 4, 0) }; for (int i = 0; i < path.Waypoints.Count; i++) Assert.AreEqual(expected[i], path.Waypoints[i]); } [Test] public void TestAStarDiagonalPath() { var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var astar = new AStarPathFinder(); var start = new Coordinates3D(0, 4, 0); var end = new Coordinates3D(5, 4, 5); var path = astar.FindPath(world, new BoundingBox(), start, end); DrawGrid(path, world); // Just test the start and end, the exact results need to be eyeballed Assert.AreEqual(start, path.Waypoints[0]); Assert.AreEqual(end, path.Waypoints[path.Waypoints.Count - 1]); } [Test] public void TestAStarObstacle() { var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var astar = new AStarPathFinder(); var start = new Coordinates3D(0, 4, 0); var end = new Coordinates3D(5, 4, 0); world.SetBlockID(new Coordinates3D(3, 4, 0), 1); // Obstacle var path = astar.FindPath(world, new BoundingBox(), start, end); DrawGrid(path, world); // Just test the start and end, the exact results need to be eyeballed Assert.AreEqual(start, path.Waypoints[0]); Assert.AreEqual(end, path.Waypoints[path.Waypoints.Count - 1]); Assert.IsFalse(path.Waypoints.Contains(new Coordinates3D(3, 4, 0))); } [Test] public void TestAStarImpossible() { var world = new TrueCraft.Core.World.World("default", new FlatlandGenerator()); var astar = new AStarPathFinder(); var start = new Coordinates3D(0, 4, 0); var end = new Coordinates3D(5, 4, 0); world.SetBlockID(start + Coordinates3D.East, 1); world.SetBlockID(start + Coordinates3D.West, 1); world.SetBlockID(start + Coordinates3D.North, 1); world.SetBlockID(start + Coordinates3D.South, 1); var path = astar.FindPath(world, new BoundingBox(), start, end); Assert.IsNull(path); } } }