From 9dd13245efd2f35709fb4cf20c879945e2de07c0 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 21 Nov 2022 23:14:08 +1100 Subject: [PATCH] Add lookup reparenting tests (#3421) --- .../Shared/Physics/Broadphase_Test.cs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/Robust.UnitTesting/Shared/Physics/Broadphase_Test.cs b/Robust.UnitTesting/Shared/Physics/Broadphase_Test.cs index 10abfc09a..231dccf9d 100644 --- a/Robust.UnitTesting/Shared/Physics/Broadphase_Test.cs +++ b/Robust.UnitTesting/Shared/Physics/Broadphase_Test.cs @@ -4,7 +4,9 @@ using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Dynamics; using Robust.Shared.Physics.Systems; using Robust.UnitTesting.Server; @@ -13,6 +15,85 @@ namespace Robust.UnitTesting.Shared.Physics; [TestFixture] public sealed class Broadphase_Test { + /// + /// If we reparent a sundries entity to another broadphase does it correctly update. + /// + [Test] + public void ReparentSundries() + { + var sim = RobustServerSimulation.NewSimulation().InitializeInstance(); + var entManager = sim.Resolve(); + var mapManager = sim.Resolve(); + + var mapId = mapManager.CreateMap(); + var mapEnt = mapManager.GetMapEntityId(mapId); + var grid = mapManager.CreateGrid(mapId); + + grid.SetTile(Vector2i.Zero, new Tile(1)); + Assert.That(entManager.HasComponent(grid.GridEntityId)); + var broadphase = entManager.GetComponent(grid.GridEntityId); + + var ent = entManager.SpawnEntity(null, new EntityCoordinates(grid.GridEntityId, new Vector2(0.5f, 0.5f))); + var xform = entManager.GetComponent(ent); + Assert.That(broadphase.SundriesTree, Does.Contain(ent)); + + var broadphaseData = xform.Broadphase; + Assert.That(broadphaseData!.Value.Uid, Is.EqualTo(grid.GridEntityId)); + + xform.Coordinates = new EntityCoordinates(mapEnt, Vector2.One); + Assert.That(broadphase.SundriesTree, Does.Not.Contain(ent)); + + Assert.That(entManager.GetComponent(mapEnt).SundriesTree, Does.Contain(ent)); + broadphaseData = xform.Broadphase; + Assert.That(broadphaseData!.Value.Uid, Is.EqualTo(mapEnt)); + } + + /// + /// If we reparent a colliding physics entity to another broadphase does it correctly update. + /// + [Test] + public void ReparentBroadphase() + { + var sim = RobustServerSimulation.NewSimulation().InitializeInstance(); + var entManager = sim.Resolve(); + var mapManager = sim.Resolve(); + var fixturesSystem = entManager.EntitySysManager.GetEntitySystem(); + var physicsSystem = entManager.EntitySysManager.GetEntitySystem(); + + var mapId = mapManager.CreateMap(); + var mapEnt = mapManager.GetMapEntityId(mapId); + var grid = mapManager.CreateGrid(mapId); + + grid.SetTile(Vector2i.Zero, new Tile(1)); + Assert.That(entManager.HasComponent(grid.GridEntityId)); + var broadphase = entManager.GetComponent(grid.GridEntityId); + + var ent = entManager.SpawnEntity(null, new EntityCoordinates(grid.GridEntityId, new Vector2(0.5f, 0.5f))); + var physics = entManager.AddComponent(ent); + var xform = entManager.GetComponent(ent); + + // If we're not collidable we're still on the sundries tree. + Assert.That(broadphase.StaticSundriesTree, Does.Contain(ent)); + Assert.That(xform.Broadphase!.Value.Uid, Is.EqualTo(grid.GridEntityId)); + + var shape = new PolygonShape(); + shape.SetAsBox(0.5f, 0.5f); + var fixture = new Fixture(physics, shape); + fixturesSystem.CreateFixture(physics, fixture); + physicsSystem.SetCanCollide(physics, true); + + // Now that we're collidable should be correctly on the grid's tree. + Assert.That(fixture.ProxyCount, Is.EqualTo(1)); + Assert.That(broadphase.StaticSundriesTree, Does.Not.Contain(ent)); + + Assert.That(broadphase.StaticTree.GetProxy(fixture.Proxies[0].ProxyId)!.Equals(fixture.Proxies[0])); + + // Now check we go to the map's tree correctly. + xform.Coordinates = new EntityCoordinates(mapEnt, Vector2.One); + Assert.That(entManager.GetComponent(mapEnt).StaticTree.GetProxy(fixture.Proxies[0].ProxyId)!.Equals(fixture.Proxies[0])); + Assert.That(xform.Broadphase!.Value.Uid.Equals(mapEnt)); + } + /// /// If we change a grid's map does it still remain not on the general broadphase. ///