// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.Tests.Offline; using Moq; using MUnique.OpenMU.DataModel; using MUnique.OpenMU.GameLogic; using MUnique.OpenMU.GameLogic.MuHelper; using MUnique.OpenMU.GameLogic.Offline; using MUnique.OpenMU.GameServer.RemoteView.MuHelper; using MUnique.OpenMU.GameLogic.Pet; using MUnique.OpenMU.GameLogic.PlayerActions.Items; using Item = MUnique.OpenMU.Persistence.BasicModel.Item; using ItemDefinition = MUnique.OpenMU.Persistence.BasicModel.ItemDefinition; using ItemSlotType = MUnique.OpenMU.Persistence.BasicModel.ItemSlotType; /// /// Tests for . /// [TestFixture] public class PetHandlerTests { private IGameContext _gameContext = null!; /// /// Sets up a fresh game context before each test. /// [SetUp] public void SetUp() { this._gameContext = GameContextTestHelper.CreateGameContext(); } /// /// Tests that sets the correct Dark Raven behavior. /// [Test] [TestCase(1, PetBehaviour.AttackRandom)] [TestCase(2, PetBehaviour.AttackWithOwner)] public async ValueTask InitializeAsync_SetsDarkRavenBehaviorAsync(int mode, PetBehaviour expectedBehaviour) { // Arrange var player = await this.CreateOfflinePlayerAsync().ConfigureAwait(false); var petCommandManagerMock = new Mock(); var config = new MuHelperSettings { UseDarkRaven = true, DarkRavenMode = (byte)mode, }; var handler = new PetHandler(player, config, petCommandManagerMock.Object); // Act await handler.InitializeAsync().ConfigureAwait(false); // Assert petCommandManagerMock.Verify(m => m.SetBehaviourAsync(expectedBehaviour, null), Times.Once); } /// /// Tests that sets pet behavior to Idle when durability is 0. /// [Test] public async ValueTask CheckPetDurabilityAsync_SetsIdleWhenDurabilityIsZeroAsync() { // Arrange var player = await this.CreateOfflinePlayerAsync().ConfigureAwait(false); var petCommandManagerMock = new Mock(); var petItem = new Item { Definition = new ItemDefinition { ItemSlot = new ItemSlotType(), Width = 1, Height = 1, }, Durability = 0, }; await player.Inventory!.AddItemAsync(InventoryConstants.PetSlot, petItem).ConfigureAwait(false); var handler = new PetHandler(player, new MuHelperSettings(), petCommandManagerMock.Object); // Act await handler.CheckPetDurabilityAsync().ConfigureAwait(false); // Assert petCommandManagerMock.Verify(m => m.SetBehaviourAsync(PetBehaviour.Idle, null), Times.Once); } /// /// Tests that sets pet behavior to Idle. /// [Test] public async ValueTask StopAsync_SetsIdleAsync() { // Arrange var player = await this.CreateOfflinePlayerAsync().ConfigureAwait(false); var petCommandManagerMock = new Mock(); var handler = new PetHandler(player, new MuHelperSettings(), petCommandManagerMock.Object); // Act await handler.StopAsync().ConfigureAwait(false); // Assert petCommandManagerMock.Verify(m => m.SetBehaviourAsync(PetBehaviour.Idle, null), Times.Once); } private async ValueTask CreateOfflinePlayerAsync() { return await PlayerTestHelper.CreateOfflineLevelingPlayerAsync(this._gameContext).ConfigureAwait(false); } }