From d662175719ba6466b4d1534141a5c6f94b044d3b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 9 Apr 2023 05:53:25 +1200 Subject: [PATCH] Add pickup-drop test and fix hand state handling (#15212) --- Content.Client/Hands/Systems/HandsSystem.cs | 12 ++-- .../Tests/Hands/HandTests.cs | 56 +++++++++++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 Content.IntegrationTests/Tests/Hands/HandTests.cs diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index f42de01c81..062958193b 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -72,11 +72,13 @@ namespace Content.Client.Hands.Systems List addedHands = new(); foreach (var hand in state.Hands) { - if (component.Hands.TryAdd(hand.Name, hand)) - { - hand.Container = _containerSystem.EnsureContainer(uid, hand.Name, manager); - addedHands.Add(hand); - } + if (component.Hands.ContainsKey(hand.Name)) + continue; + + var container = _containerSystem.EnsureContainer(uid, hand.Name, manager); + var newHand = new Hand(hand.Name, hand.Location, container); + component.Hands.Add(hand.Name, newHand); + addedHands.Add(newHand); } foreach (var name in component.Hands.Keys) diff --git a/Content.IntegrationTests/Tests/Hands/HandTests.cs b/Content.IntegrationTests/Tests/Hands/HandTests.cs new file mode 100644 index 0000000000..aadec1c079 --- /dev/null +++ b/Content.IntegrationTests/Tests/Hands/HandTests.cs @@ -0,0 +1,56 @@ +using System.Linq; +using System.Threading.Tasks; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using NUnit.Framework; +using Robust.Server.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Map; + +namespace Content.IntegrationTests.Tests.Hands; + +[TestFixture] +public sealed class HandTests +{ + [Test] + public async Task TestPickupDrop() + { + await using var pairTracker = await PoolManager.GetServerClient(); + var server = pairTracker.Pair.Server; + + var entMan = server.ResolveDependency(); + var playerMan = server.ResolveDependency(); + var mapMan = server.ResolveDependency(); + var sys = entMan.System(); + + var data = await PoolManager.CreateTestMap(pairTracker); + await PoolManager.RunTicksSync(pairTracker.Pair, 5); + + EntityUid item = default; + EntityUid player = default; + HandsComponent hands = default!; + await server.WaitPost(() => + { + player = playerMan.Sessions.First().AttachedEntity!.Value; + var xform = entMan.GetComponent(player); + item = entMan.SpawnEntity("Crowbar", xform.MapPosition); + hands = entMan.GetComponent(player); + sys.TryPickup(player, item, hands.ActiveHand!); + }); + + // run ticks here is important, as errors may happen within the container system's frame update methods. + await PoolManager.RunTicksSync(pairTracker.Pair, 5); + Assert.That(hands.ActiveHandEntity == item); + + await server.WaitPost(() => + { + sys.TryDrop(player, item, null!); + }); + + await PoolManager.RunTicksSync(pairTracker.Pair, 5); + Assert.That(hands.ActiveHandEntity == null); + + await server.WaitPost(() => mapMan.DeleteMap(data.MapId)); + await pairTracker.CleanReturnAsync(); + } +} -- 2.51.2