#nullable enable using NUnit.Framework; using System.Threading.Tasks; using Content.Server.Stack; using Content.Shared.Stacks; using Content.Shared.Materials; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Prototypes; namespace Content.IntegrationTests.Tests.Materials { /// /// Materials and stacks have some odd relationships to entities, /// so we need some test coverage for them. /// [TestFixture] [TestOf(typeof(StackSystem))] [TestOf(typeof(MaterialPrototype))] public sealed class MaterialPrototypeSpawnsStackMaterialTest { [Test] public async Task MaterialPrototypeSpawnsStackMaterial() { await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true}); var server = pairTracker.Pair.Server; await server.WaitIdleAsync(); var mapManager = server.ResolveDependency(); var prototypeManager = server.ResolveDependency(); var entityManager = server.ResolveDependency(); var testMap = await PoolManager.CreateTestMap(pairTracker); await server.WaitAssertion(() => { var allMaterialProtos = prototypeManager.EnumeratePrototypes(); var coords = testMap.GridCoords; Assert.Multiple(() => { foreach (var proto in allMaterialProtos) { if (proto.StackEntity == "") continue; var spawned = entityManager.SpawnEntity(proto.StackEntity, coords); Assert.That(entityManager.TryGetComponent(spawned, out var stack), $"{proto.ID} 'stack entity' {proto.StackEntity} does not have the stack component"); Assert.That(entityManager.HasComponent(spawned), $"{proto.ID} 'material stack' {proto.StackEntity} does not have the material component"); StackPrototype? stackProto = null; Assert.That(stack?.StackTypeId != null && prototypeManager.TryIndex(stack.StackTypeId, out stackProto), $"{proto.ID} material has no stack prototype"); if (stackProto != null) Assert.That(proto.StackEntity, Is.EqualTo(stackProto.Spawn)); } }); mapManager.DeleteMap(testMap.MapId); }); await pairTracker.CleanReturnAsync(); } } }