public void CascadeValidate()
        {
            // Arrange
            var manager = new Manager()
                              {
                                  Reports =
                                      {
                                          new Employee()
                                              {
                                                  EmployeeId = 1
                                              },
                                          new Employee()
                                              {
                                                  EmployeeId = 2
                                              },
                                          new Employee()
                                              {
                                                  EmployeeId = 3
                                              },
                                      }
                              };


            foreach (var dataRow in manager.Reports)
            {
                this.ValidationEngine.Validate(typeof(Employee), dataRow, Arg.Any<string[]>())
                    .Returns(new[]{new ValidationResult()
                                    {
                                        PropertyName = "Id",
                                        Context = dataRow,
                                        Message = string.Format("Item {0}", dataRow.EmployeeId)
                                    }, });


            }

            // Act
            var results = this.Validator.Validate(manager).ToList();

            // Assert
            Assert.That(results, Has.Count.EqualTo(3));

            foreach(var employee in manager.Reports)
            {
                this.ValidationEngine.Received().Validate(typeof(Employee), employee, Arg.Is<string[]>(arg => arg.Length == 0));
            }

            for (var i = 0; i < 3; i++)
            {
                var result = results[i];
                Assert.That(result.PropertyName, Is.EqualTo(string.Format("Reports[{0}].Id", i)));
            }

        }
        public void Validate()
        {
            // Arrange
            var validatorProvider = new DefaultValidatorProvider();
            validatorProvider.RegisterValidator(new SaveEmployeeValidator());
            Validator.SetValidatorProvider(validatorProvider);

            var manager = new Manager();

            // Act
            var validator = new AncestorTypeValidator<Manager, Employee>(RulesSets.Crud.Save);
            var results = validator.Validate(manager);

            // Assert
            Assert.That(results, Is.Not.Empty);
        }
        public void CascadeOverManager_Should_SetPropertyNamesCorrectlyForAllDescendants()
        {
            // Arrange
            var config = new ValidationConfiguration();
            config.Configure();

            var manager = new Manager()
                              {
                                  Reports = new List<Employee>()
                                      {
                                          new Employee
                                              {
                                                  ContactInfo = new[]
                                                                    {
                                                                        new ContactInfo(), 
                                                                    }
                                              },
                                      }
                              };

            // Act
            var results = Validator.Validate(manager, RulesSets.Crud.Save);

            // Assert
            var result = results.FirstOrDefault(vr => vr.PropertyName == "Reports[0].ContactInfo[0].Text");
            Assert.That(result, Is.Not.Null);
        }
        public void Cascade_WithGenericType_InValidValues()
        {
            // Arrange
            var validatorProvider = new DefaultValidatorProvider();
            validatorProvider.RegisterValidator(new SaveEmployeeValidator());
            validatorProvider.RegisterValidator(new SaveManagerValidator());
            Validator.SetValidatorProvider(validatorProvider);

            var validator = Properties<Manager>
                .For(e => e.Reports)
                .Cascade<Employee>("Save")
                ;

            // Act
            var manager = new Manager();
            var reports = Builder<Manager>
                .CreateListOfSize(1)
                .All()
                .Do(m => m.Age += 20)
                .Do(m => m.Address = Builder<Address>.CreateNew().Build())
                .Do(m => m.ContactInfo = Builder<ContactInfo>.CreateListOfSize(3).Build())
                .Do(m => m.ReportsTo = null)
                .Build();

            manager.Reports = reports.Cast<Employee>().ToList();

            var results = validator.Validate(manager).ToList();

            // Assert
            Assert.That(results, Is.Not.Empty);
            for (var i = 0; i < manager.Reports.Count; i++)
            {
                var expectedPropertyName = string.Format("Reports[{0}].ReportsTo", i);
                var expectedResults = results.Where(vr => vr.PropertyName == expectedPropertyName).ToList();
                Assert.That(expectedResults, Is.Not.Empty);

                foreach (var expectedResult in expectedResults)
                    Assert.That(expectedResult.Context == manager);
            }

        }
        public void Cascade_WithGenericType_InvalidValuesForSubType()
        {
            // Arrange
            var validatorProvider = new DefaultValidatorProvider();
            validatorProvider.RegisterValidator(new SaveEmployeeValidator());
            validatorProvider.RegisterValidator(new SaveManagerValidator());
            Validator.SetValidatorProvider(validatorProvider);

            var validator = Properties<Manager>
                .For(e => e.Reports)
                .Cascade<Employee>("Save")
                ;

            // Act
            var manager = new Manager();
            var reports = Builder<Manager>
                .CreateListOfSize(1)
                .All()
                .Do(m => m.Age += 20)
                .Do(m => m.Address = Builder<Address>.CreateNew().Build())
                .Do(m => m.ContactInfo = Builder<ContactInfo>.CreateListOfSize(3).Build())
                .Do(m => m.ReportsTo = manager)
                .Do(m => m.IsSalaried = true)
                .Do(m => m.Reports = new List<Employee>())
                .Build();

            manager.Reports = reports.Cast<Employee>().ToList();

            var results = validator.Validate(manager).ToList();

            // Assert
            Assert.That(results, Is.Empty);
        }
        public void methodName()
        {
            // Arrange
            this.ValidationEngine = Substitute.For<IValidationEngine>();

            var report = new Manager();

            // Act
            this.ValidationEngine.Validate(typeof(Manager), report, Arg.Is<string[]>(row => row.Contains("Save"))).Returns(new[] { new ValidationResult(), });

            // Assert

            var results = this.ValidationEngine.Validate(typeof (Manager), report, new[] {"Save"});
            Assert.That(results, Is.Not.Empty);
        }
        public void Cascade_Enumerable_InValidValues()
        {
            // Arrange
            this.ValidationEngine = Substitute.For<IValidationEngine>();
            Simple.Validation.Validator.SetValidationEngine(this.ValidationEngine);

            var validator = Properties<Manager>
                .For(e => e.Reports)
                .Cascade("Save")
                ;

            // Act
            var manager = new Manager();
            var reports = Builder<Manager>
                .CreateListOfSize(1)
                .All()
                .Do(m => m.Reports = Builder<Employee>
                    .CreateListOfSize(10)
                    .All()
                    .Build())
                .Build();

            manager.Reports = reports.Cast<Employee>().ToList();

            foreach(var report in reports)
            {
                this.ValidationEngine
                    .Validate(typeof(Manager), report, "Save")
                    .Returns(new []
                        {
                            new ValidationResult()
                                {
                                    PropertyName = "Age",
                                    Message = string.Format("Report {0} has an error", report.EmployeeId),
                                },
                        });
            }

            var results = validator.Validate(manager).ToList();

            // Assert
            Assert.That(results, Is.Not.Empty);
            for (var i = 0; i < manager.Reports.Count; i++)
            {
                var expectedPropertyName = string.Format("Reports[{0}].Age", i);
                var expectedResults = results.Where(vr => vr.PropertyName == expectedPropertyName).ToList();
                Assert.That(expectedResults, Is.Not.Empty);

                foreach (var expectedResult in expectedResults)
                {
                    Assert.That(expectedResult.Context == manager);
                }
            }
        }
        public void Cascade_Enumerable_ValidValues()
        {
            // Arrange

            var validator = Properties<Manager>
                .For(e => e.Reports)
                .Cascade("Save")
                ;

            // Act
            var manager = new Manager();
            var reports = Builder<Manager>
                .CreateListOfSize(1)
                .All()
                .Do(m => m.Age += 20)
                .Do(m => m.Address = Builder<Address>.CreateNew().Build())
                .Do(m => m.ContactInfo = Builder<ContactInfo>.CreateListOfSize(3).Build())
                .Do(m => m.ReportsTo = manager)
                .Do(m => m.IsSalaried = true)
                .Do(m => m.Reports = Builder<Employee>
                    .CreateListOfSize(10)
                    .All()
                    .Do(e => e.Address = Builder<Address>.CreateNew().Build())
                    .Do(e => e.ReportsTo = m)
                    .Do(e => e.ContactInfo = Builder<ContactInfo>.CreateListOfSize(3).Build())
                    .Do(e => e.Age += 20)
                    .Do(e => e.IsHourly = true)
                    .Do(e => e.IsSalaried = false)
                    .Build())
                .Build();

            manager.Reports = reports.Cast<Employee>().ToList();

            var results = validator.Validate(manager).ToList();

            // Assert
            Assert.That(results, Is.Empty);
        }