public void ViewModel_must_be_invalid_when_created()
        {
            var mainViewModelValidator = new MainViewModelValidator ();

            var repository = new Mock<IRepository> ();
            var vm = new MainViewModel (mainViewModelValidator, repository.Object);

            vm.IsValid.ShouldBeFalse ();
        }
        private bool IsValid()
        {
            var result = new MainViewModelValidator().Validate(this);

            this.ValidationErrors = new ObservableCollection <ValidationError>(result.ValidationErrors);
            this.RaisePropertyChanged(nameof(ValidationErrors));

            return(result.IsValid);
        }
        public MainPage()
        {
            var viewModelValidator = new MainViewModelValidator ();

            //This really should be an Dependency Injection container
            var repository = new Repository (new InstructorModelValidator(), new ClassModelValidator());

            _viewModel = new MainViewModel (viewModelValidator, repository);

            this.BindingContext = _viewModel;
            InitializeComponent ();

            agreementSwitch.Toggled += (sender, args) =>
            {
                ageValidator.Validate(null, null);
            };
        }
        public void Email_must_be_a_valid_address_format()
        {
            var fixture = new Fixture();

            var mainViewModelValidator = new MainViewModelValidator ();

            var repository = new Mock<IRepository> ();
            var vm = new MainViewModel (mainViewModelValidator, repository.Object);

            fixture.Customizations.Add(new RandomNumericSequenceGenerator(1, 17));

            vm.Age = fixture.Create<int> ();
            vm.IsAgreementAccepted = false;
            vm.EmailAddress = fixture.Create<string>();

            vm.IsValid.ShouldBeFalse ();
        }
        public void Agreement_can_be_false_when_age_is_less_than_18()
        {
            var fixture = new Fixture();

            var mainViewModelValidator = new MainViewModelValidator ();

            var repository = new Mock<IRepository> ();
            var vm = new MainViewModel (mainViewModelValidator, repository.Object);

            fixture.Customizations.Add(new RandomNumericSequenceGenerator(1, 17));

            vm.Age = fixture.Create<int> ();
            vm.IsAgreementAccepted = false;
            vm.EmailAddress = fixture.Create<string>() + "@foobar.com";

            vm.IsValid.ShouldBeTrue ();
        }
        public void ViewModel_must_not_save_models_when_invalid()
        {
            var mainViewModelValidator = new MainViewModelValidator ();

            var repository = new Mock<IRepository> ();

            var vm = new MainViewModel (mainViewModelValidator, repository.Object);

            vm.Save.Execute (null);

            repository.Verify (x => x.Save (), Times.Never);
        }
        public void ViewModel_must_save_models_when_valid()
        {
            var fixture = new Fixture();

            var mainViewModelValidator = new MainViewModelValidator ();

            var repository = new Mock<IRepository> ();

            var vm = new MainViewModel (mainViewModelValidator, repository.Object);
            fixture.Customizations.Add(new RandomNumericSequenceGenerator(1, 17));

            vm.Age = fixture.Create<int> ();
            vm.IsAgreementAccepted = true;
            vm.EmailAddress = fixture.Create<string>() + "@foobar.com";

            vm.Save.Execute (null);

            repository.Verify (x => x.Save (), Times.Once);
        }