// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.PlugIns.Tests; using System.ComponentModel.Design; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using MUnique.OpenMU.Tests; /// /// Tests for the . /// [TestFixture] public class PlugInManagerTest { /// /// Tests if registering a plugin type creates a proxy for it. /// [Test] public void RegisteringPlugInCreatesProxy() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); var point = manager.GetPlugInPoint(); Assert.That(point, Is.InstanceOf()); Assert.That(point, Is.InstanceOf>()); } /// /// Tests if registered plugins are active by default. /// [Test] public async ValueTask RegisteredPlugInsActiveByDefaultAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.True); } /// /// Tests if plugins can be deactivated and are not executed if they are. /// [Test] public async ValueTask DeactivatingPlugInsAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); manager.DeactivatePlugIn(); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.False); } /// /// Tests if deactivating a deactivated plugin doesn't cause issues. /// [Test] public async ValueTask DeactivatingDeactivatedPlugInAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); manager.DeactivatePlugIn(); manager.DeactivatePlugIn(); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.False); } /// /// Tests if activating an activated plugin doesn't cause issues. /// [Test] public async ValueTask ActivatingActivatedPlugInAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); manager.ActivatePlugIn(); manager.ActivatePlugIn(); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.True); } /// /// Tests if deactivating a plugin doesn't affect another plugin. /// [Test] public async ValueTask DeactivatingOnePlugInDoesntAffectOthersAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); manager.RegisterPlugIn(); manager.DeactivatePlugIn(); manager.ActivatePlugIn(); manager.DeactivatePlugIn(); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.True); } /// /// Tests if the plugins are in the correct active-state if they got created with a . /// /// If set to true, the is configured to be active. [TestCase(true)] [TestCase(false)] public async ValueTask CreatedAndActiveByConfigurationAsync(bool active) { var configuration = new PlugInConfiguration { TypeId = typeof(ExamplePlugIn).GUID, IsActive = active, }; var manager = new PlugInManager(new List { configuration }, new NullLoggerFactory(), this.CreateServiceProvider(), null); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(args.WasExecuted, Is.EqualTo(active)); } /// /// Tests if a custom plugin in a non-existing assembly is not created and throws no errors. /// [Test] public void CustomPlugInByExternalAssemblyNotFoundDoesntThrowError() { var configuration = new PlugInConfiguration { TypeId = new Guid("D88B1ACA-42B7-4A89-B3E0-3C97AA4C8578"), IsActive = true, ExternalAssemblyName = "DoesNotExist.dll", }; _ = new PlugInManager(new List { configuration }, new NullLoggerFactory(), this.CreateServiceProvider(), null); } /// /// Tests if an unknown plugin in the configuration doesn't cause exceptions. /// [Test] public void UnknownPlugInByConfigurationDoesntThrowError() { var configuration = new PlugInConfiguration { TypeId = new Guid("A9BDA3E2-4EB6-45C3-B234-37C1819C0CB6"), IsActive = true, }; _ = new PlugInManager(new List { configuration }, new NullLoggerFactory(), this.CreateServiceProvider(), null); } /// /// Tests if activating an unknown plugin doesn't cause exceptions. /// [Test] public void ActivatingUnknownPlugInDoesNotThrowError() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.ActivatePlugIn(new Guid("4C38A813-F9BF-428A-8EA1-A6C90A87E583")); } /// /// Tests if deactivating an unknown plugin doesn't cause exceptions. /// [Test] public void DeactivatingUnknownPlugInDoesNotThrowError() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.ActivatePlugIn(new Guid("4C38A813-F9BF-428A-8EA1-A6C90A87E583")); } /// /// Tests if plugins can be activated and are executed if they are. /// [Test] public async ValueTask ActivatingPlugInsAsync() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var plugIn = new ExamplePlugIn(); manager.RegisterPlugInAtPlugInPoint(plugIn); manager.DeactivatePlugIn(); manager.ActivatePlugIn(); var player = await PlayerTestHelper.CreatePlayerAsync().ConfigureAwait(false); var command = "test"; var args = new MyEventArgs(); var point = manager.GetPlugInPoint(); point!.DoStuff(player, command, args); Assert.That(plugIn.WasExecuted, Is.True); } /// /// Tests the automatic discovery of plugins of the loaded assemblies. /// [Test] public void AutoDiscovery() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.DiscoverAndRegisterPlugIns(); var examplePlugInPoint = manager.GetPlugInPoint(); Assert.That(examplePlugInPoint, Is.InstanceOf()); } /// /// Tests if registering a plug in without a unique identifier throws an error. /// [Test] public void RegisteringPlugInWithoutGuidThrowsError() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); Assert.Throws(() => manager.RegisterPlugIn()); } /// /// Tests if the strategy provider is created for registered strategy plug in. /// [Test] public void StrategyProviderCreatedForRegisteredStrategyPlugIn() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); var strategyProvider = manager.GetStrategyProvider(); Assert.That(strategyProvider, Is.Not.Null); } /// /// Tests if the strategy provider is not created when there is no registered strategy plug in yet. /// [Test] public void StrategyProviderNotCreatedWithoutRegisteredStrategyPlugIn() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); var strategyProvider = manager.GetStrategyProvider(); Assert.That(strategyProvider, Is.Null); } /// /// Tests if the registered strategy plug in is available. /// [Test] public void RegisteredStrategyPlugInAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); var strategy = manager.GetStrategy(ExampleStrategyPlugIn.CommandKey); Assert.That(strategy, Is.Not.Null); Assert.That(strategy, Is.TypeOf()); } /// /// Tests if the registered, but deactivated strategy plug in is not available. /// [Test] public void DeactivatedStrategyPlugInNotAvailable() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); manager.DeactivatePlugIn(); var strategy = manager.GetStrategy(ExampleStrategyPlugIn.CommandKey); Assert.That(strategy, Is.Null); } /// /// Tests if registering an already registered strategy plug in does not throw an error. /// [Test] public void RegisteringRegisteredStrategyPlugInDoesntThrowError() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); manager.RegisterPlugIn(); } /// /// Tests if no plug in point is created and returned for strategy plug ins. /// [Test] public void NoPlugInPointForStrategyPlugIn() { var manager = new PlugInManager(null, new NullLoggerFactory(), this.CreateServiceProvider(), null); manager.RegisterPlugIn(); Assert.That(manager.GetPlugInPoint(), Is.Null); } private IServiceProvider CreateServiceProvider() { var provider = new ServiceContainer(); provider.AddService(typeof(ILoggerFactory), new NullLoggerFactory()); return provider; } }