public void For_WithCode_When_ThereAre2ValidationTasks_Then_CodeIsChangedInLastValidationTask()
        {
            // Arrange:
            var memberInfo      = CreateTestMemberInfo();
            var validator       = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            var validationTasks = new List <ValidationTask>
            {
                new ValidationTask(Mock.Of <IValidator>(), false),
                new ValidationTask(Mock.Of <IValidator>(), false)
            };

            validator.AddValidationTasksTestMethod(validationTasks);
            const string code = "SOME CODE";

            // Act:
            validator.WithCode(code);

            // Assert:
            var resultValidationTasks = validator.GetValidationTasksTestMethod();

            resultValidationTasks.Count.Should().Be(2);
            resultValidationTasks.First().ErrorTransformation.OverriddenCode.Should().BeNull();
            resultValidationTasks.Skip(1).First().ErrorTransformation
            .OverriddenCode.Should().Be(code);
        }
        public void For_SetValidator_When_OtherValidatorIsNull_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act:
            Assert.Throws <ArgumentNullException>(() => validator.SetValidator(null));
        }
        public void For_WithMessage_When_ProvidedMessageIsNull_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act & Assert:
            Assert.Throws <ArgumentNullException>(() => validator.WithMessage(null));
        }
        public void For_WithCode_When_ProvidedCodeIsNull_Then_ExceptionIsNotThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act & Assert:
            Assert.DoesNotThrow(() => validator.WithCode(null));
        }
        public void For_AddRule_When_ErrorMessageIsNull_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            Predicate <string> anyPredicate = s => s != null;

            // Act:
            Assert.Throws <ArgumentNullException>(() => validator.AddRule(anyPredicate, null, null));
        }
        public void For_AddRule_When_PredicateIsNull_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            Predicate <string> predicate = null;

            // Act:
            Assert.Throws <ArgumentNullException>(() => validator.AddRule(predicate, It.IsAny <string>(), null));
        }
        public void For_SetValidator_When_PassedValidatorReferenceConcernsTargetValidator_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act & Assert:
            var exception = Assert.Throws <ArgumentException>(() => validator.SetValidator(validator));

            exception.Message.Should().Contain("Detected circular reference");
        }
        public void For_SetPropertyDisplayName_When_ProvidedDisplayNameIsInvalid_Then_ExceptionIsThrown(string propertyDisplayName)
        {
            // Arrange:
            var memberInfo          = CreateTestMemberInfo();
            var validator           = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            var previousDisplayName = validator.PropertyDisplayName;

            // Act & Assert:
            Assert.Throws(Is.AssignableTo <Exception>(), () => validator.SetPropertyDisplayName(propertyDisplayName));
            previousDisplayName.Should().Be("SomeProperty");
        }
        public void For_Ctor_When_ProvidedMemberInfoValueIsValid_Then_ValidatorIsInitialized()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();

            // Act:
            var validator = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Assert:
            validator.Member.IsProperty.Should().BeTrue();
            validator.Member.Name.Should().Be("SomeProperty");
            validator.PropertyDisplayName.Should().Be("SomeProperty");
        }
        public void For_StopValidationAfterFailure_When_ThereAreNoValidationTasks_Then_ConstraintIsNotAppliedToAnyValidationTask()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act:
            validator.StopValidationAfterFailure();

            // Assert:
            var validationTasks = validator.GetValidationTasksTestMethod();

            validationTasks.Count.Should().Be(0);
        }
        public void For_SetValidator_When_ValidatorCanBeSet_Then_ItIsAddedToValidationTasksList()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);

            // Act:
            validator.SetValidator(Mock.Of <ISyncValidator <string> >());

            // Assert:
            var validationTasks = validator.GetValidationTasksTestMethod();

            validationTasks.Count.Should().Be(1);
        }
        public void For_WithCode_When_ThereAreNoValidationTasks_Then_MessageIsNotOverridenForAnyValidationTask()
        {
            // Arrange:
            var          memberInfo = CreateTestMemberInfo();
            var          validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            const string code       = "SOME CODE";

            // Act:
            validator.WithCode(code);

            // Assert:
            var validationTasks = validator.GetValidationTasksTestMethod();

            validationTasks.Count.Should().Be(0);
        }
        public void For_SetPropertyDisplayName_When_ProvidedDisplayNameIsValid_Then_ItIsSet()
        {
            // Arrange:
            var          memberInfo          = CreateTestMemberInfo();
            var          validator           = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            const string propertyDisplayName = "SOME_PROPERTY_NAME";
            var          previousDisplayName = validator.PropertyDisplayName;

            // Act:
            validator.SetPropertyDisplayName(propertyDisplayName);

            // Assert:
            previousDisplayName.Should().Be("SomeProperty");
            validator.PropertyDisplayName.Should().Be(propertyDisplayName);
        }
        public void For_SetValidator_When_OtherValidatorIsAlreadySet_Then_ExceptionIsThrown()
        {
            // Arrange:
            var memberInfo     = CreateTestMemberInfo();
            var validator      = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            var validationTask = new ValidationTask(Mock.Of <IValidator>(), true);

            validator.AddValidationTasksTestMethod(new List <ValidationTask> {
                validationTask
            });

            // Act:
            var exception = Assert.Throws <InvalidOperationException>(() =>
                                                                      validator.SetValidator(Mock.Of <ISyncValidator <string> >()));

            exception.Message.Should().Contain("There is already set other validator");
        }
        public void For_AddRule_When_ProvidedArgumentsAreValid_Then_ValidationTaskIsAdded()
        {
            // Arrange:
            var memberInfo = CreateTestMemberInfo();
            var validator  = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            Predicate <string> anyPredicate = s => s != null;
            const string       errorMessage = "SOME ERROR MESSAGE";

            // Act:
            validator.AddRule(anyPredicate, errorMessage, null);

            // Assert:
            validator.GetValidationTasksTestMethod().Count.Should().Be(1);
            var validationTask = validator.GetValidationTasksTestMethod().First();

            validationTask.IsOtherValidator.Should().Be(false);
            validationTask.StopValidationAfterFailure.Should().Be(false);
            validationTask.Validator.Should().NotBeNull();
        }
        public void For_StopValidationAfterFailure_When_ThereAre2ValidationTasks_Then_ConstraintIsAppliedToLastValidationTask()
        {
            // Arrange:
            var memberInfo      = CreateTestMemberInfo();
            var validator       = new PropertyValidatorBaseTestImpl <string>(memberInfo);
            var validationTasks = new List <ValidationTask>
            {
                new ValidationTask(Mock.Of <IValidator>(), false),
                new ValidationTask(Mock.Of <IValidator>(), false)
            };

            validator.AddValidationTasksTestMethod(validationTasks);

            // Act:
            validator.StopValidationAfterFailure();

            // Assert:
            var resultValidationTasks = validator.GetValidationTasksTestMethod();

            resultValidationTasks.Count.Should().Be(2);
            resultValidationTasks.First().StopValidationAfterFailure.Should().BeFalse();
            resultValidationTasks.Skip(1).First().StopValidationAfterFailure.Should().BeTrue();
        }