From 409d873403c2eb327e4a73c0fa27dbdfc5ccf775 Mon Sep 17 00:00:00 2001 From: PrPleGoo Date: Tue, 14 Apr 2020 15:41:23 +0200 Subject: [PATCH] Fix ratio issues on SlipSolution --- Content.Shared/Chemistry/Solution.cs | 7 +++++-- .../Shared/Chemistry/Solution_Tests.cs | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Chemistry/Solution.cs b/Content.Shared/Chemistry/Solution.cs index 13b15d94b4..5faefd8430 100644 --- a/Content.Shared/Chemistry/Solution.cs +++ b/Content.Shared/Chemistry/Solution.cs @@ -181,11 +181,13 @@ namespace Content.Shared.Chemistry newSolution = new Solution(); var newTotalVolume = ReagentUnit.New(0M); - var ratio = (TotalVolume - quantity).Decimal() / TotalVolume.Decimal(); + var remainingVolume = TotalVolume; for (var i = 0; i < _contents.Count; i++) { var reagent = _contents[i]; + var ratio = (remainingVolume - quantity).Decimal() / remainingVolume.Decimal(); + remainingVolume -= reagent.Quantity; var newQuantity = reagent.Quantity * ratio; var splitQuantity = reagent.Quantity - newQuantity; @@ -193,10 +195,11 @@ namespace Content.Shared.Chemistry _contents[i] = new ReagentQuantity(reagent.ReagentId, newQuantity); newSolution._contents.Add(new ReagentQuantity(reagent.ReagentId, splitQuantity)); newTotalVolume += splitQuantity; + quantity -= splitQuantity; } - TotalVolume = TotalVolume * ratio; newSolution.TotalVolume = newTotalVolume; + TotalVolume -= newTotalVolume; return newSolution; } diff --git a/Content.Tests/Shared/Chemistry/Solution_Tests.cs b/Content.Tests/Shared/Chemistry/Solution_Tests.cs index f149d66043..d5d101353e 100644 --- a/Content.Tests/Shared/Chemistry/Solution_Tests.cs +++ b/Content.Tests/Shared/Chemistry/Solution_Tests.cs @@ -255,7 +255,25 @@ namespace Content.Tests.Shared.Chemistry Assert.That(splitSolution.GetReagentQuantity("water").Float(), Is.EqualTo(reduce)); Assert.That(splitSolution.TotalVolume.Float(), Is.EqualTo(reduce)); } - + + [Test] + [TestCase(2)] + [TestCase(10)] + [TestCase(100)] + [TestCase(1000)] + public void SplitRounding(int amount) + { + var solutionOne = new Solution(); + solutionOne.AddReagent("foo", ReagentUnit.New(amount)); + solutionOne.AddReagent("bar", ReagentUnit.New(amount)); + solutionOne.AddReagent("baz", ReagentUnit.New(amount)); + + var splitAmount = ReagentUnit.New(5); + var split = solutionOne.SplitSolution(splitAmount); + + Assert.That(split.TotalVolume, Is.EqualTo(splitAmount)); + } + [Test] public void SplitSolutionMoreThanTotalRemovesAll() {