// 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().WithGeneratedFactory()); IDefaultTestFactory factory = _iocContainer.Resolve(); IDefaultTest test = factory.Create(); Assert.That(factory, Is.InstanceOf()); Assert.That(test, Is.InstanceOf()); } [Test] public void TestFluentFactoryRegistrationResolveWithoutFactoryFails() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); Assert.Throws(()=>_iocContainer.Resolve()); } [Test] public void TestRegisterFactoryWithoutCreate() => Assert.Throws(() => _iocContainer.Register(r => r.Add().WithGeneratedFactory())); [Test] public void TestResolveFromFactory() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); IDefaultTestFactory testFactory = _iocContainer.Resolve(); IDefaultTest createdTest = testFactory.Create(); Assert.That(createdTest, Is.InstanceOf()); } [Test] public void TestResolveFromFactoryWithParams() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); _iocContainer.Register(r => r.Add()); //this registration is abnormal and should only be used in unit tests IDefaultTestFactory testFactory = _iocContainer.Resolve(); IDefaultTest createdTest = testFactory.Create("Test"); Assert.That(createdTest, Is.InstanceOf()); } [Test] public void TestResolveFromFactoryWithDefaultParamCreate() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); _iocContainer.Register(r => r.Add()); //this registration is abnormal and should only be used in unit tests IDefaultTestFactory testFactory = _iocContainer.Resolve(); IDefaultTest createdTest = testFactory.CreateTest(); Assert.That(createdTest, Is.InstanceOf()); } [Test] public void TestResolveFromFactoryWithDefaultParamCtor() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); _iocContainer.Register(r => r.Add()); //this registration is abnormal and should only be used in unit tests IDefaultTestFactory testFactory = _iocContainer.Resolve(); IDefaultTest createdTest = testFactory.Create(); Assert.That(createdTest, Is.InstanceOf()); } [Test] public void TestResolveFromFactoryWithByte() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); IDefaultTestFactory testFactory = _iocContainer.Resolve(); IDefaultTest createdTest = testFactory.Create(1); Assert.That(createdTest, Is.InstanceOf()); } [Test] public void TestPassingNullAsMiddleParameter() { _iocContainer.Register(r => r.Add().WithGeneratedFactory()); ITestNullFactory testNullFactory = _iocContainer.Resolve(); 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().WithGeneratedFactory()); ITestDefaultFactory testDefaultFactory = _iocContainer.Resolve(); 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().WithGeneratedFactory()); MultitonScope scope1 = new(); MultitonScope scope2 = new(); IMultitonTestFactory testFactory = _iocContainer.Resolve(); 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().WithGeneratedFactory()); MultitonScope scope1 = new(); MultitonScope scope2 = new(); IMultitonTestFactory testFactory = _iocContainer.Resolve(); 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 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(() => _iocContainer.Register(r => r.AddMultiton().WithGeneratedFactory())); [Test] public void InvalidMultitonFactoryRegistrationFactoryWithoutScopeAsFirstParameter() => Assert.Throws(() => _iocContainer.Register(r => r.AddMultiton().WithGeneratedFactory())); [Test] public void TestInvalidCreateMethodReturnType() => Assert.Throws(() => _iocContainer.Register(r => r.Add().WithGeneratedFactory())); }