From 9ca83bfe23c2a18d517016a0a66836dd588aa98b Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Sat, 4 Nov 2023 11:01:39 -0700 Subject: [PATCH] Simulator tests (will fail!) --- Craftimizer.Test/Simulator/Simulator.cs | 235 ++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 Craftimizer.Test/Simulator/Simulator.cs diff --git a/Craftimizer.Test/Simulator/Simulator.cs b/Craftimizer.Test/Simulator/Simulator.cs new file mode 100644 index 0000000..f628654 --- /dev/null +++ b/Craftimizer.Test/Simulator/Simulator.cs @@ -0,0 +1,235 @@ +using Craftimizer.Simulator.Actions; +using System; +using System.Reflection; + +namespace Craftimizer.Test.Simulator; + +[TestClass] +public class SimulatorTests +{ + // https://craftingway.app/rotation/loud-namazu-jVe9Y + // Chondrite Saw + private static SimulationInput Input1 { get; } = + new(new() + { + Craftsmanship = 3304, + Control = 3374, + CP = 575, + Level = 90, + CanUseManipulation = true, + HasSplendorousBuff = false, + IsSpecialist = false, + CLvl = 560, + }, + new() + { + IsExpert = false, + ClassJobLevel = 90, + RLvl = 560, + ConditionsFlag = 0b1111, + MaxDurability = 80, + MaxQuality = 7200, + MaxProgress = 3500, + QualityModifier = 80, + QualityDivider = 115, + ProgressModifier = 90, + ProgressDivider = 130 + }); + + // Conflicting Info: + // https://craftingway.app/rotation/sandy-fafnir-doVCs + // Classical Longsword + private static SimulationInput Input2 { get; } = + new(new() + { + Craftsmanship = 3290, + Control = 3541, + CP = 649, + Level = 90, + CanUseManipulation = true, + HasSplendorousBuff = false, + IsSpecialist = false, + CLvl = 560, + }, + new() + { + IsExpert = false, + ClassJobLevel = 90, + RLvl = 580, + ConditionsFlag = 0b1111, + MaxDurability = 70, + MaxQuality = 10920, + MaxProgress = 3900, + QualityModifier = 70, + QualityDivider = 115, + ProgressModifier = 80, + ProgressDivider = 130 + }); + + private static SimulationState AssertCraft(SimulationInput input, IEnumerable actions, + int progress, int quality, + int durability, int cp) + { + var simulator = new SimulatorNoRandom(new(input)); + var (_, state, _) = simulator.ExecuteMultiple(new(input), actions); + Assert.AreEqual(progress, state.Progress); + Assert.AreEqual(quality, state.Quality); + Assert.AreEqual(durability, state.Durability); + Assert.AreEqual(cp, state.CP); + return state; + } + + [TestMethod] + public void BasicActions() + { + AssertCraft( + Input1, + new[] { + ActionType.BasicTouch, + ActionType.BasicSynthesis, + ActionType.MastersMend + }, + 276, 262, 80, 469); + } + + [TestMethod] + public void BasicTouchCombo() + { + AssertCraft( + Input1, + new[] { + ActionType.Innovation, + ActionType.BasicTouch, + ActionType.StandardTouch, + ActionType.AdvancedTouch, + ActionType.StandardTouch, + ActionType.AdvancedTouch + }, + 0, 2828, 30, 425); + } + + [TestMethod] + public void WithBuffs1() + { + AssertCraft( + Input1, + new[] { + ActionType.Reflect, + ActionType.Manipulation, + ActionType.PreparatoryTouch, + ActionType.WasteNot2 + }, + 0, 890, 60, 335); + } + + [TestMethod] + public void WithBuffs2() + { + AssertCraft( + Input1, + new[] { + ActionType.MuscleMemory, + ActionType.GreatStrides, + ActionType.PrudentTouch, + ActionType.DelicateSynthesis + }, + 1150, 812, 55, 480); + } + + [TestMethod] + public void WithBuffs3() + { + AssertCraft( + Input1, + new[] { + ActionType.MuscleMemory, + ActionType.Manipulation, + ActionType.MastersMend, + ActionType.WasteNot2, + ActionType.Innovation, + ActionType.DelicateSynthesis, + ActionType.BasicTouch, + ActionType.GreatStrides, + ActionType.ByregotsBlessing + }, + 1150, 1925, 80, 163); + } + + [TestMethod] + public void TrainedFinesseProcs() + { + var state = AssertCraft( + Input1, + new[] { + ActionType.Reflect, + ActionType.WasteNot, + ActionType.PreparatoryTouch, + ActionType.PreparatoryTouch, + ActionType.BasicTouch, + ActionType.StandardTouch, + ActionType.PrudentTouch, + ActionType.PreparatoryTouch + }, + 0, 4064, 15, 332); + Assert.AreEqual(10, state.ActiveEffects.InnerQuiet); + Assert.IsTrue(ActionType.TrainedFinesse.Base().CanUse(new SimulatorNoRandom(state))); + } + + [TestMethod] + public void TestCompletedCraft1() + { + AssertCraft( + Input1, + new[] { + ActionType.Reflect, + ActionType.Manipulation, + ActionType.PreparatoryTouch, + ActionType.WasteNot2, + ActionType.PreparatoryTouch, + ActionType.Innovation, + ActionType.PreparatoryTouch, + ActionType.PreparatoryTouch, + ActionType.GreatStrides, + ActionType.ByregotsBlessing, + ActionType.Veneration, + ActionType.Groundwork, + ActionType.Groundwork, + ActionType.Groundwork, + }, + 3726, 8224, 5, 69); + } + + [TestMethod] + public void TestCompletedCraft2() + { + Console.WriteLine($"{Input2.BaseProgressGain} {Input2.BaseProgressGain * (3.6f * 2.5f)}"); + Console.WriteLine($"{(int)(Input2.BaseProgressGain * (3.6f * 2.5f))} {(int)MathF.Floor(Input2.BaseProgressGain * (3.6f * 2.5f))}"); + AssertCraft( + Input2, + new[] { + ActionType.MuscleMemory, + ActionType.Manipulation, + ActionType.Veneration, + ActionType.WasteNot2, + ActionType.Groundwork, + ActionType.Groundwork, + ActionType.StandardTouch, + ActionType.Innovation, + ActionType.PreparatoryTouch, + ActionType.PreparatoryTouch, + ActionType.PreparatoryTouch, + ActionType.PreparatoryTouch, + ActionType.GreatStrides, + ActionType.Innovation, + ActionType.PreparatoryTouch, + ActionType.TrainedFinesse, + ActionType.GreatStrides, + ActionType.ByregotsBlessing + }, + // Conflicting Info: + // TC https://ffxivteamcraft.com/simulator/35020/34800/4PTlwTV6w1aGCUdO2BRl + 3549, 10932, 5, 7); + // Craftingway https://craftingway.app/rotation/sandy-fafnir-doVCs + //3548, 10931, 5, 7); + } +}