using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.ScriptHandling; using PkmnLib.Dynamic.ScriptHandling.Registry; using PkmnLib.Plugin.Gen7.Scripts.Battle; using PkmnLib.Plugin.Gen7.Scripts.Moves; using PkmnLib.Static; namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves; /// /// Tests for the move script and its battle volatile. /// Gen VII Bulbapedia behavior (Generation VI base text): "For the remainder of the current turn, Ion Deluge /// causes all Normal-type moves to become Electric-type instead, including status moves." (The Gen VII /// section only describes a version 1.0 glitch of Ultra Sun/Ultra Moon, which is not intended behavior.) /// public class IonDelugeTests { /// /// Bulbapedia: "Ion Deluge causes all Normal-type moves to become Electric-type" — the effect applies to /// the whole field, so using the move adds the to the battle's volatile /// scripts. /// [Test] public async Task OnSecondaryEffect_Used_AddsIonDelugeEffectToBattle() { // Arrange var script = new IonDeluge(); var move = Substitute.For(); var user = Substitute.For(); move.User.Returns(user); var battle = Substitute.For(); battle.GetScripts().Returns(_ => new ScriptIterator(new List>())); var battleVolatile = new ScriptSet(battle); battle.Volatile.Returns(battleVolatile); user.Battle.Returns(battle); var target = Substitute.For(); // Act script.OnSecondaryEffect(move, target, 0); // Assert await Assert.That(battleVolatile.Get()).IsNotNull(); } /// /// Bulbapedia: "Ion Deluge causes all Normal-type moves to become Electric-type instead, including /// status moves." /// [Test] public async Task ChangeMoveType_NormalTypeMove_BecomesElectric() { // Arrange var effect = new IonDelugeEffect(); var move = Substitute.For(); var target = Substitute.For(); var library = LibraryHelpers.LoadLibrary(); target.Library.Returns(library); var types = library.StaticLibrary.Types; await Assert.That(types.TryGetTypeIdentifier("normal", out var normal)).IsTrue(); await Assert.That(types.TryGetTypeIdentifier("electric", out var electric)).IsTrue(); TypeIdentifier? moveType = normal; // Act effect.ChangeMoveType(move, target, 0, ref moveType); // Assert await Assert.That(moveType.HasValue).IsTrue(); await Assert.That(moveType!.Value).IsEqualTo(electric); } /// /// Bulbapedia: only "Normal-type moves" are converted; a move of any other type keeps its type. /// [Test] public async Task ChangeMoveType_NonNormalTypeMove_TypeUnchanged() { // Arrange var effect = new IonDelugeEffect(); var move = Substitute.For(); var target = Substitute.For(); var library = LibraryHelpers.LoadLibrary(); target.Library.Returns(library); var types = library.StaticLibrary.Types; await Assert.That(types.TryGetTypeIdentifier("water", out var water)).IsTrue(); TypeIdentifier? moveType = water; // Act effect.ChangeMoveType(move, target, 0, ref moveType); // Assert await Assert.That(moveType.HasValue).IsTrue(); await Assert.That(moveType!.Value).IsEqualTo(water); } /// /// Technical test: a move without a resolved type is left alone. /// [Test] public async Task ChangeMoveType_NullMoveType_TypeUnchanged() { // Arrange var effect = new IonDelugeEffect(); var move = Substitute.For(); var target = Substitute.For(); TypeIdentifier? moveType = null; // Act effect.ChangeMoveType(move, target, 0, ref moveType); // Assert await Assert.That(moveType).IsNull(); } /// /// Bulbapedia: the type conversion lasts "for the remainder of the current turn" — at the end of the /// turn the effect must remove itself from the battle. /// [Test] public async Task OnEndTurn_TurnEnds_EffectRemovesItself() { // Arrange var effect = new IonDelugeEffect(); var battle = Substitute.For(); battle.GetScripts().Returns(_ => new ScriptIterator(new List>())); var battleVolatile = new ScriptSet(battle); battle.Volatile.Returns(battleVolatile); battleVolatile.Add(effect); // Act - run the end-of-turn hook, if the effect has one at all if (effect is IScriptOnEndTurn onEndTurn) onEndTurn.OnEndTurn(battle, battle); // Assert await Assert.That(battleVolatile.Contains(ScriptUtils.ResolveName())).IsFalse(); } }