SelectorTests_Template.cs 6.0 KB

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