diff --git a/Content.IntegrationTests/Tests/MachineBoardTest.cs b/Content.IntegrationTests/Tests/MachineBoardTest.cs new file mode 100644 index 0000000000..25bfc34a44 --- /dev/null +++ b/Content.IntegrationTests/Tests/MachineBoardTest.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Content.Server.Construction.Components; +using NUnit.Framework; +using Robust.Shared.Prototypes; + +namespace Content.IntegrationTests.Tests; + +public sealed class MachineBoardTest +{ + /// + /// A list of machine boards that can be ignored by this test. + /// + private readonly HashSet _ignoredPrototypes = new() + { + //These have their own construction thing going on here + "MachineParticleAcceleratorEndCapCircuitboard", + "MachineParticleAcceleratorFuelChamberCircuitboard", + "MachineParticleAcceleratorFuelChamberCircuitboard", + "MachineParticleAcceleratorPowerBoxCircuitboard", + "MachineParticleAcceleratorEmitterLeftCircuitboard", + "MachineParticleAcceleratorEmitterCenterCircuitboard", + "MachineParticleAcceleratorEmitterRightCircuitboard" + }; + + /// + /// Ensures that every single machine board's corresponding entity + /// is a machine and can be properly deconstructed. + /// + [Test] + public async Task TestMachineBoardHasValidMachine() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true}); + var server = pairTracker.Pair.Server; + + var protoMan = server.ResolveDependency(); + + await server.WaitAssertion(() => + { + foreach (var p in protoMan.EnumeratePrototypes().Where(p => !p.Abstract && !_ignoredPrototypes.Contains(p.ID))) + { + if (!p.TryGetComponent(out var mbc)) + continue; + var mId = mbc.Prototype; + + Assert.That(mId, Is.Not.Null, $"Machine board {p.ID} does not have a corresponding machine."); + Assert.That(protoMan.TryIndex(mId, out var mProto), + $"Machine board {p.ID}'s corresponding machine has an invalid prototype."); + Assert.That(mProto.TryGetComponent(out var mComp), + $"Machine board {p.ID}'s corresponding machine {mId} does not have MachineComponent"); + Assert.That(mComp.BoardPrototype, Is.EqualTo(p.ID), + $"Machine {mId}'s BoardPrototype is not equal to it's corresponding machine board, {p.ID}"); + } + }); + + await pairTracker.CleanReturnAsync(); + } +} diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml index 7a6f0a9bc5..5e56846135 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/disease_diagnoser.yml @@ -1,6 +1,6 @@ - type: entity id: DiseaseDiagnoser - parent: BaseMachinePowered + parent: [ BaseMachinePowered, ConstructibleMachine ] name: Disease Diagnoser Delta Extreme description: A machine that analyzes disease samples. placement: @@ -22,3 +22,5 @@ - type: DiseaseMachineVisuals idleState: icon runningState: running + - type: Machine + board: DiagnoserMachineCircuitboard \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index 930fa8ae89..bdef9b808b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -1,6 +1,6 @@ - type: entity id: KitchenMicrowave - parent: BaseMachinePowered + parent: [ BaseMachinePowered, ConstructibleMachine ] name: microwave description: It's magic. components: @@ -59,6 +59,10 @@ acts: ["Breakage"] - type: ApcPowerReceiver powerLoad: 400 + - type: Machine + board: MicrowaveMachineCircuitboard - type: ContainerContainer containers: microwave_entity_container: !type:Container + machine_board: !type:Container + machine_parts: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index e362615bd4..45c97c457d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -1,6 +1,6 @@ - type: entity id: KitchenReagentGrinder - parent: BaseMachinePowered + parent: [ BaseMachinePowered, ConstructibleMachine ] name: reagent grinder description: From BlenderTech. Will It Blend? Let's find out! suffix: grinder/juicer @@ -44,7 +44,11 @@ - type: ApcPowerReceiver powerLoad: 300 - type: ItemSlots + - type: Machine + board: ReagentGrinderMachineCircuitboard - type: ContainerContainer containers: ReagentGrinder-reagentContainerContainer: !type:ContainerSlot ReagentGrinder-entityContainerContainer: !type:Container + machine_board: !type:Container + machine_parts: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml index b28e30bb07..f39e17cc6a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml @@ -1,7 +1,7 @@ - type: entity id: StasisBed name: stasis bed - parent: BaseMachinePowered + parent: [ BaseMachinePowered, ConstructibleMachine ] description: A bed that massively slows down the patient's metabolism, allowing more time to administer a proper treatment for stabilization. components: - type: StasisBed @@ -39,6 +39,8 @@ - type: Strap position: Down rotation: -90 + - type: Machine + board: StasisBedMachineCircuitboard - type: Physics bodyType: Static - type: Fixtures