// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.Tests; using MUnique.OpenMU.DataModel.Configuration.Items; using MUnique.OpenMU.GameLogic.Resets; /// /// Tests for . /// [TestFixture] public class ResetProgressionCalculatorTest { /// /// Verifies boundary behavior for point tiers. /// [TestCase(0, 800)] [TestCase(9, 800)] [TestCase(10, 600)] [TestCase(19, 600)] [TestCase(20, 400)] [TestCase(29, 400)] [TestCase(30, 200)] public void PointsTierBoundaries(int currentResetCount, int expectedPoints) { var configuration = this.CreateTieredConfiguration(); var progression = ResetProgressionCalculator.Calculate(currentResetCount, 0, configuration); Assert.That(progression.PointsForReset, Is.EqualTo(expectedPoints)); } /// /// Verifies cumulative totals for point tiers. /// [TestCase(0, 800)] [TestCase(1, 1600)] [TestCase(9, 8000)] [TestCase(10, 8600)] [TestCase(11, 9200)] [TestCase(20, 14400)] public void PointsTierTotals(int currentResetCount, int expectedTotalPoints) { var configuration = this.CreateTieredConfiguration(); var progression = ResetProgressionCalculator.Calculate(currentResetCount, 0, configuration); Assert.That(progression.TotalPointsAfterReset, Is.EqualTo(expectedTotalPoints)); } /// /// Verifies boundary behavior for item cost tiers with capped final tier. /// [TestCase(0, 2)] [TestCase(1, 4)] [TestCase(2, 8)] [TestCase(3, 16)] [TestCase(4, 32)] [TestCase(5, 64)] [TestCase(6, 64)] [TestCase(20, 64)] public void ItemCostTierBoundaries(int currentResetCount, int expectedItemAmount) { var configuration = this.CreateTieredConfiguration(); var progression = ResetProgressionCalculator.Calculate(currentResetCount, 0, configuration); Assert.That(progression.RequiredItemAmount, Is.EqualTo(expectedItemAmount)); } /// /// Verifies legacy fallback behavior when no tier collections are configured. /// [Test] public void LegacyFallbackWhenTiersAreEmpty() { var configuration = new ResetConfiguration { RequiredMoney = 2, MultiplyRequiredMoneyByResetCount = true, PointsPerReset = 300, MultiplyPointsByResetCount = true, PointsTiers = [], ItemCostTiers = [], RequiredResetItem = new ItemDefinition { Name = "Jewel of Creation" }, }; var progression = ResetProgressionCalculator.Calculate(2, 0, configuration); Assert.That(progression.NextResetCount, Is.EqualTo(3)); Assert.That(progression.RequiredZen, Is.EqualTo(6)); Assert.That(progression.PointsForReset, Is.EqualTo(900)); Assert.That(progression.TotalPointsAfterReset, Is.EqualTo(900)); Assert.That(progression.RequiredItemAmount, Is.EqualTo(0)); } /// /// Verifies that the per-character points override applies in legacy mode. /// [Test] public void PlayerSpecificPointsOverrideIsAppliedInLegacyMode() { var configuration = new ResetConfiguration { PointsPerReset = 300, MultiplyPointsByResetCount = true, PointsTiers = [], }; var progression = ResetProgressionCalculator.Calculate(4, 120, configuration); Assert.That(progression.PointsForReset, Is.EqualTo(600)); Assert.That(progression.TotalPointsAfterReset, Is.EqualTo(600)); } private ResetConfiguration CreateTieredConfiguration() { return new ResetConfiguration { RequiredResetItem = new ItemDefinition { Name = "Jewel of Creation" }, PointsTiers = [ new() { MinimumResetCount = 1, PointsGranted = 800 }, new() { MinimumResetCount = 11, PointsGranted = 600 }, new() { MinimumResetCount = 21, PointsGranted = 400 }, new() { MinimumResetCount = 31, PointsGranted = 200 }, ], ItemCostTiers = [ new() { MinimumResetCount = 1, RequiredItemAmount = 2 }, new() { MinimumResetCount = 2, RequiredItemAmount = 4 }, new() { MinimumResetCount = 3, RequiredItemAmount = 8 }, new() { MinimumResetCount = 4, RequiredItemAmount = 16 }, new() { MinimumResetCount = 5, RequiredItemAmount = 32 }, new() { MinimumResetCount = 6, RequiredItemAmount = 64 }, new() { MinimumResetCount = 7, RequiredItemAmount = 64 }, ], }; } }