using NUnit.Framework; using StyletIoC; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StyletUnitTests { [TestFixture] public class StyletIoCGetAllTests { interface IC1 { } class C11 : IC1 { } class C12 : IC1 { } class C13 : IC1 { } interface IC2 { } class C21 : IC2 { } class C22 : IC2 { } class C3 { public List C2s; public C3(IEnumerable c2s) { this.C2s = c2s.ToList(); } } // Tests that Bind() and friends worked was done in StyletIoCGetSingleTests [Test] public void ImplementationTransientBindingsResolveGeneric() { var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind().To(); builder.Bind().To(); builder.Bind().To(); var ioc = builder.BuildContainer(); var results1 = ioc.GetAll().ToList(); var results2 = ioc.GetAll().ToList(); Assert.AreEqual(3, results1.Count); Assert.IsInstanceOf(results1[0]); Assert.IsInstanceOf(results1[1]); Assert.IsInstanceOf(results1[2]); Assert.That(results1, Is.Not.EquivalentTo(results2)); } [Test] public void ImplementationTransientBindingsResolveTyped() { var builder = new StyletIoCBuilder(); builder.Bind(typeof(IC1)).To(typeof(C11)); builder.Bind(typeof(IC1)).To(typeof(C12)); builder.Bind(typeof(IC1)).To(typeof(C13)); builder.Bind(typeof(IC2)).To(typeof(C21)); var ioc = builder.BuildContainer(); var results1 = ioc.GetAll(typeof(IC1)).ToList(); var results2 = ioc.GetAll(typeof(IC1)).ToList(); Assert.AreEqual(3, results1.Count); Assert.IsInstanceOf(results1[0]); Assert.IsInstanceOf(results1[1]); Assert.IsInstanceOf(results1[2]); Assert.That(results1, Is.Not.EquivalentTo(results2)); } [Test] public void SingletonBindingsResolveGeneric() { var builder = new StyletIoCBuilder(); builder.Bind().To().InSingletonScope(); builder.Bind().To().InSingletonScope(); builder.Bind().To().InSingletonScope(); builder.Bind().To().InSingletonScope(); var ioc = builder.BuildContainer(); var results1 = ioc.GetAll().ToList(); var results2 = ioc.GetAll().ToList(); Assert.AreEqual(3, results1.Count); Assert.IsInstanceOf(results1[0]); Assert.IsInstanceOf(results1[1]); Assert.IsInstanceOf(results1[2]); Assert.That(results1, Is.EquivalentTo(results2)); } [Test] public void SingletonBindingsResolveTyped() { var builder = new StyletIoCBuilder(); builder.Bind(typeof(IC1)).To(typeof(C11)).InSingletonScope(); builder.Bind(typeof(IC1)).To(typeof(C12)).InSingletonScope(); builder.Bind(typeof(IC1)).To(typeof(C13)).InSingletonScope(); builder.Bind(typeof(IC2)).To(typeof(C21)).InSingletonScope(); var ioc = builder.BuildContainer(); var results1 = ioc.GetAll(typeof(IC1)).ToList(); var results2 = ioc.GetAll(typeof(IC1)).ToList(); Assert.AreEqual(3, results1.Count); Assert.IsInstanceOf(results1[0]); Assert.IsInstanceOf(results1[1]); Assert.IsInstanceOf(results1[2]); Assert.That(results1, Is.EquivalentTo(results2)); } [Test] public void GetAllReturnsSingleInstanceIfOnlyOneRegistration() { var builder = new StyletIoCBuilder(); builder.Bind().To(); var ioc = builder.BuildContainer(); var results = ioc.GetAll().ToList(); Assert.AreEqual(1, results.Count); Assert.IsInstanceOf(results[0]); } [Test] public void GetAllThrowsIfNoRegistrationsFound() { var builder = new StyletIoCBuilder(); var ioc = builder.BuildContainer(); Assert.Throws(() => ioc.GetAll()); } [Test] public void GetAllThrowsIfTypeIsNull() { var builder = new StyletIoCBuilder(); var ioc = builder.BuildContainer(); Assert.Throws(() => ioc.GetAll(null)); } // Also cover GetTypeOrAll here [Test] public void GetTypeOrAllReturnsSingleIfOneRegistration() { var builder = new StyletIoCBuilder(); builder.Bind().To(); var ioc = builder.BuildContainer(); var result = ioc.GetTypeOrAll(); Assert.IsInstanceOf(result); } [Test] public void GetTypeOrAllReturnsCollectionIfManyRegistrations() { var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind().To(); var ioc = builder.BuildContainer(); var result = ioc.GetTypeOrAll>(); Assert.IsInstanceOf>(result); var list = ((IEnumerable)result).ToList(); Assert.AreEqual(2, list.Count); Assert.IsInstanceOf(list[0]); Assert.IsInstanceOf(list[1]); } [Test] public void GetTypeOrAllThrowsIfTypeIsNull() { var builder = new StyletIoCBuilder(); var ioc = builder.BuildContainer(); Assert.Throws(() => ioc.GetTypeOrAll(null)); } [Test] public void CachedGetAllExpressionWorks() { // The GetAll creator's instance expression can be cached. This ensures that that works var builder = new StyletIoCBuilder(); builder.Bind().To(); builder.Bind().To(); builder.Bind().ToSelf(); var ioc = builder.BuildContainer(); var c2s = ioc.GetAll().ToList(); var c3 = ioc.Get(); Assert.NotNull(c3.C2s); Assert.AreEqual(2, c3.C2s.Count); Assert.AreNotEqual(c2s[0], c3.C2s[0]); Assert.AreNotEqual(c2s[1], c3.C2s[1]); } } }