Inheritance: MvvmValidation.Tests.Fakes.ViewModelBase, INotifyDataErrorInfo
        public void GetValidationResultFor_EmptyString_GetsErrorsForEntireObject()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            vm.StringProperty = null;

            // Assert
            Assert.False(string.IsNullOrEmpty(vm.GetErrors("").Cast<string>().FirstOrDefault()));
        }
        public void RangeProperties_ChangeFromInvalidToValid_ValidationErrorsDisappear()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            vm.RangeStart = 10;
            vm.RangeEnd = 1;

            // Assert
            Assert.False(string.IsNullOrEmpty(vm.GetErrors("RangeStart").Cast<string>().FirstOrDefault()));
            Assert.False(string.IsNullOrEmpty(vm.GetErrors("RangeEnd").Cast<string>().FirstOrDefault()));

            // Act
            vm.RangeEnd = 11;

            // Assert
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeStart").Cast<string>().FirstOrDefault()));
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeEnd").Cast<string>().FirstOrDefault()));
        }
        public void SuppressValidation_SetInvalidValue_ThereAreNoErrors()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            using (vm.Validation.SuppressValidation())
            {
                vm.RangeStart = 10;
                vm.RangeEnd = 1;
            }

            // Verify
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeStart").Cast<string>().FirstOrDefault()));
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeEnd").Cast<string>().FirstOrDefault()));
        }
        public void StringProperty_ValidValue_DoesNotHaveValidationError()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            vm.StringProperty = "Not empty string";

            // Assert
            Assert.False(vm.GetErrors("StringProperty").Cast<string>().Any());
        }
        public void StringProperty_InvalidValue_HasValidationError()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            vm.StringProperty = null;

            // Assert

            Assert.True(vm.GetErrors("StringProperty").Cast<string>().Any());
        }
        public void RangeProperties_ValidRange_NonOfThePropertiesHaveValidationError()
        {
            // Arrange
            var vm = new MockViewModel();

            // Act
            vm.RangeStart = 1;
            vm.RangeEnd = 10;

            // Assert
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeStart").Cast<string>().FirstOrDefault()));
            Assert.True(string.IsNullOrEmpty(vm.GetErrors("RangeEnd").Cast<string>().FirstOrDefault()));
        }
		public void AsyncValidation_InvalidValue_CallsValidationRuleInBackgroundThreadAndReportsInvalidOnUIThread()
		{
			TestUtils.ExecuteWithDispatcher((uiThreadDispatcher, completedAction) =>
			{
				int validationExecutionThreadID = -1;
				bool validationRuleCalled = false;

				var vm = new MockViewModel();

				// When the rule gets executed verify that it gets executed in a background thread (doesn't block the UI)
				vm.SyncValidationRuleExecutedAsyncroniouslyDelegate = () =>
				{
					validationRuleCalled = true;
					validationExecutionThreadID = Thread.CurrentThread.ManagedThreadId;

					// VERIFY

					if (validationExecutionThreadID == uiThreadDispatcher.Thread.ManagedThreadId)
					{
						Assert.True(false, "Validation rule must be called on a different thread than UI thread.");
					}
				};

				using (vm.Validation.SuppressValidation())
				{
					// Set the valid value first
					vm.StringProperty2 = "Valid value";
				}

				vm.Validation.ResultChanged += (o, e) =>
				{
					// VERIFY

					int validationCompletedThreadID = Thread.CurrentThread.ManagedThreadId;

					if (validationCompletedThreadID != uiThreadDispatcher.Thread.ManagedThreadId)
					{
						Assert.True(false, "ValidationCompleted must be called on the UI thread.");
					}

					if (!validationRuleCalled)
					{
						Assert.True(false, "Validation rule hasn't been called before validation completed.");
					}

					if (validationExecutionThreadID == validationCompletedThreadID)
					{
						Assert.True(false, "Validation execution thread must be a different thread than validation completed thread");
					}

					Assert.False(e.NewResult.IsValid, "Validation must fail");

					completedAction();
				};

				// ACT
				vm.StringProperty2 = null;
			});
		}