DefaultValueConverterTests.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. using System.Globalization;
  2. using Avalonia.Controls;
  3. using Avalonia.Data;
  4. using Xunit;
  5. using System.Windows.Input;
  6. using System;
  7. using Avalonia.Data.Converters;
  8. using Avalonia.Layout;
  9. using System.ComponentModel;
  10. namespace Avalonia.Base.UnitTests.Data.Converters
  11. {
  12. public class DefaultValueConverterTests
  13. {
  14. [Fact]
  15. public void Can_Convert_String_To_Int()
  16. {
  17. var result = DefaultValueConverter.Instance.Convert(
  18. "5",
  19. typeof(int),
  20. null,
  21. CultureInfo.InvariantCulture);
  22. Assert.Equal(5, result);
  23. }
  24. [Fact]
  25. public void Can_Convert_String_To_Double()
  26. {
  27. var result = DefaultValueConverter.Instance.Convert(
  28. "5",
  29. typeof(double),
  30. null,
  31. CultureInfo.InvariantCulture);
  32. Assert.Equal(5.0, result);
  33. }
  34. [Fact]
  35. public void Do_Not_Throw_On_InvalidInput_For_NullableInt()
  36. {
  37. var result = DefaultValueConverter.Instance.Convert(
  38. "<not-a-number>",
  39. typeof(int?),
  40. null,
  41. CultureInfo.InvariantCulture);
  42. Assert.IsType(typeof(BindingNotification), result);
  43. }
  44. [Fact]
  45. public void Can_Convert_Decimal_To_NullableDouble()
  46. {
  47. var result = DefaultValueConverter.Instance.Convert(
  48. 5m,
  49. typeof(double?),
  50. null,
  51. CultureInfo.InvariantCulture);
  52. Assert.Equal(5.0, result);
  53. }
  54. [Fact]
  55. public void Can_Convert_CustomType_To_Int()
  56. {
  57. var result = DefaultValueConverter.Instance.Convert(
  58. new CustomType(123),
  59. typeof(int),
  60. null,
  61. CultureInfo.InvariantCulture);
  62. Assert.Equal(123, result);
  63. }
  64. [Fact]
  65. public void Can_Convert_Int_To_CustomType()
  66. {
  67. var result = DefaultValueConverter.Instance.Convert(
  68. 123,
  69. typeof(CustomType),
  70. null,
  71. CultureInfo.InvariantCulture);
  72. Assert.Equal(new CustomType(123), result);
  73. }
  74. [Fact]
  75. public void Can_Convert_String_To_Enum()
  76. {
  77. var result = DefaultValueConverter.Instance.Convert(
  78. "Bar",
  79. typeof(TestEnum),
  80. null,
  81. CultureInfo.InvariantCulture);
  82. Assert.Equal(TestEnum.Bar, result);
  83. }
  84. [Fact]
  85. public void Can_Convert_String_To_TimeSpan()
  86. {
  87. var result = DefaultValueConverter.Instance.Convert(
  88. "00:00:10",
  89. typeof(TimeSpan),
  90. null,
  91. CultureInfo.InvariantCulture);
  92. Assert.Equal(TimeSpan.FromSeconds(10), result);
  93. }
  94. [Fact]
  95. public void Can_Convert_Int_To_Enum()
  96. {
  97. var result = DefaultValueConverter.Instance.Convert(
  98. 1,
  99. typeof(TestEnum),
  100. null,
  101. CultureInfo.InvariantCulture);
  102. Assert.Equal(TestEnum.Bar, result);
  103. }
  104. [Fact]
  105. public void Can_Convert_Double_To_String()
  106. {
  107. var result = DefaultValueConverter.Instance.Convert(
  108. 5.0,
  109. typeof(string),
  110. null,
  111. CultureInfo.InvariantCulture);
  112. Assert.Equal("5", result);
  113. }
  114. [Fact]
  115. public void Can_Convert_Enum_To_Int()
  116. {
  117. var result = DefaultValueConverter.Instance.Convert(
  118. TestEnum.Bar,
  119. typeof(int),
  120. null,
  121. CultureInfo.InvariantCulture);
  122. Assert.Equal(1, result);
  123. }
  124. [Fact]
  125. public void Can_Convert_Enum_To_String()
  126. {
  127. var result = DefaultValueConverter.Instance.Convert(
  128. TestEnum.Bar,
  129. typeof(string),
  130. null,
  131. CultureInfo.InvariantCulture);
  132. Assert.Equal("Bar", result);
  133. }
  134. [Fact]
  135. public void Can_Use_Explicit_Cast()
  136. {
  137. var result = DefaultValueConverter.Instance.Convert(
  138. new ExplicitDouble(5.0),
  139. typeof(double),
  140. null,
  141. CultureInfo.InvariantCulture);
  142. Assert.Equal(5.0, result);
  143. }
  144. [Fact]
  145. public void Cannot_Convert_Between_Different_Enum_Types()
  146. {
  147. var result = DefaultValueConverter.Instance.Convert(
  148. TestEnum.Foo,
  149. typeof(Orientation),
  150. null,
  151. CultureInfo.InvariantCulture);
  152. Assert.IsType<BindingNotification>(result);
  153. }
  154. [Fact]
  155. public void Can_Convert_From_Delegate_To_Command()
  156. {
  157. int commandResult = 0;
  158. var result = DefaultValueConverter.Instance.Convert(
  159. (Action<int>)((int i) => { commandResult = i; }),
  160. typeof(ICommand),
  161. null,
  162. CultureInfo.InvariantCulture);
  163. Assert.IsAssignableFrom<ICommand>(result);
  164. (result as ICommand).Execute(5);
  165. Assert.Equal(5, commandResult);
  166. }
  167. [Fact]
  168. public void Can_Convert_From_Delegate_To_Command_No_Parameters()
  169. {
  170. int commandResult = 0;
  171. var result = DefaultValueConverter.Instance.Convert(
  172. (Action)(() => { commandResult = 1; }),
  173. typeof(ICommand),
  174. null,
  175. CultureInfo.InvariantCulture);
  176. Assert.IsAssignableFrom<ICommand>(result);
  177. (result as ICommand).Execute(null);
  178. Assert.Equal(1, commandResult);
  179. }
  180. private enum TestEnum
  181. {
  182. Foo,
  183. Bar,
  184. }
  185. private class ExplicitDouble
  186. {
  187. public ExplicitDouble(double value)
  188. {
  189. Value = value;
  190. }
  191. public double Value { get; }
  192. public static explicit operator double (ExplicitDouble v)
  193. {
  194. return v.Value;
  195. }
  196. }
  197. [TypeConverter(typeof(CustomTypeConverter))]
  198. private class CustomType {
  199. public int Value { get; }
  200. public CustomType(int value)
  201. {
  202. Value = value;
  203. }
  204. public override bool Equals(object obj)
  205. {
  206. return obj is CustomType other && this.Value == other.Value;
  207. }
  208. }
  209. private class CustomTypeConverter : TypeConverter
  210. {
  211. public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
  212. {
  213. return destinationType == typeof(int);
  214. }
  215. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
  216. {
  217. return sourceType == typeof(int);
  218. }
  219. public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
  220. {
  221. return ((CustomType)value).Value;
  222. }
  223. public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
  224. {
  225. return new CustomType((int)value);
  226. }
  227. }
  228. }
  229. }