This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user