public void ShouldSupportMinimalObservableValidation()
        {
            var stream    = new Subject <IValidationState>();
            var arguments = new List <IValidationState>();
            var component = new ObservableValidation <TestViewModel, bool>(stream);

            component.ValidationStatusChange.Subscribe(arguments.Add);
            stream.OnNext(ValidationState.Valid);

            Assert.True(component.IsValid);
            Assert.Empty(component.Text !.ToSingleLine());
            Assert.Single(arguments);

            Assert.True(arguments[0].IsValid);
            Assert.Empty(arguments[0].Text.ToSingleLine());

            const string errorMessage = "Errors exist.";

            stream.OnNext(new ValidationState(false, errorMessage));

            Assert.False(component.IsValid);
            Assert.Equal(errorMessage, component.Text.ToSingleLine());
            Assert.Equal(2, arguments.Count);

            Assert.False(arguments[1].IsValid);
            Assert.Equal(errorMessage, arguments[1].Text.ToSingleLine());
        }
        public void DisposeShouldStopTrackingThePropertyValidationObservable()
        {
            var validation = new ObservableValidation <TestViewModel, bool, string>(
                _validModel,
                state => state.Name,
                _validState,
                validity => validity,
                "broken");

            _validState.OnNext(true);

            Assert.True(validation.IsValid);

            _validState.OnNext(false);

            Assert.False(validation.IsValid);

            validation.Dispose();

            _validState.OnNext(true);
            _validState.OnNext(false);
            _validState.OnNext(true);

            Assert.False(validation.IsValid);
        }
        public void InitialValidStateIsCorrectTest()
        {
            _validState.OnNext(true);

            var validation = new ObservableValidation <TestViewModel, bool>(
                _validModel,
                _validState,
                valid => valid,
                "broken");

            Assert.True(validation.IsValid);
        }
        public void InitialValidStateOfPropertyValidationIsCorrectTest()
        {
            _validState.OnNext(true);

            var propertyValidation = new ObservableValidation <TestViewModel, bool, string>(
                _validModel,
                state => state.Name,
                _validState,
                valid => valid,
                "broken");

            Assert.True(propertyValidation.IsValid);
        }
        public void ObservableToInvalidTest()
        {
            var validation = new ObservableValidation <TestViewModel, bool>(
                _validModel,
                _validState,
                valid => valid,
                "broken");

            _validState.OnNext(false);
            _validState.OnNext(true);
            _validState.OnNext(false);

            Assert.False(validation.IsValid);
            Assert.Equal("broken", validation.Text?.ToSingleLine());
        }
        public void ObservableToInvalidOfPropertyValidationTest()
        {
            var propertyValidation = new ObservableValidation <TestViewModel, bool, string>(
                _validModel,
                state => state.Name,
                _validState,
                valid => valid,
                "broken");

            _validState.OnNext(false);
            _validState.OnNext(true);
            _validState.OnNext(false);

            Assert.False(propertyValidation.IsValid);
            Assert.Equal("broken", propertyValidation.Text?.ToSingleLine());
        }
        public void ShouldResolveTypedProperties()
        {
            var viewModel = new TestViewModel {
                Name = string.Empty
            };
            IPropertyValidationComponent component =
                new ObservableValidation <TestViewModel, string, string>(
                    viewModel,
                    model => model.Name,
                    viewModel.WhenAnyValue(x => x.Name),
                    state => !string.IsNullOrWhiteSpace(state),
                    "Name shouldn't be empty.");

            Assert.True(component.ContainsProperty <TestViewModel, string>(model => model.Name));
            Assert.True(component.ContainsProperty <TestViewModel, string>(model => model.Name, true));
            Assert.False(component.ContainsProperty <TestViewModel, string>(model => model.Name2));
            Assert.False(component.ContainsProperty <TestViewModel, string>(model => model.Name2, true));
            Assert.Throws <ArgumentNullException>(() => component.ContainsProperty <TestViewModel, string>(null !));
        }