using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.ScriptHandling; using PkmnLib.Dynamic.ScriptHandling.Registry; using PkmnLib.Plugin.Gen7.Scripts.Moves; using PkmnLib.Plugin.Gen7.Scripts.Pokemon; using PkmnLib.Static; namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves; /// /// Tests for the move script and its . /// Gen VII Bulbapedia behavior: "For five turns, the target's held item has its effects negated and its /// Trainer cannot use items from the Bag on it." /// public class EmbargoTests { /// /// Creates a target Pokémon whose volatile scripts are a real . /// private static (IPokemon target, IScriptSet targetVolatile) CreateTarget() { var target = Substitute.For(); target.GetScripts().Returns(_ => new ScriptIterator(Array.Empty>())); IScriptSet targetVolatile = new ScriptSet(target); target.Volatile.Returns(targetVolatile); return (target, targetVolatile); } /// /// Bulbapedia: "For five turns, the target's held item has its effects negated" — using the move /// attaches the to the target. /// [Test] public async Task OnSecondaryEffect_AddsEmbargoEffectToTarget() { // Arrange var script = new Embargo(); var move = Substitute.For(); var (target, targetVolatile) = CreateTarget(); // Act script.OnSecondaryEffect(move, target, 0); // Assert await Assert.That(targetVolatile.Contains(ScriptUtils.ResolveName())).IsTrue(); } /// /// Bulbapedia: the target's "Trainer cannot use items from the Bag on it" and its held item is /// negated — the effect prevents held item consumption. /// [Test] public async Task PreventHeldItemConsume_EffectActive_ConsumptionPrevented() { // Arrange var effect = new EmbargoEffect(); var prevented = false; // Act effect.PreventHeldItemConsume(Substitute.For(), Substitute.For(), ref prevented); // Assert await Assert.That(prevented).IsTrue(); } /// /// Bulbapedia: the effect lasts "for five turns" — after four end-of-turn ticks it is still active. /// [Test] public async Task OnEndTurn_FourTurnsPassed_EffectStillActive() { // Arrange var (target, targetVolatile) = CreateTarget(); var effect = new EmbargoEffect(); targetVolatile.Add(effect); // Act for (var i = 0; i < 4; i++) effect.OnEndTurn(target, Substitute.For()); // Assert await Assert.That(targetVolatile.Contains(ScriptUtils.ResolveName())).IsTrue(); } /// /// Bulbapedia: the effect lasts "for five turns" — after the fifth end-of-turn tick it removes itself. /// [Test] public async Task OnEndTurn_FiveTurnsPassed_EffectRemovesItself() { // Arrange var (target, targetVolatile) = CreateTarget(); var effect = new EmbargoEffect(); targetVolatile.Add(effect); // Act for (var i = 0; i < 5; i++) effect.OnEndTurn(target, Substitute.For()); // Assert await Assert.That(targetVolatile.Contains(ScriptUtils.ResolveName())).IsFalse(); } /// /// Bulbapedia: "For five turns" — using Embargo again on an already affected target restarts the /// five turn duration (the effect stacks by resetting its counter). /// [Test] public async Task Stack_UsedAgain_DurationResetsToFiveTurns() { // Arrange var (target, targetVolatile) = CreateTarget(); var effect = new EmbargoEffect(); targetVolatile.Add(effect); for (var i = 0; i < 3; i++) effect.OnEndTurn(target, Substitute.For()); // Act - Embargo is used again, restarting the duration effect.Stack(); for (var i = 0; i < 4; i++) effect.OnEndTurn(target, Substitute.For()); // Assert - only four of the renewed five turns have passed await Assert.That(targetVolatile.Contains(ScriptUtils.ResolveName())).IsTrue(); } }