Files
PkmnLib.NET/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FoulPlayTests.cs

94 lines
3.7 KiB
C#

using PkmnLib.Dynamic.Models;
using PkmnLib.Plugin.Gen7.Scripts.Moves;
using PkmnLib.Static;
using PkmnLib.Static.Moves;
namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves;
/// <summary>
/// Tests for the <see cref="FoulPlay"/> move script.
/// Behavior is verified against the Bulbapedia page for Foul Play (Generation VII behavior).
/// </summary>
public class FoulPlayTests
{
/// <summary>
/// Creates a fully mocked test setup for Foul Play tests, with a target whose (boosted) offensive
/// stats are set to the given values.
/// </summary>
private static (FoulPlay script, IExecutingMove move, IBattlePokemon target) CreateTestSetup(MoveCategory category,
uint targetAttack, uint targetSpecialAttack)
{
var script = new FoulPlay();
var move = Substitute.For<IExecutingMove>();
var useMove = Substitute.For<IMoveData>();
useMove.Category.Returns(category);
move.UseMove.Returns(useMove);
var target = Substitute.For<IBattlePokemon>();
target.BoostedStats.Returns(new StatisticSet<uint>(100, targetAttack, 80, targetSpecialAttack, 80, 80));
var user = Substitute.For<IBattlePokemon>();
move.User.Returns(user);
return (script, move, target);
}
/// <summary>
/// Bulbapedia: "Foul Play inflicts damage. It uses the target's Attack stat to calculate damage instead
/// of the user's."
/// The offensive stat value (initially the user's Attack) must be replaced by the target's Attack.
/// </summary>
[Test, Arguments(50u), Arguments(150u), Arguments(400u)]
public async Task ChangeOffensiveStatValue_PhysicalMove_UsesTargetsAttackInsteadOfUsers(uint targetAttack)
{
// Arrange
var (script, move, target) = CreateTestSetup(MoveCategory.Physical, targetAttack, 80);
uint value = 100; // The user's own Attack stat, which must be discarded.
// Act
script.ChangeOffensiveStatValue(move, target, 0, 200, new StatisticSet<uint>(), Statistic.Attack, ref value);
// Assert
await Assert.That(value).IsEqualTo(targetAttack);
}
/// <summary>
/// Bulbapedia: "The target's Attack stat stage-modifiers are applied (rather than the user's)".
/// The stat used must be the target's boosted Attack (<see cref="IBattlePokemon.BoostedStats"/>, which includes
/// stat stages), not its flat Attack (<see cref="IBattlePokemon.FlatStats"/>).
/// </summary>
[Test]
public async Task ChangeOffensiveStatValue_PhysicalMove_TargetStatStagesApplied()
{
// Arrange - the target's flat Attack is 100, but its stat stages boost it to 400.
var (script, move, target) = CreateTestSetup(MoveCategory.Physical, 400, 80);
target.FlatStats.Returns(new StatisticSet<uint>(100, 100, 80, 80, 80, 80));
uint value = 100;
// Act
script.ChangeOffensiveStatValue(move, target, 0, 200, new StatisticSet<uint>(), Statistic.Attack, ref value);
// Assert
await Assert.That(value).IsEqualTo(400u);
}
/// <summary>
/// Technical test: the script generically supports special moves by using the target's Special Attack
/// instead. (Foul Play itself is a physical move; Bulbapedia: "It uses the target's Attack stat to
/// calculate damage instead of the user's.")
/// </summary>
[Test]
public async Task ChangeOffensiveStatValue_SpecialMove_UsesTargetsSpecialAttack()
{
// Arrange
var (script, move, target) = CreateTestSetup(MoveCategory.Special, 150, 240);
uint value = 100;
// Act
script.ChangeOffensiveStatValue(move, target, 0, 200, new StatisticSet<uint>(), Statistic.SpecialAttack,
ref value);
// Assert
await Assert.That(value).IsEqualTo(240u);
}
}