DeferredDrawingContextImplTests.cs 8.2 KB

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