using System.IO; using Content.Server.Alert; using Content.Shared.Alert; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.IoC; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; namespace Content.Tests.Shared.Alert { [TestFixture] [TestOf(typeof(AlertsComponent))] public sealed class ServerAlertsComponentTests : ContentUnitTest { const string PROTOTYPES = @" - type: alertCategory id: Pressure - type: alert id: LowPressure category: Pressure icon: /Textures/Interface/Alerts/Pressure/lowpressure.png - type: alert id: HighPressure category: Pressure icon: /Textures/Interface/Alerts/Pressure/highpressure.png "; [Test] [Ignore("There is no way to load extra Systems in a unit test, fixing RobustUnitTest is out of scope.")] public void ShowAlerts() { // this is kind of unnecessary because there's integration test coverage of Alert components // but wanted to keep it anyway to see what's possible w.r.t. testing components // in a unit test var entManager = IoCManager.Resolve(); IoCManager.Resolve().Initialize(); var prototypeManager = IoCManager.Resolve(); prototypeManager.Initialize(); var factory = IoCManager.Resolve(); factory.RegisterClass(); prototypeManager.LoadFromStream(new StringReader(PROTOTYPES)); prototypeManager.ResolveResults(); var entSys = entManager.EntitySysManager; entSys.LoadExtraSystemType(); var alertsComponent = new AlertsComponent(); alertsComponent = IoCManager.InjectDependencies(alertsComponent); Assert.That(entManager.System().TryGet("LowPressure", out var lowpressure)); Assert.That(entManager.System().TryGet("HighPressure", out var highpressure)); entManager.System().ShowAlert(alertsComponent.Owner, "LowPressure"); var getty = new ComponentGetState(); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); var alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState, Is.Not.Null); Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); Assert.That(alertState.Alerts.ContainsKey(lowpressure!.AlertKey)); entManager.System().ShowAlert(alertsComponent.Owner, "HighPressure"); // Lazy entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); Assert.That(alertState.Alerts.ContainsKey(highpressure!.AlertKey)); entManager.System().ClearAlertCategory(alertsComponent.Owner, "Pressure"); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState.Alerts.Count, Is.EqualTo(0)); } } }