Skip to content

Commit

Permalink
[#167] [add] impl
Browse files Browse the repository at this point in the history
  • Loading branch information
i4004 committed Nov 21, 2021
1 parent 2f9ef8e commit d1ad1ce
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 7 deletions.
4 changes: 3 additions & 1 deletion src/Simplify.Web.Tests/Meta/ControllersMetaStoreTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,21 @@ public void GetControllersMetaData_LocalControllers_GetWithoutIgnored()

factory.SetupSequence(x => x.CreateControllerMetaData(It.IsAny<Type>()))
.Returns(new ControllerMetaData(typeof(TestController1), new ControllerExecParameters(null, 2)))
.Returns(new ControllerMetaData(typeof(TestController6)))
.Returns(new ControllerMetaData(typeof(TestController2), new ControllerExecParameters(null, 1)))
.Returns(new ControllerMetaData(typeof(TestController4)))
.Returns(new ControllerMetaData(typeof(TestController5)));

// Act
var metaData = store.ControllersMetaData;

Assert.AreEqual(4, metaData.Count);
Assert.AreEqual(5, metaData.Count);

factory.Verify(x => x.CreateControllerMetaData(It.Is<Type>(t => t == typeof(TestController1))));
factory.Verify(x => x.CreateControllerMetaData(It.Is<Type>(t => t == typeof(TestController2))));
factory.Verify(x => x.CreateControllerMetaData(It.Is<Type>(t => t == typeof(TestController4))));
factory.Verify(x => x.CreateControllerMetaData(It.Is<Type>(t => t == typeof(TestController5))));
factory.Verify(x => x.CreateControllerMetaData(It.Is<Type>(t => t == typeof(TestController6))));
}
}
}
3 changes: 2 additions & 1 deletion src/Simplify.Web.Tests/Meta/SimplifyWebTypesFinderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,11 @@ public void FindTypesDerivedFrom_TypeHave3TypesDerived_3TestControllersReturned(

// Assert

Assert.AreEqual(2, types.Count);
Assert.AreEqual(3, types.Count);
Assert.AreEqual(1, types2.Count);
Assert.AreEqual("Simplify.Web.Tests.TestEntities.TestController1", types[0].FullName);
Assert.AreEqual("Simplify.Web.Tests.TestEntities.TestController3", types[1].FullName);
Assert.AreEqual("Simplify.Web.Tests.TestEntities.TestController6", types[2].FullName);
Assert.AreEqual("Simplify.Web.Tests.TestEntities.TestController2", types2[0].FullName);
}

Expand Down
6 changes: 6 additions & 0 deletions src/Simplify.Web.Tests/TestEntities/ControllerBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Simplify.Web.Tests.TestEntities
{
public abstract class ControllerBase : Controller
{
}
}
9 changes: 9 additions & 0 deletions src/Simplify.Web.Tests/TestEntities/TestController6.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;

namespace Simplify.Web.Tests.TestEntities
{
public class TestController6 : ControllerBase
{
public override ControllerResponse Invoke() => throw new NotImplementedException();
}
}
37 changes: 32 additions & 5 deletions src/Simplify.Web/Meta/SimplifyWebTypesFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,25 @@ public static class SimplifyWebTypesFinder
/// <param name="type">The type.</param>
/// <returns></returns>
public static IList<Type> FindTypesDerivedFrom(Type type) =>
CurrentDomainAssembliesTypes.Where(t => t.BaseType != null
&& ((t.BaseType.IsGenericType == false && t.BaseType == type)
||
(t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == type)))
.ToList();
CurrentDomainAssembliesTypes.Where(t =>
{
if (t.IsAbstract)
return false;
if (t.BaseType == null)
return false;
if (t.BaseType.IsTypeOf(type))
return true;
if (t.BaseType.BaseType == null)
return false;
if (t.BaseType.BaseType.IsTypeOf(type))
return true;
return false;
}).ToList();

/// <summary>
/// Gets all types.
Expand Down Expand Up @@ -102,6 +116,19 @@ public static void CleanLoadedTypesAndAssembliesInfo()
_currentDomainAssembliesTypes = null;
}

private static bool IsTypeOf(this Type t, Type type)
{
switch (t.IsGenericType)
{
case false when t == type:
case true when t.GetGenericTypeDefinition() == type:
return true;

default:
return false;
}
}

private static IEnumerable<Type> GetAssembliesTypes(IEnumerable<Assembly> assemblies)
{
var types = new List<Type>();
Expand Down

0 comments on commit d1ad1ce

Please sign in to comment.