using PkmnLib.Dynamic.Models; using PkmnLib.Plugin.Gen7.Scripts.Moves; using PkmnLib.Static; namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves; /// /// Tests for the move script. /// Gen VII Bulbapedia behavior: "Guardian of Alola deals damage equal to 75% of the target's remaining HP /// (rounded down, but no less than 1)." /// public class GuardianOfAlolaTests { private static (GuardianOfAlola script, IExecutingMove move, IBattlePokemon target) CreateTestSetup(uint maxHp, uint currentHp) { var script = new GuardianOfAlola(); var move = Substitute.For(); var target = Substitute.For(); target.BoostedStats.Returns(new StatisticSet(maxHp, 100, 100, 100, 100, 100)); target.CurrentHealth.Returns(currentHp); return (script, move, target); } /// /// Bulbapedia: "Guardian of Alola deals damage equal to 75% of the target's remaining HP". A target /// at full HP takes 75% of that HP as damage. /// [Test] public async Task ChangeMoveDamage_TargetAtFullHp_DamageIsThreeQuartersOfHp() { // Arrange var (script, move, target) = CreateTestSetup(400, 400); uint damage = 10; // Act script.ChangeMoveDamage(move, target, 0, ref damage); // Assert await Assert.That(damage).IsEqualTo(300u); } /// /// Bulbapedia: the damage is "equal to 75% of the target's remaining HP", not its maximum HP. A /// target with 400 max HP but only 100 remaining takes 75 damage. /// [Test, Arguments(400u, 100u, 75u), Arguments(400u, 200u, 150u), Arguments(300u, 50u, 37u)] public async Task ChangeMoveDamage_TargetDamaged_DamageIsThreeQuartersOfRemainingHp(uint maxHp, uint currentHp, uint expectedDamage) { // Arrange var (script, move, target) = CreateTestSetup(maxHp, currentHp); uint damage = 10; // Act script.ChangeMoveDamage(move, target, 0, ref damage); // Assert await Assert.That(damage).IsEqualTo(expectedDamage); } /// /// Bulbapedia: the damage is "rounded down, but no less than 1" — a target with a single HP remaining /// still takes 1 damage instead of 0. /// [Test] public async Task ChangeMoveDamage_TargetAtOneHp_DamageIsAtLeastOne() { // Arrange var (script, move, target) = CreateTestSetup(400, 1); uint damage = 10; // Act script.ChangeMoveDamage(move, target, 0, ref damage); // Assert await Assert.That(damage).IsEqualTo(1u); } }