mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-15 23:02:34 +02:00
RobustToolbox projects should be named Robust.* This PR changes the RobustToolbox projects from SS14.* to Robust.* Updates SS14.* prefixes/namespaces to Robust.* Updates SpaceStation14.sln to RobustToolbox.sln Updates MSBUILD/SS14.* to MSBUILD/Robust.* Updates CSProject and MSBuild references for the above Updates git_helper.py Removes Runserver and Runclient as they are unusable
249 lines
9.1 KiB
C#
249 lines
9.1 KiB
C#
using System.Collections.Generic;
|
|
using Moq;
|
|
using NUnit.Framework;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Interfaces.Physics;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Maths;
|
|
using Robust.Shared.Physics;
|
|
|
|
namespace Robust.UnitTesting.Shared.Physics
|
|
{
|
|
[TestFixture]
|
|
[TestOf(typeof(PhysicsManager))]
|
|
internal class CollisionManager_Test
|
|
{
|
|
[Test]
|
|
public void IsCollidingFalse()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 4, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(0));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void IsCollidingInclusive()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 5, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(0));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void IsCollidingNotHard()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 5, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(false);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(0));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void IsCollidingTrue()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 6, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(0));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void IsCollidingFalseNoLayer()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 6, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(0));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0); // Collision layer is None
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void IsCollidingWrongMap()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var testBox = new Box2(-3, -3, 5, 6);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock.Setup(foo => foo.MapID).Returns(new MapId(3));
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IsColliding(testBox, new MapId(0));
|
|
|
|
// Assert
|
|
Assert.That(result, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void RayCast()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var ray = new Ray(new Vector2(0, 1), Vector2.UnitX, 1);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.Owner).Returns(new Entity()); // requires ICollidable not have null owner
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(1);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(1);
|
|
mock.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IntersectRay(ray);
|
|
|
|
// Assert
|
|
Assert.That(result.DidHitObject, Is.True);
|
|
Assert.That(result.Distance, Is.EqualTo(5));
|
|
Assert.That(result.HitPos.X, Is.EqualTo(5));
|
|
Assert.That(result.HitPos.Y, Is.EqualTo(1));
|
|
}
|
|
|
|
[Test]
|
|
public void RayCastMissUp()
|
|
{
|
|
// Arrange
|
|
var box = new Box2(5, -5, 10, 6);
|
|
var ray = new Ray(new Vector2(4.99999f, 1), Vector2.UnitY, 1);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock = new Mock<ICollidable>();
|
|
mock.Setup(foo => foo.WorldAABB).Returns(box);
|
|
mock.Setup(foo => foo.Owner).Returns(new Entity()); // requires ICollidable not have null owner
|
|
mock.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock.Setup(foo => foo.CollisionLayer).Returns(1);
|
|
mock.Setup(foo => foo.CollisionMask).Returns(1);
|
|
manager.AddCollidable(mock.Object);
|
|
|
|
// Act
|
|
var result = manager.IntersectRay(ray);
|
|
|
|
// Assert
|
|
Assert.That(result.DidHitObject, Is.False);
|
|
Assert.That(result.Distance, Is.EqualTo(0.0f));
|
|
Assert.That(result.HitPos, Is.EqualTo(Vector2.Zero));
|
|
}
|
|
|
|
[Test]
|
|
public void DoCollisionTestTrue()
|
|
{
|
|
// Arrange
|
|
var results = new List<ICollidable>(1);
|
|
var manager = new PhysicsManager();
|
|
|
|
var mock0 = new Mock<ICollidable>();
|
|
mock0.Setup(foo => foo.WorldAABB).Returns(new Box2(-3, -3, 6, 6));
|
|
mock0.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock0.Setup(foo => foo.MapID).Returns(new MapId(1));
|
|
mock0.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock0.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock0.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
var staticBody = mock0.Object;
|
|
manager.AddCollidable(staticBody);
|
|
|
|
var mock1 = new Mock<ICollidable>();
|
|
mock1.Setup(foo => foo.WorldAABB).Returns(new Box2(5, -5, 10, 6));
|
|
mock1.Setup(foo => foo.IsHardCollidable).Returns(true);
|
|
mock1.Setup(foo => foo.MapID).Returns(new MapId(1));
|
|
mock1.Setup(foo => foo.CollisionEnabled).Returns(true);
|
|
mock1.Setup(foo => foo.CollisionLayer).Returns(0x4);
|
|
mock1.Setup(foo => foo.CollisionMask).Returns(0x04);
|
|
var testBody = mock1.Object;
|
|
manager.AddCollidable(testBody);
|
|
|
|
manager.BuildCollisionGrid();
|
|
// Act
|
|
manager.DoCollisionTest(testBody, testBody.WorldAABB, results);
|
|
|
|
// Assert
|
|
Assert.That(results.Count, Is.EqualTo(1));
|
|
Assert.That(results[0], Is.EqualTo(staticBody));
|
|
}
|
|
}
|
|
}
|