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.
///