- fix validation of open generic type registrations without parameter constraints

master
Simon G. 12 months ago
parent 1b84c307d4
commit cc104b95ec
Signed by: SimonG
GPG Key ID: 0B82B964BA536523
  1. 9
      LightweightIocContainer.Validation/IocValidator.cs
  2. 26
      Test.LightweightIocContainer.Validation/IocValidatorTest.cs

@ -68,8 +68,13 @@ public class IocValidator(IocContainer iocContainer)
foreach (Type genericArgument in genericArguments.Where(g => g.IsGenericParameter))
{
Type[] genericParameterConstraints = genericArgument.GetGenericParameterConstraints();
object mock = Substitute.For(genericParameterConstraints, []);
genericParameters.Add(mock.GetType());
if (genericParameterConstraints.Any())
{
object mock = Substitute.For(genericParameterConstraints, []);
genericParameters.Add(mock.GetType());
}
else
genericParameters.Add(typeof(object));
}
type = type.MakeGenericType(genericParameters.ToArray());

@ -41,6 +41,12 @@ public class IocValidatorTest
[UsedImplicitly]
public class GenericTest<T> : IGenericTest<T> where T : IConstraint, new();
[UsedImplicitly]
public interface IGenericTestWithoutConstraint<T>;
[UsedImplicitly]
public class GenericTestWithoutConstraint<T> : IGenericTestWithoutConstraint<T>;
[UsedImplicitly]
public interface IGenericTestFactory
{
@ -58,6 +64,15 @@ public class IocValidatorTest
}
}
[UsedImplicitly]
public class GenericParameterWithoutConstraint : IGenericParameter
{
public GenericParameterWithoutConstraint(IGenericTestWithoutConstraint<IParameter> test)
{
}
}
[UsedImplicitly]
private class TestViewModelDontIgnoreDesignTimeCtor : ITest
@ -321,6 +336,17 @@ public class IocValidatorTest
IocValidator validator = new(iocContainer);
validator.Validate();
}
[Test]
public void TestValidateOpenGenericTypeWithoutConstraintAsParameter()
{
IocContainer iocContainer = new();
iocContainer.Register(r => r.AddOpenGenerics(typeof(IGenericTestWithoutConstraint<>), typeof(GenericTestWithoutConstraint<>)));
iocContainer.Register(r => r.Add<IGenericParameter, GenericParameterWithoutConstraint>());
IocValidator validator = new(iocContainer);
validator.Validate();
}
private void AssertNoMatchingConstructorFoundForType<T>(AggregateException aggregateException)
{

Loading…
Cancel
Save