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: "Electro Ball inflicts more damage the faster the user is compared to the
/// target." The power is based on the target's Speed as a percentage of the user's Speed:
/// more than 100% (or exactly 0) → 40, 50.01%–100% → 60, 33.34%–50% → 80, 25.01%–33.33% → 120,
/// 0.01%–25% → 150. "The Speed values used take all modifiers into account (including stat stages,
/// paralysis, held items [...], and Abilities [...])."
///
public class ElectroBallTests
{
private static (ElectroBall script, IExecutingMove move, IPokemon target) CreateTestSetup(uint userSpeed,
uint targetSpeed)
{
var script = new ElectroBall();
var move = Substitute.For();
var user = Substitute.For();
user.BoostedStats.Returns(new StatisticSet(1, 1, 1, 1, 1, userSpeed));
move.User.Returns(user);
var target = Substitute.For();
target.BoostedStats.Returns(new StatisticSet(1, 1, 1, 1, 1, targetSpeed));
return (script, move, target);
}
///
/// Bulbapedia: the power scales with the target's Speed as a percentage of the user's Speed —
/// more than 100% → 40, 50.01%–100% → 60, 33.34%–50% → 80, 25.01%–33.33% → 120, 0.01%–25% → 150.
///
[Test, Arguments(100u, 150u, (ushort)40), Arguments(100u, 101u, (ushort)40), Arguments(100u, 70u, (ushort)60),
Arguments(100u, 40u, (ushort)80), Arguments(100u, 30u, (ushort)120), Arguments(100u, 20u, (ushort)150),
Arguments(500u, 100u, (ushort)150)]
public async Task ChangeBasePower_ScalesWithSpeedRatio(uint userSpeed, uint targetSpeed, ushort expectedPower)
{
// Arrange
var (script, move, target) = CreateTestSetup(userSpeed, targetSpeed);
ushort basePower = 40;
// Act
script.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo(expectedPower);
}
///
/// Bulbapedia: the power bands are inclusive of their upper boundary — a target at exactly 100% of the
/// user's Speed yields 60 power, exactly 50% yields 80, exactly 33.33% yields 120, and exactly 25%
/// yields 150.
///
[Test, Arguments(100u, 100u, (ushort)60), Arguments(100u, 50u, (ushort)80), Arguments(300u, 100u, (ushort)120),
Arguments(400u, 100u, (ushort)150)]
public async Task ChangeBasePower_SpeedRatioAtExactBoundary_UsesHigherTier(uint userSpeed, uint targetSpeed,
ushort expectedPower)
{
// Arrange
var (script, move, target) = CreateTestSetup(userSpeed, targetSpeed);
ushort basePower = 40;
// Act
script.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo(expectedPower);
}
///
/// Bulbapedia: the power is 40 when the target's Speed is "more than 100%, or exactly 0" of the
/// user's Speed.
///
[Test]
public async Task ChangeBasePower_TargetSpeedZero_PowerIsForty()
{
// Arrange
var (script, move, target) = CreateTestSetup(100, 0);
ushort basePower = 40;
// Act
script.ChangeBasePower(move, target, 0, ref basePower);
// Assert
await Assert.That(basePower).IsEqualTo((ushort)40);
}
}