using System.IO; using Moq; using NUnit.Framework; using Robust.Server.GameObjects; using Robust.Server.Physics; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Physics; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; // ReSharper disable InconsistentNaming // ReSharper disable AccessToStaticMemberViaDerivedType namespace Robust.UnitTesting.Shared.Map { [TestFixture, Parallelizable, TestOf(typeof(EntityCoordinates))] public sealed class EntityCoordinates_Tests : RobustUnitTest { private const string PROTOTYPES = @" - type: entity name: dummy id: dummy components: - type: Transform"; [OneTimeSetUp] public void Setup() { IoCManager.Resolve().Initialize(); var prototypeManager = IoCManager.Resolve(); prototypeManager.RegisterType(typeof(EntityPrototype)); prototypeManager.LoadFromStream(new StringReader(PROTOTYPES)); prototypeManager.Resync(); var factory = IoCManager.Resolve(); factory.GenerateNetIds(); } /// /// Passing an invalid entity ID into the constructor makes it invalid. /// [Test] public void IsValid_InvalidEntId_False() { var entityManager = IoCManager.Resolve(); // Same as EntityCoordinates.Invalid var coords = new EntityCoordinates(EntityUid.Invalid, Vector2.Zero); Assert.That(coords.IsValid(entityManager), Is.False); } /// /// Deleting the parent entity should make the coordinates invalid. /// [Test] public void IsValid_EntityDeleted_False() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEntity = mapManager.CreateNewMapEntity(mapId); var newEnt = entityManager.CreateEntityUninitialized("dummy", new MapCoordinates(Vector2.Zero, mapId)); var coords = IoCManager.Resolve().GetComponent(newEnt).Coordinates; var result = coords.IsValid(entityManager); Assert.That(result, Is.True); IoCManager.Resolve().DeleteEntity(mapEntity); result = coords.IsValid(entityManager); Assert.That(result, Is.False); } /// /// Passing a valid entity ID into the constructor with infinite numbers makes it invalid. /// [TestCase(float.NaN, float.NaN)] [TestCase(0, float.NaN)] [TestCase(float.NaN, 0)] public void IsValid_NonFiniteVector_False(float x, float y) { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEntity = mapManager.CreateNewMapEntity(mapId); var newEnt = entityManager.CreateEntityUninitialized("dummy", new MapCoordinates(new Vector2(x, y), mapId)); var coords = IoCManager.Resolve().GetComponent(newEnt).Coordinates; Assert.That(coords.IsValid(entityManager), Is.False); } [Test] public void EntityCoordinates_Map() { var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEntity = mapManager.CreateNewMapEntity(mapId); Assert.That(IoCManager.Resolve().GetComponent(mapEntity).ParentUid.IsValid(), Is.False); Assert.That(IoCManager.Resolve().GetComponent(mapEntity).Coordinates.EntityId, Is.EqualTo(mapEntity)); } /// /// Even if we change the local position of an entity without a parent, /// EntityCoordinates should still return offset 0. /// [Test] public void NoParent_OffsetZero() { var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEntity = mapManager.CreateNewMapEntity(mapId); Assert.That(IoCManager.Resolve().GetComponent(mapEntity).Coordinates.Position, Is.EqualTo(Vector2.Zero)); IoCManager.Resolve().GetComponent(mapEntity).LocalPosition = Vector2.One; Assert.That(IoCManager.Resolve().GetComponent(mapEntity).Coordinates.Position, Is.EqualTo(Vector2.Zero)); } [Test] public void GetGridId_Map() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEnt = mapManager.CreateNewMapEntity(mapId); var newEnt = entityManager.CreateEntityUninitialized("dummy", new MapCoordinates(Vector2.Zero, mapId)); Assert.That(IoCManager.Resolve().GetComponent(mapEnt).Coordinates.GetGridId(entityManager), Is.EqualTo(GridId.Invalid)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetGridId(entityManager), Is.EqualTo(GridId.Invalid)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.EntityId, Is.EqualTo(mapEnt)); } [Test] public void GetGridId_Grid() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(gridEnt, Vector2.Zero)); // Grids aren't parented to other grids. Assert.That(IoCManager.Resolve().GetComponent(gridEnt).Coordinates.GetGridId(entityManager), Is.EqualTo(GridId.Invalid)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetGridId(entityManager), Is.EqualTo(grid.Index)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.EntityId, Is.EqualTo(gridEnt)); } [Test] public void GetMapId_Map() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEnt = mapManager.CreateNewMapEntity(mapId); var newEnt = entityManager.CreateEntityUninitialized("dummy", new MapCoordinates(Vector2.Zero, mapId)); Assert.That(IoCManager.Resolve().GetComponent(mapEnt).Coordinates.GetMapId(entityManager), Is.EqualTo(mapId)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetMapId(entityManager), Is.EqualTo(mapId)); } [Test] public void GetMapId_Grid() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(gridEnt, Vector2.Zero)); Assert.That(IoCManager.Resolve().GetComponent(gridEnt).Coordinates.GetMapId(entityManager), Is.EqualTo(mapId)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetMapId(entityManager), Is.EqualTo(mapId)); } [Test] public void GetParent() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var mapEnt = mapManager.GetMapEntityId(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(grid.GridEntityId, Vector2.Zero)); Assert.That(entityManager.GetComponent(mapEnt).Coordinates.EntityId, Is.EqualTo(mapEnt)); Assert.That(entityManager.GetComponent(gridEnt).Coordinates.EntityId, Is.EqualTo(mapEnt)); Assert.That(entityManager.GetComponent(newEnt).Coordinates.EntityId, Is.EqualTo(gridEnt)); // Reparenting the entity should return correct results. entityManager.GetComponent(newEnt).AttachParent(mapEnt); Assert.That(entityManager.GetComponent(newEnt).Coordinates.EntityId, Is.EqualTo(mapEnt)); } [Test] public void TryGetParent() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var mapEnt = mapManager.GetMapEntityId(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(grid.GridEntityId, Vector2.Zero)); var mapCoords = entityManager.GetComponent(mapEnt).Coordinates; Assert.That(mapCoords.IsValid(entityManager), Is.EqualTo(true)); Assert.That(mapCoords.EntityId, Is.EqualTo(mapEnt)); var gridCoords = entityManager.GetComponent(mapEnt).Coordinates; Assert.That(gridCoords.IsValid(entityManager), Is.EqualTo(true)); Assert.That(gridCoords.EntityId, Is.EqualTo(mapEnt)); var newEntTransform = entityManager.GetComponent(newEnt); var newEntCoords = newEntTransform.Coordinates; Assert.That(newEntCoords.IsValid(entityManager), Is.EqualTo(true)); Assert.That(newEntCoords.EntityId, Is.EqualTo(gridEnt)); // Reparenting the entity should return correct results. newEntTransform.AttachParent(mapEnt); var newEntCoords2 = newEntTransform.Coordinates; Assert.That(newEntCoords2.IsValid(entityManager), Is.EqualTo(true)); Assert.That(newEntCoords2.EntityId, Is.EqualTo(mapEnt)); // Deleting the parent should make TryGetParent return false. entityManager.DeleteEntity(mapEnt); // These shouldn't be valid anymore. Assert.That(entityManager.Deleted(newEnt), Is.True); Assert.That(entityManager.Deleted(gridEnt), Is.True); Assert.That(entityManager.Deleted(newEntCoords.EntityId), Is.True); Assert.That(entityManager.Deleted(gridCoords.EntityId), Is.True); } [Test] [TestCase(0, 0, 0, 0)] [TestCase(5, 0, 0, 0)] [TestCase(5, 0, 0, 5)] [TestCase(-5, 5, 5, -5)] [TestCase(100, -500, -200, -300)] public void ToMap_MoveGrid(float x1, float y1, float x2, float y2) { var gridPos = new Vector2(x1, y1); var entPos = new Vector2(x2, y2); var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(grid.GridEntityId, entPos)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.ToMap(entityManager), Is.EqualTo(new MapCoordinates(entPos, mapId))); IoCManager.Resolve().GetComponent(gridEnt).LocalPosition += gridPos; Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.ToMap(entityManager), Is.EqualTo(new MapCoordinates(entPos + gridPos, mapId))); } [Test] public void WithEntityId() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapId = mapManager.CreateMap(); var mapEnt = mapManager.GetMapEntityId(mapId); var grid = mapManager.CreateGrid(mapId); var gridEnt = grid.GridEntityId; var newEnt = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(grid.GridEntityId, Vector2.Zero)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.WithEntityId(mapEnt).Position, Is.EqualTo(Vector2.Zero)); IoCManager.Resolve().GetComponent(newEnt).LocalPosition = Vector2.One; Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.Position, Is.EqualTo(Vector2.One)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.WithEntityId(mapEnt).Position, Is.EqualTo(Vector2.One)); IoCManager.Resolve().GetComponent(gridEnt).LocalPosition = Vector2.One; Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.Position, Is.EqualTo(Vector2.One)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.WithEntityId(mapEnt).Position, Is.EqualTo(new Vector2(2, 2))); var newEntTwo = entityManager.CreateEntityUninitialized("dummy", new EntityCoordinates(newEnt, Vector2.Zero)); Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.Position, Is.EqualTo(Vector2.Zero)); Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.WithEntityId(mapEnt).Position, Is.EqualTo(IoCManager.Resolve().GetComponent(newEnt).Coordinates.WithEntityId(mapEnt).Position)); Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.WithEntityId(gridEnt).Position, Is.EqualTo(IoCManager.Resolve().GetComponent(newEnt).Coordinates.Position)); IoCManager.Resolve().GetComponent(newEntTwo).LocalPosition = -Vector2.One; Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.Position, Is.EqualTo(-Vector2.One)); Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.WithEntityId(mapEnt).Position, Is.EqualTo(Vector2.One)); Assert.That(IoCManager.Resolve().GetComponent(newEntTwo).Coordinates.WithEntityId(gridEnt).Position, Is.EqualTo(Vector2.Zero)); } } }