SelectorTests_Multiple.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Avalonia.Controls;
  5. using Avalonia.Controls.Templates;
  6. using Avalonia.Styling;
  7. using Avalonia.VisualTree;
  8. using Xunit;
  9. namespace Avalonia.Base.UnitTests.Styling
  10. {
  11. public class SelectorTests_Multiple
  12. {
  13. [Fact]
  14. public void Named_Template_Child_Of_Control_With_Two_Classes()
  15. {
  16. var template = new FuncControlTemplate((parent, scope) =>
  17. {
  18. return new Border
  19. {
  20. Name = "border",
  21. }.RegisterInNameScope(scope);
  22. });
  23. var control = new Button
  24. {
  25. Template = template,
  26. };
  27. control.ApplyTemplate();
  28. var selector = default(Selector)
  29. .OfType<Button>()
  30. .Class("foo")
  31. .Class("bar")
  32. .Template()
  33. .Name("border");
  34. var border = (Border)control.VisualChildren.Single();
  35. var values = new List<bool>();
  36. var match = selector.Match(border);
  37. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  38. match.Activator.Subscribe(x => values.Add(x));
  39. Assert.Equal(new[] { false }, values);
  40. control.Classes.AddRange(new[] { "foo", "bar" });
  41. Assert.Equal(new[] { false, true }, values);
  42. control.Classes.Remove("foo");
  43. Assert.Equal(new[] { false, true, false }, values);
  44. }
  45. [Fact]
  46. public void Named_OfType_Template_Child_Of_Control_With_Two_Classes_Wrong_Type()
  47. {
  48. var template = new FuncControlTemplate((parent, scope) =>
  49. {
  50. return new Border
  51. {
  52. Name = "border",
  53. }.RegisterInNameScope(scope);
  54. });
  55. var control = new Button
  56. {
  57. Template = template,
  58. };
  59. control.ApplyTemplate();
  60. var selector = default(Selector)
  61. .OfType<Button>()
  62. .Class("foo")
  63. .Class("bar")
  64. .Template()
  65. .OfType<TextBlock>()
  66. .Name("baz");
  67. var border = (Border)control.VisualChildren.Single();
  68. var values = new List<bool>();
  69. var match = selector.Match(border);
  70. Assert.Equal(SelectorMatchResult.NeverThisType, match.Result);
  71. }
  72. [Fact]
  73. public void Control_With_Class_Descendent_Of_Control_With_Two_Classes()
  74. {
  75. var textBlock = new TextBlock();
  76. var control = new Button { Content = textBlock };
  77. control.ApplyTemplate();
  78. var selector = default(Selector)
  79. .OfType<Button>()
  80. .Class("foo")
  81. .Class("bar")
  82. .Descendant()
  83. .OfType<TextBlock>()
  84. .Class("baz");
  85. var values = new List<bool>();
  86. var match = selector.Match(textBlock);
  87. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  88. match.Activator.Subscribe(x => values.Add(x));
  89. Assert.Equal(new[] { false }, values);
  90. control.Classes.AddRange(new[] { "foo", "bar" });
  91. Assert.Equal(new[] { false }, values);
  92. textBlock.Classes.Add("baz");
  93. Assert.Equal(new[] { false, true }, values);
  94. }
  95. [Fact]
  96. public void Named_Class_Template_Child_Of_Control()
  97. {
  98. var template = new FuncControlTemplate((parent, scope) =>
  99. {
  100. return new Border
  101. {
  102. Name = "border",
  103. }.RegisterInNameScope(scope);
  104. });
  105. var control = new Button
  106. {
  107. Template = template,
  108. };
  109. control.ApplyTemplate();
  110. var selector = default(Selector)
  111. .OfType<Button>()
  112. .Template()
  113. .Name("border")
  114. .Class("foo");
  115. var border = (Border)control.VisualChildren.Single();
  116. var values = new List<bool>();
  117. var match = selector.Match(border);
  118. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  119. match.Activator.Subscribe(x => values.Add(x));
  120. Assert.Equal(new[] { false }, values);
  121. border.Classes.AddRange(new[] { "foo" });
  122. Assert.Equal(new[] { false, true }, values);
  123. border.Classes.Remove("foo");
  124. Assert.Equal(new[] { false, true, false }, values);
  125. }
  126. [Fact]
  127. public async Task Nested_PropertyEquals()
  128. {
  129. var control = new Canvas();
  130. var parent = new Border { Child = control };
  131. var target = default(Selector)
  132. .OfType<Border>()
  133. .PropertyEquals(Border.TagProperty, "foo")
  134. .Child()
  135. .OfType<Canvas>()
  136. .PropertyEquals(Canvas.TagProperty, "bar");
  137. var match = target.Match(control);
  138. Assert.Equal(SelectorMatchResult.Sometimes, match.Result);
  139. var activator = match.Activator;
  140. Assert.False(await activator.Take(1));
  141. control.Tag = "bar";
  142. Assert.False(await activator.Take(1));
  143. parent.Tag = "foo";
  144. Assert.True(await activator.Take(1));
  145. }
  146. [Fact]
  147. public void TargetType_OfType()
  148. {
  149. var selector = default(Selector).OfType<Button>();
  150. Assert.Equal(typeof(Button), selector.TargetType);
  151. }
  152. [Fact]
  153. public void TargetType_OfType_Class()
  154. {
  155. var selector = default(Selector)
  156. .OfType<Button>()
  157. .Class("foo");
  158. Assert.Equal(typeof(Button), selector.TargetType);
  159. }
  160. [Fact]
  161. public void TargetType_Is_Class()
  162. {
  163. var selector = default(Selector)
  164. .Is<Button>()
  165. .Class("foo");
  166. Assert.Equal(typeof(Button), selector.TargetType);
  167. }
  168. [Fact]
  169. public void TargetType_Child()
  170. {
  171. var selector = default(Selector)
  172. .OfType<Button>()
  173. .Child()
  174. .OfType<TextBlock>();
  175. Assert.Equal(typeof(TextBlock), selector.TargetType);
  176. }
  177. [Fact]
  178. public void TargetType_Descendant()
  179. {
  180. var selector = default(Selector)
  181. .OfType<Button>()
  182. .Descendant()
  183. .OfType<TextBlock>();
  184. Assert.Equal(typeof(TextBlock), selector.TargetType);
  185. }
  186. [Fact]
  187. public void TargetType_Template()
  188. {
  189. var selector = default(Selector)
  190. .OfType<Button>()
  191. .Template()
  192. .OfType<TextBlock>();
  193. Assert.Equal(typeof(TextBlock), selector.TargetType);
  194. }
  195. }
  196. }