| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- using Content.Server.Fluids.EntitySystems;
- using Content.Shared.Chemistry.Components;
- using Content.Shared.Chemistry.EntitySystems;
- using Content.Shared.FixedPoint;
- using Content.Shared.Fluids;
- using Robust.Shared.GameObjects;
- using Robust.Shared.Prototypes;
- using System.Collections.Generic;
- using System.Linq;
- namespace Content.IntegrationTests.Tests.Fluids;
- [TestFixture]
- [TestOf(typeof(AbsorbentComponent))]
- public sealed class AbsorbentTest
- {
- private const string UserDummyId = "UserDummy";
- private const string AbsorbentDummyId = "AbsorbentDummy";
- private const string RefillableDummyId = "RefillableDummy";
- private const string SmallRefillableDummyId = "SmallRefillableDummy";
- private const string EvaporablePrototypeId = "Water";
- private const string NonEvaporablePrototypeId = "Cola";
- [TestPrototypes]
- private const string Prototypes = $@"
- - type: entity
- name: {UserDummyId}
- id: {UserDummyId}
- - type: entity
- name: {AbsorbentDummyId}
- id: {AbsorbentDummyId}
- components:
- - type: Absorbent
- - type: SolutionContainerManager
- solutions:
- absorbed:
- maxVol: 100
- - type: entity
- name: {RefillableDummyId}
- id: {RefillableDummyId}
- components:
- - type: SolutionContainerManager
- solutions:
- refillable:
- maxVol: 200
- - type: RefillableSolution
- solution: refillable
- - type: entity
- name: {SmallRefillableDummyId}
- id: {SmallRefillableDummyId}
- components:
- - type: SolutionContainerManager
- solutions:
- refillable:
- maxVol: 20
- - type: RefillableSolution
- solution: refillable
- ";
- public sealed record TestSolutionReagents(FixedPoint2 VolumeOfEvaporable, FixedPoint2 VolumeOfNonEvaporable);
- public record TestSolutionCase(
- string Case, // Only for clarity purposes
- TestSolutionReagents InitialAbsorbentSolution,
- TestSolutionReagents InitialRefillableSolution,
- TestSolutionReagents ExpectedAbsorbentSolution,
- TestSolutionReagents ExpectedRefillableSolution);
- [TestCaseSource(nameof(TestCasesToRun))]
- public async Task AbsorbentOnRefillableTest(TestSolutionCase testCase)
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var testMap = await pair.CreateTestMap();
- var coordinates = testMap.GridCoords;
- var entityManager = server.ResolveDependency<IEntityManager>();
- var absorbentSystem = entityManager.System<AbsorbentSystem>();
- var solutionContainerSystem = entityManager.System<SharedSolutionContainerSystem>();
- var prototypeManager = server.ResolveDependency<IPrototypeManager>();
- EntityUid user = default;
- EntityUid absorbent = default;
- EntityUid refillable = default;
- AbsorbentComponent component = null;
- await server.WaitAssertion(() =>
- {
- user = entityManager.SpawnEntity(UserDummyId, coordinates);
- absorbent = entityManager.SpawnEntity(AbsorbentDummyId, coordinates);
- refillable = entityManager.SpawnEntity(RefillableDummyId, coordinates);
- entityManager.TryGetComponent(absorbent, out component);
- solutionContainerSystem.TryGetSolution(absorbent, AbsorbentComponent.SolutionName, out var absorbentSoln, out var absorbentSolution);
- solutionContainerSystem.TryGetRefillableSolution(refillable, out var refillableSoln, out var refillableSolution);
- // Arrange
- if (testCase.InitialAbsorbentSolution.VolumeOfEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(absorbentSoln.Value, new Solution(EvaporablePrototypeId, testCase.InitialAbsorbentSolution.VolumeOfEvaporable));
- if (testCase.InitialAbsorbentSolution.VolumeOfNonEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(absorbentSoln.Value, new Solution(NonEvaporablePrototypeId, testCase.InitialAbsorbentSolution.VolumeOfNonEvaporable));
- if (testCase.InitialRefillableSolution.VolumeOfEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(refillableSoln.Value, new Solution(EvaporablePrototypeId, testCase.InitialRefillableSolution.VolumeOfEvaporable));
- if (testCase.InitialRefillableSolution.VolumeOfNonEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(refillableSoln.Value, new Solution(NonEvaporablePrototypeId, testCase.InitialRefillableSolution.VolumeOfNonEvaporable));
- // Act
- absorbentSystem.Mop(user, refillable, absorbent, component);
- // Assert
- var absorbentComposition = absorbentSolution.GetReagentPrototypes(prototypeManager).ToDictionary(r => r.Key.ID, r => r.Value);
- var refillableComposition = refillableSolution.GetReagentPrototypes(prototypeManager).ToDictionary(r => r.Key.ID, r => r.Value);
- Assert.Multiple(() =>
- {
- Assert.That(VolumeOfPrototypeInComposition(absorbentComposition, EvaporablePrototypeId), Is.EqualTo(testCase.ExpectedAbsorbentSolution.VolumeOfEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(absorbentComposition, NonEvaporablePrototypeId), Is.EqualTo(testCase.ExpectedAbsorbentSolution.VolumeOfNonEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(refillableComposition, EvaporablePrototypeId), Is.EqualTo(testCase.ExpectedRefillableSolution.VolumeOfEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(refillableComposition, NonEvaporablePrototypeId), Is.EqualTo(testCase.ExpectedRefillableSolution.VolumeOfNonEvaporable));
- });
- });
- await pair.RunTicksSync(5);
- await pair.CleanReturnAsync();
- }
- [TestCaseSource(nameof(TestCasesToRunOnSmallRefillable))]
- public async Task AbsorbentOnSmallRefillableTest(TestSolutionCase testCase)
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var testMap = await pair.CreateTestMap();
- var coordinates = testMap.GridCoords;
- var entityManager = server.ResolveDependency<IEntityManager>();
- var absorbentSystem = entityManager.System<AbsorbentSystem>();
- var solutionContainerSystem = entityManager.System<SharedSolutionContainerSystem>();
- var prototypeManager = server.ResolveDependency<IPrototypeManager>();
- EntityUid user = default;
- EntityUid absorbent = default;
- EntityUid refillable = default;
- AbsorbentComponent component = null;
- await server.WaitAssertion(() =>
- {
- user = entityManager.SpawnEntity(UserDummyId, coordinates);
- absorbent = entityManager.SpawnEntity(AbsorbentDummyId, coordinates);
- refillable = entityManager.SpawnEntity(SmallRefillableDummyId, coordinates);
- entityManager.TryGetComponent(absorbent, out component);
- solutionContainerSystem.TryGetSolution(absorbent, AbsorbentComponent.SolutionName, out var absorbentSoln, out var absorbentSolution);
- solutionContainerSystem.TryGetRefillableSolution(refillable, out var refillableSoln, out var refillableSolution);
- // Arrange
- solutionContainerSystem.AddSolution(absorbentSoln.Value, new Solution(EvaporablePrototypeId, testCase.InitialAbsorbentSolution.VolumeOfEvaporable));
- if (testCase.InitialAbsorbentSolution.VolumeOfNonEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(absorbentSoln.Value, new Solution(NonEvaporablePrototypeId, testCase.InitialAbsorbentSolution.VolumeOfNonEvaporable));
- if (testCase.InitialRefillableSolution.VolumeOfEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(refillableSoln.Value, new Solution(EvaporablePrototypeId, testCase.InitialRefillableSolution.VolumeOfEvaporable));
- if (testCase.InitialRefillableSolution.VolumeOfNonEvaporable > FixedPoint2.Zero)
- solutionContainerSystem.AddSolution(refillableSoln.Value, new Solution(NonEvaporablePrototypeId, testCase.InitialRefillableSolution.VolumeOfNonEvaporable));
- // Act
- absorbentSystem.Mop(user, refillable, absorbent, component);
- // Assert
- var absorbentComposition = absorbentSolution.GetReagentPrototypes(prototypeManager).ToDictionary(r => r.Key.ID, r => r.Value);
- var refillableComposition = refillableSolution.GetReagentPrototypes(prototypeManager).ToDictionary(r => r.Key.ID, r => r.Value);
- Assert.Multiple(() =>
- {
- Assert.That(VolumeOfPrototypeInComposition(absorbentComposition, EvaporablePrototypeId), Is.EqualTo(testCase.ExpectedAbsorbentSolution.VolumeOfEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(absorbentComposition, NonEvaporablePrototypeId), Is.EqualTo(testCase.ExpectedAbsorbentSolution.VolumeOfNonEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(refillableComposition, EvaporablePrototypeId), Is.EqualTo(testCase.ExpectedRefillableSolution.VolumeOfEvaporable));
- Assert.That(VolumeOfPrototypeInComposition(refillableComposition, NonEvaporablePrototypeId), Is.EqualTo(testCase.ExpectedRefillableSolution.VolumeOfNonEvaporable));
- });
- });
- await pair.RunTicksSync(5);
- await pair.CleanReturnAsync();
- }
- private static FixedPoint2 VolumeOfPrototypeInComposition(Dictionary<string, FixedPoint2> composition, string prototypeId)
- {
- return composition.TryGetValue(prototypeId, out var value) ? value : FixedPoint2.Zero;
- }
- public static readonly TestSolutionCase[] TestCasesToRun = new TestSolutionCase[]
- {
- // Both empty case
- new(
- "Both empty - no transfer",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero)
- ),
- // Just water cases
- new(
- "Transfer water to empty refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero)
- ),
- new(
- "Transfer water to empty absorbent",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero)
- ),
- new(
- "Both partially filled with water while everything fits in absorbent",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(40), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(90), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero)
- ),
- new(
- "Both partially filled with water while not everything fits in absorbent",
- new TestSolutionReagents(FixedPoint2.New(70), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(20), FixedPoint2.Zero)
- ),
- // Just contaminants cases
- new(
- "Transfer contaminants to empty refillable",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50))
- ),
- new(
- "Do not transfer contaminants back to empty absorbent",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50))
- ),
- new(
- "Add contaminants to preexisting while everything fits in refillable",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(130)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(180))
- ),
- new(
- "Add contaminants to preexisting while not everything fits in refillable",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(90)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(130)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(20)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(200))
- ),
- // Mixed: water and contaminants cases
- new(
- "Transfer just contaminants into empty refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50))
- ),
- new(
- "Transfer just contaminants into non-empty refillable while everything fits",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(60)),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(110))
- ),
- new(
- "Transfer just contaminants into non-empty refillable while not everything fits",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(170)),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(20)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(200))
- ),
- new(
- "Transfer just contaminants and absorb water from water refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.New(70), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(20), FixedPoint2.New(50))
- ),
- new(
- "Transfer just contaminants and absorb water from a full water refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.New(200), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(150), FixedPoint2.New(50))
- ),
- new(
- "Transfer just contaminants and absorb water from a full mixed refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.New(100)),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(150))
- ),
- new(
- "Transfer just contaminants and absorb water from a low-water mixed refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.New(10), FixedPoint2.New(100)),
- new TestSolutionReagents(FixedPoint2.New(60), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(150))
- ),
- new(
- "Contaminants for water exchange",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(100)),
- new TestSolutionReagents(FixedPoint2.New(200), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(100), FixedPoint2.New(100))
- )
- };
- public static readonly TestSolutionCase[] TestCasesToRunOnSmallRefillable = new TestSolutionCase[]
- {
- // Only testing cases where small refillable AvailableVolume makes a difference
- new(
- "Transfer water to empty refillable",
- new TestSolutionReagents(FixedPoint2.New(50), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(30), FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.New(20), FixedPoint2.Zero)
- ),
- new(
- "Transfer contaminants to empty refillable",
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(50)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.Zero),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(30)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(20))
- ),
- new(
- "Mixed transfer in limited space",
- new TestSolutionReagents(FixedPoint2.New(20), FixedPoint2.New(25)),
- new TestSolutionReagents(FixedPoint2.New(10), FixedPoint2.New(5)),
- new TestSolutionReagents(FixedPoint2.New(30), FixedPoint2.New(10)),
- new TestSolutionReagents(FixedPoint2.Zero, FixedPoint2.New(20))
- )
- };
- }
|