//
// 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;
}
}