// Author: Simon Gockner // Created: 2020-09-18 // Copyright(c) 2020 SimonG. All Rights Reserved. using System.Diagnostics.CodeAnalysis; using JetBrains.Annotations; using LightweightIocContainer; using LightweightIocContainer.Exceptions; using NUnit.Framework; namespace Test.LightweightIocContainer; [TestFixture] public class OpenGenericRegistrationTest { private IocContainer _iocContainer; [UsedImplicitly] public interface IConstraint { } [UsedImplicitly] public class Constraint : IConstraint { } [UsedImplicitly] [SuppressMessage("ReSharper", "UnusedTypeParameter")] public interface ITest where T : IConstraint, new() { } [UsedImplicitly] public class Test : ITest where T : IConstraint, new() { } [UsedImplicitly] public class CtorTest : ITest where T : IConstraint, new() { public CtorTest(T item) { } } [UsedImplicitly] public interface ITestFactory { ITest Create() where T : IConstraint, new(); } [UsedImplicitly] public interface ICtorTestFactory { ITest Create(T item) where T : IConstraint, new(); } [SetUp] public void SetUp() => _iocContainer = new IocContainer(); [TearDown] public void TearDown() => _iocContainer.Dispose(); [Test] public void TestRegisterOpenGenericType() { _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(Test<>))); ITest test = _iocContainer.Resolve>(); Assert.NotNull(test); } [Test] public void TestRegisterOpenGenericTypeAsSingleton() { _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(Test<>), Lifestyle.Singleton)); ITest test = _iocContainer.Resolve>(); Assert.NotNull(test); ITest secondTest = _iocContainer.Resolve>(); Assert.NotNull(secondTest); Assert.AreEqual(test, secondTest); Assert.AreSame(test, secondTest); } [Test] public void TestRegisterOpenGenericTypeAsMultitonThrowsException() => Assert.Throws(() => _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(Test<>), Lifestyle.Multiton))); [Test] public void TestRegisterNonOpenGenericTypeWithOpenGenericsFunctionThrowsException() => Assert.Throws(() => _iocContainer.Register(r => r.AddOpenGenerics(typeof(int), typeof(int)))); [Test] public void TestRegisterFactoryOfOpenGenericType() { _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(Test<>)).WithFactory()); ITestFactory testFactory = _iocContainer.Resolve(); ITest test = testFactory.Create(); Assert.IsInstanceOf>(test); } [Test] public void TestRegisterFactoryOfOpenGenericTypeWithCtorParameter() { _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(CtorTest<>)).WithFactory()); ICtorTestFactory testFactory = _iocContainer.Resolve(); ITest test = testFactory.Create(new Constraint()); Assert.IsInstanceOf>(test); } }