using PkmnLib.Dynamic.Models;
using PkmnLib.Dynamic.Models.Choices;
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: "Belch deals damage. It cannot be selected unless the user has previously eaten
/// a Berry in the current battle."
///
public class BelchTests
{
///
/// Creates a fully mocked test setup where the user's
/// contains one item per given .
///
private static (Belch script, IMoveChoice choice) CreateTestSetup(params ItemCategory[] consumedItemCategories)
{
var script = new Belch();
var user = Substitute.For();
var items = consumedItemCategories.Select(category =>
{
var item = Substitute.For();
item.Category.Returns(category);
return item;
}).ToArray();
var battleData = Substitute.For();
battleData.ConsumedItems.Returns(items);
user.BattleData.Returns(battleData);
var choice = Substitute.For();
choice.User.Returns(user);
return (script, choice);
}
///
/// Bulbapedia: "It cannot be selected unless the user has previously eaten a Berry in the current battle."
/// A user that has eaten a Berry may select Belch.
///
[Test]
public async Task PreventMoveSelection_UserAteBerry_SelectionAllowed()
{
// Arrange
var (script, choice) = CreateTestSetup(ItemCategory.Berry);
var prevent = false;
// Act
script.PreventMoveSelection(choice, ref prevent);
// Assert
await Assert.That(prevent).IsFalse();
}
///
/// Bulbapedia: "It cannot be selected unless the user has previously eaten a Berry in the current battle."
/// A user that has not consumed anything cannot select Belch.
///
[Test]
public async Task PreventMoveSelection_NoItemsConsumed_SelectionPrevented()
{
// Arrange
var (script, choice) = CreateTestSetup();
var prevent = false;
// Act
script.PreventMoveSelection(choice, ref prevent);
// Assert
await Assert.That(prevent).IsTrue();
}
///
/// Bulbapedia: "It cannot be selected unless the user has previously eaten a Berry in the current battle."
/// Having consumed only non-Berry items does not satisfy the requirement.
///
[Test, Arguments(ItemCategory.MiscItem), Arguments(ItemCategory.Medicine)]
public async Task PreventMoveSelection_OnlyNonBerryItemConsumed_SelectionPrevented(ItemCategory category)
{
// Arrange
var (script, choice) = CreateTestSetup(category);
var prevent = false;
// Act
script.PreventMoveSelection(choice, ref prevent);
// Assert
await Assert.That(prevent).IsTrue();
}
///
/// Bulbapedia: "It cannot be selected unless the user has previously eaten a Berry in the current battle."
/// The Berry does not have to be the only consumed item: a Berry among other consumed items is enough.
///
[Test]
public async Task PreventMoveSelection_BerryAmongOtherConsumedItems_SelectionAllowed()
{
// Arrange
var (script, choice) = CreateTestSetup(ItemCategory.MiscItem, ItemCategory.Berry);
var prevent = false;
// Act
script.PreventMoveSelection(choice, ref prevent);
// Assert
await Assert.That(prevent).IsFalse();
}
///
/// Technical test: outside of battle (no ) the script does not prevent
/// selection.
///
[Test]
public async Task PreventMoveSelection_NoBattleData_SelectionAllowed()
{
// Arrange
var script = new Belch();
var user = Substitute.For();
user.BattleData.Returns((IPokemonBattleData?)null);
var choice = Substitute.For();
choice.User.Returns(user);
var prevent = false;
// Act
script.PreventMoveSelection(choice, ref prevent);
// Assert
await Assert.That(prevent).IsFalse();
}
}