using System.Linq; using NUnit.Framework; using Assert = ModestTree.Assert; namespace Zenject.Tests.Bindings { [TestFixture] public class TestFromResolve : ZenjectUnitTestFixture { [Test] public void TestTransient() { var foo = new Foo(); Container.BindInstance(foo); Container.Bind().To().FromResolve(); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), foo); } [Test] public void TestIdentifier() { var foo = new Foo(); Container.Bind().WithId("foo").FromInstance(foo); Container.Bind().To().FromResolve("foo"); Assert.IsEqual(Container.Resolve(), Container.ResolveId("foo")); Assert.IsEqual(Container.Resolve(), foo); } [Test] public void TestCached() { Container.Bind().AsTransient(); Container.Bind().To().FromResolve().AsCached(); Assert.IsNotEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestSingle() { var foo = new Foo(); Container.Bind().FromInstance(foo); Container.Bind().To().FromResolve(); Assert.IsEqual(Container.Resolve(), foo); Assert.IsEqual(Container.Resolve(), Container.Resolve()); Assert.IsEqual(Container.Resolve(), Container.Resolve()); } [Test] public void TestNoMatch() { Container.Bind().To().FromResolve(); Assert.Throws(() => Container.Resolve()); } [Test] public void TestSingleFailure() { Container.Bind().AsCached(); Container.Bind().AsCached(); Container.Bind().To().FromResolve(); Assert.Throws(() => Container.Resolve()); } [Test] public void TestInfiniteLoop() { Container.Bind().To().FromResolve().AsSingle(); Assert.Throws(() => Container.Resolve()); } [Test] public void TestResolveManyTransient() { Container.Bind().AsTransient(); Container.Bind().FromInstance(new Foo()); Container.Bind().To().FromResolveAll(); Assert.IsEqual(Container.ResolveAll().Count, 2); } [Test] public void TestResolveManyTransient2() { Container.Bind().AsTransient(); Container.Bind().FromInstance(new Foo()); Container.Bind(typeof(IFoo), typeof(IBar)).To().FromResolveAll(); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.IsEqual(Container.ResolveAll().Count, 2); } [Test] public void TestResolveManyCached() { Container.Bind().AsTransient(); Container.Bind().AsTransient(); Container.Bind().To().FromResolveAll().AsCached(); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.That(Enumerable.SequenceEqual(Container.ResolveAll(), Container.ResolveAll())); } [Test] public void TestResolveManyCached2() { Container.Bind().AsTransient(); Container.Bind().AsTransient(); Container.Bind(typeof(IFoo), typeof(IBar)).To().FromResolveAll().AsCached(); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.That(Enumerable.SequenceEqual(Container.ResolveAll().Cast(), Container.ResolveAll().Cast())); } [Test] public void TestResolveManyCached3() { Container.Bind().AsTransient(); Container.Bind().AsTransient(); Container.Bind().To().FromResolveAll().AsCached(); Container.Bind().To().FromResolveAll().AsCached(); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.IsEqual(Container.ResolveAll().Count, 2); Assert.That(!Enumerable.SequenceEqual(Container.ResolveAll().Cast(), Container.ResolveAll().Cast())); } [Test] public void TestResolveSingleLocal() { var foo1 = new Foo(); var foo2 = new Foo(); Container.Bind().FromInstance(foo1); var subContainer = Container.CreateSubContainer(); subContainer.Bind().FromInstance(foo2); subContainer.Bind().To().FromResolve(); Assert.IsEqual(subContainer.Resolve(), foo2); } [Test] public void TestInjectSource1() { var foo1 = new Foo(); var foo2 = new Foo(); Container.Bind().FromInstance(foo1); var subContainer = Container.CreateSubContainer(); subContainer.Bind().FromInstance(foo2); subContainer.Bind().To().FromResolve(null, InjectSources.Parent); Assert.IsEqual(subContainer.Resolve(), foo1); } [Test] public void TestInjectSource2() { var foo1 = new Foo(); var foo2 = new Foo(); var foo3 = new Foo(); Container.Bind().FromInstance(foo1); var subContainer = Container.CreateSubContainer(); subContainer.Bind().FromInstance(foo2); subContainer.Bind().FromInstance(foo3); subContainer.Bind().To().FromResolveAll(null, InjectSources.Local); Assert.Throws(() => subContainer.Resolve()); Assert.That(Enumerable.SequenceEqual(subContainer.ResolveAll(), new [] { foo2, foo3, })); } interface IBar { } interface IFoo { } class Foo : IFoo, IBar { } } }