Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Configuration for loading assemblies #294

Closed
wants to merge 71 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
2f69143
Add AutoMockingLoadingTypes to configuration
iamdmitrij Apr 11, 2022
3841a57
Add TODO comment
iamdmitrij Apr 11, 2022
861529d
Pass configuration in to GetRelatedAssemblies
iamdmitrij Apr 11, 2022
adc7769
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 12, 2022
cd116ff
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 17, 2022
b794ab2
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 17, 2022
64642c5
Enable Stryker tracing
iamdmitrij Apr 18, 2022
c196f51
Lock dotnet-stryker to v1.5.0
iamdmitrij Apr 18, 2022
6f13c4a
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 20, 2022
ac58b3d
Revert "Lock dotnet-stryker to v1.5.0"
iamdmitrij Apr 22, 2022
ae86e43
Revert "Enable Stryker tracing"
iamdmitrij Apr 22, 2022
8596942
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 27, 2022
c9243af
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 27, 2022
6ee16a7
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 30, 2022
8f06534
Merge branch 'main' into assembly-loading-config
iamdmitrij May 2, 2022
718c5a1
Add TODOs
iamdmitrij May 2, 2022
93ddf50
Merge branch 'main' into assembly-loading-config
iamdmitrij May 3, 2022
da857d3
Merge branch 'main' into assembly-loading-config
iamdmitrij May 3, 2022
bc24386
Merge branch 'main' into assembly-loading-config
iamdmitrij May 5, 2022
756bf9d
Use top-level namespaces
iamdmitrij May 5, 2022
b47fa04
Merge branch 'main' into assembly-loading-config
iamdmitrij May 6, 2022
6712dd2
Add docs
iamdmitrij May 6, 2022
75277f0
Add PatternFromSourceAssembly type
iamdmitrij May 6, 2022
95e2917
Refactor GetAssemblies func
iamdmitrij May 6, 2022
0e03fcb
Fix spelling
iamdmitrij May 6, 2022
587013a
Merge branch 'main' into assembly-loading-config
iamdmitrij May 8, 2022
0bdb8f7
Fix build from bad merge
iamdmitrij May 8, 2022
70d8dff
Merge branch 'main' into assembly-loading-config
iamdmitrij May 11, 2022
3d8efee
Merge branch 'main' into assembly-loading-config
iamdmitrij May 18, 2022
fc8596a
Merge branch 'main' into assembly-loading-config
iamdmitrij May 25, 2022
92e680c
Merge branch 'main' into assembly-loading-config
iamdmitrij Jun 15, 2022
a861dae
Merge branch 'main' into assembly-loading-config
iamdmitrij Jun 16, 2022
2130954
Merge branch 'main' into assembly-loading-config
iamdmitrij Jun 30, 2022
74d369f
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 10, 2022
2d762c8
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 22, 2022
dc916aa
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 22, 2022
7b38003
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 22, 2022
223f5d0
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 29, 2022
aa6140b
Merge branch 'main' into assembly-loading-config
iamdmitrij Sep 5, 2022
194a47f
Merge branch 'main' into assembly-loading-config
iamdmitrij Oct 20, 2022
f51bd91
Merge branch 'main' into assembly-loading-config
iamdmitrij Feb 19, 2023
2e1da8a
Merge branch 'main' into assembly-loading-config
iamdmitrij Feb 27, 2023
ef96dc4
Merge branch 'main' into assembly-loading-config
iamdmitrij Mar 2, 2023
8e3711b
Merge branch 'main' into assembly-loading-config
iamdmitrij Mar 12, 2023
4afd40e
Merge branch 'main' into assembly-loading-config
iamdmitrij Mar 16, 2023
b5ecac7
Merge branch 'main' into assembly-loading-config
iamdmitrij Mar 29, 2023
3f17cc6
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 21, 2023
b0af754
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 21, 2023
618aa65
Merge branch 'main' into assembly-loading-config
iamdmitrij Apr 28, 2023
ccb4b64
Merge branch 'main' into assembly-loading-config
iamdmitrij May 6, 2023
e86863c
Merge branch 'main' into assembly-loading-config
iamdmitrij May 6, 2023
1d4142b
Merge branch 'main' into assembly-loading-config
iamdmitrij May 12, 2023
ffb2d6f
Merge branch 'main' into assembly-loading-config
iamdmitrij May 17, 2023
e8d9c63
Merge branch 'main' into assembly-loading-config
iamdmitrij May 18, 2023
7d9392d
Merge branch 'main' into assembly-loading-config
iamdmitrij May 24, 2023
fc64656
Merge branch 'main' into assembly-loading-config
iamdmitrij May 25, 2023
e8bb989
Merge branch 'main' into assembly-loading-config
iamdmitrij May 26, 2023
8955bf7
Merge branch 'main' into assembly-loading-config
iamdmitrij May 26, 2023
fee26cf
Merge branch 'main' into assembly-loading-config
iamdmitrij May 29, 2023
d7f2e04
Merge branch 'main' into assembly-loading-config
iamdmitrij May 29, 2023
93fcee5
Merge branch 'main' into assembly-loading-config
iamdmitrij Jun 2, 2023
e8094f7
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 4, 2023
81ca87e
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 4, 2023
3af3204
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 5, 2023
10c96ec
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 7, 2023
281cbdc
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 16, 2023
b1f0015
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 20, 2023
290d53b
Merge branch 'main' into assembly-loading-config
iamdmitrij Jul 31, 2023
936d3e4
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 11, 2023
7a88b00
Merge branch 'main' into assembly-loading-config
iamdmitrij Aug 16, 2023
777d5c5
Merge branch 'main' into assembly-loading-config
iamdmitrij Sep 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Tethos/AutoMockingConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,9 @@ public class AutoMockingConfiguration
/// Toggle to include non-public types into auto-mocking container.
/// </summary>
public bool IncludeNonPublicTypes { get; set; }

/// <summary>
/// Assembly loading type method selection.
/// </summary>
public AutoMockingLoadingTypes LoadingMethod { get; set; } = AutoMockingLoadingTypes.All;
}
11 changes: 11 additions & 0 deletions src/Tethos/AutoMockingLoadingTypes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Tethos;

/// <summary>
/// Available assembly loading type methods.
/// </summary>
public enum AutoMockingLoadingTypes
{
All,
ReferencedAssemblies,
PatternFromSourceAssembly,
}
2 changes: 1 addition & 1 deletion src/Tethos/BaseAutoMockingTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public abstract class BaseAutoMockingTest<T> : IWindsorInstaller, IDisposable
/// </summary>
protected BaseAutoMockingTest()
{
this.Assemblies = this.GetType().GetRelatedAssemblies();
this.Assemblies = this.GetType().GetAssemblies(this.AutoMockingConfiguration);
this.Container = (T)new T().Install(this);
}

Expand Down
25 changes: 18 additions & 7 deletions src/Tethos/Extensions/Assembly/AssemblyExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,29 @@

internal static class AssemblyExtensions
{
internal static Assembly[] GetRelatedAssemblies(this Type type) =>
Assembly.GetAssembly(type).GetDependencies();

/// <summary>
/// TODO: Create assembly loading configuration
/// Retrieves related assemblies.
/// </summary>
internal static Assembly[] GetDependencies(
this Assembly rootAssembly) => AppDomain.CurrentDomain.BaseDirectory.GetFiles()
.FilterAssemblies(new[] { ".dll", ".exe" }, rootAssembly)
internal static Assembly[] GetAssemblies(
this Type type,
AutoMockingConfiguration configuration)
{
var rootAssembly = Assembly.GetAssembly(type);
var appDomain = AppDomain.CurrentDomain.BaseDirectory.GetFiles();

var assemblies = configuration.LoadingMethod switch
{
AutoMockingLoadingTypes.All => appDomain.FilterAssemblies(new[] { ".dll", ".exe" }, rootAssembly),
AutoMockingLoadingTypes.PatternFromSourceAssembly => appDomain.FilterAssemblies(rootAssembly.FullName.GetPattern(), new[] { ".dll", ".exe" }, rootAssembly),
AutoMockingLoadingTypes.ReferencedAssemblies => appDomain.ElseLoadReferencedAssemblies(rootAssembly),
_ => throw new NotImplementedException(),
};

return assemblies
.ExcludeRefDirectory()
.LoadAssemblies(rootAssembly)
.ToArray();
}

internal static IEnumerable<File> ElseLoadReferencedAssemblies(
this IEnumerable<File> assemblies,
Expand Down
58 changes: 32 additions & 26 deletions test/Tethos.Tests/Extensions/Assembly/AssemblyExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,49 +14,51 @@
public class AssemblyExtensionsTests : BaseAutoMockingTest<AutoMockingContainer>
{
[Theory]
[InlineData(typeof(IMockable))]
[InlineData(typeof(Assert))]
[InlineData(typeof(Xunit.Abstractions.ITest))]
[InlineData(typeof(Moq.IMock<>))]
[InlineData(typeof(FluentAssertions.Events.EventMetadata))]
[InlineData(typeof(AutoFixture.BehaviorRoot))]
[InlineData(typeof(Castle.Core.ParameterModel))]
[InlineData(typeof(Castle.Windsor.IWindsorContainer))]
[InlineData(typeof(System.Collections.IList))]
[InlineData(typeof(System.Collections.IEnumerable))]
[InlineData(typeof(Array))]
[InlineData(typeof(Enumerable))]
[InlineData(typeof(Type))]
[InlineData(typeof(BaseAutoResolver))]
[InlineData(typeof(TimeoutException))]
[InlineData(typeof(Guid))]
[InlineData(typeof(Task<>))]
[InlineData(typeof(Task<int>))]
[InlineData(typeof(int))]
[InlineAutoData(typeof(IMockable))]
[InlineAutoData(typeof(Assert))]
[InlineAutoData(typeof(Xunit.Abstractions.ITest))]
[InlineAutoData(typeof(Moq.IMock<>))]
[InlineAutoData(typeof(FluentAssertions.Events.EventMetadata))]
[InlineAutoData(typeof(AutoFixture.BehaviorRoot))]
[InlineAutoData(typeof(Castle.Core.ParameterModel))]
[InlineAutoData(typeof(Castle.Windsor.IWindsorContainer))]
[InlineAutoData(typeof(System.Collections.IList))]
[InlineAutoData(typeof(System.Collections.IEnumerable))]
[InlineAutoData(typeof(Array))]
[InlineAutoData(typeof(Enumerable))]
[InlineAutoData(typeof(Type))]
[InlineAutoData(typeof(BaseAutoResolver))]
[InlineAutoData(typeof(TimeoutException))]
[InlineAutoData(typeof(Guid))]
[InlineAutoData(typeof(Task<>))]
[InlineAutoData(typeof(Task<int>))]
[InlineAutoData(typeof(int))]
[Trait("Type", "Unit")]
public void GetRelatedAssemblies_ShouldLoad(Type type)
public void GetAssemblies_ShouldLoadAssembly(Type type, AutoMockingConfiguration configuration)
{
// Arrange
var expected = type.Assembly;

// Act
var actual = type.GetRelatedAssemblies();
var actual = type.GetAssemblies(configuration);

// Assert
actual.Should().Contain(expected);
}

[Fact]
[Theory(Skip = "Use different assembly")]
[AutoData]
[Trait("Type", "Unit")]
public void GetDependencies_UsingMicrosoftCorLib_ShouldLoad()
public void GetAssemblies_UsingMicrosoftCorLib_ShouldLoad(AutoMockingConfiguration configuration)
{
// Arrange
var assemblyName = "mscorlib";
var assembly = Assembly.Load(assemblyName);
var expected = new[] { assembly };
var type = assembly.DefinedTypes.First();

// Act
var actual = assembly.GetDependencies();
var actual = type.GetAssemblies(configuration);

// Assert
actual.Should().Contain(expected);
Expand All @@ -65,13 +67,17 @@ public void GetDependencies_UsingMicrosoftCorLib_ShouldLoad()
[Theory]
[ClassData(typeof(AssemblyTheoryData))]
[Trait("Type", "Unit")]
public void GetDependencies_ShouldLoad(string assemblyName, IEnumerable<string> expected)
public void GetAssemblies_ShouldLoad(
string assemblyName,
IEnumerable<string> expected,
AutoMockingConfiguration configuration)
{
// Arrange
var assembly = Assembly.LoadFrom(assemblyName);
var type = assembly.DefinedTypes.First();

// Act
var actual = assembly.GetDependencies().Select(dependency => dependency.GetName().Name);
var actual = type.GetAssemblies(configuration).Select(dependency => dependency.GetName().Name);

// Assert
actual.Should().BeEquivalentTo(expected);
Expand Down
29 changes: 16 additions & 13 deletions test/Tethos.Tests/Extensions/Assembly/AssemblyTheoryData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,27 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using AutoFixture;
using Xunit;

public class AssemblyTheoryData : TheoryData<string, IEnumerable<string>>
public class AssemblyTheoryData : TheoryData<string, IEnumerable<string>, AutoMockingConfiguration>
{
public AssemblyTheoryData()
{
this.Add("Fake.Core21.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Core22.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Core31.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Framework461.exe", GetMatchingAssemblies("Fake."));
this.Add("Fake.Framework472.exe", GetMatchingAssemblies("Fake."));
this.Add("Fake.Net50.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Net60.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Standard20.dll", GetMatchingAssemblies("Fake."));
this.Add("Fake.Standard21.dll", GetMatchingAssemblies("Fake."));
this.Add("Tethos.dll", GetMatchingAssemblies("Tethos."));
this.Add("Tethos.Tests.dll", GetMatchingAssemblies("Tethos."));
this.Add("Tethos.Tests.Common.dll", GetMatchingAssemblies("Tethos."));
var configuration = new Fixture().Create<AutoMockingConfiguration>();

this.Add("Fake.Core21.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Core22.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Core31.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Framework461.exe", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Framework472.exe", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Net50.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Net60.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Standard20.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Fake.Standard21.dll", GetMatchingAssemblies("Fake."), configuration);
this.Add("Tethos.dll", GetMatchingAssemblies("Tethos."), configuration);
this.Add("Tethos.Tests.dll", GetMatchingAssemblies("Tethos."), configuration);
this.Add("Tethos.Tests.Common.dll", GetMatchingAssemblies("Tethos."), configuration);
}

private static IEnumerable<string> GetMatchingAssemblies(string pattern) => Directory
Expand Down