using System.Linq; using Content.Shared.Actions; using Content.Shared.CombatMode; using Robust.Server.Player; using Robust.Shared.GameObjects; namespace Content.IntegrationTests.Tests.Actions; /// /// This tests checks that actions properly get added to an entity's actions component.. /// [TestFixture] public sealed class ActionsAddedTest { // TODO add magboot test (inventory action) // TODO add ghost toggle-fov test (client-side action) [Test] public async Task TestCombatActionsAdded() { await using var pair = await PoolManager.GetServerClient(new PoolSettings { Connected = true, DummyTicker = false }); var server = pair.Server; var client = pair.Client; var sEntMan = server.ResolveDependency(); var cEntMan = client.ResolveDependency(); var clientSession = client.Session; var serverSession = server.ResolveDependency().Sessions.Single(); var sActionSystem = server.System(); var cActionSystem = client.System(); // Dummy ticker is disabled - client should be in control of a normal mob. Assert.That(serverSession.AttachedEntity, Is.Not.Null); var serverEnt = serverSession.AttachedEntity!.Value; var clientEnt = clientSession!.AttachedEntity!.Value; Assert.That(sEntMan.EntityExists(serverEnt)); Assert.That(cEntMan.EntityExists(clientEnt)); Assert.That(sEntMan.HasComponent(serverEnt)); Assert.That(cEntMan.HasComponent(clientEnt)); Assert.That(sEntMan.HasComponent(serverEnt)); Assert.That(cEntMan.HasComponent(clientEnt)); var sComp = sEntMan.GetComponent(serverEnt); var cComp = cEntMan.GetComponent(clientEnt); // Mob should have a combat-mode action. // This action should have a non-null event both on the server & client. var evType = typeof(ToggleCombatActionEvent); var sActions = sActionSystem.GetActions(serverEnt).Where( x => x.Comp is InstantActionComponent act && act.Event?.GetType() == evType).ToArray(); var cActions = cActionSystem.GetActions(clientEnt).Where( x => x.Comp is InstantActionComponent act && act.Event?.GetType() == evType).ToArray(); Assert.That(sActions.Length, Is.EqualTo(1)); Assert.That(cActions.Length, Is.EqualTo(1)); var sAct = sActions[0].Comp; var cAct = cActions[0].Comp; Assert.That(sAct, Is.Not.Null); Assert.That(cAct, Is.Not.Null); // Finally, these two actions are not the same object // required, because integration tests do not respect the [NonSerialized] attribute and will simply events by reference. Assert.That(ReferenceEquals(sAct, cAct), Is.False); Assert.That(ReferenceEquals(sAct.BaseEvent, cAct.BaseEvent), Is.False); await pair.CleanReturnAsync(); } }