diff --git a/Content.IntegrationTests/Tests/Chemistry/TryAllReactionsTest.cs b/Content.IntegrationTests/Tests/Chemistry/TryAllReactionsTest.cs new file mode 100644 index 0000000000..9587897442 --- /dev/null +++ b/Content.IntegrationTests/Tests/Chemistry/TryAllReactionsTest.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Content.Server.Chemistry.Components; +using Content.Server.Fluids.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Coordinates; +using NUnit.Framework; +using Robust.Shared.GameObjects; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.IntegrationTests.Tests.Chemistry +{ + [TestFixture] + [TestOf(typeof(ReactionPrototype))] + public class TryAllReactionsTest : ContentIntegrationTest + { + [Test] + public async Task TryAllTest() + { + var server = StartServerDummyTicker(); + + await server.WaitIdleAsync(); + + var mapManager = server.ResolveDependency(); + var entityManager = server.ResolveDependency(); + var prototypeManager = server.ResolveDependency(); + + foreach (var reactionPrototype in prototypeManager.EnumeratePrototypes()) + { + //since i have no clue how to isolate each loop assert-wise im just gonna throw this one in for good measure + Console.WriteLine($"Testing {reactionPrototype.ID}"); + + IEntity beaker; + SolutionContainerComponent component = null; + + server.Assert(() => + { + mapManager.CreateNewMapEntity(MapId.Nullspace); + + beaker = entityManager.SpawnEntity("BluespaceBeaker", MapCoordinates.Nullspace); + Assert.That(beaker.TryGetComponent(out component)); + foreach (var (id, reactant) in reactionPrototype.Reactants) + { + Assert.That(component.TryAddReagent(id, reactant.Amount, out var quantity)); + Assert.That(reactant.Amount, Is.EqualTo(quantity)); + } + }); + + await server.WaitIdleAsync(); + + server.Assert(() => + { + //you just got linq'd fool + //(i'm sorry) + var foundProductsMap = reactionPrototype.Products + .Concat(reactionPrototype.Reactants.Where(x => x.Value.Catalyst).ToDictionary(x => x.Key, x => x.Value.Amount)) + .ToDictionary(x => x, x => false); + foreach (var reagent in component.Solution.Contents) + { + Assert.That(foundProductsMap.TryFirstOrNull(x => x.Key.Key == reagent.ReagentId && x.Key.Value == reagent.Quantity, out var foundProduct)); + foundProductsMap[foundProduct.Value.Key] = true; + } + + Assert.That(foundProductsMap.All(x => x.Value)); + }); + } + + } + } + +}