using System.Collections.Generic; using System.Linq; using System.Numerics; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; using Robust.UnitTesting.Server; namespace Robust.UnitTesting.Shared.GameObjects { [TestFixture, Parallelizable ,TestOf(typeof(EntityManager))] public sealed partial class EntityManager_Components_Tests { private const string DummyLoadId = "DummyLoad"; private const string DummyLoad = $@" - type: entity id: {DummyLoadId} name: weh components: - type: Joint - type: Physics "; [Test] public void AddRegistryComponentTest() { var sim = RobustServerSimulation .NewSimulation() .RegisterPrototypes(fac => fac.LoadString(DummyLoad)) .InitializeInstance(); var entMan = sim.Resolve(); var protoManager = sim.Resolve(); var map = sim.CreateMap().Uid; var coords = new EntityCoordinates(map, default); var entity = entMan.SpawnEntity(null, coords); Assert.That(!entMan.HasComponent(entity)); var proto = protoManager.Index(DummyLoadId); entMan.AddComponents(entity, proto); Assert.Multiple(() => { Assert.That(entMan.HasComponent(entity)); Assert.That(entMan.HasComponent(entity)); }); } [Test] public void RemoveRegistryComponentTest() { var sim = RobustServerSimulation .NewSimulation() .RegisterPrototypes(fac => fac.LoadString(DummyLoad)) .InitializeInstance(); var entMan = sim.Resolve(); var protoManager = sim.Resolve(); var map = sim.CreateMap().Uid; var coords = new EntityCoordinates(map, default); var entity = entMan.SpawnEntity(DummyLoadId, coords); var proto = protoManager.Index(DummyLoadId); entMan.RemoveComponents(entity, proto); Assert.Multiple(() => { Assert.That(!entMan.HasComponent(entity)); Assert.That(!entMan.HasComponent(entity)); }); } [Test] public void AddComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = new DummyComponent(); // Act entMan.AddComponent(entity, component); // Assert var result = entMan.GetComponent(entity); Assert.That(result, Is.EqualTo(component)); } [Test] public void AddComponentOverwriteTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = new DummyComponent(); // Act entMan.AddComponent(entity, component, true); // Assert var result = entMan.GetComponent(entity); Assert.That(result, Is.EqualTo(component)); } [Test] public void AddComponent_ExistingDeleted() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var firstComp = new DummyComponent(); entMan.AddComponent(entity, firstComp); entMan.RemoveComponent(entity); var secondComp = new DummyComponent(); // Act entMan.AddComponent(entity, secondComp); // Assert var result = entMan.GetComponent(entity); Assert.That(result, Is.EqualTo(secondComp)); } [Test] public void HasComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); entMan.AddComponent(entity); // Act var result = entMan.HasComponent(entity); // Assert Assert.That(result, Is.True); } [Test] public void HasComponentNoGenericTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); entMan.AddComponent(entity); // Act var result = entMan.HasComponent(entity, typeof(DummyComponent)); // Assert Assert.That(result, Is.True); } [Test] public void HasNetComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var factory = sim.Resolve(); var netId = factory.GetRegistration().NetID!; var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); entMan.AddComponent(entity); // Act var result = entMan.HasComponent(entity, netId.Value); // Assert Assert.That(result, Is.True); } [Test] public void GetNetComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var factory = sim.Resolve(); var netId = factory.GetRegistration().NetID!; var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.GetComponent(entity, netId.Value); // Assert Assert.That(result, Is.EqualTo(component)); } [Test] public void TryGetComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.TryGetComponent(entity, out var comp); // Assert Assert.That(result, Is.True); Assert.That(comp, Is.EqualTo(component)); } [Test] public void TryGetNetComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var factory = sim.Resolve(); var netId = factory.GetRegistration().NetID!; var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.TryGetComponent(entity, netId.Value, out var comp); // Assert Assert.That(result, Is.True); Assert.That(comp, Is.EqualTo(component)); } [Test] public void RemoveComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act entMan.RemoveComponent(entity); entMan.CullRemovedComponents(); // Assert Assert.That(entMan.HasComponent(entity, component.GetType()), Is.False); } [Test] public void EnsureQueuedComponentDeletion() { var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); Assert.That(component.LifeStage, Is.LessThanOrEqualTo(ComponentLifeStage.Running)); entMan.RemoveComponentDeferred(entity, component); Assert.That(component.LifeStage, Is.EqualTo(ComponentLifeStage.Stopped)); Assert.That(entMan.EnsureComponent(entity, out var comp2), Is.False); Assert.That(comp2.LifeStage, Is.LessThanOrEqualTo(ComponentLifeStage.Running)); Assert.That(component.LifeStage, Is.EqualTo(ComponentLifeStage.Deleted)); } [Test] public void RemoveNetComponentTest() { // Arrange var (sim, coords) = SimulationFactory(); var factory = sim.Resolve(); var netId = factory.GetRegistration().NetID!; var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act entMan.RemoveComponent(entity, netId.Value); entMan.CullRemovedComponents(); // Assert Assert.That(entMan.HasComponent(entity, component.GetType()), Is.False); } [Test] public void GetComponentsTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.GetComponents(entity); // Assert var list = result.ToList(); Assert.That(list.Count, Is.EqualTo(1)); Assert.That(list[0], Is.EqualTo(component)); } [Test] public void GetAllComponentsTest() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.EntityQuery(true); // Assert var list = result.ToList(); Assert.That(list.Count, Is.EqualTo(1)); Assert.That(list[0], Is.EqualTo(component)); } [Test] public void GetAllComponentInstances() { // Arrange var (sim, coords) = SimulationFactory(); var entMan = sim.Resolve(); var fac = sim.Resolve(); var entity = entMan.SpawnEntity(null, coords); var component = entMan.AddComponent(entity); // Act var result = entMan.GetComponents(entity); // Assert var list = result.Where(c=>fac.GetComponentName(c.GetType()) == "Dummy").ToList(); Assert.That(list.Count, Is.EqualTo(1)); Assert.That(list[0], Is.EqualTo(component)); } private static (ISimulation, EntityCoordinates) SimulationFactory() { var sim = RobustServerSimulation .NewSimulation() .RegisterComponents(factory => factory.RegisterClass()) .InitializeInstance(); var map = sim.CreateMap().Uid; var coords = new EntityCoordinates(map, default); return (sim, coords); } [NetworkedComponent()] private sealed partial class DummyComponent : Component, ICompType1, ICompType2 { } private interface ICompType1 { } private interface ICompType2 { } } }