A lightweight IOC Container that is powerful enough to do all the things you need it to do.
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.

212 lines
8.8 KiB

// Author: Simon.Gockner
// Created: 2025-12-03
// Copyright(c) 2025 SimonG. All Rights Reserved.
using LightweightIocContainer;
using LightweightIocContainer.Exceptions;
using LightweightIocContainer.FactoryGenerator;
using Test.LightweightIocContainer.FactoryGenerator.TestClasses;
using Test.LightweightIocContainer.FactoryGenerator.TestClasses.Factories;
using Test.LightweightIocContainer.FactoryGenerator.TestClasses.Interfaces;
namespace Test.LightweightIocContainer.FactoryGenerator;
[TestFixture]
public class FluentFactoryRegistrationTest
{
private IocContainer _iocContainer;
[SetUp]
public void SetUp() => _iocContainer = new IocContainer();
[TearDown]
public void TearDown() => _iocContainer.Dispose();
[Test]
public void TestFluentFactoryRegistration()
{
_iocContainer.Register(r => r.Add<IDefaultTest, DefaultTest>().WithGeneratedFactory<IDefaultTestFactory>());
IDefaultTestFactory factory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest test = factory.Create();
Assert.That(factory, Is.InstanceOf<IDefaultTestFactory>());
Assert.That(test, Is.InstanceOf<IDefaultTest>());
}
[Test]
public void TestFluentFactoryRegistrationResolveWithoutFactoryFails()
{
_iocContainer.Register(r => r.Add<IDefaultTest, DefaultTest>().WithGeneratedFactory<IDefaultTestFactory>());
Assert.Throws<DirectResolveWithRegisteredFactoryNotAllowed>(()=>_iocContainer.Resolve<IDefaultTest>());
}
[Test]
public void TestRegisterFactoryWithoutCreate() => Assert.Throws<InvalidFactoryRegistrationException>(() => _iocContainer.Register(r => r.Add<IDefaultTest, DefaultTest>().WithGeneratedFactory<ITestFactoryNoCreate>()));
[Test]
public void TestResolveFromFactory()
{
_iocContainer.Register(r => r.Add<IDefaultTest, DefaultTest>().WithGeneratedFactory<IDefaultTestFactory>());
IDefaultTestFactory testFactory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest createdTest = testFactory.Create();
Assert.That(createdTest, Is.InstanceOf<DefaultTest>());
}
[Test]
public void TestResolveFromFactoryWithParams()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestConstructor>().WithGeneratedFactory<IDefaultTestFactory>());
_iocContainer.Register(r => r.Add<DefaultTest, DefaultTest>()); //this registration is abnormal and should only be used in unit tests
IDefaultTestFactory testFactory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest createdTest = testFactory.Create("Test");
Assert.That(createdTest, Is.InstanceOf<TestConstructor>());
}
[Test]
public void TestResolveFromFactoryWithDefaultParamCreate()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestConstructor>().WithGeneratedFactory<IDefaultTestFactory>());
_iocContainer.Register(r => r.Add<DefaultTest, DefaultTest>()); //this registration is abnormal and should only be used in unit tests
IDefaultTestFactory testFactory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest createdTest = testFactory.CreateTest();
Assert.That(createdTest, Is.InstanceOf<TestConstructor>());
}
[Test]
public void TestResolveFromFactoryWithDefaultParamCtor()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestConstructor>().WithGeneratedFactory<IDefaultTestFactory>());
_iocContainer.Register(r => r.Add<DefaultTest, DefaultTest>()); //this registration is abnormal and should only be used in unit tests
IDefaultTestFactory testFactory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest createdTest = testFactory.Create();
Assert.That(createdTest, Is.InstanceOf<TestConstructor>());
}
[Test]
public void TestResolveFromFactoryWithByte()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestByte>().WithGeneratedFactory<IDefaultTestFactory>());
IDefaultTestFactory testFactory = _iocContainer.Resolve<IDefaultTestFactory>();
IDefaultTest createdTest = testFactory.Create(1);
Assert.That(createdTest, Is.InstanceOf<TestByte>());
}
[Test]
public void TestPassingNullAsMiddleParameter()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestNull>().WithGeneratedFactory<ITestNullFactory>());
ITestNullFactory testNullFactory = _iocContainer.Resolve<ITestNullFactory>();
object obj = new();
string content = "TestContent";
string optional2 = "optionalParameter2";
IDefaultTest createdTest = testNullFactory.Create(obj, content, null!, optional2);
if (createdTest is not TestNull testNull)
{
Assert.Fail();
return;
}
Assert.That(testNull.Obj, Is.SameAs(obj));
Assert.That(testNull.Content, Is.EqualTo(content));
Assert.That(testNull.Optional1, Is.Null);
Assert.That(testNull.Optional2, Is.EqualTo(optional2));
}
[Test]
public void TestPassingNullAsDefaultParameter()
{
_iocContainer.Register(r => r.Add<IDefaultTest, TestNull>().WithGeneratedFactory<ITestDefaultFactory>());
ITestDefaultFactory testDefaultFactory = _iocContainer.Resolve<ITestDefaultFactory>();
object obj = new();
string content = "TestContent";
string optional2 = "optionalParameter2";
IDefaultTest createdTest = testDefaultFactory.Create(obj, content, null!, optional2);
if (createdTest is not TestNull testNull)
{
Assert.Fail();
return;
}
Assert.That(testNull.Obj, Is.SameAs(obj));
Assert.That(testNull.Content, Is.EqualTo(content));
Assert.That(testNull.Optional1, Is.Null);
Assert.That(testNull.Optional2, Is.EqualTo(optional2));
Assert.That(testNull.TestNullFactory, Is.Null);
}
[Test]
public void TestResolveMultitonFromFactory()
{
_iocContainer.Register(r => r.AddMultiton<IDefaultTest, TestMultiton, MultitonScope>().WithGeneratedFactory<IMultitonTestFactory>());
MultitonScope scope1 = new();
MultitonScope scope2 = new();
IMultitonTestFactory testFactory = _iocContainer.Resolve<IMultitonTestFactory>();
IDefaultTest resolvedTest1 = testFactory.Create(scope1);
IDefaultTest resolvedTest2 = testFactory.Create(scope1);
IDefaultTest resolvedTest3 = testFactory.Create(scope2);
Assert.That(resolvedTest1, Is.SameAs(resolvedTest2));
Assert.That(resolvedTest1, Is.Not.SameAs(resolvedTest3));
Assert.That(resolvedTest2, Is.Not.SameAs(resolvedTest3));
}
[Test]
public void TestResolveMultitonFromFactoryClearInstances()
{
_iocContainer.Register(r => r.AddMultiton<IDefaultTest, TestMultiton, MultitonScope>().WithGeneratedFactory<IMultitonTestFactory>());
MultitonScope scope1 = new();
MultitonScope scope2 = new();
IMultitonTestFactory testFactory = _iocContainer.Resolve<IMultitonTestFactory>();
IDefaultTest resolvedTest1 = testFactory.Create(scope1);
IDefaultTest resolvedTest2 = testFactory.Create(scope1);
IDefaultTest resolvedTest3 = testFactory.Create(scope2);
Assert.That(resolvedTest1, Is.SameAs(resolvedTest2));
Assert.That(resolvedTest1, Is.Not.SameAs(resolvedTest3));
Assert.That(resolvedTest2, Is.Not.SameAs(resolvedTest3));
testFactory.ClearMultitonInstance<IDefaultTest>();
IDefaultTest resolvedTest4 = testFactory.Create(scope1);
IDefaultTest resolvedTest5 = testFactory.Create(scope2);
Assert.That(resolvedTest1, Is.Not.SameAs(resolvedTest4));
Assert.That(resolvedTest2, Is.Not.SameAs(resolvedTest4));
Assert.That(resolvedTest3, Is.Not.SameAs(resolvedTest5));
}
[Test]
public void InvalidMultitonFactoryRegistrationFactoryWithoutParameter() =>
Assert.Throws<InvalidFactoryRegistrationException>(() => _iocContainer.Register(r => r.AddMultiton<IDefaultTest, DefaultTest, MultitonScope>().WithGeneratedFactory<IDefaultTestFactory>()));
[Test]
public void InvalidMultitonFactoryRegistrationFactoryWithoutScopeAsFirstParameter() =>
Assert.Throws<InvalidFactoryRegistrationException>(() => _iocContainer.Register(r => r.AddMultiton<IDefaultTest, DefaultTest, MultitonScope>().WithGeneratedFactory<IInvalidMultitonTestFactory>()));
[Test]
public void TestInvalidCreateMethodReturnType() =>
Assert.Throws<InvalidFactoryRegistrationException>(() => _iocContainer.Register(r => r.Add<IDefaultTest, DefaultTest>().WithGeneratedFactory<ITestFactoryWrongReturn>()));
}