Many more tests and fixes
All checks were successful
Build / Build (push) Successful in 3m12s

This commit is contained in:
2026-08-27 17:11:12 +02:00
parent 32b3ef9c4a
commit d2a82b5fe3
204 changed files with 20255 additions and 242 deletions

View File

@@ -0,0 +1,158 @@
using PkmnLib.Dynamic.Events;
using PkmnLib.Dynamic.Models;
using PkmnLib.Plugin.Gen7.Scripts.Moves;
using PkmnLib.Static;
using PkmnLib.Static.Utils;
namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves;
/// <summary>
/// Tests for the <see cref="Incinerate"/> move script.
/// Gen VII Bulbapedia behavior: "Incinerate inflicts damage to all adjacent opponents. The move destroys any
/// Berries held by hit Pokémon". Generation VI onwards: "The move now also destroys Gems."
/// </summary>
public class IncinerateTests
{
/// <summary>
/// Creates a fully mocked test setup for Incinerate tests, with the target holding the given item
/// (nothing when null).
/// </summary>
private static (Incinerate script, IExecutingMove move, IPokemon target, IHitData hitData, EventHook eventHook)
CreateTestSetup(IItem? heldItem)
{
var script = new Incinerate();
var move = Substitute.For<IExecutingMove>();
var target = Substitute.For<IPokemon>();
var hitData = Substitute.For<IHitData>();
move.GetHitData(target, 0).Returns(hitData);
var eventHook = new EventHook();
var battle = Substitute.For<IBattle>();
battle.EventHook.Returns(eventHook);
move.Battle.Returns(battle);
target.HeldItem.Returns(heldItem);
if (heldItem != null)
{
target.TryStealHeldItem(out Arg.Any<IItem?>()).Returns(x =>
{
x[0] = heldItem;
return true;
});
}
return (script, move, target, hitData, eventHook);
}
/// <summary>
/// Creates a substitute held item with the given name and category.
/// </summary>
private static IItem CreateItem(string name, ItemCategory category)
{
var item = Substitute.For<IItem>();
item.Name.Returns(new StringKey(name));
item.Category.Returns(category);
return item;
}
/// <summary>
/// Helper to check whether the target's held item was taken away.
/// </summary>
private static bool ItemWasRemoved(IPokemon pokemon) =>
pokemon.ReceivedCalls().Any(c => c.GetMethodInfo().Name == "TryStealHeldItem");
/// <summary>
/// Bulbapedia: "The move destroys any Berries held by hit Pokémon." A held Berry is removed from the
/// target.
/// </summary>
[Test]
public async Task OnSecondaryEffect_TargetHoldsBerry_BerryIsRemoved()
{
// Arrange
var berry = CreateItem("oran_berry", ItemCategory.Berry);
var (script, move, target, _, _) = CreateTestSetup(berry);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
await Assert.That(ItemWasRemoved(target)).IsTrue();
}
/// <summary>
/// Bulbapedia: "The move destroys any Berries held by hit Pokémon" — the destruction is announced
/// through a <see cref="DialogEvent"/> so the battle log can show it.
/// </summary>
[Test]
public async Task OnSecondaryEffect_TargetHoldsBerry_FiresItemIncineratedDialogEvent()
{
// Arrange
var berry = CreateItem("oran_berry", ItemCategory.Berry);
var (script, move, target, _, eventHook) = CreateTestSetup(berry);
DialogEvent? captured = null;
eventHook.Handler += (_, args) =>
{
if (args is DialogEvent dialogEvent)
captured = dialogEvent;
};
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
await Assert.That(captured).IsNotNull();
await Assert.That(captured!.Message).IsEqualTo("item_incinerated");
}
/// <summary>
/// Bulbapedia: only Berries (and, from Gen VI, Gems) are destroyed. A regular held item is left alone.
/// </summary>
[Test]
public async Task OnSecondaryEffect_TargetHoldsRegularItem_ItemIsNotRemoved()
{
// Arrange
var item = CreateItem("leftovers", ItemCategory.MiscItem);
var (script, move, target, _, _) = CreateTestSetup(item);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
await Assert.That(ItemWasRemoved(target)).IsFalse();
}
/// <summary>
/// Bulbapedia (Generation VI onwards): "The move now also destroys Gems." A held Gem is removed from
/// the target.
/// </summary>
[Test]
public async Task OnSecondaryEffect_TargetHoldsGem_GemIsRemoved()
{
// Arrange
var gem = CreateItem("normal_gem", ItemCategory.MiscItem);
var (script, move, target, _, _) = CreateTestSetup(gem);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
await Assert.That(ItemWasRemoved(target)).IsTrue();
}
/// <summary>
/// Bulbapedia: "Incinerate inflicts damage to all adjacent opponents." Destroying a Berry is a bonus
/// effect: against a target holding nothing the move still simply deals its damage, it does not fail.
/// </summary>
[Test]
public void OnSecondaryEffect_TargetHoldsNoItem_HitIsNotMarkedAsFailed()
{
// Arrange
var (script, move, target, hitData, _) = CreateTestSetup(null);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
hitData.DidNotReceive().Fail();
}
}