using LightweightIocContainer; using LightweightIocContainer.Exceptions; using LightweightIocContainer.Interfaces; 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 { } public interface ITestFactory { ITest Create(); ITest Create(string name); } private class Test : ITest { } private class TestConstructor : ITest { public TestConstructor(string name, Test test) { } } #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 TestResolveNotRegistered() { IIocContainer iocContainer = new IocContainer(); Assert.Throws(() => iocContainer.Resolve()); } [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 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); } } }