Files
PkmnLib.NET/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlyingPressTests.cs
Deukhoofd d2a82b5fe3
All checks were successful
Build / Build (push) Successful in 3m12s
Many more tests and fixes
2026-08-27 17:11:12 +02:00

96 lines
3.9 KiB
C#

using PkmnLib.Dynamic.Models;
using PkmnLib.Plugin.Gen7.Scripts.Moves;
using PkmnLib.Static;
using PkmnLib.Static.Libraries;
namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves;
/// <summary>
/// Tests for the <see cref="FlyingPress"/> script, which implements Flying Press.
/// Behavior is verified against the Bulbapedia page for Flying Press (Generation VII).
/// </summary>
public class FlyingPressTests
{
/// <summary>
/// Creates a fully mocked test setup for Flying Press tests, with a type library containing both the
/// Fighting and Flying types.
/// </summary>
private static (FlyingPress flyingPress, IExecutingMove move, IPokemon target, TypeIdentifier fighting,
TypeIdentifier flying) CreateTestSetup()
{
var flyingPress = new FlyingPress();
var typeLibrary = new TypeLibrary();
var fighting = typeLibrary.RegisterType("fighting");
var flying = typeLibrary.RegisterType("flying");
var move = Substitute.For<IExecutingMove>();
move.User.Library.StaticLibrary.Types.Returns(typeLibrary);
var target = Substitute.For<IPokemon>();
return (flyingPress, move, target, fighting, flying);
}
/// <summary>
/// Bulbapedia: "Despite being a Fighting move, the damage dealt is actually a combination of Fighting and
/// Flying types, and thus its effectiveness against a given Pokémon differs from other Fighting-type moves."
/// The script adds the Flying type to the list of types used for the move's effectiveness calculation.
/// </summary>
[Test]
public async Task ChangeTypesForMove_FlyingTypeAvailable_AddsFlyingTypeToMoveTypes()
{
// Arrange
var (flyingPress, move, target, fighting, flying) = CreateTestSetup();
IList<TypeIdentifier> types = new List<TypeIdentifier> { fighting };
// Act
flyingPress.ChangeTypesForMove(move, target, 0, types);
// Assert
await Assert.That(types.Contains(flying)).IsTrue();
}
/// <summary>
/// Bulbapedia: "However, for all other purposes, it is a Fighting-type move: only Fighting-type Pokémon can
/// receive the same-type attack bonus on Flying Press".
/// The Flying type is added on top of the move's own Fighting type; the original type is not replaced.
/// </summary>
[Test]
public async Task ChangeTypesForMove_FlyingTypeAvailable_KeepsOriginalFightingType()
{
// Arrange
var (flyingPress, move, target, fighting, _) = CreateTestSetup();
IList<TypeIdentifier> types = new List<TypeIdentifier> { fighting };
// Act
flyingPress.ChangeTypesForMove(move, target, 0, types);
// Assert - the Fighting type is still the first type, and exactly one type was added
await Assert.That(types[0]).IsEqualTo(fighting);
await Assert.That(types.Count).IsEqualTo(2);
}
/// <summary>
/// Bulbapedia: "the damage dealt is actually a combination of Fighting and Flying types".
/// Technical test: if the type library does not know a "flying" type, the script leaves the move's types
/// unchanged instead of adding a default type identifier.
/// </summary>
[Test]
public async Task ChangeTypesForMove_FlyingTypeMissingFromLibrary_TypesUnchanged()
{
// Arrange
var flyingPress = new FlyingPress();
var typeLibrary = new TypeLibrary();
var fighting = typeLibrary.RegisterType("fighting");
var move = Substitute.For<IExecutingMove>();
move.User.Library.StaticLibrary.Types.Returns(typeLibrary);
var target = Substitute.For<IPokemon>();
IList<TypeIdentifier> types = new List<TypeIdentifier> { fighting };
// Act
flyingPress.ChangeTypesForMove(move, target, 0, types);
// Assert
await Assert.That(types.Count).IsEqualTo(1);
await Assert.That(types[0]).IsEqualTo(fighting);
}
}