123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- using System;
- using System.ComponentModel;
- using System.Globalization;
- using System.Windows.Input;
- using Avalonia.Data;
- using Avalonia.Data.Converters;
- using Avalonia.Layout;
- using Xunit;
- namespace Avalonia.Base.UnitTests.Data.Converters
- {
- public class DefaultValueConverterTests
- {
- [Fact]
- public void Can_Convert_String_To_Int()
- {
- var result = DefaultValueConverter.Instance.Convert(
- "5",
- typeof(int),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(5, result);
- }
- [Fact]
- public void Can_Convert_String_To_Double()
- {
- var result = DefaultValueConverter.Instance.Convert(
- "5",
- typeof(double),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(5.0, result);
- }
- [Fact]
- public void Do_Not_Throw_On_InvalidInput_For_NullableInt()
- {
- var result = DefaultValueConverter.Instance.Convert(
- "<not-a-number>",
- typeof(int?),
- null,
- CultureInfo.InvariantCulture);
- Assert.IsType(typeof(BindingNotification), result);
- }
- [Fact]
- public void Can_Convert_Decimal_To_NullableDouble()
- {
- var result = DefaultValueConverter.Instance.Convert(
- 5m,
- typeof(double?),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(5.0, result);
- }
- [Fact]
- public void Can_Convert_CustomType_To_Int()
- {
- var result = DefaultValueConverter.Instance.Convert(
- new CustomType(123),
- typeof(int),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(123, result);
- }
- [Fact]
- public void Can_Convert_Int_To_CustomType()
- {
- var result = DefaultValueConverter.Instance.Convert(
- 123,
- typeof(CustomType),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(new CustomType(123), result);
- }
- [Fact]
- public void Can_Convert_String_To_Enum()
- {
- var result = DefaultValueConverter.Instance.Convert(
- "Bar",
- typeof(TestEnum),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(TestEnum.Bar, result);
- }
- [Fact]
- public void Can_Convert_String_To_TimeSpan()
- {
- var result = DefaultValueConverter.Instance.Convert(
- "00:00:10",
- typeof(TimeSpan),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(TimeSpan.FromSeconds(10), result);
- }
- [Fact]
- public void Can_Convert_Int_To_Enum()
- {
- var result = DefaultValueConverter.Instance.Convert(
- 1,
- typeof(TestEnum),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(TestEnum.Bar, result);
- }
- [Fact]
- public void Can_Convert_Double_To_String()
- {
- var result = DefaultValueConverter.Instance.Convert(
- 5.0,
- typeof(string),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal("5", result);
- }
- [Fact]
- public void Can_Convert_Enum_To_Int()
- {
- var result = DefaultValueConverter.Instance.Convert(
- TestEnum.Bar,
- typeof(int),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(1, result);
- }
- [Fact]
- public void Can_Convert_Enum_To_String()
- {
- var result = DefaultValueConverter.Instance.Convert(
- TestEnum.Bar,
- typeof(string),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal("Bar", result);
- }
- [Fact]
- public void Can_Use_Explicit_Cast()
- {
- var result = DefaultValueConverter.Instance.Convert(
- new ExplicitDouble(5.0),
- typeof(double),
- null,
- CultureInfo.InvariantCulture);
- Assert.Equal(5.0, result);
- }
- [Fact]
- public void Cannot_Convert_Between_Different_Enum_Types()
- {
- var result = DefaultValueConverter.Instance.Convert(
- TestEnum.Foo,
- typeof(Orientation),
- null,
- CultureInfo.InvariantCulture);
- Assert.IsType<BindingNotification>(result);
- }
- [Fact]
- public void Can_Convert_From_Delegate_To_Command()
- {
- int commandResult = 0;
- var result = DefaultValueConverter.Instance.Convert(
- (Action<int>)((int i) => { commandResult = i; }),
- typeof(ICommand),
- null,
- CultureInfo.InvariantCulture);
- Assert.IsAssignableFrom<ICommand>(result);
- (result as ICommand).Execute(5);
- Assert.Equal(5, commandResult);
- }
- [Fact]
- public void Can_Convert_From_Delegate_To_Command_No_Parameters()
- {
- int commandResult = 0;
- var result = DefaultValueConverter.Instance.Convert(
- (Action)(() => { commandResult = 1; }),
- typeof(ICommand),
- null,
- CultureInfo.InvariantCulture);
- Assert.IsAssignableFrom<ICommand>(result);
- (result as ICommand).Execute(null);
- Assert.Equal(1, commandResult);
- }
- private enum TestEnum
- {
- Foo,
- Bar,
- }
- private class ExplicitDouble
- {
- public ExplicitDouble(double value)
- {
- Value = value;
- }
- public double Value { get; }
- public static explicit operator double (ExplicitDouble v)
- {
- return v.Value;
- }
- }
- [TypeConverter(typeof(CustomTypeConverter))]
- private class CustomType {
- public int Value { get; }
- public CustomType(int value)
- {
- Value = value;
- }
- public override bool Equals(object obj)
- {
- return obj is CustomType other && this.Value == other.Value;
- }
- public override int GetHashCode()
- {
- return 8399587^Value.GetHashCode();
- }
- }
- private class CustomTypeConverter : TypeConverter
- {
- public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
- {
- return destinationType == typeof(int);
- }
- public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
- {
- return sourceType == typeof(int);
- }
- public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
- {
- return ((CustomType)value).Value;
- }
- public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
- {
- return new CustomType((int)value);
- }
- }
- }
- }
|