public void GetBuildCapabilityForTypeReturnsCapabilityWhenMatchingRuleFound()
        {
            var type = typeof(Person);
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();
            var expected           = new Person();

            var executeStrategy = Substitute.For <IExecuteStrategy>();
            var rule            = Substitute.For <ICreationRule>();

            buildConfiguration.CreationRules.Add(rule);

            executeStrategy.Configuration.Returns(buildConfiguration);
            executeStrategy.Log.Returns(_buildLog);
            rule.IsMatch(type).Returns(true);
            rule.Create(executeStrategy, type).Returns(expected);

            var sut = new CreationRuleBuildAction();

            var actual = sut.GetBuildCapability(buildConfiguration, buildChain, type);

            actual.Should().NotBeNull();
            actual !.SupportsCreate.Should().BeTrue();
            actual.SupportsPopulate.Should().BeFalse();
            actual.AutoPopulate.Should().BeFalse();
            actual.ImplementedByType.Should().Be(rule.GetType());
        }
        public void GetBuildCapabilityForParameterInfoReturnsCapabilityWhenMatchingRuleFound()
        {
            var parameterInfo = typeof(Person).GetConstructors()
                                .First(x => x.GetParameters().FirstOrDefault()?.Name == "firstName").GetParameters().First();
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();
            var expected           = new Person();

            var executeStrategy = Substitute.For <IExecuteStrategy>();
            var rule            = Substitute.For <ICreationRule>();

            buildConfiguration.CreationRules.Add(rule);

            executeStrategy.Configuration.Returns(buildConfiguration);
            executeStrategy.Log.Returns(_buildLog);
            rule.IsMatch(parameterInfo).Returns(true);
            rule.Create(executeStrategy, parameterInfo).Returns(expected);

            var sut = new CreationRuleBuildAction();

            var actual = sut.GetBuildCapability(buildConfiguration, buildChain, parameterInfo) !;

            actual.Should().NotBeNull();
            actual.SupportsCreate.Should().BeTrue();
            actual.SupportsPopulate.Should().BeFalse();
            actual.AutoPopulate.Should().BeFalse();
            actual.ImplementedByType.Should().Be(rule.GetType());
        }
        public void GetBuildCapabilityForTypeThrowsExceptionWithNullType()
        {
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();

            var sut = new CreationRuleBuildAction();

            Action action = () => sut.GetBuildCapability(buildConfiguration, buildChain, (Type)null !);

            action.Should().Throw <ArgumentNullException>();
        }
        public void GetBuildCapabilityForTypeThrowsExceptionWithNullBuildChain()
        {
            var type = typeof(Person);
            var buildConfiguration = new BuildConfiguration();

            var sut = new CreationRuleBuildAction();

            Action action = () => sut.GetBuildCapability(buildConfiguration, null !, type);

            action.Should().Throw <ArgumentNullException>();
        }
        public void GetBuildCapabilityForPropertyInfoThrowsExceptionWithNullBuildChain()
        {
            var propertyInfo       = typeof(Person).GetProperty(nameof(Person.FirstName)) !;
            var buildConfiguration = new BuildConfiguration();

            var sut = new CreationRuleBuildAction();

            Action action = () => sut.GetBuildCapability(buildConfiguration, null !, propertyInfo);

            action.Should().Throw <ArgumentNullException>();
        }
        public void GetBuildCapabilityForParameterInfoThrowsExceptionWithNullBuildChain()
        {
            var parameterInfo = typeof(Person).GetConstructors()
                                .First(x => x.GetParameters().FirstOrDefault()?.Name == "firstName").GetParameters().First();
            var buildConfiguration = new BuildConfiguration();

            var sut = new CreationRuleBuildAction();

            Action action = () => sut.GetBuildCapability(buildConfiguration, null !, parameterInfo);

            action.Should().Throw <ArgumentNullException>();
        }
        public void GetBuildCapabilityForTypeReturnsNullWhenNoRulesExist()
        {
            var type = typeof(Person);
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();

            var executeStrategy = Substitute.For <IExecuteStrategy>();

            executeStrategy.Configuration.Returns(buildConfiguration);
            executeStrategy.Log.Returns(_buildLog);

            var sut = new CreationRuleBuildAction();

            var actual = sut.GetBuildCapability(buildConfiguration, buildChain, type);

            actual.Should().BeNull();
        }
        public void GetBuildCapabilityForParameterInfoReturnsNullWhenNoRulesExist()
        {
            var parameterInfo = typeof(Person).GetConstructors()
                                .First(x => x.GetParameters().FirstOrDefault()?.Name == "firstName").GetParameters().First();
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();

            var executeStrategy = Substitute.For <IExecuteStrategy>();

            executeStrategy.Configuration.Returns(buildConfiguration);
            executeStrategy.Log.Returns(_buildLog);

            var sut = new CreationRuleBuildAction();

            var actual = sut.GetBuildCapability(buildConfiguration, buildChain, parameterInfo);

            actual.Should().BeNull();
        }
        public void GetBuildCapabilityForPropertyInfoReturnsNullWhenNoMatchingRuleFound()
        {
            var propertyInfo       = typeof(Person).GetProperty(nameof(Person.FirstName)) !;
            var buildConfiguration = new BuildConfiguration();
            var buildChain         = new BuildHistory();

            var executeStrategy = Substitute.For <IExecuteStrategy>();
            var rule            = Substitute.For <ICreationRule>();

            buildConfiguration.CreationRules.Add(rule);

            executeStrategy.Configuration.Returns(buildConfiguration);
            executeStrategy.Log.Returns(_buildLog);

            var sut = new CreationRuleBuildAction();

            var actual = sut.GetBuildCapability(buildConfiguration, buildChain, propertyInfo);

            actual.Should().BeNull();
        }