Пример #1
0
        /// <summary>
        /// Gets the value.
        /// </summary>
        /// <param name="sectionName">Name of the section.</param>
        /// <param name="keyName">Name of the key.</param>
        /// <param name="defaultValue">if set to <c>true</c> [default value].</param>
        /// <param name="booleanConverter">The boolean converter.</param>
        /// <returns></returns>
        public virtual bool GetValue(string sectionName, string keyName, bool defaultValue,
                                     BooleanConverter booleanConverter = null)
        {
            booleanConverter = booleanConverter ?? Settings.BooleanConverter;

            var booleanValue = GetRawValue <string>(sectionName, keyName, null);

            if (string.IsNullOrWhiteSpace(booleanValue))
            {
                SetValue(sectionName, keyName,
                         null == booleanConverter
                         // if some day Boolean.ToString(IFormatProvider) will work
                         // https://msdn.microsoft.com/en-us/library/s802ct92(v=vs.110).aspx#Anchor_1
                        ? defaultValue.ToString(Settings.Culture).ToLowerInvariant()
                        : booleanConverter.ConvertToString(defaultValue));
                return(defaultValue);
            }

#pragma warning disable IDE0046 // Convert to conditional expression
            foreach (var converter in YesNoBoolConverters)
            {
                if (converter.Yes.Equals(booleanValue.Trim(), StringComparison.InvariantCultureIgnoreCase) ||
                    converter.No.Equals(booleanValue.Trim(), StringComparison.InvariantCultureIgnoreCase))
                {
                    return(converter.Yes.Equals(booleanValue, StringComparison.InvariantCultureIgnoreCase));
                }
            }
#pragma warning restore IDE0046 // Convert to conditional expression

            if (bool.TryParse(booleanValue, out var parseBoolean))
            {
                return(parseBoolean);
            }

            // if some day Boolean.ToString(IFormatProvider) will work
            // https://msdn.microsoft.com/en-us/library/s802ct92(v=vs.110).aspx#Anchor_1
            if (true.ToString(Settings.Culture).ToLowerInvariant().Equals(booleanValue, StringComparison.InvariantCultureIgnoreCase))
            {
                return(true);
            }

            if (booleanConverter == null || !booleanConverter.CanConvertFrom(typeof(string)))
            {
                return(defaultValue);
            }

            var value = booleanConverter.ConvertFrom(booleanValue);
            return(value is bool convertedBoolean
                ? convertedBoolean
                : defaultValue);
        }
        public void TestBooleanConverter()
        {
            BooleanConverter booleanConverter = new BooleanConverter();

            Assert.True(booleanConverter.CanConvertTo(typeof(bool)));
            Assert.True(booleanConverter.CanConvertTo(typeof(Boolean)));

            Assert.False(booleanConverter.CanConvertTo(typeof(string)));
            Assert.False(booleanConverter.CanConvertTo(typeof(float)));
            Assert.False(booleanConverter.CanConvertTo(typeof(double)));
            Assert.False(booleanConverter.CanConvertTo(typeof(int)));

            Assert.True(booleanConverter.CanConvertFrom(" oN   "));
            Assert.True(booleanConverter.CanConvertFrom("OFF  "));
            Assert.True(booleanConverter.CanConvertFrom(" YeS"));
            Assert.True(booleanConverter.CanConvertFrom("No"));
            Assert.True(booleanConverter.CanConvertFrom("true"));
            Assert.True(booleanConverter.CanConvertFrom("FALSE"));
            Assert.True(booleanConverter.CanConvertFrom("10"));

            Assert.False(booleanConverter.CanConvertFrom("abc"));
            Assert.False(booleanConverter.CanConvertFrom("No!"));

            Assert.Equal(true, booleanConverter.Convert(typeof(bool), "TRUE"));
            Assert.Equal(false, booleanConverter.Convert(typeof(object), "fAlSe"));
            Assert.Equal(true, booleanConverter.Convert(typeof(bool), "on"));
            Assert.Equal(false, booleanConverter.Convert(typeof(object), "oFF"));
            Assert.Equal(true, booleanConverter.Convert(typeof(bool), "yeS"));
            Assert.Equal(false, booleanConverter.Convert(typeof(object), "No"));
            Assert.Equal(true, booleanConverter.Convert(typeof(bool), "-10"));
            Assert.Equal(true, booleanConverter.Convert(typeof(bool), "123"));
            Assert.Equal(false, booleanConverter.Convert(typeof(object), "0"));

            Assert.Throws <InvalidOperationException>(() => booleanConverter.Convert(typeof(object), "0.0"));
            Assert.Throws <InvalidOperationException>(() => booleanConverter.Convert(typeof(object), "XYZ"));
        }