public void IsEmail_GivenValidField_DontReturnErrors(string email)
        {
            var person = new Person() { Email = email };

            var errors = new Validation<Person>(person)
                .IsEmail(x => x.Email)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void HasSmallDateTime_GivenValidNullableField_DontReturnErrors(int year, int month, int day)
        {
            var person = new Person() { Death = new DateTime(year, month, day) };

            var errors = new Validation<Person>(person)
                .IsSmallDateTime(x => x.Death)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsUnique_GivenEmptyEmailField_DontReturnErrors()
        {
            var person = new Person() { Id = 2, Name = "alex" };

            var errors = new Validation<Person>(person, context)
                .IsUnique(x => x.Email)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsRequired_GivenValidInt_DontReturnErrors()
        {
            var person = new Person() { Age = 21 };

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Age)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsUnique_GivenSameNameAndSameId_DontReturnErrors()
        {
            var person = new Person() { Id = 1, Name = "fernando" };

            var errors = new Validation<Person>(person, context)
                .IsUnique(x => x.Name)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void HasCustomValidation_GivenSimpleFalseCondition_ReturnErrors()
        {
            var person = new Person();

            var errors = new Validation<Person>(person, context)
                .HasCustomValidation(x => false, "Email", "Preencha o campo Email corretamente")
                .ToList();

            Assert.Equal("Preencha o campo Email corretamente", errors[0].Message);
        }
        public void IsRequired_GivenValidDateTime_DontReturnErrors()
        {
            var person = new Person() { Birth = new DateTime(1990, 5, 15) };

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Birth)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void HasCustomValidation_GivenTrueCondition_DontReturnErrors()
        {
            var person = new Person() { Id = 2, Age = 20, Email = "*****@*****.**" };

            var errors = new Validation<Person>(person, context)
                .HasCustomValidation(x => true, "Email", "Preencha o campo Email corretamente")
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void Matches_GivenValidString_DontReturnErrors(string pis)
        {
            var person = new Person() { Pis = pis };

            var errors = new Validation<Person>(person)
                .Matches(x => x.Pis, @"^\d+$", "Error {0}")
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsCnpj_GivenValidField_DontReturnErrors(string cnpj)
        {
            var person = new Person() { Cnpj = cnpj };

            var errors = new Validation<Person>(person)
                .IsCnpj(x => x.Cnpj)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsTimespan_GivenValidField_DontReturnErrors(string timespan)
        {
            var person = new Person() { Hour = timespan };

            var errors = new Validation<Person>(person)
                .IsTimespan(x => x.Hour)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsBetween_GivenValidFloatValue_DontReturnErrors(int height)
        {
            var person = new Person() { Id = 2, Height = height};

            var errors = new Validation<Person>(person, context)
                .IsBetween(x => x.Height, 100, 250)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsRequired_GivenValidString_DontReturnErrors()
        {
            var person = new Person() { Name = "Fernando" };

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Name)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsUnique_GivenNewAgeAndSameId_DontReturnErrors()
        {
            var person = new Person() { Id = 1, Age = 25 };

            var errors = new Validation<Person>(person, context)
                .IsUnique(x => x.Age)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsBetween_GivenValidIntValue_DontReturnErrors(int age)
        {
            var person = new Person() { Id = 2, Age = age };

            var errors = new Validation<Person>(person, context)
                .IsBetween(x => x.Age, 18, 60)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsPis_GivenValidField_DontReturnErrors(string pis)
        {
            var person = new Person() { Pis = pis };

            var errors = new Validation<Person>(person)
                .IsPis(x => x.Pis)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void HasMaxLength_GivenValidField_DontReturnErrors(string name, int maxLength)
        {
            var person = new Person() { Name = name };

            var errors = new Validation<Person>(person)
                .HasMaxLength(x => x.Name, maxLength)
                .ToList();

            Assert.Equal(0, errors.Count);
        }
        public void IsCnpj_GivenInvalidField_ReturnError(string cnpj)
        {
            var person = new Person() { Cnpj = cnpj };

            var errors = new Validation<Person>(person)
                .IsCnpj(x => x.Cnpj)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Cnpj", errors[0].Property);
        }
        public void IsTimespan_GivenInvalidField_ReturnError(string timespan)
        {
            var person = new Person() { Hour = timespan };

            var errors = new Validation<Person>(person)
                .IsTimespan(x => x.Hour)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Hour", errors[0].Property);
        }
        public void IsRequired_GivenEmptyDateTime_ReturnError()
        {
            var person = new Person() { Birth = new DateTime() };

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Birth)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Birth", errors[0].Property);
        }
        public void HasMaxLength_GivenInvalidExpression_ThrowsException()
        {
            var person = new Person();

            Assert.Throws<ArgumentException>("expression", () =>
            {
                var erros = new Validation<Person>(person)
                    .HasMaxLength(x => "", 100)
                    .ToList();
            });
        }
        public void IsPis_GivenInvalidExpression_ThrowsException()
        {
            var person = new Person();

            Assert.Throws<ArgumentException>("expression", () =>
            {
                var erros = new Validation<Person>(person)
                    .IsPis(x => "")
                    .ToList();
            });
        }
        public void IsRequired_GivenEmptyString_ReturnError(string name)
        {
            var person = new Person() { Name = name };

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Name)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Name", errors[0].Property);
        }
        public void HasMaxLength_GivenInvalidLength_ThrowsException(int length)
        {
            var person = new Person();

            Assert.Throws<ArgumentOutOfRangeException>("maxLength", () =>
            {
                var erros = new Validation<Person>(person)
                    .HasMaxLength(x => x.Name, length)
                    .ToList();
            });
        }
        public void IsPis_GivenInvalidField_ReturnError(string pis)
        {
            var person = new Person() { Pis = pis };

            var errors = new Validation<Person>(person)
                .IsPis(x => x.Pis)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Pis", errors[0].Property);
        }
        public void HasMaxLength_GivenInvalidField_ReturnError()
        {
            var person = new Person() { Name = "Fernando" };

            var errors = new Validation<Person>(person)
                .HasMaxLength(x => x.Name, 5)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Name", errors[0].Property);
        }
        public void IsRequired_GivenEmptyInt_ReturnError()
        {
            var person = new Person();

            var errors = new Validation<Person>(person)
                .IsRequired(x => x.Age)
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Age", errors[0].Property);
        }
        public void Matches_GivenInvalidString_ReturnError(string pis)
        {
            var person = new Person() { Pis = pis };

            var errors = new Validation<Person>(person)
                .Matches(x => x.Pis, @"^\d+$", "Error {0}")
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Pis", errors[0].Property);
        }
        public void HasCustomValidation_GivenFalseCondition_ReturnErrors()
        {
            var person = new Person() { Id = 2, Age = 20, Email = "*****@*****.**" };

            var errors = new Validation<Person>(person, context)
                .HasCustomValidation(x => !((x.Email == "*****@*****.**" || x.Id == 1) && x.Age > 0), "Email", "Preencha o campo Email corretamente")
                .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Preencha o campo Email corretamente", errors[0].Message);
        }
        public void HasSmallDateTime_GivenNullField_ReturnError()
        {
            var person = new Person();

            var errors = new Validation<Person>(person)
                            .IsSmallDateTime(x => x.Birth ) 
                            .ToList();

            Assert.Equal(1, errors.Count);
            Assert.Equal("Birth", errors[0].Property);
        }