public void ConvertBack_InvalidStringToInt32_ThrowsException(object value, CultureInfo culture, int minimum, int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Minimum = minimum,
                Maximum = maximum
            };

            var targetType = typeof(int);
            var parameter = (object)null;

            var result = Should.Throw<Exception>(() =>
            {
                uut.ConvertBack(value, targetType, parameter, culture);
            });

            result.ShouldSatisfyAnyCondition(
                () => result.ShouldSatisfyAllConditions(
                    () => result.ShouldBeOfType<ArgumentException>(),
                    () => (result as ArgumentException)?.ParamName.ShouldBe(nameof(value)),
                    () => (result as ArgumentException)?.Message.ShouldContain(value?.ToString() ?? "null")),
                () => result.ShouldSatisfyAllConditions(
                    () => result.ShouldBeOfType<ArgumentOutOfRangeException>(),
                    () => (result as ArgumentOutOfRangeException)?.ParamName.ShouldBe(nameof(value)),
                    () => (result as ArgumentOutOfRangeException)?.ActualValue.ShouldBe(value),
                    () => (result as ArgumentOutOfRangeException)?.Message.ShouldContain(minimum.ToString()),
                    () => (result as ArgumentOutOfRangeException)?.Message.ShouldContain(maximum.ToString())));
        }
        public void Maximum_Otherwise_SetsToGiven(int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Maximum = maximum
            };

            uut.Maximum.ShouldBe(maximum);
        }
        public void Validate_ValueIsNotValid_ReturnsIsValidFalse(object value, CultureInfo cultureInfo, int minimum, int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Minimum = minimum,
                Maximum = maximum
            };

            uut.Validate(value, cultureInfo).IsValid.ShouldBeFalse();
        }
        public void ConvertBack_ValidStringToInt32_ReturnsExpected(object value, CultureInfo culture, int expectedResult, int minimum, int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Minimum = minimum,
                Maximum = maximum
            };

            var targetType = typeof(int);
            var parameter = (object)null;

            uut.Convert(value, targetType, parameter, culture).ShouldBe(expectedResult);
        }
        public void Convert_TargetTypeIsNull_ThrowsException()
        {
            var uut = new Int32ToStringValueConverterAndValidationRule();

            var value = 0;
            var targetType = (Type)null;
            var parameter = (object)null;
            var culture = (CultureInfo)null;

            var result = Should.Throw<ArgumentNullException>(() => uut.Convert(value, targetType, parameter, culture));

            result.ParamName.ShouldBe(nameof(targetType));
        }
        public void ConvertBack_ConversionIsInvalid_ThrowsException(object value, Type targetType)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule();

            var parameter = (object)null;
            var culture = (CultureInfo)null;

            var result = Should.Throw<NotSupportedException>(() =>
            {
                uut.ConvertBack(value, targetType, parameter, culture);
            });

            result.ShouldSatisfyAllConditions(
                () => result.Message.ShouldContain(value?.GetType().Name ?? "null"),
                () => result.Message.ShouldContain(targetType.Name));
        }
        public void Validate_ValueIsNotValid_ReturnsErrorContentAsExpected(object value, CultureInfo cultureInfo, int minimum, int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Minimum = minimum,
                Maximum = maximum
            };

            var result = uut.Validate(value, cultureInfo).ErrorContent;

            result.ShouldSatisfyAllConditions(
                () => result.ShouldBeOfType<string>(),
                () => result.ShouldSatisfyAnyCondition(
                    () => result.ShouldSatisfyAllConditions(
                        () => (result as string)?.ShouldContain(minimum.ToString()),
                        () => (result as string)?.ShouldContain(maximum.ToString())),
                    () => (result as string)?.ShouldContain(value?.ToString() ?? "null")));
        }
        public void Maximum_GivenIsLessThanMinimum_ThrowsException()
        {
            var minimum = 0;
            var maximum = -1;

            var uut = new Int32ToStringValueConverterAndValidationRule() { Minimum = minimum };

            var result = Should.Throw<PropertyValidationException>(() =>
            {
                uut.Maximum = maximum;
            });

            result.ShouldSatisfyAllConditions(
                () => result.PropertyName.ShouldBe(nameof(uut.Maximum)),
                () => result.InvalidValue.ShouldBe(maximum),
                () => result.Message.ShouldContain(nameof(uut.Minimum)),
                () => result.Message.ShouldContain(minimum.ToString()));
        }
        public void ConvertBack_InvalidInt32ToString_ReturnsExpected(int value, CultureInfo culture, int minimum, int maximum)
        {
            var uut = new Int32ToStringValueConverterAndValidationRule()
            {
                Minimum = minimum,
                Maximum = maximum
            };

            var targetType = typeof(string);
            var parameter = (object)null;

            var result = Should.Throw<ArgumentOutOfRangeException>(() =>
            {
                uut.Convert(value, targetType, parameter, culture);
            });

            result.ShouldSatisfyAllConditions(
                () => result.ParamName.ShouldBe(nameof(value)),
                () => result.ActualValue.ShouldBe(value),
                () => result.Message.ShouldContain(minimum.ToString()),
                () => result.Message.ShouldContain(maximum.ToString()));
        }
        public void Maximum_ByDefault_IsMaxValue()
        {
            var uut = new Int32ToStringValueConverterAndValidationRule();

            uut.Maximum.ShouldBe(int.MaxValue);
        }