public void ParentScopeShouldDisposeAllChildScopesAndObjects()
        {
            Disposable parentObj, childObj, grandChildObj, siblingObj;

            using (var parent = new DisposingContainerScope(new Container()))
            {
                var child      = parent.CreateScope();
                var grandChild = child.CreateScope();
                var sibling    = parent.CreateScope();

                parentObj = parent.ActivateImplicit(new Disposable());

                childObj = child.ActivateImplicit(new Disposable());

                grandChildObj = grandChild.ActivateImplicit(new Disposable());

                siblingObj = sibling.ActivateImplicit(new Disposable());
            }

            Assert.All(new[] { parentObj, childObj, grandChildObj, siblingObj },
                       d =>
            {
                Assert.True(d.Disposed);
                Assert.Equal(1, d.DisposedCount);
            });
        }
        public void ShouldDisposeImplicitIDisposable()
        {
            Disposable disposable;

            using (var scope = new DisposingContainerScope(new Container()))
            {
                disposable = scope.ActivateImplicit(new Disposable());
            }

            Assert.True(disposable.Disposed);
            Assert.Equal(1, disposable.DisposedCount);
        }
        public void ShouldDisposeExplicitIDisposable()
        {
            Disposable disposable;

            using (var scope = new DisposingContainerScope(new Container()))
            {
                disposable = scope.ActivateExplicit(
                    new ResolveContext(scope, typeof(Disposable)),
                    new TestTarget().Id,
                    c => new Disposable());
            }

            Assert.True(disposable.Disposed);
            Assert.Equal(1, disposable.DisposedCount);
        }
        public void ImplicitlyScopedObjectShouldNotBeSameAsExplicitlyScopedObject()
        {
            Disposable explicitlyScoped, implicitlyScoped;

            using (var scope = new DisposingContainerScope(new Container()))
            {
                Func <ResolveContext, Disposable> factory = c => new Disposable();
                explicitlyScoped = scope.ActivateExplicit(
                    new ResolveContext(scope, typeof(Disposable)),
                    new TestTarget().Id,
                    factory);

                implicitlyScoped = scope.ActivateImplicit(
                    new Disposable());

                Assert.NotSame(explicitlyScoped, implicitlyScoped);
            }
            Assert.True(explicitlyScoped.Disposed);
            Assert.True(implicitlyScoped.Disposed);
        }
        public void ShouldCreateOnlyOneExplicitNonDisposable()
        {
            // note - this works because we pass the same target both times
            using (var scope = new DisposingContainerScope(new Container()))
            {
                Func <ResolveContext, NoCtor> factory = c => new NoCtor();
                var target = new TestTarget();
                var result = scope.ActivateExplicit(
                    new ResolveContext(scope, typeof(NoCtor)),
                    target.Id,
                    factory);

                Assert.NotNull(result);

                var result2 = scope.ActivateExplicit(
                    new ResolveContext(scope, typeof(NoCtor)),
                    target.Id,
                    factory);

                Assert.Same(result, result2);
            }
        }
        public void ChildScopeShouldDisposeItsOwnImplicitDisposable()
        {
            using (var scope = new DisposingContainerScope(new Container()))
            {
                Disposable inner1, inner2;

                using (var childScope = scope.CreateScope())
                {
                    inner1 = childScope.ActivateImplicit(new Disposable());
                }

                Assert.True(inner1.Disposed);
                Assert.Equal(1, inner1.DisposedCount);

                using (var childScope = scope.CreateScope())
                {
                    inner2 = childScope.ActivateImplicit(new Disposable());
                }

                Assert.True(inner2.Disposed);
                Assert.Equal(1, inner2.DisposedCount);
            }
        }
        public void ChildScopeShouldGetItsOwnExplicitInstance()
        {
            using (var scope = new DisposingContainerScope(new Container()))
            {
                Func <ResolveContext, NoCtor> factory = c => new NoCtor();
                var target = new TestTarget();
                var result = scope.ActivateExplicit(
                    new ResolveContext(scope, typeof(NoCtor)),
                    target.Id,
                    factory);

                Assert.NotNull(result);

                using (var childScope = scope.CreateScope())
                {
                    var result2 = childScope.ActivateExplicit(
                        new ResolveContext(childScope, typeof(NoCtor)),
                        target.Id,
                        factory);

                    Assert.NotSame(result, result2);
                }
            }
        }