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: "Covet inflicts damage and steals the target's held item if it is holding
/// any. If the target is not holding an item or the user is already holding an item, Covet cannot steal an
/// item."
///
public class CovetTests
{
private static (Covet script, IExecutingMove move, IPokemon user, IPokemon target) CreateTestSetup(
IItem? targetItem)
{
var script = new Covet();
var move = Substitute.For();
var user = Substitute.For();
// Explicitly return null to suppress NSubstitute's auto-substitution; Covet must see an empty-handed user.
user.HeldItem.Returns((IItem?)null);
move.User.Returns(user);
var target = Substitute.For();
target.HeldItem.Returns(targetItem);
if (targetItem != null)
{
target.TryStealHeldItem(out Arg.Any()).Returns(x =>
{
x[0] = targetItem;
return true;
});
}
return (script, move, user, target);
}
///
/// Bulbapedia: "Covet inflicts damage and steals the target's held item if it is holding any." The
/// item is removed from the target and ends up held by the user.
///
[Test]
public void OnSecondaryEffect_TargetHoldsItem_UserStealsIt()
{
// Arrange
var item = Substitute.For();
var (script, move, user, target) = CreateTestSetup(item);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert - the item is taken from the target and given to the user
target.Received(1).TryStealHeldItem(out Arg.Any());
user.Received(1).ForceSetHeldItem(item);
}
///
/// Bulbapedia: "If the target is not holding an item [...], Covet cannot steal an item."
///
[Test]
public void OnSecondaryEffect_TargetHoldsNoItem_NothingIsStolen()
{
// Arrange
var (script, move, user, target) = CreateTestSetup(null);
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert
target.DidNotReceive().TryStealHeldItem(out Arg.Any());
user.DidNotReceive().ForceSetHeldItem(Arg.Any());
}
///
/// Bulbapedia: "If [...] the user is already holding an item, Covet cannot steal an item."
///
[Test]
public void OnSecondaryEffect_UserAlreadyHoldsItem_TargetItemIsNotStolen()
{
// Arrange
var targetItem = Substitute.For();
var (script, move, user, target) = CreateTestSetup(targetItem);
user.HeldItem.Returns(Substitute.For());
// Act
script.OnSecondaryEffect(move, target, 0);
// Assert - the user must not end up with the target's item
user.DidNotReceive().ForceSetHeldItem(targetItem);
}
}