// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.Tests; using System.ComponentModel.DataAnnotations; using System.Runtime.InteropServices; using Microsoft.Extensions.Logging.Abstractions; using Moq; using MUnique.OpenMU.DataModel.Configuration; using MUnique.OpenMU.GameLogic; using MUnique.OpenMU.GameLogic.Views; using MUnique.OpenMU.GameServer; using MUnique.OpenMU.GameServer.RemoteView; using MUnique.OpenMU.Network; using MUnique.OpenMU.Network.PlugIns; using MUnique.OpenMU.Persistence; using MUnique.OpenMU.PlugIns; /// /// Unit tests for the . /// [TestFixture] public class ViewPlugInContainerTest { private static readonly ClientVersion Season6E3English = new(6, 3, ClientLanguage.English); private static readonly ClientVersion Season9E2English = new(9, 2, ClientLanguage.English); /// /// A test interface for our test plugin implementations. /// public interface ISomeViewPlugIn : IViewPlugIn { } /// /// Tests if the the plug in of correct version is selected when the plugin for the exact version is available. /// [Test] public void SelectPlugInOfCorrectVersionWhenExactVersionIsAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var containerForSeason6 = new ViewPlugInContainer(this.CreatePlayer(manager), Season6E3English, manager); Assert.That(containerForSeason6.GetPlugIn()!.GetType(), Is.EqualTo(typeof(Season6PlugIn))); } /// /// Tests if the the plug in of correct version is selected when only plugins for lower versions are available. /// [Test] public void SelectPlugInOfCorrectVersionWhenLowerVersionsAreAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var containerForSeason9 = new ViewPlugInContainer(this.CreatePlayer(manager), Season9E2English, manager); Assert.That(containerForSeason9.GetPlugIn()!.GetType(), Is.EqualTo(typeof(Season6PlugIn))); } /// /// Tests if plugins of the correct language are selected. /// [Test] public void SelectPlugInOfCorrectLanguage() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var containerForSeason6English = new ViewPlugInContainer(this.CreatePlayer(manager), Season6E3English, manager); Assert.That(containerForSeason6English.GetPlugIn()!.GetType(), Is.EqualTo(typeof(Season6PlugIn))); } /// /// Tests if plugins of invariant language and version are selected. /// [Test] public void SelectInvariantPlugIn() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); var containerForSeason6English = new ViewPlugInContainer(this.CreatePlayer(manager), Season6E3English, manager); Assert.That(containerForSeason6English.GetPlugIn()!.GetType(), Is.EqualTo(typeof(InvariantSeasonPlugIn))); } /// /// Tests if another plugin is getting 'effective' when the currently effective plugin gets deactivated. /// [Test] public void SelectPlugInAfterDeactivation() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var containerForSeason9 = new ViewPlugInContainer(this.CreatePlayer(manager), Season9E2English, manager); manager.DeactivatePlugIn(); Assert.That(containerForSeason9.GetPlugIn()!.GetType(), Is.EqualTo(typeof(Season1PlugIn))); } /// /// Tests if the language specific plugin has priority over the invariant one. /// [Test] public void SelectLanguageSpecificOverInvariant() { var manager = new PlugInManager(null, new NullLoggerFactory(), null, null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); var containerForSeason9 = new ViewPlugInContainer(this.CreatePlayer(manager), Season9E2English, manager); Assert.That(containerForSeason9.GetPlugIn()!.GetType(), Is.EqualTo(typeof(Season6PlugIn))); } private RemotePlayer CreatePlayer(PlugInManager plugInManager) { var gameContext = new Mock(); gameContext.Setup(c => c.PersistenceContextProvider).Returns(new Mock().Object); gameContext.Setup(c => c.Configuration).Returns(new GameConfiguration()); gameContext.Setup(c => c.PlugInManager).Returns(plugInManager); gameContext.Setup(c => c.LoggerFactory).Returns(new NullLoggerFactory()); return new RemotePlayer(gameContext.Object, new Mock().Object, default); } /// /// A plugin which is version/language invariant. /// [PlugIn] [Display(Name = "Season Invariant Test PlugIn")] [Guid("96A3FED8-0112-4CFC-A717-70EEEEBE859A")] public class InvariantSeasonPlugIn : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public InvariantSeasonPlugIn(RemotePlayer player) { } } /// /// A test plugin for season 1. /// [PlugIn] [Display(Name = "Season 1 Test PlugIn")] [Guid("8CA21647-85D5-43BB-A8F9-3543D0E02176")] [MinimumClient(1, 0, ClientLanguage.English)] public class Season1PlugIn : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public Season1PlugIn(RemotePlayer player) { } } /// /// A test plugin for season 6. /// [PlugIn] [Display(Name = "Season 6 Test PlugIn")] [Guid("7C029691-BB22-4B5D-BE96-924537E43EB2")] [MinimumClient(6, 3, ClientLanguage.English)] public class Season6PlugIn : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public Season6PlugIn(RemotePlayer player) { } } /// /// A test plugin for season 6, with invariant language. /// [PlugIn] [Display(Name = "Season 6 Test PlugIn, Invariant language")] [Guid("D58A6AC6-A804-4321-9422-0911EDC82867")] [MinimumClient(6, 3, ClientLanguage.Invariant)] public class Season6PlugInInvariant : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public Season6PlugInInvariant(RemotePlayer player) { } } /// /// A test plugin for season 6, but for another client language. /// [PlugIn] [Display(Name = "Season 6 Test PlugIn")] [Guid("05C47D9E-F0A0-48B3-9FFF-22CF43B20494")] [MinimumClient(6, 3, (ClientLanguage)42)] public class Season6PlugInOfSomeOtherLanguage : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public Season6PlugInOfSomeOtherLanguage(RemotePlayer player) { } } /// /// Test plugin for season 9. /// [PlugIn] [Display(Name = "Season 9 Test PlugIn")] [Guid("82AC1C9A-F3D0-4196-A3CD-6CB36AA2D914")] [MinimumClient(9, 2, ClientLanguage.English)] public class Season9PlugIn : ISomeViewPlugIn { /// /// Initializes a new instance of the class. /// /// The player. public Season9PlugIn(RemotePlayer player) { } } }