using System; using System.Collections.Generic; using System.Linq; using Moq; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; namespace Robust.UnitTesting.Shared.GameObjects { [TestFixture, Parallelizable ,TestOf(typeof(ComponentManager))] class ComponentManager_Tests { private const uint CompNetId = 3; #region Component Management [Test] public void AddComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; // Act manager.AddComponent(entity, component); // Assert var result = manager.GetComponent(entity.Uid); Assert.That(result, Is.EqualTo(component)); } [Test] public void AddComponentOverwriteTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, new DummyComponent { Owner = entity }); // Act manager.AddComponent(entity, component, true); // Assert var result = manager.GetComponent(entity.Uid); Assert.That(result, Is.EqualTo(component)); } [Test] public void HasComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.HasComponent(entity.Uid); // Assert Assert.That(result, Is.True); } [Test] public void HasNetComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.HasComponent(entity.Uid, CompNetId); // Assert Assert.That(result, Is.True); } [Test] public void GetNetComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.GetComponent(entity.Uid, CompNetId); // Assert Assert.That(result, Is.EqualTo(component)); } [Test] public void TryGetComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.TryGetComponent(entity.Uid, out var comp); // Assert Assert.That(result, Is.True); Assert.That(comp, Is.EqualTo(component)); } [Test] public void TryGetNetComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.TryGetComponent(entity.Uid, CompNetId, out var comp); // Assert Assert.That(result, Is.True); Assert.That(comp, Is.EqualTo(component)); } [Test] public void RemoveComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act manager.RemoveComponent(entity.Uid); manager.CullRemovedComponents(); // Assert Assert.That(manager.HasComponent(entity.Uid, component.GetType()), Is.False); } [Test] public void RemoveNetComponentTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act manager.RemoveComponent(entity.Uid, CompNetId); manager.CullRemovedComponents(); // Assert Assert.That(manager.HasComponent(entity.Uid, component.GetType()), Is.False); } [Test] public void GetComponentsTest() { // Arrange var manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.GetComponents(entity.Uid); // 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 manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.GetAllComponents(); // 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 manager = ManagerFactory(out var entityManager); var entity = EntityFactory(entityManager); var component = new DummyComponent(); component.Owner = entity; manager.AddComponent(entity, component); // Act var result = manager.GetComponentInstances(entity.Uid); // Assert var list = result.ToList(); Assert.That(list.Count, Is.EqualTo(1)); Assert.That(list[0], Is.EqualTo(component)); } #endregion private static IComponentManager ManagerFactory(out IEntityManager entityManager) { var dependencies = new DependencyCollection(); // set up the registration var mockRegistration = new Mock(); mockRegistration.SetupGet(x => x.References).Returns(new List { typeof(DummyComponent) }); // setup the comp factory var mockFactory = new Mock(); mockFactory.Setup(x => x.GetRegistration(It.IsAny())).Returns(mockRegistration.Object); mockFactory.Setup(x => x.GetRegistration(It.IsAny())).Returns(mockRegistration.Object); mockFactory.Setup(x => x.GetComponent()).Returns(new DummyComponent()); dependencies.RegisterInstance(mockFactory.Object); // set up the entity manager var mockEntMan = new Mock(); dependencies.RegisterInstance(mockEntMan.Object); var manager = new ComponentManager(); dependencies.InjectDependencies(manager); entityManager = mockEntMan.Object; return manager; } private class DummyComponent : Component, ICompType1, ICompType2 { public override string Name => null; public override uint? NetID => CompNetId; } private static IEntity EntityFactory(IEntityManager entityManager) { var mockEnt = new Mock(); mockEnt.SetupGet(x => x.EntityManager).Returns(entityManager); mockEnt.SetupGet(x => x.Uid).Returns(new EntityUid(7)); mockEnt.Setup(x => x.IsValid()).Returns(true); return mockEnt.Object; } private interface ICompType1 { } private interface ICompType2 { } } }