DoAfter Refactor (#13225)

Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
keronshb
2023-02-24 19:01:25 -05:00
committed by GitHub
parent 7a9baa79c2
commit 9ebb452a3c
129 changed files with 2624 additions and 4132 deletions

View File

@@ -1,6 +1,7 @@
using System.Threading;
using System.Threading.Tasks;
using Content.Server.DoAfter;
using Content.Shared.DoAfter;
using NUnit.Framework;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -21,17 +22,34 @@ namespace Content.IntegrationTests.Tests.DoAfter
- type: DoAfter
";
public sealed class TestDoAfterSystem : EntitySystem
{
public override void Initialize()
{
SubscribeLocalEvent<DoAfterEvent<TestDoAfterData>>(OnTestDoAfterFinishEvent);
}
private void OnTestDoAfterFinishEvent(DoAfterEvent<TestDoAfterData> ev)
{
ev.AdditionalData.Cancelled = ev.Cancelled;
}
}
private sealed class TestDoAfterData
{
public bool Cancelled;
};
[Test]
public async Task TestFinished()
{
Task<DoAfterStatus> task = null;
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes});
var server = pairTracker.Pair.Server;
await server.WaitIdleAsync();
var mapManager = server.ResolveDependency<IMapManager>();
var entityManager = server.ResolveDependency<IEntityManager>();
var doAfterSystem = entityManager.EntitySysManager.GetEntitySystem<DoAfterSystem>();
var data = new TestDoAfterData();
// That it finishes successfully
await server.WaitPost(() =>
@@ -39,15 +57,12 @@ namespace Content.IntegrationTests.Tests.DoAfter
var tickTime = 1.0f / IoCManager.Resolve<IGameTiming>().TickRate;
var mob = entityManager.SpawnEntity("Dummy", MapCoordinates.Nullspace);
var cancelToken = new CancellationTokenSource();
var args = new DoAfterEventArgs(mob, tickTime / 2, cancelToken.Token);
task = doAfterSystem.WaitDoAfter(args);
var args = new DoAfterEventArgs(mob, tickTime / 2, cancelToken.Token) { Broadcast = true };
doAfterSystem.DoAfter(args, data);
});
await server.WaitRunTicks(1);
Assert.That(task.Status, Is.EqualTo(TaskStatus.RanToCompletion));
#pragma warning disable RA0004
Assert.That(task.Result == DoAfterStatus.Finished);
#pragma warning restore RA0004
Assert.That(data.Cancelled, Is.False);
await pairTracker.CleanReturnAsync();
}
@@ -55,13 +70,11 @@ namespace Content.IntegrationTests.Tests.DoAfter
[Test]
public async Task TestCancelled()
{
Task<DoAfterStatus> task = null;
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes});
var server = pairTracker.Pair.Server;
var entityManager = server.ResolveDependency<IEntityManager>();
var mapManager = server.ResolveDependency<IMapManager>();
var doAfterSystem = entityManager.EntitySysManager.GetEntitySystem<DoAfterSystem>();
var data = new TestDoAfterData();
await server.WaitPost(() =>
{
@@ -69,16 +82,13 @@ namespace Content.IntegrationTests.Tests.DoAfter
var mob = entityManager.SpawnEntity("Dummy", MapCoordinates.Nullspace);
var cancelToken = new CancellationTokenSource();
var args = new DoAfterEventArgs(mob, tickTime * 2, cancelToken.Token);
task = doAfterSystem.WaitDoAfter(args);
var args = new DoAfterEventArgs(mob, tickTime * 2, cancelToken.Token) { Broadcast = true };
doAfterSystem.DoAfter(args, data);
cancelToken.Cancel();
});
await server.WaitRunTicks(3);
Assert.That(task.Status, Is.EqualTo(TaskStatus.RanToCompletion));
#pragma warning disable RA0004
Assert.That(task.Result, Is.EqualTo(DoAfterStatus.Cancelled), $"Result was {task.Result}");
#pragma warning restore RA0004
Assert.That(data.Cancelled, Is.False);
await pairTracker.CleanReturnAsync();
}