using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.ScriptHandling; using PkmnLib.Plugin.Gen7.Scripts.Moves; using PkmnLib.Plugin.Gen7.Scripts.Pokemon; using PkmnLib.Static.Species; using PkmnLib.Static.Utils; namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves; /// /// Tests for the move script. /// Gen VII Bulbapedia behavior: "The target becomes infatuated with the user if they have opposite genders. /// [...] Attract has no effect if the user and target have the same gender, or if either of them is a /// gender-unknown Pokémon (such as Magnemite). It also fails when used on a Pokémon that is already infatuated." /// public class AttractTests { private static (Attract script, IExecutingMove move, IPokemon target, IScriptSet targetVolatile, IHitData hitData) CreateTestSetup(Gender userGender, Gender targetGender) { var script = new Attract(); var move = Substitute.For(); var target = Substitute.For(); var hitData = Substitute.For(); move.GetHitData(target, 0).Returns(hitData); var targetVolatile = Substitute.For(); target.Volatile.Returns(targetVolatile); target.Gender.Returns(targetGender); var user = Substitute.For(); user.Gender.Returns(userGender); move.User.Returns(user); return (script, move, target, targetVolatile, hitData); } /// /// Bulbapedia: "The target becomes infatuated with the user if they have opposite genders." /// [Test, Arguments(Gender.Male, Gender.Female), Arguments(Gender.Female, Gender.Male)] public void OnSecondaryEffect_OppositeGenders_TargetBecomesInfatuated(Gender userGender, Gender targetGender) { // Arrange var (script, move, target, targetVolatile, hitData) = CreateTestSetup(userGender, targetGender); // Act script.OnSecondaryEffect(move, target, 0); // Assert targetVolatile.Received(1).Add(Arg.Any()); hitData.DidNotReceive().Fail(); } /// /// Bulbapedia: "Attract has no effect if the user and target have the same gender". /// [Test, Arguments(Gender.Male, Gender.Male), Arguments(Gender.Female, Gender.Female)] public void OnSecondaryEffect_SameGender_Fails(Gender userGender, Gender targetGender) { // Arrange var (script, move, target, targetVolatile, hitData) = CreateTestSetup(userGender, targetGender); // Act script.OnSecondaryEffect(move, target, 0); // Assert hitData.Received(1).Fail(); targetVolatile.DidNotReceive().Add(Arg.Any