From 39a45a286cb8dff10bff677b0c285db75a0f659f Mon Sep 17 00:00:00 2001 From: Mikael Koskinen Date: Wed, 30 Dec 2020 10:52:32 +0200 Subject: [PATCH] Added functionality for configuring default naming options for different catalogs. Breaking change: Added NugetFeedPluginCatalogOptions and changed NugetFeedPluginCatalog to use the options class instead of NugetPluginCatalogOptions. --- .../NugetFeedPluginCatalog.cs | 8 +- .../NugetFeedPluginCatalogOptions.cs | 36 ++++++++ .../NugetPackagePluginCatalog.cs | 2 +- .../NugetPluginCatalogOptions.cs | 8 ++ ...ikio.PluginFramework.Catalogs.NuGet.csproj | 2 +- .../Catalogs/AssemblyPluginCatalogOptions.cs | 9 +- .../Catalogs/CompositePluginCatalog.cs | 1 - .../Catalogs/FolderPluginCatalogOptions.cs | 7 +- .../Catalogs/TypePluginCatalogOptions.cs | 7 +- .../NugetFeedPluginCatalogTests.cs | 47 +++++++++++ .../NugetPackagePluginCatalogTests.cs | 49 ++++++++++- .../AssemblyPluginCatalogTests.cs | 57 +++++++++++++ .../FolderCatalogTests.cs | 82 ++++++++++++++++--- .../Weikio.PluginFramework.Tests/TagTests.cs | 13 +++ .../TypePluginCatalogTests.cs | 61 ++++++++++++++ 15 files changed, 363 insertions(+), 26 deletions(-) create mode 100644 src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs diff --git a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs index 3c2a261..01f93f9 100644 --- a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs +++ b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs @@ -21,13 +21,13 @@ public class NugetFeedPluginCatalog : IPluginCatalog private readonly HashSet _pluginAssemblyNames = new HashSet(); private List _pluginCatalogs = new List(); - private readonly NugetPluginCatalogOptions _options; + private readonly NugetFeedPluginCatalogOptions _options; public string PackagesFolder { get; } public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm = null, bool includePrereleases = false, int maxPackages = 128, - string packagesFolder = null, Action configureFinder = null, Dictionary criterias = null, NugetPluginCatalogOptions options = null) + string packagesFolder = null, Action configureFinder = null, Dictionary criterias = null, NugetFeedPluginCatalogOptions options = null) { _packageFeed = packageFeed; _searchTerm = searchTerm; @@ -46,7 +46,7 @@ public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm = null, criterias = new Dictionary(); } - _options = options ?? new NugetPluginCatalogOptions(); + _options = options ?? new NugetFeedPluginCatalogOptions(); if (configureFinder != null) { @@ -93,7 +93,7 @@ public async Task Initialize() foreach (var packageAndRepo in packages) { - var options = new NugetPluginCatalogOptions() { TypeFinderOptions = _options.TypeFinderOptions }; + var options = new NugetPluginCatalogOptions() { TypeFinderOptions = _options.TypeFinderOptions, PluginNameOptions = _options.PluginNameOptions}; var packageCatalog = new NugetPackagePluginCatalog(packageAndRepo.Package.Identity.Id, packageAndRepo.Package.Identity.Version.ToString(), _includePrereleases, _packageFeed, PackagesFolder, options: options); diff --git a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs new file mode 100644 index 0000000..6db770f --- /dev/null +++ b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs @@ -0,0 +1,36 @@ +using System; +using NuGet.Common; +using Weikio.PluginFramework.Abstractions; +using Weikio.PluginFramework.Catalogs.NuGet.PackageManagement; +using Weikio.PluginFramework.TypeFinding; + +namespace Weikio.PluginFramework.Catalogs.NuGet +{ + public class NugetFeedPluginCatalogOptions + { + /// + /// Gets or sets the function which is used to create the logger for Nuget activities + /// + public Func LoggerFactory { get; set; } = Defaults.LoggerFactory; + + /// + /// Gets or sets the . + /// + public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions(); + + /// + /// Gets or sets how the plugin names and version should be defined. . + /// + public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions; + + public static class Defaults + { + /// + /// Gets or sets the default function which is used to create the logger for PluginLoadContextOptions + /// + public static Func LoggerFactory { get; set; } = () => new ConsoleLogger(); + + public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + } + } +} diff --git a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs index 370fac5..4bc11fe 100644 --- a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs +++ b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs @@ -101,7 +101,7 @@ public async Task Initialize() foreach (var pluginAssemblyFilePath in _pluginAssemblyFilePaths) { - var options = new AssemblyPluginCatalogOptions { TypeFinderOptions = _options.TypeFinderOptions }; + var options = new AssemblyPluginCatalogOptions { TypeFinderOptions = _options.TypeFinderOptions, PluginNameOptions = _options.PluginNameOptions}; var assemblyCatalog = new AssemblyPluginCatalog(pluginAssemblyFilePath, options); await assemblyCatalog.Initialize(); diff --git a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs index 23974c1..0a1bf26 100644 --- a/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs +++ b/src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs @@ -1,5 +1,6 @@ using System; using NuGet.Common; +using Weikio.PluginFramework.Abstractions; using Weikio.PluginFramework.Catalogs.NuGet.PackageManagement; using Weikio.PluginFramework.TypeFinding; @@ -17,12 +18,19 @@ public class NugetPluginCatalogOptions /// public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions(); + /// + /// Gets or sets how the plugin names and version should be defined. . + /// + public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions; + public static class Defaults { /// /// Gets or sets the default function which is used to create the logger for PluginLoadContextOptions /// public static Func LoggerFactory { get; set; } = () => new ConsoleLogger(); + + public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); } } } diff --git a/src/Weikio.PluginFramework.Catalogs.NuGet/Weikio.PluginFramework.Catalogs.NuGet.csproj b/src/Weikio.PluginFramework.Catalogs.NuGet/Weikio.PluginFramework.Catalogs.NuGet.csproj index 3bc8db0..a6ed456 100644 --- a/src/Weikio.PluginFramework.Catalogs.NuGet/Weikio.PluginFramework.Catalogs.NuGet.csproj +++ b/src/Weikio.PluginFramework.Catalogs.NuGet/Weikio.PluginFramework.Catalogs.NuGet.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs b/src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs index 7fa350f..48a5447 100644 --- a/src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs +++ b/src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs @@ -15,15 +15,20 @@ public class AssemblyPluginCatalogOptions [Obsolete("Please use TypeFinderOptions. This will be removed in a future release.")] public Dictionary TypeFinderCriterias = new Dictionary(); - + /// /// Gets or sets how the plugin names and version should be defined. . /// - public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions; /// /// Gets or sets the . /// public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions(); + + public static class Defaults + { + public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + } } } diff --git a/src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs b/src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs index 036f5ca..c186fc6 100644 --- a/src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs +++ b/src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Threading.Tasks; using Weikio.PluginFramework.Abstractions; diff --git a/src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs b/src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs index 92bfc7d..fe7f273 100644 --- a/src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs +++ b/src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs @@ -46,7 +46,12 @@ public class FolderPluginCatalogOptions /// /// Gets or sets how the plugin names and version should be defined. /// - public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions; + + public static class Defaults + { + public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + } } } diff --git a/src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs b/src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs index fa24d81..6e1c009 100644 --- a/src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs +++ b/src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs @@ -13,7 +13,7 @@ public class TypePluginCatalogOptions /// /// Gets or sets how the plugin names and version should be defined. . /// - public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions; [Obsolete("Please use TypeFinderOptions. This will be removed in a future release.")] public Dictionary TypeFinderCriterias = new Dictionary(); @@ -27,5 +27,10 @@ public class TypePluginCatalogOptions /// Gets or sets the . /// public ITypeFindingContext TypeFindingContext { get; set; } = null; + + public static class Defaults + { + public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions(); + } } } diff --git a/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs b/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs index 9be3d60..006649d 100644 --- a/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs +++ b/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Weikio.PluginFramework.Abstractions; using Weikio.PluginFramework.Catalogs; +using Weikio.PluginFramework.Catalogs.NuGet; using Xunit; namespace PluginFramework.Catalogs.NuGet.Tests @@ -70,5 +71,51 @@ public async Task CanTag() // Assert Assert.Equal("MockSolutions", plugin.Tag); } + + [Fact] + public async Task CanConfigureNamingOptions() + { + var options = new NugetFeedPluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" } + }; + + // Arrange + var feed = new NuGetFeed("nuget.org", "https://api.nuget.org/v3/index.json"); + var catalog = new NugetFeedPluginCatalog(feed, searchTerm: "tags:mocking", maxPackages: 1, configureFinder: configure => + { + configure.HasName("Moq.Range"); + }, options: options); + + // Act + await catalog.Initialize(); + var plugin = catalog.Single(); + + // Assert + Assert.EndsWith("Modified", plugin.Name); + } + + [Fact] + public async Task CanConfigureDefaultNamingOptions() + { + NugetFeedPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" + }; + + // Arrange + var feed = new NuGetFeed("nuget.org", "https://api.nuget.org/v3/index.json"); + var catalog = new NugetFeedPluginCatalog(feed, searchTerm: "tags:mocking", maxPackages: 1, configureFinder: configure => + { + configure.HasName("Moq.Range"); + }); + + // Act + await catalog.Initialize(); + var plugin = catalog.Single(); + + // Assert + Assert.EndsWith("Modified", plugin.Name); + } } } diff --git a/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs b/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs index 42c33bf..39ee329 100644 --- a/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs +++ b/tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Weikio.PluginFramework.Abstractions; using Weikio.PluginFramework.Catalogs; +using Weikio.PluginFramework.Catalogs.NuGet; using Xunit; namespace PluginFramework.Catalogs.NuGet.Tests @@ -50,7 +51,7 @@ public async Task InstallPackageWithoutDepencencies() Assert.StartsWith("2.9.0", plugins[0].Version.ToString()); AssertAssemblyFrameWork(".NETStandard,Version=v2.0", catalog.Single().Assembly); } - + [Fact] public async Task CanTag() { @@ -69,6 +70,48 @@ public async Task CanTag() Assert.Equal("CustomTag", plugin.Tag); } + [Fact] + public async Task CanConfigureNamingOptions() + { + var options = new NugetPluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" } + }; + + // Arrange + var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", configureFinder: configure => + { + configure.HasName("Serilog.Core.Logger"); + }, options: options); + + // Act + await catalog.Initialize(); + var plugin = catalog.Single(); + + // Assert + Assert.EndsWith("Modified", plugin.Name); + } + + [Fact] + public async Task CanConfigureDefaultNamingOptions() + { + NugetPluginCatalogOptions.Defaults.PluginNameOptions = + new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" }; + + // Arrange + var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", configureFinder: configure => + { + configure.HasName("Serilog.Core.Logger"); + }); + + // Act + await catalog.Initialize(); + var plugin = catalog.Single(); + + // Assert + Assert.EndsWith("Modified", plugin.Name); + } + [Fact] public async Task InstallPackageWithDepencencies() { @@ -136,7 +179,6 @@ public async Task InstallPackageFromFeed() Assert.NotEmpty(plugins); } - [Fact] public async Task InstallPackageFromFeedUsingFeedName() { @@ -155,7 +197,8 @@ public async Task InstallPackageFromFeedUsingFeedName() public async Task InstallPackageFromFeedUsingCustomNuGetConfig() { // Arrange - var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", packageFeed: new NuGetFeed("nuget.org_test"), packagesFolder: _packagesFolderInTestsBin); + var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", packageFeed: new NuGetFeed("nuget.org_test"), + packagesFolder: _packagesFolderInTestsBin); // Act await catalog.Initialize(); diff --git a/tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs b/tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs index dbba27a..689f772 100644 --- a/tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs +++ b/tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs @@ -70,6 +70,63 @@ public async Task CanConfigureNamingOptions() } } + [Fact] + public async Task CanConfigureDefaultNamingOptions() + { + AssemblyPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" + }; + + var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); + + await catalog.Initialize(); + + var allPlugins = catalog.GetPlugins(); + + foreach (var plugin in allPlugins) + { + Assert.EndsWith("Modified", plugin.Name); + } + } + + [Fact] + public async Task CanOverrideDefaultNamingOptions() + { + AssemblyPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" + }; + + var options = new AssemblyPluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Overridden" + } + }; + + var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); + var catalog2 = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly2.dll", options); + + await catalog.Initialize(); + await catalog2.Initialize(); + + var catalog1Plugins = catalog.GetPlugins(); + + foreach (var plugin in catalog1Plugins) + { + Assert.EndsWith("Modified", plugin.Name); + } + + var catalog2Plugins = catalog2.GetPlugins(); + + foreach (var plugin in catalog2Plugins) + { + Assert.EndsWith("Overridden", plugin.Name); + } + } + [Fact] public async Task ByDefaultOnlyContainsPublicNonAbstractClasses() { diff --git a/tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs b/tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs index bc4e071..0f97eac 100644 --- a/tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs +++ b/tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs @@ -21,9 +21,9 @@ public async Task CanInitialize() { var catalog = new FolderPluginCatalog(_pluginFolder); await catalog.Initialize(); - + var plugins = catalog.GetPlugins(); - + Assert.NotEmpty(plugins); } @@ -34,39 +34,96 @@ public async Task CanInitializeWithCriteria() { configure.HasName("*Plugin"); }); - + await catalog.Initialize(); var pluginCount = catalog.GetPlugins().Count; - + Assert.Equal(2, pluginCount); } + [Fact] + public async Task CanConfigureNamingOptions() + { + var options = new FolderPluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" } + }; + + var catalog = new FolderPluginCatalog(_pluginFolder, options); + await catalog.Initialize(); + + var plugins = catalog.GetPlugins(); + + foreach (var plugin in plugins) + { + Assert.EndsWith("Modified", plugin.Name); + } + } + + [Fact] + public async Task CanConfigureDefaultNamingOptions() + { + FolderPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" + }; + + var catalog = new FolderPluginCatalog(_pluginFolder); + await catalog.Initialize(); + + var plugins = catalog.GetPlugins(); + + foreach (var plugin in plugins) + { + Assert.EndsWith("Modified", plugin.Name); + } + } + + [Fact] + public async Task DefaultAssemblyNamingOptionsDoesntAffectFolderCatalogs() + { + AssemblyPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" + }; + + var catalog = new FolderPluginCatalog(_pluginFolder); + await catalog.Initialize(); + + var plugins = catalog.GetPlugins(); + + foreach (var plugin in plugins) + { + Assert.False(plugin.Name.EndsWith("Modified")); + } + } + [Fact] public async Task CanUseReferencedDependencies() { PluginLoadContextOptions.Defaults.UseHostApplicationAssemblies = UseHostApplicationAssembliesEnum.Never; - + Action configureFinder = configure => { configure.HasName("*JsonResolver"); }; - + var folder1Catalog = new FolderPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonNew\netstandard2.0", configureFinder); var folder2Catalog = new FolderPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonOld\netstandard2.0", configureFinder); - + await folder1Catalog.Initialize(); await folder2Catalog.Initialize(); var newPlugin = folder1Catalog.Single(); var oldPlugin = folder2Catalog.Single(); - + dynamic newPluginJsonResolver = Activator.CreateInstance(newPlugin); var newPluginVersion = newPluginJsonResolver.GetVersion(); - + dynamic oldPluginJsonResolver = Activator.CreateInstance(oldPlugin); var oldPluginVersion = oldPluginJsonResolver.GetVersion(); - + Assert.Equal("10.0.0.0", newPluginVersion); Assert.Equal("9.0.0.0", oldPluginVersion); } @@ -76,6 +133,7 @@ public async Task CanUseSelectedHoststDependencies() { // Make sure that the referenced version of JSON.NET is loaded into memory var json = Newtonsoft.Json.JsonConvert.SerializeObject(1); + // Make sure that the referenced version of Microsoft.Extensions.Logging is loaded into memory var logging = new Microsoft.Extensions.Logging.LoggerFactory(); @@ -93,11 +151,11 @@ public async Task CanUseSelectedHoststDependencies() await catalog.Initialize(); var oldPlugin = catalog.Single(); - + dynamic oldPluginJsonResolver = Activator.CreateInstance(oldPlugin); var oldPluginVersion = oldPluginJsonResolver.GetVersion(); var loggerVersion = oldPluginJsonResolver.GetLoggingVersion(); - + Assert.Equal("3.1.2.0", loggerVersion); Assert.Equal("9.0.0.0", oldPluginVersion); } diff --git a/tests/unit/Weikio.PluginFramework.Tests/TagTests.cs b/tests/unit/Weikio.PluginFramework.Tests/TagTests.cs index a9dd454..557e73f 100644 --- a/tests/unit/Weikio.PluginFramework.Tests/TagTests.cs +++ b/tests/unit/Weikio.PluginFramework.Tests/TagTests.cs @@ -158,6 +158,19 @@ public async Task CanTagUsingDefaultOptions() TypeFinderOptions.Defaults.TypeFinderCriterias.Clear(); } + + [Fact] + public async Task TypeCatalogCanTagUsingDefaultOptions() + { + var typePluginCatalog = new TypePluginCatalog(typeof(TypePlugin)); + + await typePluginCatalog.Initialize(); + + var myTaggedPlugins = typePluginCatalog.GetByTag("MyTag_1"); + Assert.Single(myTaggedPlugins); + + TypeFinderOptions.Defaults.TypeFinderCriterias.Clear(); + } [Fact] public async Task DefaultTagsWithFolderCatalogTypeShouldNotDuplicatePlugins() diff --git a/tests/unit/Weikio.PluginFramework.Tests/TypePluginCatalogTests.cs b/tests/unit/Weikio.PluginFramework.Tests/TypePluginCatalogTests.cs index 35076ac..5cbeb68 100644 --- a/tests/unit/Weikio.PluginFramework.Tests/TypePluginCatalogTests.cs +++ b/tests/unit/Weikio.PluginFramework.Tests/TypePluginCatalogTests.cs @@ -55,5 +55,66 @@ public async Task CanSetNameByAttribute() Assert.Equal("MyCustomName", thePlugin.Name); } + + + [Fact] + public async Task CanConfigureNamingOptions() + { + var options = new TypePluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (opt, type) => "HelloOptions" } + }; + + var catalog = new TypePluginCatalog(typeof(TypePlugin), options); + + await catalog.Initialize(); + + var thePlugin = catalog.Single(); + + Assert.Equal("HelloOptions", thePlugin.Name); + } + + [Fact] + public async Task CanConfigureDefaultNamingOptions() + { + TypePluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => "HelloOptions" + }; + + var catalog = new TypePluginCatalog(typeof(TypePlugin)); + + await catalog.Initialize(); + + var thePlugin = catalog.Single(); + + Assert.Equal("HelloOptions", thePlugin.Name); + } + + [Fact] + public async Task CanOverrideDefaultNamingOptions() + { + var options = new TypePluginCatalogOptions() + { + PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (opt, type) => "Overridden" } + }; + + TypePluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions() + { + PluginNameGenerator = (nameOptions, type) => "HelloOptions" + }; + + var catalog = new TypePluginCatalog(typeof(TypePlugin)); + var catalog2 = new TypePluginCatalog(typeof(TypePlugin), options); + + await catalog.Initialize(); + await catalog2.Initialize(); + + var thePlugin = catalog.Single(); + Assert.Equal("HelloOptions", thePlugin.Name); + + var anotherPlugin = catalog2.Single(); + Assert.Equal("Overridden", anotherPlugin.Name); + } } }