DeferredDrawingContextImplTests.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. using System.Linq;
  3. using Avalonia.Media;
  4. using Avalonia.Rendering.SceneGraph;
  5. using Avalonia.UnitTests;
  6. using Avalonia.Utilities;
  7. using Avalonia.VisualTree;
  8. using Moq;
  9. using Xunit;
  10. namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
  11. {
  12. public class DeferredDrawingContextImplTests
  13. {
  14. [Fact]
  15. public void Should_Add_VisualNode()
  16. {
  17. var parent = new VisualNode(new TestRoot(), null);
  18. var child = new VisualNode(Mock.Of<IVisual>(), null);
  19. var layers = new SceneLayers(parent.Visual);
  20. var target = new DeferredDrawingContextImpl(null, layers);
  21. target.BeginUpdate(parent);
  22. target.BeginUpdate(child);
  23. Assert.Equal(1, parent.Children.Count);
  24. Assert.Same(child, parent.Children[0]);
  25. }
  26. [Fact]
  27. public void Should_Not_Replace_Identical_VisualNode()
  28. {
  29. var parent = new VisualNode(new TestRoot(), null);
  30. var child = new VisualNode(Mock.Of<IVisual>(), null);
  31. var layers = new SceneLayers(parent.Visual);
  32. parent.AddChild(child);
  33. var target = new DeferredDrawingContextImpl(null, layers);
  34. target.BeginUpdate(parent);
  35. target.BeginUpdate(child);
  36. Assert.Equal(1, parent.Children.Count);
  37. Assert.Same(child, parent.Children[0]);
  38. }
  39. [Fact]
  40. public void Should_Replace_Different_VisualNode()
  41. {
  42. var parent = new VisualNode(new TestRoot(), null);
  43. var child1 = new VisualNode(Mock.Of<IVisual>(), null);
  44. var child2 = new VisualNode(Mock.Of<IVisual>(), null);
  45. var layers = new SceneLayers(parent.Visual);
  46. parent.AddChild(child1);
  47. var target = new DeferredDrawingContextImpl(null, layers);
  48. target.BeginUpdate(parent);
  49. target.BeginUpdate(child2);
  50. Assert.Equal(1, parent.Children.Count);
  51. Assert.Same(child2, parent.Children[0]);
  52. }
  53. [Fact]
  54. public void TrimChildren_Should_Trim_Children()
  55. {
  56. var root = new TestRoot();
  57. var node = new VisualNode(root, null) { LayerRoot = root };
  58. node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
  59. node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
  60. node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
  61. node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
  62. var layers = new SceneLayers(root);
  63. var target = new DeferredDrawingContextImpl(null, layers);
  64. var child1 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root };
  65. var child2 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root };
  66. target.BeginUpdate(node);
  67. using (target.BeginUpdate(child1)) { }
  68. using (target.BeginUpdate(child2)) { }
  69. target.TrimChildren();
  70. Assert.Equal(2, node.Children.Count);
  71. }
  72. [Fact]
  73. public void Should_Add_DrawOperations()
  74. {
  75. var node = new VisualNode(new TestRoot(), null);
  76. var layers = new SceneLayers(node.Visual);
  77. var target = new DeferredDrawingContextImpl(null, layers);
  78. node.LayerRoot = node.Visual;
  79. using (target.BeginUpdate(node))
  80. {
  81. target.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
  82. target.DrawRectangle(new Pen(Brushes.Green, 1), new Rect(0, 0, 100, 100));
  83. }
  84. Assert.Equal(2, node.DrawOperations.Count);
  85. Assert.IsType<RectangleNode>(node.DrawOperations[0]);
  86. Assert.IsType<RectangleNode>(node.DrawOperations[1]);
  87. }
  88. [Fact]
  89. public void Should_Not_Replace_Identical_DrawOperation()
  90. {
  91. var node = new VisualNode(new TestRoot(), null);
  92. var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0));
  93. var layers = new SceneLayers(node.Visual);
  94. var target = new DeferredDrawingContextImpl(null, layers);
  95. node.LayerRoot = node.Visual;
  96. node.AddDrawOperation(operation);
  97. using (target.BeginUpdate(node))
  98. {
  99. target.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
  100. }
  101. Assert.Equal(1, node.DrawOperations.Count);
  102. Assert.Same(operation, node.DrawOperations.Single());
  103. Assert.IsType<RectangleNode>(node.DrawOperations[0]);
  104. }
  105. [Fact]
  106. public void Should_Replace_Different_DrawOperation()
  107. {
  108. var node = new VisualNode(new TestRoot(), null);
  109. var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0));
  110. var layers = new SceneLayers(node.Visual);
  111. var target = new DeferredDrawingContextImpl(null, layers);
  112. node.LayerRoot = node.Visual;
  113. node.AddDrawOperation(operation);
  114. using (target.BeginUpdate(node))
  115. {
  116. target.FillRectangle(Brushes.Green, new Rect(0, 0, 100, 100));
  117. }
  118. Assert.Equal(1, node.DrawOperations.Count);
  119. Assert.NotSame(operation, node.DrawOperations.Single());
  120. Assert.IsType<RectangleNode>(node.DrawOperations[0]);
  121. }
  122. [Fact]
  123. public void Should_Update_DirtyRects()
  124. {
  125. var node = new VisualNode(new TestRoot(), null);
  126. var operation = new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0);
  127. var layers = new SceneLayers(node.Visual);
  128. var target = new DeferredDrawingContextImpl(null, layers);
  129. node.LayerRoot = node.Visual;
  130. using (target.BeginUpdate(node))
  131. {
  132. target.FillRectangle(Brushes.Green, new Rect(0, 0, 100, 100));
  133. }
  134. Assert.Equal(new Rect(0, 0, 100, 100), layers.Single().Dirty.Single());
  135. }
  136. [Fact]
  137. public void Should_Trim_DrawOperations()
  138. {
  139. var node = new VisualNode(new TestRoot(), null);
  140. node.LayerRoot = node.Visual;
  141. node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 10, 100), 0)));
  142. node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 20, 100), 0)));
  143. node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 30, 100), 0)));
  144. node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 40, 100), 0)));
  145. var layers = new SceneLayers(node.Visual);
  146. var target = new DeferredDrawingContextImpl(null, layers);
  147. using (target.BeginUpdate(node))
  148. {
  149. target.FillRectangle(Brushes.Green, new Rect(0, 0, 10, 100));
  150. target.FillRectangle(Brushes.Blue, new Rect(0, 0, 20, 100));
  151. }
  152. Assert.Equal(2, node.DrawOperations.Count);
  153. }
  154. }
  155. }