Files
RobustToolbox/Robust.UnitTesting/Server/GameObjects/Components/Container_Test.cs
T
c17c8d7a11 Physics (#1605)
* Physics worlds

* Paul's a good boy

* Build working

* Ingame and not lagging to hell

* Why didn't you commit ahhhhh

* Hard collisions working

* Solver parity

* Decent broadphase work done

* BroadPhase outline done

* BroadPhase working

* waiting for pvs

* Fix static PVS AABB

* Stop static bodies from awakening

* Optimise a bunch of stuff

* Even more broadphase stuff

* I'm fucking stupid

* Optimise fixture updates

* Collision solver start

* Building

* A is for Argumentative

* Fix contact caching island flags

* Circle shapes actually workeded

* Damping

* DS2 consumables only

* Slightly more stable

* Even slightlier more stablier

* VV your heart out

* Initial joint support

* 90% of joints I just wanted to push as I'd scream if I lost progress

* JOINT PURGATORY

* Joints barely functional lmao

* Okay these joints slightly more functional

* Remove station FrictionJoint

* Also that

* Some Box2D ports

* Cleanup mass

* Edge shape

* Active contacts

* Fix active contacts

* Optimise active contacts even more

* Boxes be stacking

* I would die for smug oh my fucking god

* In which everything is fixed

* Distance joints working LETS GO

* Remove frequency on distancejoint

* Fix some stuff and break joints

* Crashing fixed mehbeh

* ICollideSpecial and more resilience

* auto-clear

* showbb vera

* Slap that TODO in there

* Fix restartround crash

* Random fixes

* Fix fixture networking

* Add intersection method for broadphase

* Fix contacts

* Licenses done

* Optimisations

* Fix wall clips

* Config caching for island

* allocations optimisations

* Optimise casts

* Optimise events queue for physics

* Contact manager optimisations

* Optimise controllers

* Sloth joint or something idk

* Controller graph

* Remove content cvar

* Random cleanup

* Finally remove VirtualController

* Manifold structs again

* Optimise this absolute retardation

* Optimise

* fix license

* Cleanup physics interface

* AHHHHHHHHHHHHH

* Fix collisions again

* snivybus

* Fix potential nasty manifold bug

* Tests go snivy

* Disable prediction for now

* Spans

* Fix ShapeTypes

* fixes

* ch ch changeesss

* Kinematic idea

* Prevent static bodies from waking

* Pass WorldAABB to MoveEvent

* Fix collisions

* manifold structs fucking WOOORRKKKINNGGG

* Better pushing

* Fix merge ickies

* Optimise MoveEvents

* Use event for collisions performance

* Fix content tests

* Do not research tests

* Fix most conflicts

* Paul's trying to kill me

* Maybe collisions work idk

* Make us whole again

* Smug is also trying to kill me

* nani

* shitty collisions

* Settling

* Do not research collisions

* SHIP IT

* Fix joints

* PVS moment

* Fix other assert

* Fix locker collisions

* serializable sleeptime

* Aether2D contacts

* Physics is no longer crashing (and burning)

* Add to the TODO list

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-08 03:19:01 +11:00

329 lines
13 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Moq;
using NUnit.Framework;
using Robust.Shared.Containers;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Players;
namespace Robust.UnitTesting.Server.GameObjects.Components
{
[TestFixture, Parallelizable]
public class ContainerTest
{
private static ISimulation SimulationFactory()
{
var sim = RobustServerSimulation
.NewSimulation()
.RegisterComponents(factory => { factory.RegisterClass<ContainerManagerComponent>(); factory.RegisterReference<ContainerManagerComponent, IContainerManager>(); })
.RegisterPrototypes(protoMan => protoMan.LoadString(PROTOTYPES))
.InitializeInstance();
// Adds the map with id 1, and spawns entity 1 as the map entity.
sim.AddMap(1);
return sim;
}
const string PROTOTYPES = @"
- type: entity
name: dummy
id: dummy
";
[Test]
public void TestCreation()
{
var sim = SimulationFactory();
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(entity, "dummy");
Assert.That(container.ID, Is.EqualTo("dummy"));
Assert.That(container.Owner, Is.EqualTo(entity));
var manager = entity.GetComponent<IContainerManager>();
Assert.That(container.Manager, Is.EqualTo(manager));
Assert.That(() => ContainerHelpers.CreateContainer<Container>(entity, "dummy"), Throws.ArgumentException);
Assert.That(manager.HasContainer("dummy2"), Is.False);
var container2 = ContainerHelpers.CreateContainer<Container>(entity, "dummy2");
Assert.That(container2.Manager, Is.EqualTo(manager));
Assert.That(container2.Owner, Is.EqualTo(entity));
Assert.That(container2.ID, Is.EqualTo("dummy2"));
Assert.That(manager.HasContainer("dummy"), Is.True);
Assert.That(manager.HasContainer("dummy2"), Is.True);
Assert.That(manager.HasContainer("dummy3"), Is.False);
Assert.That(manager.GetContainer("dummy"), Is.EqualTo(container));
Assert.That(manager.GetContainer("dummy2"), Is.EqualTo(container2));
Assert.That(() => manager.GetContainer("dummy3"), Throws.TypeOf<KeyNotFoundException>());
entity.Delete();
Assert.That(manager.Deleted, Is.True);
Assert.That(container.Deleted, Is.True);
Assert.That(container2.Deleted, Is.True);
}
[Test]
public void TestInsertion()
{
var sim = SimulationFactory();
var owner = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var inserted = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var transform = inserted.Transform;
var container = ContainerHelpers.CreateContainer<Container>(owner, "dummy");
Assert.That(container.Insert(inserted), Is.True);
Assert.That(transform.Parent!.Owner, Is.EqualTo(owner));
var container2 = ContainerHelpers.CreateContainer<Container>(inserted, "dummy");
Assert.That(container2.Insert(owner), Is.False);
var success = container.Remove(inserted);
Assert.That(success, Is.True);
success = container.Remove(inserted);
Assert.That(success, Is.False);
container.Insert(inserted);
owner.Delete();
// Make sure inserted was detached.
Assert.That(transform.Deleted, Is.True);
}
[Test]
public void TestNestedRemoval()
{
var sim = SimulationFactory();
var owner = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var inserted = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var transform = inserted.Transform;
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(owner, "dummy");
Assert.That(container.Insert(inserted), Is.True);
Assert.That(transform.Parent!.Owner, Is.EqualTo(owner));
var container2 = ContainerHelpers.CreateContainer<Container>(inserted, "dummy");
Assert.That(container2.Insert(entity), Is.True);
Assert.That(entity.Transform.Parent!.Owner, Is.EqualTo(inserted));
Assert.That(container2.Remove(entity), Is.True);
Assert.That(container.Contains(entity), Is.True);
Assert.That(entity.Transform.Parent!.Owner, Is.EqualTo(owner));
owner.Delete();
Assert.That(transform.Deleted, Is.True);
}
[Test]
public void TestNestedRemovalWithDenial()
{
var sim = SimulationFactory();
var coordinates = new EntityCoordinates(new EntityUid(1), (0, 0));
var entityOne = sim.SpawnEntity("dummy", coordinates);
var entityTwo = sim.SpawnEntity("dummy", coordinates);
var entityThree = sim.SpawnEntity("dummy", coordinates);
var entityItem = sim.SpawnEntity("dummy", coordinates);
var container = ContainerHelpers.CreateContainer<Container>(entityOne, "dummy");
var container2 = ContainerHelpers.CreateContainer<ContainerOnlyContainer>(entityTwo, "dummy");
var container3 = ContainerHelpers.CreateContainer<Container>(entityThree, "dummy");
Assert.That(container.Insert(entityTwo), Is.True);
Assert.That(entityTwo.Transform.Parent!.Owner, Is.EqualTo(entityOne));
Assert.That(container2.Insert(entityThree), Is.True);
Assert.That(entityThree.Transform.Parent!.Owner, Is.EqualTo(entityTwo));
Assert.That(container3.Insert(entityItem), Is.True);
Assert.That(entityItem.Transform.Parent!.Owner, Is.EqualTo(entityThree));
Assert.That(container3.Remove(entityItem), Is.True);
Assert.That(container.Contains(entityItem), Is.True);
Assert.That(entityItem.Transform.Parent!.Owner, Is.EqualTo(entityOne));
entityOne.Delete();
Assert.That(entityTwo.Transform.Deleted, Is.True);
}
[Test]
public void BaseContainer_SelfInsert_False()
{
var sim = SimulationFactory();
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(entity, "dummy");
Assert.That(container.Insert(entity), Is.False);
Assert.That(container.CanInsert(entity), Is.False);
}
[Test]
public void BaseContainer_InsertMap_False()
{
var sim = SimulationFactory();
var mapEnt = sim.Resolve<IEntityManager>().GetEntity(new EntityUid(1));
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(entity, "dummy");
Assert.That(container.Insert(mapEnt), Is.False);
Assert.That(container.CanInsert(mapEnt), Is.False);
}
[Test]
public void BaseContainer_InsertGrid_False()
{
var sim = SimulationFactory();
var grid = sim.Resolve<IMapManager>().CreateGrid(new MapId(1));
var gridEntity = sim.Resolve<IEntityManager>().GetEntity(grid.GridEntityId);
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(entity, "dummy");
Assert.That(container.Insert(gridEntity), Is.False);
Assert.That(container.CanInsert(gridEntity), Is.False);
}
[Test]
public void BaseContainer_Insert_True()
{
var sim = SimulationFactory();
var containerEntity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(containerEntity, "dummy");
var insertEntity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var result = container.Insert(insertEntity);
Assert.That(result, Is.True);
Assert.That(container.ContainedEntities.Count, Is.EqualTo(1));
Assert.That(containerEntity.Transform.ChildCount, Is.EqualTo(1));
Assert.That(containerEntity.Transform.ChildEntityUids.First(), Is.EqualTo(insertEntity.Uid));
result = insertEntity.TryGetContainerMan(out var resultContainerMan);
Assert.That(result, Is.True);
Assert.That(resultContainerMan, Is.EqualTo(container.Manager));
}
[Test]
public void BaseContainer_RemoveNotAdded_False()
{
var sim = SimulationFactory();
var containerEntity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(containerEntity, "dummy");
var insertEntity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var result = container.Remove(insertEntity);
Assert.That(result, Is.False);
}
[Test]
public void BaseContainer_Transfer_True()
{
var sim = SimulationFactory();
var entity1 = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container1 = ContainerHelpers.CreateContainer<Container>(entity1, "dummy");
var entity2 = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container2 = ContainerHelpers.CreateContainer<Container>(entity2, "dummy");
var transferEntity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
container1.Insert(transferEntity);
var result = container2.Insert(transferEntity);
Assert.That(result, Is.True);
Assert.That(container1.ContainedEntities.Count, Is.EqualTo(0));
Assert.That(container2.ContainedEntities.Count, Is.EqualTo(1));
}
[Test]
public void Container_Serialize()
{
var sim = SimulationFactory();
var entity = sim.SpawnEntity("dummy", new EntityCoordinates(new EntityUid(1), (0, 0)));
var container = ContainerHelpers.CreateContainer<Container>(entity, "dummy");
var childEnt = sim.SpawnEntity(null, new EntityCoordinates(new EntityUid(1), (0, 0)));
container.OccludesLight = true;
container.ShowContents = true;
container.Insert(childEnt);
var containerMan = entity.GetComponent<IContainerManager>();
var state = (ContainerManagerComponent.ContainerManagerComponentState)containerMan.GetComponentState(new Mock<ICommonSession>().Object);
Assert.That(state.NetID, Is.EqualTo(containerMan.NetID));
Assert.That(state.ContainerSet.Count, Is.EqualTo(1));
Assert.That(state.ContainerSet[0].Id, Is.EqualTo("dummy"));
Assert.That(state.ContainerSet[0].OccludesLight, Is.True);
Assert.That(state.ContainerSet[0].ShowContents, Is.True);
Assert.That(state.ContainerSet[0].ContainedEntities.Length, Is.EqualTo(1));
Assert.That(state.ContainerSet[0].ContainedEntities[0], Is.EqualTo(childEnt.Uid));
}
private class ContainerOnlyContainer : BaseContainer
{
/// <summary>
/// The generic container class uses a list of entities
/// </summary>
private readonly List<IEntity> _containerList = new();
public override string ContainerType => nameof(ContainerOnlyContainer);
/// <inheritdoc />
public override IReadOnlyList<IEntity> ContainedEntities => _containerList;
/// <inheritdoc />
protected override void InternalInsert(IEntity toinsert)
{
_containerList.Add(toinsert);
base.InternalInsert(toinsert);
}
/// <inheritdoc />
protected override void InternalRemove(IEntity toremove)
{
_containerList.Remove(toremove);
base.InternalRemove(toremove);
}
/// <inheritdoc />
public override bool Contains(IEntity contained)
{
return _containerList.Contains(contained);
}
/// <inheritdoc />
public override void Shutdown()
{
base.Shutdown();
foreach (var entity in _containerList)
{
entity.Delete();
}
}
public override bool CanInsert(IEntity toinsert)
{
return toinsert.TryGetComponent(out IContainerManager _);
}
}
}
}