using LightweightIocContainer; using LightweightIocContainer.Exceptions; using LightweightIocContainer.Interfaces; using LightweightIocContainer.Registrations; using Moq; using NUnit.Framework; namespace Test.LightweightIocContainer { [TestFixture] public class InjectorContainerTest { #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(); IInjectorContainer injectorContainer = new InjectorContainer(); IInjectorContainer returnedContainer = injectorContainer.Install(installerMock.Object); installerMock.Verify(m => m.Install(It.IsAny()), Times.Once); Assert.AreEqual(injectorContainer, returnedContainer); } [Test] public void TestInstallMultiple() { Mock installer1Mock = new Mock(); Mock installer2Mock = new Mock(); Mock installer3Mock = new Mock(); IInjectorContainer injectorContainer = new InjectorContainer(); IInjectorContainer returnedContainer = injectorContainer.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(injectorContainer, returnedContainer); } [Test] public void TestResolveNotRegistered() { IInjectorContainer injectorContainer = new InjectorContainer(); Assert.Throws(() => injectorContainer.Resolve()); } [Test] public void TestResolve() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = injectorContainer.Resolve(); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveWithParams() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = injectorContainer.Resolve("Test", new Test()); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveWithMissingParam() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); injectorContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests ITest resolvedTest = injectorContainer.Resolve("Test"); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveReflection() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); object resolvedTest = injectorContainer.Resolve(typeof(ITest), null); Assert.IsInstanceOf(resolvedTest); } [Test] public void TestResolveSingleton() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register(Lifestyle.Singleton)); ITest resolvedTest = injectorContainer.Resolve(); ITest secondResolvedTest = injectorContainer.Resolve(); Assert.AreEqual(resolvedTest, secondResolvedTest); } [Test] public void TestResolveTransient() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); ITest resolvedTest = injectorContainer.Resolve(); ITest secondResolvedTest = injectorContainer.Resolve(); Assert.AreNotEqual(resolvedTest, secondResolvedTest); } [Test] public void TestResolveFactory() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); ITestFactory testFactory = injectorContainer.Resolve(); Assert.IsInstanceOf(testFactory); } [Test] public void TestResolveFromFactory() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); ITestFactory testFactory = injectorContainer.Resolve(); ITest createdTest = testFactory.Create(); Assert.IsInstanceOf(createdTest); } [Test] public void TestResolveFromFactoryWithParams() { IInjectorContainer injectorContainer = new InjectorContainer(); injectorContainer.Register(RegistrationFactory.Register()); injectorContainer.Register(RegistrationFactory.Register()); //this registration is abnormal and should only be used in unit tests injectorContainer.Register(RegistrationFactory.RegisterFactory(injectorContainer)); ITestFactory testFactory = injectorContainer.Resolve(); ITest createdTest = testFactory.Create("Test"); Assert.IsInstanceOf(createdTest); } } }