using Content.Shared.DoAfter; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Reflection; using Robust.Shared.Serialization; using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.IntegrationTests.Tests.DoAfter { [TestFixture] [TestOf(typeof(DoAfterComponent))] public sealed partial class DoAfterServerTest { [TestPrototypes] private const string Prototypes = @" - type: entity name: DoAfterDummy id: DoAfterDummy components: - type: DoAfter "; private sealed partial class TestDoAfterEvent : DoAfterEvent { public override DoAfterEvent Clone() { return this; } }; [Test] public async Task TestSerializable() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; await server.WaitIdleAsync(); var refMan = server.ResolveDependency(); await server.WaitPost(() => { Assert.Multiple(() => { foreach (var type in refMan.GetAllChildren(true)) { if (type.IsAbstract || type == typeof(TestDoAfterEvent)) continue; Assert.That(type.HasCustomAttribute() && type.HasCustomAttribute(), $"{nameof(DoAfterEvent)} is not NetSerializable. Event: {type.Name}"); } }); }); await pair.CleanReturnAsync(); } [Test] public async Task TestFinished() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; await server.WaitIdleAsync(); var entityManager = server.ResolveDependency(); var timing = server.ResolveDependency(); var doAfterSystem = entityManager.EntitySysManager.GetEntitySystem(); var ev = new TestDoAfterEvent(); // That it finishes successfully await server.WaitPost(() => { var tickTime = 1.0f / timing.TickRate; var mob = entityManager.SpawnEntity("DoAfterDummy", MapCoordinates.Nullspace); var args = new DoAfterArgs(mob, tickTime / 2, ev, null) { Broadcast = true }; #pragma warning disable NUnit2045 // Interdependent assertions. Assert.That(doAfterSystem.TryStartDoAfter(args)); Assert.That(ev.Cancelled, Is.False); #pragma warning restore NUnit2045 }); await server.WaitRunTicks(1); Assert.That(ev.Cancelled, Is.False); await pair.CleanReturnAsync(); } [Test] public async Task TestCancelled() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var entityManager = server.ResolveDependency(); var timing = server.ResolveDependency(); var doAfterSystem = entityManager.EntitySysManager.GetEntitySystem(); var ev = new TestDoAfterEvent(); await server.WaitPost(() => { var tickTime = 1.0f / timing.TickRate; var mob = entityManager.SpawnEntity("DoAfterDummy", MapCoordinates.Nullspace); var args = new DoAfterArgs(mob, tickTime * 2, ev, null) { Broadcast = true }; if (!doAfterSystem.TryStartDoAfter(args, out var id)) { Assert.Fail(); return; } Assert.That(!ev.Cancelled); doAfterSystem.Cancel(id); Assert.That(ev.Cancelled); }); await server.WaitRunTicks(3); Assert.That(ev.Cancelled); await pair.CleanReturnAsync(); } } }