ToolTipTests.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. using System;
  2. using System.Reactive.Disposables;
  3. using Avalonia.Markup.Xaml;
  4. using Avalonia.Platform;
  5. using Avalonia.Threading;
  6. using Avalonia.UnitTests;
  7. using Avalonia.VisualTree;
  8. using Moq;
  9. using Xunit;
  10. namespace Avalonia.Controls.UnitTests
  11. {
  12. public class TolTipTests
  13. {
  14. private MouseTestHelper _mouseHelper = new MouseTestHelper();
  15. [Fact]
  16. public void Should_Not_Open_On_Detached_Control()
  17. {
  18. //issue #3188
  19. var control = new Decorator()
  20. {
  21. [ToolTip.TipProperty] = "Tip",
  22. [ToolTip.ShowDelayProperty] = 0
  23. };
  24. Assert.False(control.IsAttachedToVisualTree);
  25. //here in issue #3188 exception is raised
  26. _mouseHelper.Enter(control);
  27. Assert.False(ToolTip.GetIsOpen(control));
  28. }
  29. [Fact]
  30. public void Should_Close_When_Control_Detaches()
  31. {
  32. using (UnitTestApplication.Start(TestServices.StyledWindow))
  33. {
  34. var window = new Window();
  35. var panel = new Panel();
  36. var target = new Decorator()
  37. {
  38. [ToolTip.TipProperty] = "Tip",
  39. [ToolTip.ShowDelayProperty] = 0
  40. };
  41. panel.Children.Add(target);
  42. window.Content = panel;
  43. window.ApplyStyling();
  44. window.ApplyTemplate();
  45. window.Presenter.ApplyTemplate();
  46. Assert.True(target.IsAttachedToVisualTree);
  47. _mouseHelper.Enter(target);
  48. Assert.True(ToolTip.GetIsOpen(target));
  49. panel.Children.Remove(target);
  50. Assert.False(ToolTip.GetIsOpen(target));
  51. }
  52. }
  53. [Fact]
  54. public void Should_Close_When_Tip_Is_Opened_And_Detached_From_Visual_Tree()
  55. {
  56. using (UnitTestApplication.Start(TestServices.StyledWindow))
  57. {
  58. var xaml = @"
  59. <Window xmlns='https://github.com/avaloniaui'
  60. xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
  61. <Panel x:Name='PART_panel'>
  62. <Decorator x:Name='PART_target' ToolTip.Tip='{Binding Tip}' ToolTip.ShowDelay='0' />
  63. </Panel>
  64. </Window>";
  65. var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
  66. window.DataContext = new ToolTipViewModel();
  67. window.ApplyTemplate();
  68. window.Presenter.ApplyTemplate();
  69. var target = window.Find<Decorator>("PART_target");
  70. var panel = window.Find<Panel>("PART_panel");
  71. Assert.True(target.IsAttachedToVisualTree);
  72. _mouseHelper.Enter(target);
  73. Assert.True(ToolTip.GetIsOpen(target));
  74. panel.Children.Remove(target);
  75. Assert.False(ToolTip.GetIsOpen(target));
  76. }
  77. }
  78. [Fact]
  79. public void Should_Open_On_Pointer_Enter()
  80. {
  81. using (UnitTestApplication.Start(TestServices.StyledWindow))
  82. {
  83. var window = new Window();
  84. var target = new Decorator()
  85. {
  86. [ToolTip.TipProperty] = "Tip",
  87. [ToolTip.ShowDelayProperty] = 0
  88. };
  89. window.Content = target;
  90. window.ApplyStyling();
  91. window.ApplyTemplate();
  92. window.Presenter.ApplyTemplate();
  93. Assert.True(target.IsAttachedToVisualTree);
  94. _mouseHelper.Enter(target);
  95. Assert.True(ToolTip.GetIsOpen(target));
  96. }
  97. }
  98. [Fact]
  99. public void Content_Should_Update_When_Tip_Property_Changes_And_Already_Open()
  100. {
  101. using (UnitTestApplication.Start(TestServices.StyledWindow))
  102. {
  103. var window = new Window();
  104. var target = new Decorator()
  105. {
  106. [ToolTip.TipProperty] = "Tip",
  107. [ToolTip.ShowDelayProperty] = 0
  108. };
  109. window.Content = target;
  110. window.ApplyStyling();
  111. window.ApplyTemplate();
  112. window.Presenter.ApplyTemplate();
  113. _mouseHelper.Enter(target);
  114. Assert.True(ToolTip.GetIsOpen(target));
  115. Assert.Equal("Tip", target.GetValue(ToolTip.ToolTipProperty).Content);
  116. ToolTip.SetTip(target, "Tip1");
  117. Assert.Equal("Tip1", target.GetValue(ToolTip.ToolTipProperty).Content);
  118. }
  119. }
  120. [Fact(Skip = "Timers should NOT, in fact, be checked via IPlatformThreadingInterface")]
  121. public void Should_Open_On_Pointer_Enter_With_Delay()
  122. {
  123. Action timercallback = null;
  124. var delay = TimeSpan.Zero;
  125. var pti = Mock.Of<IPlatformThreadingInterface>(x => x.CurrentThreadIsLoopThread == true);
  126. Mock.Get(pti)
  127. .Setup(v => v.StartTimer(It.IsAny<DispatcherPriority>(), It.IsAny<TimeSpan>(), It.IsAny<Action>()))
  128. .Callback<DispatcherPriority, TimeSpan, Action>((priority, interval, tick) =>
  129. {
  130. delay = interval;
  131. timercallback = tick;
  132. })
  133. .Returns(Disposable.Empty);
  134. using (UnitTestApplication.Start(TestServices.StyledWindow.With(threadingInterface: pti)))
  135. {
  136. var window = new Window();
  137. var target = new Decorator()
  138. {
  139. [ToolTip.TipProperty] = "Tip",
  140. [ToolTip.ShowDelayProperty] = 1
  141. };
  142. window.Content = target;
  143. window.ApplyStyling();
  144. window.ApplyTemplate();
  145. window.Presenter.ApplyTemplate();
  146. Assert.True(target.IsAttachedToVisualTree);
  147. _mouseHelper.Enter(target);
  148. Assert.Equal(TimeSpan.FromMilliseconds(1), delay);
  149. Assert.NotNull(timercallback);
  150. Assert.False(ToolTip.GetIsOpen(target));
  151. timercallback();
  152. Assert.True(ToolTip.GetIsOpen(target));
  153. }
  154. }
  155. [Fact]
  156. public void Open_Class_Should_Not_Initially_Be_Added()
  157. {
  158. using (UnitTestApplication.Start(TestServices.StyledWindow))
  159. {
  160. var toolTip = new ToolTip();
  161. var window = new Window();
  162. var decorator = new Decorator()
  163. {
  164. [ToolTip.TipProperty] = toolTip
  165. };
  166. window.Content = decorator;
  167. window.ApplyStyling();
  168. window.ApplyTemplate();
  169. window.Presenter.ApplyTemplate();
  170. Assert.Empty(toolTip.Classes);
  171. }
  172. }
  173. [Fact]
  174. public void Setting_IsOpen_Should_Add_Open_Class()
  175. {
  176. using (UnitTestApplication.Start(TestServices.StyledWindow))
  177. {
  178. var toolTip = new ToolTip();
  179. var window = new Window();
  180. var decorator = new Decorator()
  181. {
  182. [ToolTip.TipProperty] = toolTip
  183. };
  184. window.Content = decorator;
  185. window.ApplyStyling();
  186. window.ApplyTemplate();
  187. window.Presenter.ApplyTemplate();
  188. ToolTip.SetIsOpen(decorator, true);
  189. Assert.Equal(new[] { ":open" }, toolTip.Classes);
  190. }
  191. }
  192. [Fact]
  193. public void Clearing_IsOpen_Should_Remove_Open_Class()
  194. {
  195. using (UnitTestApplication.Start(TestServices.StyledWindow))
  196. {
  197. var toolTip = new ToolTip();
  198. var window = new Window();
  199. var decorator = new Decorator()
  200. {
  201. [ToolTip.TipProperty] = toolTip
  202. };
  203. window.Content = decorator;
  204. window.ApplyStyling();
  205. window.ApplyTemplate();
  206. window.Presenter.ApplyTemplate();
  207. ToolTip.SetIsOpen(decorator, true);
  208. ToolTip.SetIsOpen(decorator, false);
  209. Assert.Empty(toolTip.Classes);
  210. }
  211. }
  212. [Fact]
  213. public void Should_Close_On_Null_Tip()
  214. {
  215. using (UnitTestApplication.Start(TestServices.StyledWindow))
  216. {
  217. var window = new Window();
  218. var target = new Decorator()
  219. {
  220. [ToolTip.TipProperty] = "Tip",
  221. [ToolTip.ShowDelayProperty] = 0
  222. };
  223. window.Content = target;
  224. window.ApplyStyling();
  225. window.ApplyTemplate();
  226. window.Presenter.ApplyTemplate();
  227. _mouseHelper.Enter(target);
  228. Assert.True(ToolTip.GetIsOpen(target));
  229. target[ToolTip.TipProperty] = null;
  230. Assert.False(ToolTip.GetIsOpen(target));
  231. }
  232. }
  233. }
  234. internal class ToolTipViewModel
  235. {
  236. public string Tip => "Tip";
  237. }
  238. }