Files
Delta-v/Content.IntegrationTests/Tests/Fluids/AbsorbentTest.cs
T
29e55b9464 Upstream Merge (June / July) attempt 2 electric boogaloo (#4607)
* Fix the sensor monitoring console forcing a GC every 3 seconds (#38146)

* Optimize sensor monitoring window graph drawing

* Add shared static Vector2 pool for all GraphView instances

* Address requested changes

* remove lock

* Update submodule to 264.0.0 (#38629)

* Toy/Plushie Inhands and Wearables (#38514)

* Fixed dependency injection and some other issues in a few places.

* More issue fixes

* patchfor broken NetworkConfiguratorLinkMenu (#38632)

fix

* Fix solutions flickering when transferring contents (#34838)

* Use Solution clones when applying SolutionComponent states

* Revert "Use Solution clones when applying SolutionComponent states"

This reverts commit 013fd111cf92b22562e00f98a7aaa49bc4b4ed62.

* Make Solution implement ICloneable and rename Clone method.

* Copy CanReact value when cloning a Solution

* Convert to IRobustCloneable

* Fix typos in guidebook: Buisness → Business (#38636)

* Fix typo in `MinorAntagonists.xml`

Buisness → Business

* Fix typo in `YourFirstCharacter.xml`

Buisness → Business

* Various Headphones Fixes and Tweaks (#38479)

* sprites, wearables

* neck

* icon-on sprite

* Cleanup prototype instantiation in `DamageTest` (#38639)

Cleanup prototype instantiation in DamageTest

* Cleanup prototype instantiation in `ExplosionSystem` (#38642)

Cleanup prototype instantiation in ExplosionSystem

* AddBodyPartCommand localization. (#38612)

commit

* fix ItemSlotsSystem debug assert (#38655)

* Allow the Command & Super door remotes to use the access of their user. (Re-creation of PR due to changes to game balance) (#35536)

* Added directional beacons (#38284)

* Added directional beacons

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

* Fixed names

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

---------

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

* Power stat and nuke codes commands get some LEC love. (#38585)

* commit

* requested changes.

* Dsay Dirty and Follow commands converted to LEC and localized. (#38666)

* commit

* whoopwhoopwhoop

* Retro laser sprite fix (#38676)

* Fixed everything except the icon

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

* fixed icon

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

---------

Signed-off-by: Nox38 <nebulousnox38@gmail.com>

* fix water coolers (#38681)

* Monochromacy typo fix (#38686)

* fixes the typo

* Fixed cloning looking for the trait, not the component, RE https://github.com/space-wizards/space-station-14/pull/38686#issuecomment-3025093504

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Validate `CloningSettingsPrototype`s (#38688)

* Validate CloningSettingsPrototypes

* Update Content.IntegrationTests/Tests/Cloning/CloningSettingsPrototypeTest.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Check EventComponents too

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Add test of objective-related console commands (#36400)

* Add test of objective add/list/remove commands

* Not sure why we're validating test prototypes, but sure

* We don't need a map

* Improvements and fixups for New Status Effect API (#38660)

* Predict healing and bloodstream (#38690)

* initial commit

* reapply 38126

* fix rootable

* someone missed an important minus sign here

* try this

* fix

* fix

* reenable crit hits

* cleanup

* fix status time dirtying

* fix

* camelCase

* Healing and bloodstream prediction fixes.

* Resolving Wizard casting recall on nuke disk making it impossible to disarm (#38661)

* Resolving Wizard Recall on Nuke disk making it impossible to disarm
- Adding a DisarmBomb case to nuke status update loop
- Changing a few methods and parameters to properly follow formatting standards
- Updating some names to follow camelCase

* Updating missed tag

* Reverting DataField change

Should prevent this preventative bugfix being a breaking change.

* Switch HSV to the default colorspace for character customization (#38434)

* Made HSV default for character editor

* Adds/fixes comments to HSV defaulting

* Added dropbox fix, potentially cursed

* Revert "Added dropbox fix, potentially cursed"

This reverts commit a709883366fbee813e839742125e70844672af29.

---------

Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com>

* Fix: Don't deploy foldables when clicking on items inside containers (#38709)

* Fix

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Pressure Relief Valve (#36708)

* initial system (this math is probably WRONG)

* General code cleanup and OnExamined support
(holy moly this code sucks)

* UICode and related events foundation
TODO:
- Actually write the XAML UI and the underlying system
- Un-shitcode the entire thing
- Actually test everything...

* Working UI code
TODO: Make predicted, as this certainly isn't predicted. Even though I said it was. It isn't.

* Remove one TODO for unshitcoding the examine code

* Add reminder
yea

* Make predicted (defenitely isn't)
(also defenitely isn't a copypaste from pressure pump code)

* It's predicted!
TODO:
- Give it snazzy predicted visuals!
- Have a different field for pressure entry, lest it gets bulldozed every UI update.

* Improve gas pressure relief valve UI
TODO: Reminder to reduce amount of dirties using deltafields

* Implement DirtyField prediction

* Entity<T> cleanup
A lot of Entity<T> conversions and lukewarm cleanup.

Also got caught copy pasting code in 4K UHD but it's not like you couldn't tell.

* More cleanup and comments

* Remove TODO comment on bulldozing window title

* """refactoring"""
- Move appearance out of shared and finally fix it. Pointless to predict appearance in this instance.
- More Entity<T> conversions because I like them.
- Move UI creation handling over entirely to the ActivatableUI system.
- Fix a hardcoded locale string (why????).

* Add visuals

* Revert debugging variable replacememt
yea

* Revert skissue

* Remove unused using directives and remove TODO

* Localize, cleanup, document

* Fix adminlogging discrepancy

* Add ability to construct, add guidebook entry

* Clear up comment

* Add guidebook tooltip to valve

* Convert GasPressureReliefValveBoundUserInterface declaration into primary constructor

* Adds more input handling and adds autofill on open

* Un-deepfry input validator shitcode
Genuinely what was I smoking

* improve visuals logic

* Refactor again
- Update math to the correct implementation
- Moved code that could be re-used in the future into a helper method under AtmosphereSystem.Gases.cs

* I'm sorry but I hate warnings

* Remove unused using directive in AtmosphereSystem.Gases.cs

* Review and cleanup

* Lukewarm UI glossup

* Maintainer for the upstream project btw

* Remove redundant state sets and messy logic

* Unduplicate valve updater code

* Redo UI (im sorry Slarti)

* run tests

* Test refactored UI messaging

* Second round of UI improvements
- God please find a way to improve this system. Feels bad.

* Update loop implementation

* Further predict UI

* Clear up SetToCurrentThreshold

* cleanup

* Update to master + pipe layers and bug fixes
want to run tests

* fixes

* Deploy rename pipebomb

* Documentation and requested changes

* Rename the method that wiggled away

* Undo rounding changes

* Fix comment

* Rename and cleanup

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fix TextLinkTag (#32203)

* Adjust uplink buy button to be under item icon (#38596)

* Adjusted uplink buy button to be under item icon

* Put the discount subtext under the icon

* Indent fixes, added margin

---------

Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com>

* Scurrets - Audio Improvements (#38482)

* Scurret audio tuning

* Add new sfx

* Update sneezing sfx

* YAML support

* Rename a folder

* make telesci wreck easier (#37569)

rel

* Validate `ShaderPrototype` IDs (#38728)

* Convert all shader prototype string literals to protoids in overlays

* Convert more shader prototype literal strings to protoids

* Convert ValidatePrototypeId to ProtoId

* Later

* [BUGFIX] Fixed revenant malfunction ability not working properly only MediBots and Stasis bed (#38664)

* fixed

* clean up

* orks fix smart

* review fix 1

* more requested changes

* less cursed

* more descriptive description

* better wording

* Tiny Tiny Cleanup of the EyeClosingSystem. (#38734)

Update EyeClosingSystem.cs

* Fix human skin tone distribution (#38701)

* fix: Use PredictedQueueDel for gib spell (#38729)

* fix: don't default to uncharged sprite state for cells (#38730)

* Fix Hristov description - remove inaccurate technical specs (#38746)

- Removes inaccurate 'armor piercing 14.5mm shells' reference
- Replaces it with a more funny description, matching the style of the other snipers and guns
- Keeps ammunition type '.60 anti-materiel ammo' specification
- Fixes issue #38590

Co-authored-by: Arthur Fiorese de Andrade <aandrade@cmcxs.gov.br>

* feat: allow mopping evaporating puddles (#38743)

* Validate remaining `ProtoId` strings (#38747)

Validate remaining ProtoId strings

* Validate `ProtoId`s in tests (#38745)

* Convert string literals to protoids in Content.Tests

* Convert string literals to protoids or consts in Content.IntegrationTests

* Fix linter failures
Tricksy static using misled me

* Cleanup warning in StomachSystem (#38748)

you did not see this

* Vox scars (#38592)

* Added vox scars n'stuff, renamed vox_tattoos.ftl to just vox.ftl

* Revert "Added vox scars n'stuff, renamed vox_tattoos.ftl to just vox.ftl"

This reverts commit c73da55ba3b39ddf93b493aecd85604c54dd8a15.

* locale key fix

* Changed top surgery scar names to be more generalized

* Adjusted face scars

* Formatting fixes

---------

Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com>

* UnlockNode command to LEC. (#38751)

* commit

* Update UnlockNodeCommand.cs

* commit

* move command locale to its own file.

* Update Content.Server/Xenoarchaeology/Artifact/UnlockNodeCommand.cs

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Typofixes for figurine dialogue (#38737)

* Typofixes for figurine dialogue

* Forgot two

* Janitor Tool: Wire Brush (#38667)

* Wow! It's -brush-

* spacing.

* Update Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* fixed changes

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Minor escape menu UX improvements (#38650)

* fix: spellbooks can have infinite charges (#38376)

* fix: spellbooks can have infinite charges

* refactor: indicate infinite spellbook charges with null

Not sure if I like this much better...
2025-11-06 18:22:39 +00:00

346 lines
18 KiB
C#

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
useAbsorberSolution: true
- 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, component.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((absorbent, component), user, refillable);
// 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, component.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((absorbent, component), user, refillable);
// 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))
)
};
}