From 0d869a0cc61b73f18727eb415a1a07f4fbecdc5a Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 3 May 2025 13:23:25 +0200 Subject: [PATCH] Update dependencies, replace Moq with NSubstitute --- PkmnLib.Dynamic/PkmnLib.Dynamic.csproj | 14 +- PkmnLib.Static/PkmnLib.Static.csproj | 16 +-- PkmnLib.Tests/Dynamic/ChoiceQueueTests.cs | 131 +++++++++--------- PkmnLib.Tests/GlobalUsings.cs | 1 + PkmnLib.Tests/PkmnLib.Tests.csproj | 15 +- .../DamageCalculatorTests.cs | 36 ++--- .../PkmnLib.Plugin.Gen7.Tests/GlobalUsings.cs | 2 +- .../PkmnLib.Plugin.Gen7.Tests.csproj | 11 +- .../Scripts/Moves/AcrobaticsTests.cs | 33 +++-- .../Scripts/Moves/HiddenPowerTests.cs | 42 +++--- .../Scripts/Moves/MultiAttackTests.cs | 29 ++-- 11 files changed, 174 insertions(+), 156 deletions(-) diff --git a/PkmnLib.Dynamic/PkmnLib.Dynamic.csproj b/PkmnLib.Dynamic/PkmnLib.Dynamic.csproj index 4a1314c..f1db35a 100644 --- a/PkmnLib.Dynamic/PkmnLib.Dynamic.csproj +++ b/PkmnLib.Dynamic/PkmnLib.Dynamic.csproj @@ -9,24 +9,24 @@ - bin\Debug\netstandard2.1\PkmnLib.Dynamic.xml + bin\Debug\netstandard2.1\PkmnLib.Dynamic.xml - bin\Release\netstandard2.1\PkmnLib.Dynamic.xml + bin\Release\netstandard2.1\PkmnLib.Dynamic.xml - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + diff --git a/PkmnLib.Static/PkmnLib.Static.csproj b/PkmnLib.Static/PkmnLib.Static.csproj index c6a93fa..50a19a3 100644 --- a/PkmnLib.Static/PkmnLib.Static.csproj +++ b/PkmnLib.Static/PkmnLib.Static.csproj @@ -9,20 +9,20 @@ - bin\Debug\netstandard2.1\PkmnLib.Static.xml + bin\Debug\netstandard2.1\PkmnLib.Static.xml - bin\Release\netstandard2.1\PkmnLib.Static.xml + bin\Release\netstandard2.1\PkmnLib.Static.xml - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/PkmnLib.Tests/Dynamic/ChoiceQueueTests.cs b/PkmnLib.Tests/Dynamic/ChoiceQueueTests.cs index 79bab6f..c57acfb 100644 --- a/PkmnLib.Tests/Dynamic/ChoiceQueueTests.cs +++ b/PkmnLib.Tests/Dynamic/ChoiceQueueTests.cs @@ -1,4 +1,3 @@ -using Moq; using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.Models.Choices; @@ -9,99 +8,99 @@ public class ChoiceQueueTests [Test] public async Task ChoiceQueue_MovePokemonChoiceNext() { - var pokemon1 = new Mock(); - var pokemon2 = new Mock(); - var pokemon3 = new Mock(); - var pokemon4 = new Mock(); + var pokemon1 = Substitute.For(); + var pokemon2 = Substitute.For(); + var pokemon3 = Substitute.For(); + var pokemon4 = Substitute.For(); - var choice1 = new Mock(); - choice1.Setup(c => c.User).Returns(pokemon1.Object); - var choice2 = new Mock(); - choice2.Setup(c => c.User).Returns(pokemon2.Object); - var choice3 = new Mock(); - choice3.Setup(c => c.User).Returns(pokemon3.Object); - var choice4 = new Mock(); - choice4.Setup(c => c.User).Returns(pokemon4.Object); + var choice1 = Substitute.For(); + choice1.User.Returns(pokemon1); + var choice2 = Substitute.For(); + choice2.User.Returns(pokemon2); + var choice3 = Substitute.For(); + choice3.User.Returns(pokemon3); + var choice4 = Substitute.For(); + choice4.User.Returns(pokemon4); - var queue = new BattleChoiceQueue([choice1.Object, choice2.Object, choice3.Object, choice4.Object]); - var result = queue.MovePokemonChoiceNext(pokemon3.Object); + var queue = new BattleChoiceQueue([choice1, choice2, choice3, choice4]); + var result = queue.MovePokemonChoiceNext(pokemon3); await Assert.That(result).IsTrue(); - await Assert.That(queue.Dequeue()).IsEqualTo(choice3.Object); + await Assert.That(queue.Dequeue()).IsEqualTo(choice3); } [Test] public async Task ChoiceQueue_MovePokemonChoiceNextFailsIfAlreadyExecuted() { - var pokemon1 = new Mock(); - var pokemon2 = new Mock(); - var pokemon3 = new Mock(); - var pokemon4 = new Mock(); + var pokemon1 = Substitute.For(); + var pokemon2 = Substitute.For(); + var pokemon3 = Substitute.For(); + var pokemon4 = Substitute.For(); - var choice1 = new Mock(); - choice1.Setup(c => c.User).Returns(pokemon1.Object); - var choice2 = new Mock(); - choice2.Setup(c => c.User).Returns(pokemon2.Object); - var choice3 = new Mock(); - choice3.Setup(c => c.User).Returns(pokemon3.Object); - var choice4 = new Mock(); - choice4.Setup(c => c.User).Returns(pokemon4.Object); + var choice1 = Substitute.For(); + choice1.User.Returns(pokemon1); + var choice2 = Substitute.For(); + choice2.User.Returns(pokemon2); + var choice3 = Substitute.For(); + choice3.User.Returns(pokemon3); + var choice4 = Substitute.For(); + choice4.User.Returns(pokemon4); - var queue = new BattleChoiceQueue([choice1.Object, choice2.Object, choice3.Object, choice4.Object]); + var queue = new BattleChoiceQueue([choice1, choice2, choice3, choice4]); queue.Dequeue(); - var result = queue.MovePokemonChoiceNext(pokemon1.Object); + var result = queue.MovePokemonChoiceNext(pokemon1); await Assert.That(result).IsFalse(); - await Assert.That(queue.Dequeue()).IsEqualTo(choice2.Object); + await Assert.That(queue.Dequeue()).IsEqualTo(choice2); } [Test] public async Task ChoiceQueue_MovePokemonChoiceLast() { - var pokemon1 = new Mock(); - var pokemon2 = new Mock(); - var pokemon3 = new Mock(); - var pokemon4 = new Mock(); + var pokemon1 = Substitute.For(); + var pokemon2 = Substitute.For(); + var pokemon3 = Substitute.For(); + var pokemon4 = Substitute.For(); - var choice1 = new Mock(); - choice1.Setup(c => c.User).Returns(pokemon1.Object); - var choice2 = new Mock(); - choice2.Setup(c => c.User).Returns(pokemon2.Object); - var choice3 = new Mock(); - choice3.Setup(c => c.User).Returns(pokemon3.Object); - var choice4 = new Mock(); - choice4.Setup(c => c.User).Returns(pokemon4.Object); + var choice1 = Substitute.For(); + choice1.User.Returns(pokemon1); + var choice2 = Substitute.For(); + choice2.User.Returns(pokemon2); + var choice3 = Substitute.For(); + choice3.User.Returns(pokemon3); + var choice4 = Substitute.For(); + choice4.User.Returns(pokemon4); - var queue = new BattleChoiceQueue([choice1.Object, choice2.Object, choice3.Object, choice4.Object]); - var result = queue.MovePokemonChoiceLast(pokemon2.Object); + var queue = new BattleChoiceQueue([choice1, choice2, choice3, choice4]); + var result = queue.MovePokemonChoiceLast(pokemon2); await Assert.That(result).IsTrue(); - await Assert.That(queue.Dequeue()).IsEqualTo(choice1.Object); - await Assert.That(queue.Dequeue()).IsEqualTo(choice3.Object); - await Assert.That(queue.Dequeue()).IsEqualTo(choice4.Object); - await Assert.That(queue.Dequeue()).IsEqualTo(choice2.Object); + await Assert.That(queue.Dequeue()).IsEqualTo(choice1); + await Assert.That(queue.Dequeue()).IsEqualTo(choice3); + await Assert.That(queue.Dequeue()).IsEqualTo(choice4); + await Assert.That(queue.Dequeue()).IsEqualTo(choice2); } [Test] public async Task ChoiceQueue_MovePokemonChoiceLastFailsIfAlreadyExecuted() { - var pokemon1 = new Mock(); - var pokemon2 = new Mock(); - var pokemon3 = new Mock(); - var pokemon4 = new Mock(); + var pokemon1 = Substitute.For(); + var pokemon2 = Substitute.For(); + var pokemon3 = Substitute.For(); + var pokemon4 = Substitute.For(); - var choice1 = new Mock(); - choice1.Setup(c => c.User).Returns(pokemon1.Object); - var choice2 = new Mock(); - choice2.Setup(c => c.User).Returns(pokemon2.Object); - var choice3 = new Mock(); - choice3.Setup(c => c.User).Returns(pokemon3.Object); - var choice4 = new Mock(); - choice4.Setup(c => c.User).Returns(pokemon4.Object); + var choice1 = Substitute.For(); + choice1.User.Returns(pokemon1); + var choice2 = Substitute.For(); + choice2.User.Returns(pokemon2); + var choice3 = Substitute.For(); + choice3.User.Returns(pokemon3); + var choice4 = Substitute.For(); + choice4.User.Returns(pokemon4); - var queue = new BattleChoiceQueue([choice1.Object, choice2.Object, choice3.Object, choice4.Object]); + var queue = new BattleChoiceQueue([choice1, choice2, choice3, choice4]); queue.Dequeue(); - var result = queue.MovePokemonChoiceLast(pokemon1.Object); + var result = queue.MovePokemonChoiceLast(pokemon1); await Assert.That(result).IsFalse(); - await Assert.That(queue.Dequeue()).IsEqualTo(choice2.Object); - await Assert.That(queue.Dequeue()).IsEqualTo(choice3.Object); - await Assert.That(queue.Dequeue()).IsEqualTo(choice4.Object); + await Assert.That(queue.Dequeue()).IsEqualTo(choice2); + await Assert.That(queue.Dequeue()).IsEqualTo(choice3); + await Assert.That(queue.Dequeue()).IsEqualTo(choice4); } } \ No newline at end of file diff --git a/PkmnLib.Tests/GlobalUsings.cs b/PkmnLib.Tests/GlobalUsings.cs index 49e2b77..2a4d0c9 100644 --- a/PkmnLib.Tests/GlobalUsings.cs +++ b/PkmnLib.Tests/GlobalUsings.cs @@ -1,3 +1,4 @@ global using TUnit; +global using NSubstitute; global using FluentAssertions; global using LevelInt = byte; \ No newline at end of file diff --git a/PkmnLib.Tests/PkmnLib.Tests.csproj b/PkmnLib.Tests/PkmnLib.Tests.csproj index c9ed51a..c9b0f25 100644 --- a/PkmnLib.Tests/PkmnLib.Tests.csproj +++ b/PkmnLib.Tests/PkmnLib.Tests.csproj @@ -10,12 +10,19 @@ - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/DamageCalculatorTests.cs b/Plugins/PkmnLib.Plugin.Gen7.Tests/DamageCalculatorTests.cs index cd3ae46..227fc4c 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/DamageCalculatorTests.cs +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/DamageCalculatorTests.cs @@ -23,37 +23,37 @@ public class DamageCalculatorTests [Test] public async Task BulbapediaExampleDamageTest() { - var attacker = new Mock(); + var attacker = Substitute.For(); // Imagine a level 75 Glaceon - attacker.Setup(x => x.Level).Returns(75); + attacker.Level.Returns((byte)75); // with an effective Attack stat of 123 - attacker.Setup(x => x.BoostedStats).Returns(new StatisticSet(1, 123, 1, 1, 1, 1)); + attacker.BoostedStats.Returns(new StatisticSet(1, 123, 1, 1, 1, 1)); // We use 10 as the Ice type - attacker.Setup(x => x.Types).Returns([new TypeIdentifier(10, "ice")]); + attacker.Types.Returns([new TypeIdentifier(10, "ice")]); - var defender = new Mock(); + var defender = Substitute.For(); // a Garchomp with an effective Defense stat of 163 - defender.Setup(x => x.BoostedStats).Returns(new StatisticSet(1, 1, 163, 1, 1, 1)); - defender.Setup(x => x.GetScripts()).Returns(new ScriptIterator([])); + defender.BoostedStats.Returns(new StatisticSet(1, 1, 163, 1, 1, 1)); + defender.GetScripts().Returns(new ScriptIterator([])); - var useMove = new Mock(); + var useMove = Substitute.For(); // Ice Fang (an Ice-type physical move with a power of 65) - useMove.Setup(x => x.Category).Returns(MoveCategory.Physical); + useMove.Category.Returns(MoveCategory.Physical); var damageCalculator = new Gen7DamageCalculator(false); - var executingMove = new Mock(); - executingMove.Setup(x => x.UseMove).Returns(useMove.Object); - executingMove.Setup(x => x.User).Returns(attacker.Object); - executingMove.Setup(x => x.GetScripts()).Returns(new ScriptIterator([])); + var executingMove = Substitute.For(); + executingMove.UseMove.Returns(useMove); + executingMove.User.Returns(attacker); + executingMove.GetScripts().Returns(new ScriptIterator([])); - var hit = new Mock(); + var hit = Substitute.For(); // Ice Fang (an Ice-type physical move with a power of 65) - hit.Setup(x => x.BasePower).Returns(65); - hit.Setup(x => x.Type).Returns(new TypeIdentifier(10, "ice")); + hit.BasePower.Returns((byte)65); + hit.Type.Returns(new TypeIdentifier(10, "ice")); // has a double weakness to the move's Ice type - hit.Setup(x => x.Effectiveness).Returns(4.0f); + hit.Effectiveness.Returns(4.0f); - var damage = damageCalculator.GetDamage(executingMove.Object, defender.Object, 0, hit.Object); + var damage = damageCalculator.GetDamage(executingMove, defender, 0, hit); // That means Ice Fang will do between 168 and 196 HP damage, depending on luck. // Note that we are testing deterministic damage, so we expect the maximum damage. await Assert.That(damage).IsEqualTo((uint)196); diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/GlobalUsings.cs b/Plugins/PkmnLib.Plugin.Gen7.Tests/GlobalUsings.cs index 4d610bb..31ffff2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/GlobalUsings.cs +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/GlobalUsings.cs @@ -1,2 +1,2 @@ global using TUnit; -global using Moq; \ No newline at end of file +global using NSubstitute; \ No newline at end of file diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/PkmnLib.Plugin.Gen7.Tests.csproj b/Plugins/PkmnLib.Plugin.Gen7.Tests/PkmnLib.Plugin.Gen7.Tests.csproj index a45e414..ad77062 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/PkmnLib.Plugin.Gen7.Tests.csproj +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/PkmnLib.Plugin.Gen7.Tests.csproj @@ -10,8 +10,15 @@ - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/AcrobaticsTests.cs b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/AcrobaticsTests.cs index 7df19e3..2529729 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/AcrobaticsTests.cs +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/AcrobaticsTests.cs @@ -10,15 +10,16 @@ public class AcrobaticsTests public async Task ChangeBasePower_UserNotHoldingItem_BasePowerDoubles() { // Arrange - var move = new Mock(); - var target = new Mock(); + var move = Substitute.For(); + var target = Substitute.For(); byte basePower = 10; - move.Setup(m => m.User).Returns(new Mock().Object); - move.Setup(m => m.User.HeldItem).Returns((IItem?)null); + var user = Substitute.For(); + user.HeldItem.Returns((IItem?)null); + move.User.Returns(user); var acrobatics = new Acrobatics(); // Act - acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower); + acrobatics.ChangeBasePower(move, target, 0, ref basePower); // Assert await Assert.That(basePower).IsEqualTo((byte)20); @@ -28,15 +29,16 @@ public class AcrobaticsTests public async Task ChangeBasePower_UserHoldingItem_BasePowerUnchanged() { // Arrange - var move = new Mock(); - var target = new Mock(); + var move = Substitute.For(); + var target = Substitute.For(); byte basePower = 10; - move.Setup(m => m.User).Returns(new Mock().Object); - move.Setup(m => m.User.HeldItem).Returns(new Mock().Object); + var user = Substitute.For(); + user.HeldItem.Returns(Substitute.For()); + move.User.Returns(user); var acrobatics = new Acrobatics(); // Act - acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower); + acrobatics.ChangeBasePower(move, target, 0, ref basePower); // Assert await Assert.That(basePower).IsEqualTo((byte)10); @@ -46,15 +48,16 @@ public class AcrobaticsTests public async Task ChangeBasePower_UserNotHoldingItem_NoOverflow() { // Arrange - var move = new Mock(); - var target = new Mock(); + var move = Substitute.For(); + var target = Substitute.For(); byte basePower = 200; - move.Setup(m => m.User).Returns(new Mock().Object); - move.Setup(m => m.User.HeldItem).Returns((IItem?)null); + var user = Substitute.For(); + move.User.Returns(user); + user.HeldItem.Returns((IItem?)null); var acrobatics = new Acrobatics(); // Act - acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower); + acrobatics.ChangeBasePower(move, target, 0, ref basePower); // Assert await Assert.That(basePower).IsEqualTo(byte.MaxValue); diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HiddenPowerTests.cs b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HiddenPowerTests.cs index 4758c46..b9c9e51 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HiddenPowerTests.cs +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HiddenPowerTests.cs @@ -47,22 +47,22 @@ public class HiddenPowerTests typeLibrary.RegisterType("dark"); typeLibrary.RegisterType("fairy"); - var executingMove = new Mock(MockBehavior.Strict); - var user = new Mock(MockBehavior.Strict); - var target = new Mock(MockBehavior.Strict); - var dynamicLibrary = new Mock(MockBehavior.Strict); - var staticLibrary = new Mock(MockBehavior.Strict); + var executingMove = Substitute.For(); + var user = Substitute.For(); + var target = Substitute.For(); + var dynamicLibrary = Substitute.For(); + var staticLibrary = Substitute.For(); - executingMove.SetupGet(x => x.User).Returns(user.Object); - user.SetupGet(x => x.IndividualValues).Returns(test.Ivs); - user.SetupGet(x => x.Library).Returns(dynamicLibrary.Object); - staticLibrary.Setup(x => x.Types).Returns(typeLibrary); - dynamicLibrary.Setup(x => x.StaticLibrary).Returns(staticLibrary.Object); + executingMove.User.Returns(user); + user.IndividualValues.Returns(test.Ivs); + user.Library.Returns(dynamicLibrary); + staticLibrary.Types.Returns(typeLibrary); + dynamicLibrary.StaticLibrary.Returns(staticLibrary); TypeIdentifier? moveType = new TypeIdentifier(1, "normal"); var hiddenPower = new HiddenPower(); - hiddenPower.ChangeMoveType(executingMove.Object, target.Object, 0, ref moveType); + hiddenPower.ChangeMoveType(executingMove, target, 0, ref moveType); await Assert.That(moveType!.Value.Name).IsEqualTo(test.ExpectedType); } @@ -70,20 +70,20 @@ public class HiddenPowerTests [Test, MethodDataSource(nameof(HiddenPowerTestData))] public async Task HiddenPower_ChangesBasePower(TestCaseData test) { - var executingMove = new Mock(MockBehavior.Strict); - var user = new Mock(MockBehavior.Strict); - var target = new Mock(MockBehavior.Strict); - var dynamicLibrary = new Mock(MockBehavior.Strict); - var staticLibrary = new Mock(MockBehavior.Strict); + var executingMove = Substitute.For(); + var user = Substitute.For(); + var target = Substitute.For(); + var dynamicLibrary = Substitute.For(); + var staticLibrary = Substitute.For(); - executingMove.SetupGet(x => x.User).Returns(user.Object); - user.SetupGet(x => x.IndividualValues).Returns(test.Ivs); - user.SetupGet(x => x.Library).Returns(dynamicLibrary.Object); - dynamicLibrary.Setup(x => x.StaticLibrary).Returns(staticLibrary.Object); + executingMove.User.Returns(user); + user.IndividualValues.Returns(test.Ivs); + user.Library.Returns(dynamicLibrary); + dynamicLibrary.StaticLibrary.Returns(staticLibrary); var hiddenPower = new HiddenPower(); byte power = 0; - hiddenPower.ChangeBasePower(executingMove.Object, target.Object, 0, ref power); + hiddenPower.ChangeBasePower(executingMove, target, 0, ref power); await Assert.That(power).IsEqualTo(test.ExpectedPower); } diff --git a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MultiAttackTests.cs b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MultiAttackTests.cs index d5a37c9..dfdcc46 100644 --- a/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MultiAttackTests.cs +++ b/Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MultiAttackTests.cs @@ -3,6 +3,7 @@ using PkmnLib.Dynamic.Models; using PkmnLib.Plugin.Gen7.Scripts.Moves; using PkmnLib.Static; using PkmnLib.Static.Libraries; +using PkmnLib.Static.Utils; namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves; @@ -60,28 +61,28 @@ public class MultiAttackTests typeLibrary.RegisterType("fairy"); // Arrange - var move = new Mock(); - var target = new Mock(); - var user = new Mock(); + var move = Substitute.For(); + var target = Substitute.For(); + var user = Substitute.For(); TypeIdentifier? typeIdentifier = new TypeIdentifier(1, "Normal"); - var dynamicLibrary = new Mock(); - var staticLibrary = new Mock(); - var item = new Mock(); + var dynamicLibrary = Substitute.For(); + var staticLibrary = Substitute.For(); + var item = Substitute.For(); - user.Setup(u => u.Library).Returns(dynamicLibrary.Object); - dynamicLibrary.Setup(d => d.StaticLibrary).Returns(staticLibrary.Object); - staticLibrary.Setup(s => s.Types).Returns(typeLibrary); - item.Setup(i => i.Name).Returns(test.ItemName!); - move.Setup(m => m.User).Returns(user.Object); + user.Library.Returns(dynamicLibrary); + dynamicLibrary.StaticLibrary.Returns(staticLibrary); + staticLibrary.Types.Returns(typeLibrary); + item.Name.Returns((StringKey)test.ItemName!); + move.User.Returns(user); if (test.ItemName != null) - move.Setup(m => m.User.HeldItem).Returns(item.Object); + user.HeldItem.Returns(item); else - move.Setup(m => m.User.HeldItem).Returns((IItem?)null); + user.HeldItem.Returns((IItem?)null); var multiAttack = new MultiAttack(); // Act - multiAttack.ChangeMoveType(move.Object, target.Object, 0, ref typeIdentifier); + multiAttack.ChangeMoveType(move, target, 0, ref typeIdentifier); // Assert await Assert.That(typeIdentifier!.Value.Name).IsEqualTo(test.ExpectedTypeName);