ControlAutomationPeerTests.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System.Linq;
  2. using Avalonia.Automation.Peers;
  3. using Avalonia.Controls.Presenters;
  4. using Avalonia.Controls.Templates;
  5. using Avalonia.UnitTests;
  6. using Avalonia.VisualTree;
  7. using Xunit;
  8. #nullable enable
  9. namespace Avalonia.Controls.UnitTests.Automation
  10. {
  11. public class ControlAutomationPeerTests
  12. {
  13. public class Children : ScopedTestBase
  14. {
  15. [Fact]
  16. public void Creates_Children_For_Controls_In_Visual_Tree()
  17. {
  18. var panel = new Panel
  19. {
  20. Children =
  21. {
  22. new Border(),
  23. new Border(),
  24. },
  25. };
  26. var target = CreatePeer(panel);
  27. Assert.Equal(
  28. panel.GetVisualChildren(),
  29. target.GetChildren().Cast<ControlAutomationPeer>().Select(x => x.Owner));
  30. }
  31. [Fact]
  32. public void Creates_Children_when_Controls_Attached_To_Visual_Tree()
  33. {
  34. var contentControl = new ContentControl
  35. {
  36. Template = new FuncControlTemplate<ContentControl>((o, _) =>
  37. new ContentPresenter
  38. {
  39. Name = "PART_ContentPresenter",
  40. [!ContentPresenter.ContentProperty] = o[!ContentControl.ContentProperty],
  41. }),
  42. Content = new Border(),
  43. };
  44. var target = CreatePeer(contentControl);
  45. Assert.Empty(target.GetChildren());
  46. contentControl.Measure(Size.Infinity);
  47. Assert.Equal(1, target.GetChildren().Count);
  48. }
  49. [Fact]
  50. public void Updates_Children_When_VisualChildren_Added()
  51. {
  52. var panel = new Panel
  53. {
  54. Children =
  55. {
  56. new Border(),
  57. new Border(),
  58. },
  59. };
  60. var target = CreatePeer(panel);
  61. var children = target.GetChildren();
  62. Assert.Equal(2, children.Count);
  63. panel.Children.Add(new Decorator());
  64. children = target.GetChildren();
  65. Assert.Equal(3, children.Count);
  66. }
  67. [Fact]
  68. public void Updates_Children_When_VisualChildren_Removed()
  69. {
  70. var panel = new Panel
  71. {
  72. Children =
  73. {
  74. new Border(),
  75. new Border(),
  76. },
  77. };
  78. var target = CreatePeer(panel);
  79. var children = target.GetChildren();
  80. Assert.Equal(2, children.Count);
  81. panel.Children.RemoveAt(1);
  82. children = target.GetChildren();
  83. Assert.Equal(1, children.Count);
  84. }
  85. [Fact]
  86. public void Updates_Children_When_Visibility_Changes_From_Visible_To_Invisible()
  87. {
  88. var panel = new Panel
  89. {
  90. Children =
  91. {
  92. new Border(),
  93. new Border(),
  94. },
  95. };
  96. var target = CreatePeer(panel);
  97. var children = target.GetChildren();
  98. Assert.Equal(2, children.Count);
  99. panel.Children[1].IsVisible = false;
  100. children = target.GetChildren();
  101. Assert.Equal(1, children.Count);
  102. panel.Children[1].IsVisible = true;
  103. children = target.GetChildren();
  104. Assert.Equal(2, children.Count);
  105. }
  106. [Fact]
  107. public void Updates_Children_When_Visibility_Changes_From_Invisible_To_Visible()
  108. {
  109. var panel = new Panel
  110. {
  111. Children =
  112. {
  113. new Border(),
  114. new Border { IsVisible = false },
  115. },
  116. };
  117. var target = CreatePeer(panel);
  118. var children = target.GetChildren();
  119. Assert.Equal(1, children.Count);
  120. panel.Children[1].IsVisible = true;
  121. children = target.GetChildren();
  122. Assert.Equal(2, children.Count);
  123. }
  124. }
  125. public class Parent : ScopedTestBase
  126. {
  127. [Fact]
  128. public void Connects_Peer_To_Tree_When_GetParent_Called()
  129. {
  130. var border = new Border();
  131. var tree = new Decorator
  132. {
  133. Child = new Decorator
  134. {
  135. Child = border,
  136. }
  137. };
  138. // We're accessing Border directly without going via its ancestors. Because the tree
  139. // is built lazily, ensure that calling GetParent causes the ancestor tree to be built.
  140. var target = CreatePeer(border);
  141. var parentPeer = Assert.IsAssignableFrom<ControlAutomationPeer>(target.GetParent());
  142. Assert.Same(border.GetVisualParent(), parentPeer.Owner);
  143. }
  144. [Fact]
  145. public void Parent_Updated_When_Moved_To_Separate_Visual_Tree()
  146. {
  147. var border = new Border();
  148. var root1 = new Decorator { Child = border };
  149. var root2 = new Decorator();
  150. var target = CreatePeer(border);
  151. var parentPeer = Assert.IsAssignableFrom<ControlAutomationPeer>(target.GetParent());
  152. Assert.Same(root1, parentPeer.Owner);
  153. root1.Child = null;
  154. Assert.Null(target.GetParent());
  155. root2.Child = border;
  156. parentPeer = Assert.IsAssignableFrom<ControlAutomationPeer>(target.GetParent());
  157. Assert.Same(root2, parentPeer.Owner);
  158. }
  159. }
  160. private static AutomationPeer CreatePeer(Control control)
  161. {
  162. return ControlAutomationPeer.CreatePeerForElement(control);
  163. }
  164. }
  165. }