SelectorTests_NthChild.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Avalonia.Controls;
  4. using Avalonia.Styling;
  5. using Xunit;
  6. namespace Avalonia.Base.UnitTests.Styling
  7. {
  8. public class SelectorTests_NthChild
  9. {
  10. [Theory]
  11. [InlineData(2, 0, ":nth-child(2n)")]
  12. [InlineData(2, 1, ":nth-child(2n+1)")]
  13. [InlineData(1, 0, ":nth-child(1n)")]
  14. [InlineData(4, -1, ":nth-child(4n-1)")]
  15. [InlineData(0, 1, ":nth-child(1)")]
  16. [InlineData(0, -1, ":nth-child(-1)")]
  17. [InlineData(int.MaxValue, int.MinValue + 1, ":nth-child(2147483647n-2147483647)")]
  18. public void Not_Selector_Should_Have_Correct_String_Representation(int step, int offset, string expected)
  19. {
  20. var target = default(Selector).NthChild(step, offset);
  21. Assert.Equal(expected, target.ToString());
  22. }
  23. [Fact]
  24. public async Task Nth_Child_Match_Control_In_Panel()
  25. {
  26. Border b1, b2, b3, b4;
  27. var panel = new StackPanel();
  28. panel.Children.AddRange(new[]
  29. {
  30. b1 = new Border(),
  31. b2 = new Border(),
  32. b3 = new Border(),
  33. b4 = new Border()
  34. });
  35. var target = default(Selector).NthChild(2, 0);
  36. Assert.False(await target.Match(b1).Activator!.Take(1));
  37. Assert.True(await target.Match(b2).Activator!.Take(1));
  38. Assert.False(await target.Match(b3).Activator!.Take(1));
  39. Assert.True(await target.Match(b4).Activator!.Take(1));
  40. }
  41. [Fact]
  42. public async Task Nth_Child_Match_Control_In_Panel_With_Offset()
  43. {
  44. Border b1, b2, b3, b4;
  45. var panel = new StackPanel();
  46. panel.Children.AddRange(new[]
  47. {
  48. b1 = new Border(),
  49. b2 = new Border(),
  50. b3 = new Border(),
  51. b4 = new Border()
  52. });
  53. var target = default(Selector).NthChild(2, 1);
  54. Assert.True(await target.Match(b1).Activator!.Take(1));
  55. Assert.False(await target.Match(b2).Activator!.Take(1));
  56. Assert.True(await target.Match(b3).Activator!.Take(1));
  57. Assert.False(await target.Match(b4).Activator!.Take(1));
  58. }
  59. [Fact]
  60. public async Task Nth_Child_Match_Control_In_Panel_With_Negative_Offset()
  61. {
  62. Border b1, b2, b3, b4;
  63. var panel = new StackPanel();
  64. panel.Children.AddRange(new[]
  65. {
  66. b1 = new Border(),
  67. b2 = new Border(),
  68. b3 = new Border(),
  69. b4 = new Border()
  70. });
  71. var target = default(Selector).NthChild(4, -1);
  72. Assert.False(await target.Match(b1).Activator!.Take(1));
  73. Assert.False(await target.Match(b2).Activator!.Take(1));
  74. Assert.True(await target.Match(b3).Activator!.Take(1));
  75. Assert.False(await target.Match(b4).Activator!.Take(1));
  76. }
  77. [Fact]
  78. public async Task Nth_Child_Match_Control_In_Panel_With_Singular_Step()
  79. {
  80. Border b1, b2, b3, b4;
  81. var panel = new StackPanel();
  82. panel.Children.AddRange(new[]
  83. {
  84. b1 = new Border(),
  85. b2 = new Border(),
  86. b3 = new Border(),
  87. b4 = new Border()
  88. });
  89. var target = default(Selector).NthChild(1, 2);
  90. Assert.False(await target.Match(b1).Activator!.Take(1));
  91. Assert.True(await target.Match(b2).Activator!.Take(1));
  92. Assert.True(await target.Match(b3).Activator!.Take(1));
  93. Assert.True(await target.Match(b4).Activator!.Take(1));
  94. }
  95. [Fact]
  96. public async Task Nth_Child_Match_Control_In_Panel_With_Singular_Step_With_Negative_Offset()
  97. {
  98. Border b1, b2, b3, b4;
  99. var panel = new StackPanel();
  100. panel.Children.AddRange(new[]
  101. {
  102. b1 = new Border(),
  103. b2 = new Border(),
  104. b3 = new Border(),
  105. b4 = new Border()
  106. });
  107. var target = default(Selector).NthChild(1, -1);
  108. Assert.True(await target.Match(b1).Activator!.Take(1));
  109. Assert.True(await target.Match(b2).Activator!.Take(1));
  110. Assert.True(await target.Match(b3).Activator!.Take(1));
  111. Assert.True(await target.Match(b4).Activator!.Take(1));
  112. }
  113. [Fact]
  114. public async Task Nth_Child_Match_Control_In_Panel_With_Zero_Step_With_Offset()
  115. {
  116. Border b1, b2, b3, b4;
  117. var panel = new StackPanel();
  118. panel.Children.AddRange(new[]
  119. {
  120. b1 = new Border(),
  121. b2 = new Border(),
  122. b3 = new Border(),
  123. b4 = new Border()
  124. });
  125. var target = default(Selector).NthChild(0, 2);
  126. Assert.False(await target.Match(b1).Activator!.Take(1));
  127. Assert.True(await target.Match(b2).Activator!.Take(1));
  128. Assert.False(await target.Match(b3).Activator!.Take(1));
  129. Assert.False(await target.Match(b4).Activator!.Take(1));
  130. }
  131. [Fact]
  132. public async Task Nth_Child_Doesnt_Match_Control_In_Panel_With_Zero_Step_With_Negative_Offset()
  133. {
  134. Border b1, b2, b3, b4;
  135. var panel = new StackPanel();
  136. panel.Children.AddRange(new[]
  137. {
  138. b1 = new Border(),
  139. b2 = new Border(),
  140. b3 = new Border(),
  141. b4 = new Border()
  142. });
  143. var target = default(Selector).NthChild(0, -2);
  144. Assert.False(await target.Match(b1).Activator!.Take(1));
  145. Assert.False(await target.Match(b2).Activator!.Take(1));
  146. Assert.False(await target.Match(b3).Activator!.Take(1));
  147. Assert.False(await target.Match(b4).Activator!.Take(1));
  148. }
  149. [Fact]
  150. public async Task Nth_Child_Match_Control_In_Panel_With_Previous_Selector()
  151. {
  152. Border b1, b2;
  153. Button b3, b4;
  154. var panel = new StackPanel();
  155. panel.Children.AddRange(new Control[]
  156. {
  157. b1 = new Border(),
  158. b2 = new Border(),
  159. b3 = new Button(),
  160. b4 = new Button()
  161. });
  162. var previous = default(Selector).OfType<Border>();
  163. var target = previous.NthChild(2, 0);
  164. Assert.False(await target.Match(b1).Activator!.Take(1));
  165. Assert.True(await target.Match(b2).Activator!.Take(1));
  166. Assert.Null(target.Match(b3).Activator);
  167. Assert.Equal(SelectorMatchResult.NeverThisType, target.Match(b3).Result);
  168. Assert.Null(target.Match(b4).Activator);
  169. Assert.Equal(SelectorMatchResult.NeverThisType, target.Match(b4).Result);
  170. }
  171. [Fact]
  172. public void Nth_Child_Doesnt_Match_Control_Out_Of_Panel_Parent()
  173. {
  174. Border b1;
  175. var contentControl = new ContentControl();
  176. contentControl.Content = b1 = new Border();
  177. var target = default(Selector).NthChild(1, 0);
  178. Assert.Equal(SelectorMatch.NeverThisInstance, target.Match(b1));
  179. }
  180. [Theory] // http://nthmaster.com/
  181. [InlineData(+0, 8, false, false, false, false, false, false, false, true , false, false, false)]
  182. [InlineData(+1, 6, false, false, false, false, false, true , true , true , true , true , true )]
  183. [InlineData(-1, 9, true , true , true , true , true , true , true , true , true , false, false)]
  184. public async Task Nth_Child_Master_Com_Test_Sigle_Selector(
  185. int step, int offset, params bool[] items)
  186. {
  187. var panel = new StackPanel();
  188. panel.Children.AddRange(items.Select(_ => new Border()));
  189. var previous = default(Selector).OfType<Border>();
  190. var target = previous.NthChild(step, offset);
  191. var results = new bool[items.Length];
  192. for (int index = 0; index < items.Length; index++)
  193. {
  194. var border = panel.Children[index];
  195. results[index] = await target.Match(border).Activator!.Take(1);
  196. }
  197. Assert.Equal(items, results);
  198. }
  199. [Theory] // http://nthmaster.com/
  200. [InlineData(+1, 4, -1, 8, false, false, false, true , true , true , true , true , false, false, false)]
  201. [InlineData(+3, 1, +2, 0, false, false, false, true , false, false, false, false, false, true , false)]
  202. public async Task Nth_Child_Master_Com_Test_Double_Selector(
  203. int step1, int offset1, int step2, int offset2, params bool[] items)
  204. {
  205. var panel = new StackPanel();
  206. panel.Children.AddRange(items.Select(_ => new Border()));
  207. var previous = default(Selector).OfType<Border>();
  208. var middle = previous.NthChild(step1, offset1);
  209. var target = middle.NthChild(step2, offset2);
  210. var results = new bool[items.Length];
  211. for (int index = 0; index < items.Length; index++)
  212. {
  213. var border = panel.Children[index];
  214. results[index] = await target.Match(border).Activator!.Take(1);
  215. }
  216. Assert.Equal(items, results);
  217. }
  218. [Theory] // http://nthmaster.com/
  219. [InlineData(+1, 2, 2, 1, -1, 9, false, false, true , false, true , false, true , false, true , false, false)]
  220. public async Task Nth_Child_Master_Com_Test_Triple_Selector(
  221. int step1, int offset1, int step2, int offset2, int step3, int offset3, params bool[] items)
  222. {
  223. var panel = new StackPanel();
  224. panel.Children.AddRange(items.Select(_ => new Border()));
  225. var previous = default(Selector).OfType<Border>();
  226. var middle1 = previous.NthChild(step1, offset1);
  227. var middle2 = middle1.NthChild(step2, offset2);
  228. var target = middle2.NthChild(step3, offset3);
  229. var results = new bool[items.Length];
  230. for (int index = 0; index < items.Length; index++)
  231. {
  232. var border = panel.Children[index];
  233. results[index] = await target.Match(border).Activator!.Take(1);
  234. }
  235. Assert.Equal(items, results);
  236. }
  237. [Fact]
  238. public void Returns_Correct_TargetType()
  239. {
  240. var target = new NthChildSelector(default(Selector).OfType<Control1>(), 1, 0);
  241. Assert.Equal(typeof(Control1), target.TargetType);
  242. }
  243. public class Control1 : Control
  244. {
  245. }
  246. }
  247. }