You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.7 KiB
120 lines
3.7 KiB
// Author: Gockner, Simon
|
|
// Created: 2021-12-03
|
|
// Copyright(c) 2021 SimonG. All Rights Reserved.
|
|
|
|
using System;
|
|
using JetBrains.Annotations;
|
|
using LightweightIocContainer;
|
|
using LightweightIocContainer.Exceptions;
|
|
using LightweightIocContainer.Interfaces.Installers;
|
|
using LightweightIocContainer.Interfaces.Registrations;
|
|
using LightweightIocContainer.Validation;
|
|
using Moq;
|
|
using NUnit.Framework;
|
|
|
|
namespace Test.LightweightIocContainer
|
|
{
|
|
[TestFixture]
|
|
public class IocValidatorTest
|
|
{
|
|
public interface ITest
|
|
{
|
|
|
|
}
|
|
|
|
[UsedImplicitly]
|
|
public interface IParameter
|
|
{
|
|
bool Method();
|
|
}
|
|
|
|
private class Test : ITest
|
|
{
|
|
public Test(IParameter parameter) => parameter?.Method();
|
|
}
|
|
|
|
[UsedImplicitly]
|
|
public interface ITestFactory
|
|
{
|
|
ITest Create(IParameter parameter);
|
|
}
|
|
|
|
[UsedImplicitly]
|
|
public interface IInvalidFactory
|
|
{
|
|
ITest Create();
|
|
}
|
|
|
|
private class TestInstallerNoFactory : IIocInstaller
|
|
{
|
|
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>();
|
|
}
|
|
|
|
private class TestInstallerWithFactory : IIocInstaller
|
|
{
|
|
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<ITestFactory>();
|
|
}
|
|
|
|
private class TestInstallerWithInvalidFactory : IIocInstaller
|
|
{
|
|
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<IInvalidFactory>();
|
|
}
|
|
|
|
[Test]
|
|
public void TestValidate()
|
|
{
|
|
IocContainer iocContainer = new();
|
|
iocContainer.Install(new TestInstallerNoFactory());
|
|
|
|
IocValidator validator = new(iocContainer);
|
|
|
|
validator.Validate();
|
|
}
|
|
|
|
[Test]
|
|
public void TestValidateWithFactory()
|
|
{
|
|
IocContainer iocContainer = new();
|
|
iocContainer.Install(new TestInstallerWithFactory());
|
|
|
|
IocValidator validator = new(iocContainer);
|
|
|
|
validator.Validate();
|
|
}
|
|
|
|
[Test]
|
|
public void TestValidateWithParameter()
|
|
{
|
|
IocContainer iocContainer = new();
|
|
iocContainer.Install(new TestInstallerNoFactory());
|
|
|
|
IocValidator validator = new(iocContainer);
|
|
|
|
Mock<IParameter> parameterMock = new();
|
|
parameterMock.Setup(p => p.Method()).Returns(true);
|
|
|
|
validator.AddParameter<ITest, IParameter>(parameterMock.Object);
|
|
|
|
validator.Validate();
|
|
|
|
parameterMock.Verify(p => p.Method(), Times.Never);
|
|
}
|
|
|
|
[Test]
|
|
public void TestValidateInvalidFactory()
|
|
{
|
|
IocContainer iocContainer = new();
|
|
iocContainer.Install(new TestInstallerWithInvalidFactory());
|
|
|
|
IocValidator validator = new(iocContainer);
|
|
|
|
AggregateException aggregateException = Assert.Throws<AggregateException>(() => validator.Validate());
|
|
|
|
Exception exception = aggregateException?.InnerExceptions[0];
|
|
Assert.IsInstanceOf<NoMatchingConstructorFoundException>(exception);
|
|
|
|
NoMatchingConstructorFoundException noMatchingConstructorFoundException = (NoMatchingConstructorFoundException) exception;
|
|
Assert.AreEqual(typeof(Test), noMatchingConstructorFoundException?.Type);
|
|
}
|
|
}
|
|
} |