#nullable enable using System.Collections.Generic; using System.Linq; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.UnitTesting; namespace Content.IntegrationTests.Pair; // Contains misc helper functions to make writing tests easier. public sealed partial class TestPair { /// /// Creates a map, a grid, and a tile, and gives back references to them. /// public async Task CreateTestMap() { await Server.WaitIdleAsync(); var tileDefinitionManager = Server.ResolveDependency(); var mapData = new TestMapData(); TestMap = mapData; await Server.WaitPost(() => { mapData.MapId = Server.MapMan.CreateMap(); mapData.MapUid = Server.MapMan.GetMapEntityId(mapData.MapId); var mapGrid = Server.MapMan.CreateGridEntity(mapData.MapId); mapData.MapGrid = mapGrid; mapData.GridUid = mapGrid.Owner; // Fixing this requires an engine PR. mapData.GridCoords = new EntityCoordinates(mapData.GridUid, 0, 0); var plating = tileDefinitionManager["Plating"]; var platingTile = new Tile(plating.TileId); mapData.MapGrid.SetTile(mapData.GridCoords, platingTile); mapData.MapCoords = new MapCoordinates(0, 0, mapData.MapId); mapData.Tile = mapData.MapGrid.GetAllTiles().First(); }); if (!Settings.Connected) return mapData; await RunTicksSync(10); mapData.CMapUid = ToClientUid(mapData.MapUid); mapData.CGridUid = ToClientUid(mapData.GridUid); mapData.CGridCoords = new EntityCoordinates(mapData.CGridUid, 0, 0); return mapData; } /// /// Convert a client-side uid into a server-side uid /// public EntityUid ToServerUid(EntityUid uid) => ConvertUid(uid, Client, Server); /// /// Convert a server-side uid into a client-side uid /// public EntityUid ToClientUid(EntityUid uid) => ConvertUid(uid, Server, Client); private static EntityUid ConvertUid( EntityUid uid, RobustIntegrationTest.IntegrationInstance source, RobustIntegrationTest.IntegrationInstance destination) { if (!uid.IsValid()) return EntityUid.Invalid; if (!source.EntMan.TryGetComponent(uid, out var meta)) { Assert.Fail($"Failed to resolve MetaData while converting the EntityUid for entity {uid}"); return EntityUid.Invalid; } if (!destination.EntMan.TryGetEntity(meta.NetEntity, out var otherUid)) { Assert.Fail($"Failed to resolve net ID while converting the EntityUid entity {source.EntMan.ToPrettyString(uid)}"); return EntityUid.Invalid; } return otherUid.Value; } /// /// Execute a command on the server and wait some number of ticks. /// public async Task WaitCommand(string cmd, int numTicks = 10) { await Server.ExecuteCommand(cmd); await RunTicksSync(numTicks); } /// /// Execute a command on the client and wait some number of ticks. /// public async Task WaitClientCommand(string cmd, int numTicks = 10) { await Client.ExecuteCommand(cmd); await RunTicksSync(numTicks); } /// /// Retrieve all entity prototypes that have some component. /// public List GetPrototypesWithComponent( HashSet? ignored = null, bool ignoreAbstract = true, bool ignoreTestPrototypes = true) where T : IComponent { var id = Server.ResolveDependency().GetComponentName(typeof(T)); var list = new List(); foreach (var proto in Server.ProtoMan.EnumeratePrototypes()) { if (ignored != null && ignored.Contains(proto.ID)) continue; if (ignoreAbstract && proto.Abstract) continue; if (ignoreTestPrototypes && IsTestPrototype(proto)) continue; if (proto.Components.ContainsKey(id)) list.Add(proto); } return list; } }