using NUnit.Framework; using StyletIoC; using System.Collections.Generic; using System.Linq; namespace StyletUnitTests.StyletIoC.SubNamespace { public interface I1Factory { StyletIoCFactoryTests.I1 GetI1(); } } namespace StyletUnitTests.StyletIoC { [TestFixture] public class StyletIoCFactoryTests { public interface I1 { } public class C1 : I1 { } public class C12 : I1 { } public interface I1Factory { I1 GetI1(); } public interface I1Factory2 { I1 GetI1(string key = null); } public interface I1Factory3 { IEnumerable GetAllI1s(); } public interface IFactoryWithKeys { [Inject("Key")] I1 GetI1WithoutKey(); [Inject("Key")] I1 GetI1WithKey(string key); } interface IPrivateFactory { } public interface IFactoryWithBadMethod { C1 MethodWithArgs(bool arg); } public interface IFactoryWithVoidMethod { void Method(); } public interface IGenericFactory { T GetI1(); } [Test] public void CreatesImplementationWithoutKey() { var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get(); Assert.IsNotNull(factory); var result = factory.GetI1(); Assert.IsInstanceOf(result); } [Test] public void CreatesImplementationWithKey() { var builder = new StyletIoCBuilder(); builder.Bind().To().WithKey("key"); builder.Bind().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get(); Assert.IsNotNull(factory); var result = factory.GetI1("key"); Assert.IsInstanceOf(result); } [Test] public void CreatesAllImplementations() { var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind().To(); builder.Bind().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get(); Assert.IsNotNull(factory); var results = factory.GetAllI1s().ToList(); Assert.AreEqual(2, results.Count); Assert.IsInstanceOf(results[0]); Assert.IsInstanceOf(results[1]); } [Test] public void UsesAttributeKeyIfKeyParameterNotGiven() { var builder = new StyletIoCBuilder(); builder.Bind().To().WithKey("Key"); builder.Bind().To(); builder.Bind().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get(); var result = factory.GetI1WithoutKey(); Assert.IsInstanceOf(result); } [Test] public void UsesParameterKeyInPreferenceToAttributeKey() { var builder = new StyletIoCBuilder(); builder.Bind().To().WithKey("Key2"); builder.Bind().To(); builder.Bind().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get(); var result = factory.GetI1WithKey("Key2"); Assert.IsInstanceOf(result); } [Test] public void ThrowsIfServiceTypeIsNotInterface() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); Assert.Throws(() => builder.BuildContainer()); } [Test] public void ThrowsIfInterfaceNotPublic() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); Assert.Throws(() => builder.BuildContainer()); } [Test] public void ThrowsIfMethodHasArgumentOtherThanString() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); Assert.Throws(() => builder.BuildContainer()); } [Test] public void ThrowsIfMethodReturningVoid() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); Assert.Throws(() => builder.BuildContainer()); } [Test] public void BindsWithKey() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory().WithKey("hello"); var ioc = builder.BuildContainer(); Assert.Throws(() => ioc.Get()); Assert.NotNull(ioc.Get("hello")); } [Test] public void ThrowsIfFactoryTypeIsUnboundGeneric() { var builder = new StyletIoCBuilder(); Assert.Throws(() => builder.Bind(typeof(IGenericFactory<>)).ToAbstractFactory()); } [Test] public void BoundGenericFactoriesWork() { var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind>().ToAbstractFactory(); var ioc = builder.BuildContainer(); var factory = ioc.Get>(); Assert.IsInstanceOf(factory.GetI1()); } [Test] public void SupportsTwoInterfacesWithTheSameNames() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); builder.Bind().ToAbstractFactory(); Assert.DoesNotThrow(() => builder.BuildContainer()); } [Test] public void SupportsBuildingTheSameBuilderTwice() { var builder = new StyletIoCBuilder(); builder.Bind().ToAbstractFactory(); builder.BuildContainer(); Assert.DoesNotThrow(() => builder.BuildContainer()); } } }