using System.Linq; using System.Threading.Tasks; using NUnit.Framework; using Robust.Server.Player; using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Network; namespace Robust.UnitTesting.Server.GameStates; public sealed class DefaultEntityTest : RobustIntegrationTest { /// /// Simple test that just spawns a default entity without any components or modifications and checks that the /// client receives the entity. /// [Test] public async Task TestSpawnDefaultEntity() { var server = StartServer(); var client = StartClient(); await Task.WhenAll(client.WaitIdleAsync(), server.WaitIdleAsync()); var sEntMan = server.ResolveDependency(); var cEntMan = client.ResolveDependency(); var netMan = client.ResolveDependency(); var playerMan = server.ResolveDependency(); var confMan = server.ResolveDependency(); client.SetConnectTarget(server); client.Post(() => netMan.ClientConnect(null!, 0, null!)); server.Post(() => confMan.SetCVar(CVars.NetPVS, false)); for (int i = 0; i < 10; i++) { await server.WaitRunTicks(1); await client.WaitRunTicks(1); } var session = playerMan.Sessions.First(); await server.WaitPost(() => playerMan.JoinGame(session)); for (int i = 0; i < 10; i++) { await server.WaitRunTicks(1); await client.WaitRunTicks(1); } // Spawn a default unmodified entity. NetEntity ent = default; await server.WaitPost(() => { ent = sEntMan.GetNetEntity(sEntMan.Spawn()); }); for (int i = 0; i < 10; i++) { await server.WaitRunTicks(1); await client.WaitRunTicks(1); } // Check that server & client both think the entity exists. Assert.That(sEntMan.EntityExists(sEntMan.GetEntity(ent))); Assert.That(cEntMan.EntityExists(cEntMan.GetEntity(ent))); // Enable PVS and repeat the test. server.Post(() => confMan.SetCVar(CVars.NetPVS, true)); // Set up map and spawn player entity NetEntity player = default; EntityCoordinates coords = default!; await server.WaitPost(() => { var map = server.System().CreateMap(); coords = new(map, default); var playerUid = sEntMan.SpawnEntity(null, coords); player = sEntMan.GetNetEntity(playerUid); server.PlayerMan.SetAttachedEntity(session, playerUid); }); for (int i = 0; i < 10; i++) { await server.WaitRunTicks(1); await client.WaitRunTicks(1); } Assert.That(sEntMan.EntityExists(sEntMan.GetEntity(player))); Assert.That(cEntMan.EntityExists(cEntMan.GetEntity(player))); await server.WaitPost(() => { ent = sEntMan.GetNetEntity(sEntMan.SpawnAtPosition(null, coords)); }); for (int i = 0; i < 10; i++) { await server.WaitRunTicks(1); await client.WaitRunTicks(1); } Assert.That(sEntMan.EntityExists(sEntMan.GetEntity(ent))); Assert.That(cEntMan.EntityExists(cEntMan.GetEntity(ent))); await client.WaitPost(() => netMan.ClientDisconnect("")); await server.WaitRunTicks(5); await client.WaitRunTicks(5); } }