using System; using System.Threading.Tasks; using Content.Server.GameTicking; using Content.Server.GameTicking.Commands; using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Shared.CCVar; using NUnit.Framework; using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.Timing; namespace Content.IntegrationTests.Tests.GameRules { [TestFixture] [TestOf(typeof(MaxTimeRestartRuleSystem))] public sealed class RuleMaxTimeRestartTest { [Test] public async Task RestartTest() { await using var pairTracker = await PoolManager.GetServerClient(); var server = pairTracker.Pair.Server; var entityManager = server.ResolveDependency(); var configManager = server.ResolveDependency(); await server.WaitPost(() => { configManager.SetCVar(CCVars.GameLobbyEnabled, true); var command = new RestartRoundNowCommand(); command.Execute(null, string.Empty, Array.Empty()); }); var sGameTicker = server.ResolveDependency().GetEntitySystem(); var sGameTiming = server.ResolveDependency(); sGameTicker.StartGameRule("MaxTimeRestart", out var ruleEntity); Assert.That(entityManager.TryGetComponent(ruleEntity, out var maxTime)); await server.WaitAssertion(() => { Assert.That(sGameTicker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); maxTime.RoundMaxTime = TimeSpan.FromSeconds(3); sGameTicker.StartRound(); }); await server.WaitAssertion(() => { Assert.That(sGameTicker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); }); var ticks = sGameTiming.TickRate * (int) Math.Ceiling(maxTime.RoundMaxTime.TotalSeconds * 1.1f); await PoolManager.RunTicksSync(pairTracker.Pair, ticks); await server.WaitAssertion(() => { Assert.That(sGameTicker.RunLevel, Is.EqualTo(GameRunLevel.PostRound)); }); ticks = sGameTiming.TickRate * (int) Math.Ceiling(maxTime.RoundEndDelay.TotalSeconds * 1.1f); await PoolManager.RunTicksSync(pairTracker.Pair, ticks); await server.WaitAssertion(() => { Assert.That(sGameTicker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); }); await PoolManager.RunTicksSync(pairTracker.Pair, 5); await server.WaitPost(() => { configManager.SetCVar(CCVars.GameLobbyEnabled, false); var command = new RestartRoundNowCommand(); command.Execute(null, string.Empty, Array.Empty()); }); await PoolManager.RunTicksSync(pairTracker.Pair, 30); await pairTracker.CleanReturnAsync(); } } }