using System.Numerics; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; // ReSharper disable InconsistentNaming namespace Robust.UnitTesting.Shared.Map { [TestFixture, Parallelizable, TestOf(typeof(EntityCoordinates))] public sealed class EntityCoordinates_Tests : RobustUnitTest { [OneTimeSetUp] public void Setup() { IoCManager.Resolve().Initialize(); var prototypeManager = IoCManager.Resolve(); prototypeManager.RegisterKind(typeof(EntityPrototype), typeof(EntityCategoryPrototype)); prototypeManager.LoadString(""); // Set _hasEverBeenReloaded to true; prototypeManager.ResolveResults(); 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 mapEntity = entityManager.System().CreateMap(out var mapId); var newEnt = entityManager.CreateEntityUninitialized(null, 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(); entityManager.System().CreateMap(out var mapId); var newEnt = entityManager.CreateEntityUninitialized(null, 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 mapEntity = IoCManager.Resolve().System().CreateMap(); 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 entMan = IoCManager.Resolve(); var uid = entMan.SpawnEntity(null, MapCoordinates.Nullspace); var xform = entMan.GetComponent(uid); Assert.That(xform.Coordinates.Position, Is.EqualTo(Vector2.Zero)); xform.LocalPosition = Vector2.One; Assert.That(xform.Coordinates.Position, Is.EqualTo(Vector2.Zero)); } [Test] public void GetGridId_Map() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapEnt = entityManager.System().CreateMap(out var mapId); var newEnt = entityManager.CreateEntityUninitialized(null, new MapCoordinates(Vector2.Zero, mapId)); Assert.That(IoCManager.Resolve().GetComponent(mapEnt).Coordinates.GetGridUid(entityManager), Is.Null); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetGridUid(entityManager), Is.Null); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.EntityId, Is.EqualTo(mapEnt)); } [Test] public void GetGridId_Grid() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, new EntityCoordinates(gridEnt, Vector2.Zero)); // Grids aren't parented to other grids. Assert.That(IoCManager.Resolve().GetComponent(gridEnt).Coordinates.GetGridUid(entityManager), Is.Null); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.GetGridUid(entityManager), Is.EqualTo(grid.Owner)); 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 mapEnt = entityManager.System().CreateMap(out var mapId); var newEnt = entityManager.CreateEntityUninitialized(null, 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(); entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, 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 mapEnt = entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, new EntityCoordinates(grid, 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 mapEnt = entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, new EntityCoordinates(grid, 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 transformSystem = entityManager.System(); entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, new EntityCoordinates(grid, entPos)); Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.ToMap(entityManager, transformSystem), Is.EqualTo(new MapCoordinates(entPos, mapId))); IoCManager.Resolve().GetComponent(gridEnt).LocalPosition += gridPos; Assert.That(IoCManager.Resolve().GetComponent(newEnt).Coordinates.ToMap(entityManager, transformSystem), Is.EqualTo(new MapCoordinates(entPos + gridPos, mapId))); } [Test] public void WithEntityId() { var entityManager = IoCManager.Resolve(); var mapManager = IoCManager.Resolve(); var mapEnt = entityManager.System().CreateMap(out var mapId); var grid = mapManager.CreateGridEntity(mapId); var gridEnt = grid.Owner; var newEnt = entityManager.CreateEntityUninitialized(null, new EntityCoordinates(grid, 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(null, 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)); } } }