SelectorTests_NthLastChild.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using System.Threading.Tasks;
  2. using Avalonia.Controls;
  3. using Avalonia.Styling;
  4. using Xunit;
  5. namespace Avalonia.Base.UnitTests.Styling
  6. {
  7. public class SelectorTests_NthLastChild
  8. {
  9. [Theory]
  10. [InlineData(2, 0, ":nth-last-child(2n)")]
  11. [InlineData(2, 1, ":nth-last-child(2n+1)")]
  12. [InlineData(1, 0, ":nth-last-child(1n)")]
  13. [InlineData(4, -1, ":nth-last-child(4n-1)")]
  14. [InlineData(0, 1, ":nth-last-child(1)")]
  15. [InlineData(0, -1, ":nth-last-child(-1)")]
  16. [InlineData(int.MaxValue, int.MinValue + 1, ":nth-last-child(2147483647n-2147483647)")]
  17. public void Not_Selector_Should_Have_Correct_String_Representation(int step, int offset, string expected)
  18. {
  19. var target = default(Selector).NthLastChild(step, offset);
  20. Assert.Equal(expected, target.ToString());
  21. }
  22. [Fact]
  23. public async Task Nth_Child_Match_Control_In_Panel()
  24. {
  25. Border b1, b2, b3, b4;
  26. var panel = new StackPanel();
  27. panel.Children.AddRange(new[]
  28. {
  29. b1 = new Border(),
  30. b2 = new Border(),
  31. b3 = new Border(),
  32. b4 = new Border()
  33. });
  34. var target = default(Selector).NthLastChild(2, 0);
  35. Assert.True(await target.Match(b1).Activator!.Take(1));
  36. Assert.False(await target.Match(b2).Activator!.Take(1));
  37. Assert.True(await target.Match(b3).Activator!.Take(1));
  38. Assert.False(await target.Match(b4).Activator!.Take(1));
  39. }
  40. [Fact]
  41. public async Task Nth_Child_Match_Control_In_Panel_With_Offset()
  42. {
  43. Border b1, b2, b3, b4;
  44. var panel = new StackPanel();
  45. panel.Children.AddRange(new[]
  46. {
  47. b1 = new Border(),
  48. b2 = new Border(),
  49. b3 = new Border(),
  50. b4 = new Border()
  51. });
  52. var target = default(Selector).NthLastChild(2, 1);
  53. Assert.False(await target.Match(b1).Activator!.Take(1));
  54. Assert.True(await target.Match(b2).Activator!.Take(1));
  55. Assert.False(await target.Match(b3).Activator!.Take(1));
  56. Assert.True(await target.Match(b4).Activator!.Take(1));
  57. }
  58. [Fact]
  59. public async Task Nth_Child_Match_Control_In_Panel_With_Negative_Offset()
  60. {
  61. Border b1, b2, b3, b4;
  62. var panel = new StackPanel();
  63. panel.Children.AddRange(new[]
  64. {
  65. b1 = new Border(),
  66. b2 = new Border(),
  67. b3 = new Border(),
  68. b4 = new Border()
  69. });
  70. var target = default(Selector).NthLastChild(4, -1);
  71. Assert.False(await target.Match(b1).Activator!.Take(1));
  72. Assert.True(await target.Match(b2).Activator!.Take(1));
  73. Assert.False(await target.Match(b3).Activator!.Take(1));
  74. Assert.False(await target.Match(b4).Activator!.Take(1));
  75. }
  76. [Fact]
  77. public async Task Nth_Child_Match_Control_In_Panel_With_Singular_Step()
  78. {
  79. Border b1, b2, b3, b4;
  80. var panel = new StackPanel();
  81. panel.Children.AddRange(new[]
  82. {
  83. b1 = new Border(),
  84. b2 = new Border(),
  85. b3 = new Border(),
  86. b4 = new Border()
  87. });
  88. var target = default(Selector).NthLastChild(1, 2);
  89. Assert.True(await target.Match(b1).Activator!.Take(1));
  90. Assert.True(await target.Match(b2).Activator!.Take(1));
  91. Assert.True(await target.Match(b3).Activator!.Take(1));
  92. Assert.False(await target.Match(b4).Activator!.Take(1));
  93. }
  94. [Fact]
  95. public async Task Nth_Child_Match_Control_In_Panel_With_Singular_Step_With_Negative_Offset()
  96. {
  97. Border b1, b2, b3, b4;
  98. var panel = new StackPanel();
  99. panel.Children.AddRange(new[]
  100. {
  101. b1 = new Border(),
  102. b2 = new Border(),
  103. b3 = new Border(),
  104. b4 = new Border()
  105. });
  106. var target = default(Selector).NthLastChild(1, -2);
  107. Assert.True(await target.Match(b1).Activator!.Take(1));
  108. Assert.True(await target.Match(b2).Activator!.Take(1));
  109. Assert.True(await target.Match(b3).Activator!.Take(1));
  110. Assert.True(await target.Match(b4).Activator!.Take(1));
  111. }
  112. [Fact]
  113. public async Task Nth_Child_Match_Control_In_Panel_With_Zero_Step_With_Offset()
  114. {
  115. Border b1, b2, b3, b4;
  116. var panel = new StackPanel();
  117. panel.Children.AddRange(new[]
  118. {
  119. b1 = new Border(),
  120. b2 = new Border(),
  121. b3 = new Border(),
  122. b4 = new Border()
  123. });
  124. var target = default(Selector).NthLastChild(0, 2);
  125. Assert.False(await target.Match(b1).Activator!.Take(1));
  126. Assert.False(await target.Match(b2).Activator!.Take(1));
  127. Assert.True(await target.Match(b3).Activator!.Take(1));
  128. Assert.False(await target.Match(b4).Activator!.Take(1));
  129. }
  130. [Fact]
  131. public async Task Nth_Child_Doesnt_Match_Control_In_Panel_With_Zero_Step_With_Negative_Offset()
  132. {
  133. Border b1, b2, b3, b4;
  134. var panel = new StackPanel();
  135. panel.Children.AddRange(new[]
  136. {
  137. b1 = new Border(),
  138. b2 = new Border(),
  139. b3 = new Border(),
  140. b4 = new Border()
  141. });
  142. var target = default(Selector).NthLastChild(0, -2);
  143. Assert.False(await target.Match(b1).Activator!.Take(1));
  144. Assert.False(await target.Match(b2).Activator!.Take(1));
  145. Assert.False(await target.Match(b3).Activator!.Take(1));
  146. Assert.False(await target.Match(b4).Activator!.Take(1));
  147. }
  148. [Fact]
  149. public async Task Nth_Child_Match_Control_In_Panel_With_Previous_Selector()
  150. {
  151. Border b1, b2;
  152. Button b3, b4;
  153. var panel = new StackPanel();
  154. panel.Children.AddRange(new Control[]
  155. {
  156. b1 = new Border(),
  157. b2 = new Border(),
  158. b3 = new Button(),
  159. b4 = new Button()
  160. });
  161. var previous = default(Selector).OfType<Border>();
  162. var target = previous.NthLastChild(2, 0);
  163. Assert.True(await target.Match(b1).Activator!.Take(1));
  164. Assert.False(await target.Match(b2).Activator!.Take(1));
  165. Assert.Null(target.Match(b3).Activator);
  166. Assert.Equal(SelectorMatchResult.NeverThisType, target.Match(b3).Result);
  167. Assert.Null(target.Match(b4).Activator);
  168. Assert.Equal(SelectorMatchResult.NeverThisType, target.Match(b4).Result);
  169. }
  170. [Fact]
  171. public void Nth_Child_Doesnt_Match_Control_Out_Of_Panel_Parent()
  172. {
  173. Border b1;
  174. var contentControl = new ContentControl();
  175. contentControl.Content = b1 = new Border();
  176. var target = default(Selector).NthLastChild(1, 0);
  177. Assert.Equal(SelectorMatch.NeverThisInstance, target.Match(b1));
  178. }
  179. [Fact]
  180. public void Returns_Correct_TargetType()
  181. {
  182. var target = new NthLastChildSelector(default(Selector).OfType<Control1>(), 1, 0);
  183. Assert.Equal(typeof(Control1), target.TargetType);
  184. }
  185. public class Control1 : Control
  186. {
  187. }
  188. }
  189. }