SelectorTests_Template.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Avalonia.Collections;
  4. using Avalonia.Controls;
  5. using Avalonia.Controls.Primitives;
  6. using Avalonia.Styling;
  7. using Avalonia.VisualTree;
  8. using Moq;
  9. using Xunit;
  10. namespace Avalonia.Base.UnitTests.Styling
  11. {
  12. public class SelectorTests_Template
  13. {
  14. [Fact]
  15. public void Control_In_Template_Is_Matched_With_Template_Selector()
  16. {
  17. var target = new TestTemplatedControl();
  18. var border = (Border)target.GetVisualChildren().Single();
  19. var selector = default(Selector)
  20. .OfType(target.GetType())
  21. .Template()
  22. .OfType<Border>();
  23. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(border).Result);
  24. }
  25. [Fact]
  26. public void Control_Not_In_Template_Is_Not_Matched_With_Template_Selector()
  27. {
  28. var target = new TestTemplatedControl();
  29. var border = (Border)target.GetVisualChildren().Single();
  30. var selector = default(Selector)
  31. .OfType(target.GetType())
  32. .Template()
  33. .OfType<Border>();
  34. border.TemplatedParent = null;
  35. Assert.Equal(SelectorMatchResult.NeverThisInstance, selector.Match(border).Result);
  36. }
  37. [Fact]
  38. public void Control_In_Template_Of_Wrong_Type_Is_Not_Matched_With_Template_Selector()
  39. {
  40. var target = new TestTemplatedControl();
  41. var border = (Border)target.GetVisualChildren().Single();
  42. var selector = default(Selector)
  43. .OfType<Button>()
  44. .Template()
  45. .OfType<Border>();
  46. Assert.Equal(SelectorMatchResult.NeverThisInstance, selector.Match(border).Result);
  47. }
  48. [Fact]
  49. public void Nested_Control_In_Template_Is_Matched_With_Template_Selector()
  50. {
  51. var target = new TestTemplatedControl();
  52. var textBlock = (TextBlock)target.VisualChildren.Single().VisualChildren.Single();
  53. var selector = default(Selector)
  54. .OfType(target.GetType())
  55. .Template()
  56. .OfType<TextBlock>();
  57. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(textBlock).Result);
  58. }
  59. [Fact]
  60. public void Control_In_Template_Is_Matched_With_TypeOf_TemplatedControl()
  61. {
  62. var target = new TestTemplatedControl();
  63. var styleKey = typeof(TestTemplatedControl);
  64. var border = (Border)target.VisualChildren.Single();
  65. var selector = default(Selector).OfType(styleKey).Template().OfType<Border>();
  66. Assert.Equal(SelectorMatchResult.AlwaysThisInstance, selector.Match(border).Result);
  67. }
  68. [Fact]
  69. public async Task Control_In_Template_Is_Matched_With_Correct_TypeOf_And_Class_Of_TemplatedControl()
  70. {
  71. var target = new TestTemplatedControl { Classes = { "foo" } };
  72. var styleKey = typeof(TestTemplatedControl);
  73. var border = (Border)target.VisualChildren.Single();
  74. var selector = default(Selector).OfType(styleKey).Class("foo").Template().OfType<Border>();
  75. var activator = selector.Match(border).Activator;
  76. Assert.NotNull(activator);
  77. Assert.True(await activator.Take(1));
  78. }
  79. [Fact]
  80. public async Task Control_In_Template_Is_Not_Matched_With_Correct_TypeOf_And_Wrong_Class_Of_TemplatedControl()
  81. {
  82. var target = new TestTemplatedControl { Classes = { "bar" } };
  83. var border = (Border)target.VisualChildren.Single();
  84. var selector = default(Selector).OfType(typeof(TestTemplatedControl)).Class("foo").Template().OfType<Border>();
  85. var activator = selector.Match(border).Activator;
  86. Assert.NotNull(activator);
  87. Assert.False(await activator.Take(1));
  88. }
  89. [Fact]
  90. public void Nested_Selector_Is_Unsubscribed()
  91. {
  92. var target = new TestTemplatedControl { Classes = { "foo" } };
  93. var border = (Border)target.VisualChildren.Single();
  94. var selector = default(Selector).OfType(typeof(TestTemplatedControl)).Class("foo").Template().OfType<Border>();
  95. var activator = selector.Match(border).Activator;
  96. Assert.NotNull(activator);
  97. using (activator.Subscribe(_ => { }))
  98. {
  99. Assert.Equal(1, target.Classes.ListenerCount);
  100. }
  101. Assert.Equal(0, target.Classes.ListenerCount);
  102. }
  103. private class TestTemplatedControl : Controls.Primitives.TemplatedControl
  104. {
  105. public TestTemplatedControl()
  106. {
  107. VisualChildren.Add(new Border
  108. {
  109. TemplatedParent = this,
  110. Child = new TextBlock
  111. {
  112. TemplatedParent = this,
  113. },
  114. });
  115. }
  116. }
  117. }
  118. }