using System; using System.Collections.Generic; using NUnit.Framework; using Assert = ModestTree.Assert; namespace Zenject.Tests.Bindings { [TestFixture] public class TestFrom : ZenjectUnitTestFixture { [Test] public void TestSelfSingle() { Container.Bind().AsSingle().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestSelfSingleExplicit() { Container.Bind().ToSelf().FromNew().AsSingle().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestSelfTransient() { Container.Bind().AsTransient().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestSelfCached() { Container.Bind().AsSingle().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestConcreteSingle() { Container.Bind(typeof(Foo), typeof(IFoo)).To().AsSingle().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsNotNull(Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestConcreteTransient() { Container.Bind().To().AsTransient().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestConcreteTransient2() { Container.Bind().To().AsTransient().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestConcreteCached() { Container.Bind().AsCached().NonLazy(); Container.Bind().To().AsCached().NonLazy(); Assert.IsNotNull(Container.Resolve()); Assert.IsNotNull(Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestDuplicateBindingsFail() { Container.Bind().AsSingle(); Container.Bind().AsSingle(); Assert.Throws( () => Container.FlushBindings()); } [Test] public void TestConcreteMultipleTransient() { Container.Bind().To(typeof(Foo), typeof(Bar)).AsTransient().NonLazy(); var foos = Container.ResolveAll(); Assert.IsEqual(foos.Count, 2); Assert.That(foos[0] is Foo); Assert.That(foos[1] is Bar); var foos2 = Container.ResolveAll(); Assert.IsNotEqual(foos[0], foos2[0]); Assert.IsNotEqual(foos[1], foos2[1]); } [Test] public void TestConcreteMultipleSingle() { Container.Bind().To(typeof(Foo), typeof(Bar)).AsSingle().NonLazy(); var foos = Container.ResolveAll(); Assert.IsEqual(foos.Count, 2); Assert.That(foos[0] is Foo); Assert.That(foos[1] is Bar); var foos2 = Container.ResolveAll(); Assert.IsEqual(foos[0], foos2[0]); Assert.IsEqual(foos[1], foos2[1]); } [Test] public void TestMultipleBindingsSingleFail1() { Container.Bind(typeof(IFoo), typeof(IBar)).AsSingle(); Assert.Throws(() => Container.FlushBindings()); } [Test] public void TestMultipleBindingsSingleFail2() { Assert.Throws(() => Container.Bind(typeof(IFoo), typeof(IBar)).To().AsSingle()); } [Test] public void TestMultipleBindingsSingle() { Container.Bind(typeof(IFoo), typeof(IBar)).To().AsSingle().NonLazy(); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.That(Container.Resolve() is Foo); } [Test] public void TestMultipleBindingsTransient() { Container.Bind(typeof(IFoo), typeof(IBar)).To().AsTransient().NonLazy(); Assert.That(Container.Resolve() is Foo); Assert.That(Container.Resolve() is Foo); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestMultipleBindingsCached() { Container.Bind(typeof(IFoo), typeof(IBar)).To().AsSingle().NonLazy(); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestMultipleBindingsConcreteMultipleSingle() { Container.Bind(typeof(IFoo), typeof(IBar)) .To(new List {typeof(Foo), typeof(Bar)}).AsSingle().NonLazy(); var foos = Container.ResolveAll(); var bars = Container.ResolveAll(); Assert.IsEqual(foos.Count, 2); Assert.IsEqual(bars.Count, 2); Assert.That(foos[0] is Foo); Assert.That(foos[1] is Bar); Assert.IsEqual(foos[0], bars[0]); Assert.IsEqual(foos[1], bars[1]); } [Test] public void TestMultipleBindingsConcreteMultipleTransient() { Container.Bind(typeof(IFoo), typeof(IBar)).To(new List {typeof(Foo), typeof(Bar)}).AsTransient().NonLazy(); var foos = Container.ResolveAll(); var bars = Container.ResolveAll(); Assert.IsEqual(foos.Count, 2); Assert.IsEqual(bars.Count, 2); Assert.That(foos[0] is Foo); Assert.That(foos[1] is Bar); Assert.IsNotEqual(foos[0], bars[0]); Assert.IsNotEqual(foos[1], bars[1]); } [Test] public void TestMultipleBindingsConcreteMultipleCached() { Container.Bind(typeof(IFoo), typeof(IBar)).To(new List {typeof(Foo), typeof(Bar)}).AsCached().NonLazy(); Container.Bind().AsCached().NonLazy(); Container.Bind().AsCached().NonLazy(); var foos = Container.ResolveAll(); var bars = Container.ResolveAll(); Assert.IsEqual(foos.Count, 2); Assert.IsEqual(bars.Count, 2); Assert.That(foos[0] is Foo); Assert.That(foos[1] is Bar); Assert.IsEqual(foos[0], bars[0]); Assert.IsEqual(foos[1], bars[1]); Assert.IsNotEqual(foos[0], Container.Resolve()); Assert.IsNotEqual(foos[1], Container.Resolve()); } interface IBar { } interface IFoo { } class Foo : IFoo, IBar { } class Bar : IFoo, IBar { } public class Qux { } } }