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.
/// Behavior is verified against the Bulbapedia page for Brine.
///
public class BrineTests
{
///
/// Creates a fully mocked test setup for Brine tests, with a target whose max HP
/// () and are configured.
///
private static (Brine brine, IExecutingMove move, IPokemon target) CreateTestSetup(uint maxHp, uint currentHp)
{
var brine = new Brine();
var move = Substitute.For();
var target = Substitute.For();
target.BoostedStats.Returns(new StatisticSet(maxHp, 0, 0, 0, 0, 0));
target.CurrentHealth.Returns(currentHp);
return (brine, move, target);
}
///
/// Bulbapedia: "Brine inflicts damage, and its power doubles to 130 when the target is at or below
/// 50% health."
/// At exactly half HP, the base power of 65 doubles to 130.
///
[Test]
public async Task ChangeBasePower_TargetAtExactlyHalfHp_BasePowerDoubles()
{
// Arrange
var (brine, move, target) = CreateTestSetup(100, 50);
ushort basePower = 65;
// Act
brine.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo((ushort)130);
}
///
/// Bulbapedia: "its power doubles to 130 when the target is at or below 50% health."
/// Tests several HP fractions at or below half, including odd max HP values where 50% is not
/// a whole number (50/101 ≈ 49.5% is below half).
///
[Test, Arguments(100u, 49u), Arguments(100u, 1u), Arguments(200u, 100u), Arguments(101u, 50u)]
public async Task ChangeBasePower_TargetAtOrBelowHalfHp_BasePowerDoubles(uint maxHp, uint currentHp)
{
// Arrange
var (brine, move, target) = CreateTestSetup(maxHp, currentHp);
ushort basePower = 65;
// Act
brine.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo((ushort)130);
}
///
/// Bulbapedia: "its power doubles to 130 when the target is at or below 50% health."
/// Above 50% health the power must remain unchanged, including one HP above half and odd max HP
/// values where 51/101 ≈ 50.5% is just above half.
///
[Test, Arguments(100u, 51u), Arguments(100u, 100u), Arguments(101u, 51u), Arguments(200u, 101u)]
public async Task ChangeBasePower_TargetAboveHalfHp_BasePowerUnchanged(uint maxHp, uint currentHp)
{
// Arrange
var (brine, move, target) = CreateTestSetup(maxHp, currentHp);
ushort basePower = 65;
// Act
brine.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo((ushort)65);
}
///
/// Technical test: doubling an already very high base power must clamp to
/// instead of overflowing.
///
[Test]
public async Task ChangeBasePower_DoublingWouldOverflow_ClampsToMax()
{
// Arrange
var (brine, move, target) = CreateTestSetup(100, 50);
ushort basePower = ushort.MaxValue - 100;
// Act
brine.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo(ushort.MaxValue);
}
}