public void CreateParametersCanReturnNullParameter()
        {
            var buildHistory = new BuildHistory();
            var method       = typeof(SimpleConstructor).GetConstructors().First();
            var parameters   = method.GetParameters().OrderBy(x => x.Name);

            var parameterCapability = Substitute.For <IBuildCapability>();
            var processor           = Substitute.For <IBuildProcessor>();
            var parameterResolver   = Substitute.For <IParameterResolver>();
            var buildConfiguration  = Substitute.For <IBuildConfiguration>();

            var sut = new DefaultExecuteStrategy(buildHistory, _buildLog, processor);

            parameterCapability.AutoPopulate.Returns(false);
            parameterCapability.SupportsCreate.Returns(true);
            parameterCapability.SupportsPopulate.Returns(false);
            parameterCapability.ImplementedByType.Returns(GetType());
            parameterCapability.CreateParameter(sut, Arg.Any <ParameterInfo>(), null).Returns(null);
            processor.GetBuildCapability(sut, BuildRequirement.Create,
                                         Arg.Any <ParameterInfo>()).Returns(parameterCapability);
            parameterResolver.GetOrderedParameters(buildConfiguration, method).Returns(parameters);
            buildConfiguration.ParameterResolver.Returns(parameterResolver);

            sut.Initialize(buildConfiguration);

            var actual = sut.CreateParameters(method) !;

            actual.Should().HaveCount(1);
            actual[0].Should().BeNull();
        }
        public void CreateParametersReturnsNullWhenNoOrderedParametersReturned()
        {
            var buildHistory = new BuildHistory();
            var method       = typeof(SlimModel).GetConstructors().First();
            var parameters   = Array.Empty <ParameterInfo>();

            var processor          = Substitute.For <IBuildProcessor>();
            var parameterResolver  = Substitute.For <IParameterResolver>();
            var buildConfiguration = Substitute.For <IBuildConfiguration>();

            parameterResolver.GetOrderedParameters(buildConfiguration, method).Returns(parameters);
            buildConfiguration.ParameterResolver.Returns(parameterResolver);

            var sut = new DefaultExecuteStrategy(buildHistory, _buildLog, processor);

            sut.Initialize(buildConfiguration);

            var actual = sut.CreateParameters(method);

            actual.Should().BeNull();
        }
        public void CreateParametersReturnsOriginalParameterOrderCreatedInOrderOfPriority()
        {
            var buildHistory = new BuildHistory();
            var method       = typeof(OrderedConstructorParameters).GetConstructors().First();
            var parameters   = method.GetParameters().OrderBy(x => x.Name);

            var parameterCapability = Substitute.For <IBuildCapability>();
            var processor           = Substitute.For <IBuildProcessor>();
            var parameterResolver   = Substitute.For <IParameterResolver>();
            var buildConfiguration  = Substitute.For <IBuildConfiguration>();

            var sut = new DefaultExecuteStrategy(buildHistory, _buildLog, processor);

            parameterCapability.AutoPopulate.Returns(false);
            parameterCapability.SupportsCreate.Returns(true);
            parameterCapability.SupportsPopulate.Returns(false);
            parameterCapability.ImplementedByType.Returns(GetType());
            parameterCapability
            .CreateParameter(sut, Arg.Is <ParameterInfo>(x => x.ParameterType == typeof(string)), null)
            .Returns("first", "second", "third", "fourth");
            parameterCapability
            .CreateParameter(sut, Arg.Is <ParameterInfo>(x => x.ParameterType == typeof(Gender)), null)
            .Returns(Gender.Female);
            processor.GetBuildCapability(sut, BuildRequirement.Create,
                                         Arg.Any <ParameterInfo>()).Returns(parameterCapability);
            parameterResolver.GetOrderedParameters(buildConfiguration, method).Returns(parameters);
            buildConfiguration.ParameterResolver.Returns(parameterResolver);

            sut.Initialize(buildConfiguration);

            var actual = sut.CreateParameters(method) !;

            actual.Should().HaveCount(5);
            actual[0].Should().Be("second");
            actual[1].Should().Be("first");
            actual[2].Should().Be("fourth");
            actual[3].Should().Be("third");
            actual[4].Should().Be(Gender.Female);
        }