113 lines
4.6 KiB
C#
113 lines
4.6 KiB
C#
using PkmnLib.Dynamic.Models;
|
||
using PkmnLib.Plugin.Gen7.Scripts.Moves;
|
||
using PkmnLib.Static;
|
||
|
||
namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves;
|
||
|
||
/// <summary>
|
||
/// Tests for the <see cref="Flail"/> move script.
|
||
/// Gen VII Bulbapedia behavior: "Flail inflicts damage and has no additional effect. Its power is based on
|
||
/// the user's current HP as a percentage of its maximum HP, which is higher the lower the user's HP is."
|
||
/// The power tiers (all generations except IV) are: 20 power at HP ≥ 68.8%, 40 at 35.4% ≤ HP < 68.8%,
|
||
/// 80 at 20.8% ≤ HP < 35.4%, 100 at 10.4% ≤ HP < 20.8%, 150 at 4.2% ≤ HP < 10.4%, and
|
||
/// 200 at HP < 4.2%. These percentages correspond to the tiers of floor(48 × current HP / max HP).
|
||
/// </summary>
|
||
public class FlailTests
|
||
{
|
||
/// <summary>
|
||
/// Creates a fully mocked test setup for Flail tests with the user at the given current and maximum HP.
|
||
/// </summary>
|
||
private static (Flail script, IExecutingMove move, IPokemon target) CreateTestSetup(uint currentHp, uint maxHp)
|
||
{
|
||
var script = new Flail();
|
||
var move = Substitute.For<IExecutingMove>();
|
||
var target = Substitute.For<IPokemon>();
|
||
var user = Substitute.For<IPokemon>();
|
||
user.CurrentHealth.Returns(currentHp);
|
||
user.BoostedStats.Returns(new StatisticSet<uint>(maxHp, 0, 0, 0, 0, 0));
|
||
move.User.Returns(user);
|
||
return (script, move, target);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Bulbapedia: Flail's power is 20 when the user's HP is at least 68.8% of its maximum.
|
||
/// A user at full health uses the weakest power tier.
|
||
/// </summary>
|
||
[Test]
|
||
public async Task ChangeBasePower_UserAtFullHealth_PowerIs20()
|
||
{
|
||
// Arrange
|
||
var (script, move, target) = CreateTestSetup(100, 100);
|
||
ushort basePower = 20;
|
||
|
||
// Act
|
||
script.ChangeBasePower(move, target, 0, ref basePower);
|
||
|
||
// Assert
|
||
await Assert.That(basePower).IsEqualTo((ushort)20);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Bulbapedia: Flail's power is 200 when the user's HP is below 4.2% of its maximum.
|
||
/// A user at 1 HP uses the strongest power tier.
|
||
/// </summary>
|
||
[Test]
|
||
public async Task ChangeBasePower_UserAtOneHp_PowerIs200()
|
||
{
|
||
// Arrange
|
||
var (script, move, target) = CreateTestSetup(1, 100);
|
||
ushort basePower = 20;
|
||
|
||
// Act
|
||
script.ChangeBasePower(move, target, 0, ref basePower);
|
||
|
||
// Assert
|
||
await Assert.That(basePower).IsEqualTo((ushort)200);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Bulbapedia: "Its power is based on the user's current HP as a percentage of its maximum HP, which is
|
||
/// higher the lower the user's HP is". These rows cover the extremes of the table: full health
|
||
/// (HP ≥ 68.8% → 20 power) and nearly fainted (HP < 4.2% → 200 power).
|
||
/// </summary>
|
||
[Test, Arguments(100u, 100u, 20), Arguments(4u, 100u, 200), Arguments(1u, 100u, 200)]
|
||
// 48/48 -> 20
|
||
// floor(1.92) = 1 -> 200
|
||
// floor(0.48) = 0 -> 200
|
||
public async Task ChangeBasePower_HpAtExtremes_MatchesFlailPowerTable(uint currentHp, uint maxHp, int expectedPower)
|
||
{
|
||
// Arrange
|
||
var (script, move, target) = CreateTestSetup(currentHp, maxHp);
|
||
ushort basePower = 20;
|
||
|
||
// Act
|
||
script.ChangeBasePower(move, target, 0, ref basePower);
|
||
|
||
// Assert
|
||
await Assert.That(basePower).IsEqualTo((ushort)expectedPower);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Bulbapedia: "Its power is based on the user's current HP as a percentage of its maximum HP, which is
|
||
/// higher the lower the user's HP is", following the tiers 20 (HP ≥ 68.8%), 40 (35.4% ≤ HP < 68.8%),
|
||
/// 80 (20.8% ≤ HP < 35.4%), 100 (10.4% ≤ HP < 20.8%), 150 (4.2% ≤ HP < 10.4%) and 200 (HP < 4.2%).
|
||
/// The rows cover both boundary values of every tier, verifying the integer arithmetic of
|
||
/// floor(48 × current HP / max HP).
|
||
/// </summary>
|
||
[Test, Arguments(69u, 100u, 20), Arguments(68u, 100u, 40), Arguments(36u, 100u, 40), Arguments(35u, 100u, 80),
|
||
Arguments(21u, 100u, 80), Arguments(20u, 100u, 100), Arguments(11u, 100u, 100), Arguments(10u, 100u, 150),
|
||
Arguments(5u, 100u, 150), Arguments(150u, 300u, 40), Arguments(24u, 48u, 40), Arguments(7u, 48u, 100)]
|
||
public async Task ChangeBasePower_HpFractionOfMax_MatchesFlailPowerTable(uint currentHp, uint maxHp,
|
||
int expectedPower)
|
||
{
|
||
// Arrange
|
||
var (script, move, target) = CreateTestSetup(currentHp, maxHp);
|
||
ushort basePower = 20;
|
||
|
||
// Act
|
||
script.ChangeBasePower(move, target, 0, ref basePower);
|
||
|
||
// Assert
|
||
await Assert.That(basePower).IsEqualTo((ushort)expectedPower);
|
||
}
|
||
} |