using System; using JetBrains.Annotations; using LightweightIocContainer; using LightweightIocContainer.Exceptions; using LightweightIocContainer.Interfaces; using LightweightIocContainer.Interfaces.Installers; using LightweightIocContainer.Registrations; using Moq; using NUnit.Framework; namespace Test.LightweightIocContainer { [TestFixture] public class IocContainerTest { #region TestClasses //some of the test classes have to be public to allow the implementation of the factory public interface ITest { } [UsedImplicitly] public interface ITestFactory { ITest Create(); ITest Create(string name); ITest Create(MultitonScope scope); ITest Create(bool someBool, string name = null); void ClearMultitonInstance(); } private interface ITestFactoryNoCreate { } private interface ITestFactoryNonGenericClear { ITest Create(); void ClearMultitonInstance(); } private class Test : ITest { } [UsedImplicitly] private class TestConstructor : ITest { public TestConstructor(string name, Test test) { } public TestConstructor(bool someBool, Test test, string name) { } } public class MultitonScope { } #endregion [Test] public void TestInstall() { Mock installerMock = new Mock(); IIocContainer iocContainer = new IocContainer(); IIocContainer returnedContainer = iocContainer.Install(installerMock.Object); installerMock.Verify(m => m.Install(It.IsAny()), Times.Once); Assert.AreEqual(iocContainer, returnedContainer); } [Test] public void TestInstallMultiple() { Mock installer1Mock = new Mock(); Mock installer2Mock = new Mock(); Mock installer3Mock = new Mock(); IIocContainer iocContainer = new IocContainer(); IIocContainer returnedContainer = iocContainer.Install(installer1Mock.Object, installer2Mock.Object, installer3Mock.Object); installer1Mock.Verify(m => m.Install(It.IsAny()), Times.Once); installer2Mock.Verify(m => m.Install(It.IsAny()), Times.Once); installer3Mock.Verify(m => m.Install(It.IsAny()), Times.Once); Assert.AreEqual(iocContainer, returnedContainer); } [Test] public void TestRegister() { IIocContainer iocContainer = new IocContainer(); Assert.DoesNotThrow(() => iocContainer.Register(RegistrationFactory.Register(typeof(ITest), typeof(Test)))); Assert.DoesNotThrow(() => iocContainer.Register(RegistrationFactory.RegisterFactory(typeof(ITestFactory), iocContainer))); } [Test] public void TestRegisterMultiple() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); MultipleRegistrationException exception = Assert.Throws(() => iocContainer.Register(RegistrationFactory.Register())); Assert.AreEqual(typeof(ITest), exception.Type); } [Test] public void TestRegisterFactoryWithoutCreate() { IIocContainer iocContainer = new IocContainer(); Assert.Throws(() => iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer))); } [Test] public void TestRegisterFactoryClearMultitonsNonGeneric() { IIocContainer iocContainer = new IocContainer(); Assert.Throws(() => iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer))); } [Test] public void TestResolveNotRegistered() { IIocContainer iocContainer = new IocContainer(); TypeNotRegisteredException exception = Assert.Throws(() => iocContainer.Resolve()); Assert.AreEqual(typeof(ITest), exception.Type); } [Test] public void TestResolve() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = iocContainer.Resolve(); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveWithParams() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = iocContainer.Resolve("Test", new Test()); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveWithMissingParam() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests ITest resolvedTest = iocContainer.Resolve("Test"); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveReflection() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); object resolvedTest = iocContainer.Resolve(typeof(ITest), null); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveSingleton() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register(Lifestyle.Singleton)); ITest resolvedTest = iocContainer.Resolve(); ITest secondResolvedTest = iocContainer.Resolve(); Assert.AreEqual(resolvedTest, secondResolvedTest); } [Test] public void TestResolveMultiton() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); MultitonScope scope1 = new MultitonScope(); MultitonScope scope2 = new MultitonScope(); ITest resolvedTest1 = iocContainer.Resolve(scope1); ITest resolvedTest2 = iocContainer.Resolve(scope1); ITest resolvedTest3 = iocContainer.Resolve(scope2); Assert.AreSame(resolvedTest1, resolvedTest2); Assert.AreNotSame(resolvedTest1, resolvedTest3); Assert.AreNotSame(resolvedTest2, resolvedTest3); } [Test] public void TestResolveMultitonNoArgs() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); MultitonResolveException exception = Assert.Throws(() => iocContainer.Resolve()); Assert.AreEqual(typeof(ITest), exception.Type); } [Test] public void TestResolveMultitonWrongArgs() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); MultitonResolveException exception = Assert.Throws(() => iocContainer.Resolve(new object())); Assert.AreEqual(typeof(ITest), exception.Type); } [Test] public void TestResolveTransient() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = iocContainer.Resolve(); ITest secondResolvedTest = iocContainer.Resolve(); Assert.AreNotEqual(resolvedTest, secondResolvedTest); } [Test] public void TestResolveFactory() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); ITestFactory testFactory = iocContainer.Resolve(); Assert.IsInstanceOf(testFactory); } [Test] public void TestResolveFromFactory() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); ITestFactory testFactory = iocContainer.Resolve(); ITest createdTest = testFactory.Create(); Assert.IsInstanceOf(createdTest); } [Test] public void TestResolveFromFactoryWithParams() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); ITestFactory testFactory = iocContainer.Resolve(); ITest createdTest = testFactory.Create("Test"); Assert.IsInstanceOf(createdTest); } [Test] public void TestResolveFromFactoryWithDefaultParamCreate() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); ITestFactory testFactory = iocContainer.Resolve(); ITest createdTest = testFactory.Create(true); Assert.IsInstanceOf(createdTest); } [Test] public void TestResolveMultitonFromFactory() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); MultitonScope scope1 = new MultitonScope(); MultitonScope scope2 = new MultitonScope(); ITestFactory testFactory = iocContainer.Resolve(); ITest resolvedTest1 = testFactory.Create(scope1); ITest resolvedTest2 = testFactory.Create(scope1); ITest resolvedTest3 = testFactory.Create(scope2); Assert.AreSame(resolvedTest1, resolvedTest2); Assert.AreNotSame(resolvedTest1, resolvedTest3); Assert.AreNotSame(resolvedTest2, resolvedTest3); } [Test] public void TestResolveMultitonFromFactoryClearInstances() { IIocContainer iocContainer = new IocContainer(); iocContainer.Register(RegistrationFactory.Register()); iocContainer.Register(RegistrationFactory.RegisterFactory(iocContainer)); MultitonScope scope1 = new MultitonScope(); MultitonScope scope2 = new MultitonScope(); ITestFactory testFactory = iocContainer.Resolve(); ITest resolvedTest1 = testFactory.Create(scope1); ITest resolvedTest2 = testFactory.Create(scope1); ITest resolvedTest3 = testFactory.Create(scope2); Assert.AreSame(resolvedTest1, resolvedTest2); Assert.AreNotSame(resolvedTest1, resolvedTest3); Assert.AreNotSame(resolvedTest2, resolvedTest3); testFactory.ClearMultitonInstance(); ITest resolvedTest4 = testFactory.Create(scope1); ITest resolvedTest5 = testFactory.Create(scope2); Assert.AreNotSame(resolvedTest1, resolvedTest4); Assert.AreNotSame(resolvedTest2, resolvedTest4); Assert.AreNotSame(resolvedTest3, resolvedTest5); } } }