DefaultValueConverterTests.cs 7.5 KB

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