SelectorTests_Template.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Avalonia.Controls;
  4. using Avalonia.Diagnostics;
  5. using Avalonia.Styling;
  6. using Avalonia.VisualTree;
  7. using Moq;
  8. using Xunit;
  9. namespace Avalonia.Base.UnitTests.Styling
  10. {
  11. public class SelectorTests_Template
  12. {
  13. [Fact]
  14. public void Control_In_Template_Is_Matched_With_Template_Selector()
  15. {
  16. var target = new Mock<IVisual>();
  17. var templatedControl = target.As<ITemplatedControl>();
  18. var styleable = target.As<IStyleable>();
  19. BuildVisualTree(target);
  20. var border = (Border)target.Object.GetVisualChildren().Single();
  21. var selector = default(Selector)
  22. .OfType(target.Object.GetType())
  23. .Template()
  24. .OfType<Border>();
  25. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(border).Result);
  26. }
  27. [Fact]
  28. public void Control_Not_In_Template_Is_Not_Matched_With_Template_Selector()
  29. {
  30. var target = new Mock<IVisual>();
  31. var templatedControl = target.As<ITemplatedControl>();
  32. var styleable = target.As<IStyleable>();
  33. BuildVisualTree(target);
  34. var border = (Border)target.Object.GetVisualChildren().Single();
  35. border.SetValue(Control.TemplatedParentProperty, null);
  36. var selector = default(Selector)
  37. .OfType(target.Object.GetType())
  38. .Template()
  39. .OfType<Border>();
  40. Assert.Equal(SelectorMatchResult.NeverThisInstance, selector.Match(border).Result);
  41. }
  42. [Fact]
  43. public void Control_In_Template_Of_Wrong_Type_Is_Not_Matched_With_Template_Selector()
  44. {
  45. var target = new Mock<IVisual>();
  46. var templatedControl = target.As<ITemplatedControl>();
  47. var styleable = target.As<IStyleable>();
  48. BuildVisualTree(target);
  49. var border = (Border)target.Object.GetVisualChildren().Single();
  50. var selector = default(Selector)
  51. .OfType<Button>()
  52. .Template()
  53. .OfType<Border>();
  54. Assert.Equal(SelectorMatchResult.NeverThisInstance, selector.Match(border).Result);
  55. }
  56. [Fact]
  57. public void Nested_Control_In_Template_Is_Matched_With_Template_Selector()
  58. {
  59. var target = new Mock<IVisual>();
  60. var templatedControl = target.As<ITemplatedControl>();
  61. var styleable = target.As<IStyleable>();
  62. BuildVisualTree(target);
  63. var textBlock = (TextBlock)target.Object.VisualChildren.Single().VisualChildren.Single();
  64. var selector = default(Selector)
  65. .OfType(target.Object.GetType())
  66. .Template()
  67. .OfType<TextBlock>();
  68. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(textBlock).Result);
  69. }
  70. [Fact]
  71. public void Control_In_Template_Is_Matched_With_TypeOf_TemplatedControl()
  72. {
  73. var target = new Mock<IVisual>();
  74. var templatedControl = target.As<ITemplatedControl>();
  75. var styleable = target.As<IStyleable>();
  76. var styleKey = templatedControl.Object.GetType();
  77. BuildVisualTree(target);
  78. var border = (Border)target.Object.VisualChildren.Single();
  79. var selector = default(Selector).OfType(styleKey).Template().OfType<Border>();
  80. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(border).Result);
  81. }
  82. [Fact]
  83. public async Task Control_In_Template_Is_Matched_With_Correct_TypeOf_And_Class_Of_TemplatedControl()
  84. {
  85. var target = new Mock<IVisual>();
  86. var templatedControl = target.As<ITemplatedControl>();
  87. var styleable = target.As<IStyleable>();
  88. var styleKey = templatedControl.Object.GetType();
  89. BuildVisualTree(target);
  90. styleable.Setup(x => x.StyleKey).Returns(styleKey);
  91. styleable.Setup(x => x.Classes).Returns(new Classes("foo"));
  92. var border = (Border)target.Object.VisualChildren.Single();
  93. var selector = default(Selector).OfType(styleKey).Class("foo").Template().OfType<Border>();
  94. var activator = selector.Match(border).Activator;
  95. Assert.True(await activator.Take(1));
  96. }
  97. [Fact]
  98. public async Task Control_In_Template_Is_Not_Matched_With_Correct_TypeOf_And_Wrong_Class_Of_TemplatedControl()
  99. {
  100. var target = new Mock<IVisual>();
  101. var templatedControl = target.As<ITemplatedControl>();
  102. var styleable = target.As<IStyleable>();
  103. BuildVisualTree(target);
  104. styleable.Setup(x => x.Classes).Returns(new Classes("bar"));
  105. var border = (Border)target.Object.VisualChildren.Single();
  106. var selector = default(Selector).OfType(templatedControl.Object.GetType()).Class("foo").Template().OfType<Border>();
  107. var activator = selector.Match(border).Activator;
  108. Assert.False(await activator.Take(1));
  109. }
  110. [Fact]
  111. public void Nested_Selector_Is_Unsubscribed()
  112. {
  113. var target = new Mock<IVisual>();
  114. var templatedControl = target.As<ITemplatedControl>();
  115. var styleable = target.As<IStyleable>();
  116. BuildVisualTree(target);
  117. styleable.Setup(x => x.Classes).Returns(new Classes("foo"));
  118. var border = (Border)target.Object.VisualChildren.Single();
  119. var selector = default(Selector).OfType(templatedControl.Object.GetType()).Class("foo").Template().OfType<Border>();
  120. var activator = selector.Match(border).Activator;
  121. using (activator.Subscribe(_ => { }))
  122. {
  123. Assert.Equal(1, ((Classes)styleable.Object.Classes).ListenerCount);
  124. }
  125. Assert.Equal(0, ((Classes)styleable.Object.Classes).ListenerCount);
  126. }
  127. private void BuildVisualTree<T>(Mock<T> templatedControl) where T : class, IVisual
  128. {
  129. templatedControl.Setup(x => x.VisualChildren).Returns(new Controls.Controls
  130. {
  131. new Border
  132. {
  133. [Control.TemplatedParentProperty] = templatedControl.Object,
  134. Child = new TextBlock
  135. {
  136. [Control.TemplatedParentProperty] = templatedControl.Object,
  137. },
  138. },
  139. });
  140. }
  141. }
  142. }