BindingOperationsTests.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using Avalonia.Controls;
  2. using Avalonia.Data;
  3. using Avalonia.Data.Converters;
  4. using Avalonia.Styling;
  5. using Avalonia.UnitTests;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests.Data;
  8. public class BindingOperationsTests
  9. {
  10. [Fact]
  11. public void GetBindingExpressionBase_Returns_Null_When_Not_Bound()
  12. {
  13. var target = new Control();
  14. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  15. Assert.Null(expression);
  16. }
  17. [Theory]
  18. [InlineData(BindingPriority.Animation)]
  19. [InlineData(BindingPriority.LocalValue)]
  20. [InlineData(BindingPriority.Style)]
  21. [InlineData(BindingPriority.StyleTrigger)]
  22. public void GetBindingExpressionBase_Returns_Expression_When_Bound(BindingPriority priority)
  23. {
  24. var data = new { Tag = "foo" };
  25. var target = new Control { DataContext = data };
  26. var binding = new Binding("Tag") { Priority = priority };
  27. target.Bind(Control.TagProperty, binding);
  28. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  29. Assert.NotNull(expression);
  30. }
  31. [Fact]
  32. public void GetBindingExpressionBase_Returns_Expression_When_Bound_Locally_With_Binding_Error()
  33. {
  34. // Target has no data context so binding will fail.
  35. var target = new Control();
  36. var binding = new Binding("Tag");
  37. target.Bind(Control.TagProperty, binding);
  38. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  39. Assert.NotNull(expression);
  40. }
  41. [Fact]
  42. public void GetBindingExpressionBase_Returns_Expression_When_Bound_To_MultiBinding()
  43. {
  44. var data = new { Tag = "foo" };
  45. var target = new Control { DataContext = data };
  46. var binding = new MultiBinding
  47. {
  48. Converter = new FuncMultiValueConverter<object, string>(x => string.Join(',', x)),
  49. Bindings =
  50. {
  51. new Binding("Tag"),
  52. new Binding("Tag"),
  53. }
  54. };
  55. target.Bind(Control.TagProperty, binding);
  56. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  57. Assert.NotNull(expression);
  58. }
  59. [Fact]
  60. public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme()
  61. {
  62. var target = new Control();
  63. var binding = new Binding("Tag");
  64. var theme = new ControlTheme(typeof(Control))
  65. {
  66. Setters = { new Setter(Control.TagProperty, binding) },
  67. };
  68. target.Theme = theme;
  69. var root = new TestRoot(target);
  70. root.UpdateLayout();
  71. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  72. Assert.NotNull(expression);
  73. }
  74. [Fact]
  75. public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme_TemplateBinding()
  76. {
  77. var target = new Control();
  78. var binding = new TemplateBinding(Control.TagProperty);
  79. var theme = new ControlTheme(typeof(Control))
  80. {
  81. Setters = { new Setter(Control.TagProperty, binding) },
  82. };
  83. target.Theme = theme;
  84. var root = new TestRoot(target);
  85. root.UpdateLayout();
  86. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  87. Assert.NotNull(expression);
  88. }
  89. [Fact]
  90. public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme_Style()
  91. {
  92. var target = new Control { Classes = { "foo" } };
  93. var binding = new Binding("Tag");
  94. var theme = new ControlTheme(typeof(Control))
  95. {
  96. Children =
  97. {
  98. new Style(x => x.Nesting().Class("foo"))
  99. {
  100. Setters = { new Setter(Control.TagProperty, binding) },
  101. },
  102. }
  103. };
  104. target.Theme = theme;
  105. var root = new TestRoot(target);
  106. root.UpdateLayout();
  107. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  108. Assert.NotNull(expression);
  109. }
  110. [Fact]
  111. public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_Style()
  112. {
  113. var target = new Control();
  114. var binding = new Binding("Tag");
  115. var style = new Style(x => x.OfType<Control>())
  116. {
  117. Setters = { new Setter(Control.TagProperty, binding) },
  118. };
  119. var root = new TestRoot();
  120. root.Styles.Add(style);
  121. root.Child = target;
  122. root.UpdateLayout();
  123. var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty);
  124. Assert.NotNull(expression);
  125. }
  126. }