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(); } }