public void GetInstance_ResolvingAnInstanceTwice_CallsTheInterceptorDelegateTwice()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetInstance <Container>();
            container.GetInstance <Container>();

            // Assert
            Assert.AreEqual(2, resolvedInstances.Count, resolvedInstances.ToString());
        }
        public void GetInstance_ThreeResolveInterceptorsRegistered_FlowsInstanceCorrectlyThroughInterceptors()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);
            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);
            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetInstance <Container>();

            // Assert
            Assert.AreSame(container, resolvedInstances.Last().Instance);
        }
        public void GetInstance_ThreeResolveInterceptorsRegistered_CallsAllThreeInterceptors()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);
            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);
            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetInstance <Container>();

            // Assert
            Assert.AreEqual(3, resolvedInstances.Count, resolvedInstances.ToString());
        }
        public void InstanceProducerGetInstance_ResolvingAnInstance_CallsTheInterceptorWithADeletateThatReturnsTheExpectedInstance()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetRegistration(typeof(Container)).GetInstance();

            object actualInstance = resolvedInstances.Single().Instance;

            // Assert
            AssertThat.IsInstanceOfType(typeof(Container), actualInstance, resolvedInstances.ToString());
        }
        public void GetInstance_ResolvingAnInstance_CallsTheInterceptorWithTheExpectedInitializationContext()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetInstance <Container>();

            InitializationContext actualContext = resolvedInstances.First().Context;

            // Assert
            Assert.AreSame(Lifestyle.Singleton, actualContext.Registration.Lifestyle, resolvedInstances.ToString());
            Assert.AreEqual(typeof(Container), actualContext.Registration.ImplementationType, resolvedInstances.ToString());
        }
        public void ContainerGetInstance_ResolvingAnInstanceWithDependencies_OnlyCallsTheDelegateForThisRootInstance()
        {
            // Arrange
            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(resolvedInstances.Intercept, Always);

            // Act
            container.GetInstance <Dep1>();

            object actualInstance = resolvedInstances.First().Instance;

            // Assert
            AssertThat.IsInstanceOfType(typeof(Dep1), actualInstance, resolvedInstances.ToString());
            Assert.AreEqual(1, resolvedInstances.Count, resolvedInstances.ToString());
        }
        public void GetInstance_ThreeResolveInterceptorsRegisteredWithTwoPredicateFalse_AppliesTheCorrectInterceptor()
        {
            // Arrange
            string expected = "B";
            string actual   = string.Empty;

            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(new Interceptor(() => actual += "A").Intercept, c => false);
            container.Options.RegisterResolveInterceptor(new Interceptor(() => actual += "B").Intercept, Always);
            container.Options.RegisterResolveInterceptor(new Interceptor(() => actual += "C").Intercept, c => false);

            // Act
            container.GetInstance <Container>();

            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void GetInstance_ThreeResolveInterceptorsRegistered_InterceptorsAreWrappedInOrderOfRegistration()
        {
            // Arrange
            string expectedOrder = "CBA";
            string actualOrder   = string.Empty;

            var resolvedInstances = new InstanceInitializationDataCollection();

            var container = new Container();

            container.Options.RegisterResolveInterceptor(new Interceptor(() => actualOrder += "A").Intercept, Always);
            container.Options.RegisterResolveInterceptor(new Interceptor(() => actualOrder += "B").Intercept, Always);
            container.Options.RegisterResolveInterceptor(new Interceptor(() => actualOrder += "C").Intercept, Always);

            // Act
            container.GetInstance <Container>();

            // Assert
            Assert.AreEqual(expectedOrder, actualOrder);
        }