LayoutableTests.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using Avalonia.Controls;
  3. using Moq;
  4. using Xunit;
  5. namespace Avalonia.Layout.UnitTests
  6. {
  7. public class LayoutableTests
  8. {
  9. [Fact]
  10. public void Only_Calls_LayoutManager_InvalidateMeasure_Once()
  11. {
  12. var target = new Mock<ILayoutManager>();
  13. using (Start(target.Object))
  14. {
  15. var control = new Decorator();
  16. var root = new LayoutTestRoot { Child = control };
  17. root.Measure(Size.Infinity);
  18. root.Arrange(new Rect(root.DesiredSize));
  19. target.ResetCalls();
  20. control.InvalidateMeasure();
  21. control.InvalidateMeasure();
  22. target.Verify(x => x.InvalidateMeasure(control), Times.Once());
  23. }
  24. }
  25. [Fact]
  26. public void Only_Calls_LayoutManager_InvalidateArrange_Once()
  27. {
  28. var target = new Mock<ILayoutManager>();
  29. using (Start(target.Object))
  30. {
  31. var control = new Decorator();
  32. var root = new LayoutTestRoot { Child = control };
  33. root.Measure(Size.Infinity);
  34. root.Arrange(new Rect(root.DesiredSize));
  35. target.ResetCalls();
  36. control.InvalidateArrange();
  37. control.InvalidateArrange();
  38. target.Verify(x => x.InvalidateArrange(control), Times.Once());
  39. }
  40. }
  41. [Fact]
  42. public void Attaching_Control_To_Tree_Invalidates_Parent_Measure()
  43. {
  44. var target = new Mock<ILayoutManager>();
  45. using (Start(target.Object))
  46. {
  47. var control = new Decorator();
  48. var root = new LayoutTestRoot { Child = control };
  49. root.Measure(Size.Infinity);
  50. root.Arrange(new Rect(root.DesiredSize));
  51. Assert.True(control.IsMeasureValid);
  52. root.Child = null;
  53. root.Measure(Size.Infinity);
  54. root.Arrange(new Rect(root.DesiredSize));
  55. Assert.False(control.IsMeasureValid);
  56. Assert.True(root.IsMeasureValid);
  57. target.ResetCalls();
  58. root.Child = control;
  59. Assert.False(root.IsMeasureValid);
  60. Assert.False(control.IsMeasureValid);
  61. target.Verify(x => x.InvalidateMeasure(root), Times.Once());
  62. }
  63. }
  64. private IDisposable Start(ILayoutManager layoutManager)
  65. {
  66. var result = AvaloniaLocator.EnterScope();
  67. AvaloniaLocator.CurrentMutable.Bind<ILayoutManager>().ToConstant(layoutManager);
  68. return result;
  69. }
  70. }
  71. }