public void Setup()
        {
            InvalidItemsOfCollectionValidator       = new List <EmployeeVM>();
            InvalidItemsOfSecondCollectionValidator = new List <EmployeeVM>();
            InvalidItemsOfPropertyValidator         = new List <EmployeeVM>();
            InvalidItemsOfSecondPropertyValidator   = new List <EmployeeVM>();

            VM         = new EmployeeListVM(this);
            TargetItem = new EmployeeVM(this, "Target employee");
            OtherItem  = new EmployeeVM(this, "Other employee");

            VM.GetValue(x => x.Employees).Add(TargetItem);
            VM.GetValue(x => x.Employees).Add(OtherItem);
        }
        public void TestMethod1()
        {
            IEnumerable <Employee> source = GenerateEmployees();

            var list = new EmployeeListVM();

            var sw = Stopwatch.StartNew();

            list        = new EmployeeListVM();
            list.Source = source;
            list.Revalidate(ValidationScope.SelfAndLoadedDescendants);

            foreach (EmployeeVM item in list.GetValue(x => x.Employees))
            {
                var    selection = item.GetValue(x => x.EmploymentType);
                object simulatedBindingAccess = item.GetValue(x => x.Name);
                simulatedBindingAccess = selection.GetValue(x => x.AllItems);
                simulatedBindingAccess = selection.GetValue(x => x.SelectedItem);
            }

            //sw.Stop();
            //Console.WriteLine("Time [ms]: " + sw.ElapsedMilliseconds);
            //sw = Stopwatch.StartNew();
            //list.Revalidate(ValidationScope.SelfAndAllDescendants);

            sw.Stop();

            Console.WriteLine("Time [ms]: " + sw.ElapsedMilliseconds);
        }
        public void AddError_ArgsWithProperty_CreatesAndAddsCorrectError()
        {
            var item      = new EmployeeVM();
            var owner     = new EmployeeListVM(item);
            var validator = Mock <IValidator>();
            var step      = ValidationStep.Value;

            var message = "Test error message";
            var details = new Object();

            var args = CreateArgsWithProperty(owner, step, validator);

            args.AddError(item, message, details);

            var expectedError = new ValidationError(
                validator,
                ValidationTarget.ForError(
                    step,
                    item,
                    owner.GetValue(x => x.Employees),
                    EmployeeVM.ClassDescriptor.Name
                    ),
                message,
                details
                );

            ValidationAssert.HasErrors(args.Result, ValidationAssert.FullErrorComparer, expectedError);
        }
        public void Create_PathWithViewModelPlusCollection_SetPropertiesCorrectly()
        {
            var owner = new EmployeeListVM();
            var args  = CreateArgs(owner);

            Assert.AreEqual(owner, args.Owner);
            Assert.AreEqual(owner.GetValue(x => x.Employees), args.Items);
        }
        public void Create_PathWithViewModelPlusCollectionPlusProperty_SetPropertiesCorrectly()
        {
            var owner = new EmployeeListVM();
            var args  = CreateArgsWithProperty(owner);

            Assert.AreEqual(owner, args.Owner);
            Assert.AreEqual(owner.GetValue(x => x.Employees), args.Items);
            Assert.AreEqual(EmployeeVM.ClassDescriptor.Name, args.TargetProperty);
        }
        private static CollectionValidationArgs <IViewModel, EmployeeVM> CreateArgs(
            EmployeeListVM owner,
            IValidator validator = null
            )
        {
            validator = validator ?? Mock <IValidator>();

            var path = Path.Empty
                       .Append(owner)
                       .Append(owner.GetValue(x => x.Employees));

            return(CollectionValidationArgs <IViewModel, EmployeeVM> .Create(
                       validator,
                       new ValidationRequest(ValidationStep.ViewModel, path)
                       ));
        }
        private static CollectionValidationArgs <IViewModel, EmployeeVM, string> CreateArgsWithProperty(
            EmployeeListVM owner,
            ValidationStep step  = ValidationStep.Value,
            IValidator validator = null
            )
        {
            validator = validator ?? Mock <IValidator>();

            var path = Path.Empty
                       .Append(owner)
                       .Append(owner.GetValue(x => x.Employees))
                       .Append(EmployeeVM.ClassDescriptor.Name);

            return(CollectionValidationArgs <IViewModel, EmployeeVM, string> .Create(
                       validator,
                       new ValidationRequest(step, path)
                       ));
        }