SetterTests.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using System.Globalization;
  3. using System.Reactive.Subjects;
  4. using Avalonia.Controls;
  5. using Avalonia.Controls.Templates;
  6. using Avalonia.Data;
  7. using Avalonia.Data.Converters;
  8. using Avalonia.Diagnostics;
  9. using Avalonia.Styling;
  10. using Moq;
  11. using Xunit;
  12. namespace Avalonia.Base.UnitTests.Styling
  13. {
  14. public class SetterTests
  15. {
  16. [Fact]
  17. public void Cannot_Assign_Control_To_Value()
  18. {
  19. var target = new Setter();
  20. Assert.Throws<InvalidOperationException>(() => target.Value = new Border());
  21. }
  22. [Fact]
  23. public void Setter_Should_Apply_Binding_To_Property()
  24. {
  25. var control = new TextBlock();
  26. var subject = new BehaviorSubject<object>("foo");
  27. var descriptor = InstancedBinding.OneWay(subject);
  28. var binding = Mock.Of<IBinding>(x => x.Initiate(control, TextBlock.TextProperty, null, false) == descriptor);
  29. var style = Mock.Of<IStyle>();
  30. var setter = new Setter(TextBlock.TextProperty, binding);
  31. setter.Instance(control).Start(false);
  32. Assert.Equal("foo", control.Text);
  33. }
  34. [Fact]
  35. public void Setter_Should_Handle_Binding_Producing_UnsetValue()
  36. {
  37. var control = new TextBlock();
  38. var subject = new BehaviorSubject<object>(AvaloniaProperty.UnsetValue);
  39. var descriptor = InstancedBinding.OneWay(subject);
  40. var binding = Mock.Of<IBinding>(x => x.Initiate(control, TextBlock.TagProperty, null, false) == descriptor);
  41. var style = Mock.Of<IStyle>();
  42. var setter = new Setter(TextBlock.TagProperty, binding);
  43. setter.Instance(control).Start(false);
  44. Assert.Equal("", control.Text);
  45. }
  46. [Fact]
  47. public void Setter_Should_Materialize_Template_To_Property()
  48. {
  49. var control = new Decorator();
  50. var template = new FuncTemplate<Canvas>(() => new Canvas());
  51. var style = Mock.Of<IStyle>();
  52. var setter = new Setter(Decorator.ChildProperty, template);
  53. setter.Instance(control).Start(false);
  54. Assert.IsType<Canvas>(control.Child);
  55. }
  56. [Fact]
  57. public void Does_Not_Call_Converter_ConvertBack_On_OneWay_Binding()
  58. {
  59. var control = new Decorator { Name = "foo" };
  60. var style = Mock.Of<IStyle>();
  61. var binding = new Binding("Name", BindingMode.OneWay)
  62. {
  63. Converter = new TestConverter(),
  64. RelativeSource = new RelativeSource(RelativeSourceMode.Self),
  65. };
  66. var setter = new Setter(Decorator.TagProperty, binding);
  67. var instance = setter.Instance(control);
  68. instance.Start(true);
  69. instance.Activate();
  70. Assert.Equal("foobar", control.Tag);
  71. // Issue #1218 caused TestConverter.ConvertBack to throw here.
  72. instance.Deactivate();
  73. Assert.Null(control.Tag);
  74. }
  75. [Fact]
  76. public void Setter_Should_Apply_Value_Without_Activator_With_Style_Priority()
  77. {
  78. var control = new Control();
  79. var setter = new Setter(TextBlock.TagProperty, "foo");
  80. setter.Instance(control).Start(false);
  81. Assert.Equal("foo", control.Tag);
  82. Assert.Equal(BindingPriority.Style, control.GetDiagnostic(TextBlock.TagProperty).Priority);
  83. }
  84. [Fact]
  85. public void Setter_Should_Apply_Value_With_Activator_As_Binding_With_StyleTrigger_Priority()
  86. {
  87. var control = new Canvas();
  88. var setter = new Setter(TextBlock.TagProperty, "foo");
  89. var instance = setter.Instance(control);
  90. instance.Start(true);
  91. instance.Activate();
  92. Assert.Equal("foo", control.Tag);
  93. Assert.Equal(BindingPriority.StyleTrigger, control.GetDiagnostic(TextBlock.TagProperty).Priority);
  94. }
  95. [Fact]
  96. public void Setter_Should_Apply_Binding_Without_Activator_With_Style_Priority()
  97. {
  98. var control = new Canvas();
  99. var source = new { Foo = "foo" };
  100. var setter = new Setter(TextBlock.TagProperty, new Binding
  101. {
  102. Source = source,
  103. Path = nameof(source.Foo),
  104. });
  105. setter.Instance(control).Start(false);
  106. Assert.Equal("foo", control.Tag);
  107. Assert.Equal(BindingPriority.Style, control.GetDiagnostic(TextBlock.TagProperty).Priority);
  108. }
  109. [Fact]
  110. public void Setter_Should_Apply_Binding_With_Activator_With_StyleTrigger_Priority()
  111. {
  112. var control = new Canvas();
  113. var source = new { Foo = "foo" };
  114. var setter = new Setter(TextBlock.TagProperty, new Binding
  115. {
  116. Source = source,
  117. Path = nameof(source.Foo),
  118. });
  119. var instance = setter.Instance(control);
  120. instance.Start(true);
  121. instance.Activate();
  122. Assert.Equal("foo", control.Tag);
  123. Assert.Equal(BindingPriority.StyleTrigger, control.GetDiagnostic(TextBlock.TagProperty).Priority);
  124. }
  125. [Fact]
  126. public void Disposing_Setter_Should_Preserve_LocalValue()
  127. {
  128. var control = new Canvas();
  129. var setter = new Setter(TextBlock.TagProperty, "foo");
  130. var instance = setter.Instance(control);
  131. instance.Start(true);
  132. instance.Activate();
  133. control.Tag = "bar";
  134. instance.Dispose();
  135. Assert.Equal("bar", control.Tag);
  136. }
  137. [Fact]
  138. public void Disposing_Binding_Setter_Should_Preserve_LocalValue()
  139. {
  140. var control = new Canvas();
  141. var source = new { Foo = "foo" };
  142. var setter = new Setter(TextBlock.TagProperty, new Binding
  143. {
  144. Source = source,
  145. Path = nameof(source.Foo),
  146. });
  147. var instance = setter.Instance(control);
  148. instance.Start(true);
  149. instance.Activate();
  150. control.Tag = "bar";
  151. instance.Dispose();
  152. Assert.Equal("bar", control.Tag);
  153. }
  154. private class TestConverter : IValueConverter
  155. {
  156. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  157. {
  158. return value.ToString() + "bar";
  159. }
  160. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  161. {
  162. throw new NotImplementedException();
  163. }
  164. }
  165. }
  166. }