| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- using System;
- using System.Linq;
- using Avalonia.Media;
- using Avalonia.Platform;
- using Avalonia.Rendering.SceneGraph;
- using Avalonia.UnitTests;
- using Avalonia.Utilities;
- using Avalonia.VisualTree;
- using Moq;
- using Xunit;
- namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
- {
- public class DeferredDrawingContextImplTests
- {
- [Fact]
- public void Should_Add_VisualNode()
- {
- var parent = new VisualNode(new TestRoot(), null);
- var child = new VisualNode(Mock.Of<IVisual>(), null);
- var layers = new SceneLayers(parent.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- target.BeginUpdate(parent);
- target.BeginUpdate(child);
- Assert.Equal(1, parent.Children.Count);
- Assert.Same(child, parent.Children[0]);
- }
- [Fact]
- public void Should_Not_Replace_Identical_VisualNode()
- {
- var parent = new VisualNode(new TestRoot(), null);
- var child = new VisualNode(Mock.Of<IVisual>(), null);
- var layers = new SceneLayers(parent.Visual);
- parent.AddChild(child);
- var target = new DeferredDrawingContextImpl(null, layers);
- target.BeginUpdate(parent);
- target.BeginUpdate(child);
- Assert.Equal(1, parent.Children.Count);
- Assert.Same(child, parent.Children[0]);
- }
- [Fact]
- public void Should_Replace_Different_VisualNode()
- {
- var parent = new VisualNode(new TestRoot(), null);
- var child1 = new VisualNode(Mock.Of<IVisual>(), null);
- var child2 = new VisualNode(Mock.Of<IVisual>(), null);
- var layers = new SceneLayers(parent.Visual);
- parent.AddChild(child1);
- var target = new DeferredDrawingContextImpl(null, layers);
- target.BeginUpdate(parent);
- target.BeginUpdate(child2);
- Assert.Equal(1, parent.Children.Count);
- Assert.Same(child2, parent.Children[0]);
- }
- [Fact]
- public void TrimChildren_Should_Trim_Children()
- {
- var root = new TestRoot();
- var node = new VisualNode(root, null) { LayerRoot = root };
- node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
- node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
- node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
- node.AddChild(new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root });
- var layers = new SceneLayers(root);
- var target = new DeferredDrawingContextImpl(null, layers);
- var child1 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root };
- var child2 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root };
- target.BeginUpdate(node);
- using (target.BeginUpdate(child1)) { }
- using (target.BeginUpdate(child2)) { }
- target.TrimChildren();
- Assert.Equal(2, node.Children.Count);
- }
- [Fact]
- public void Should_Add_DrawOperations()
- {
- var node = new VisualNode(new TestRoot(), null);
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- node.LayerRoot = node.Visual;
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
- target.DrawRectangle(new Pen(Brushes.Green, 1), new Rect(0, 0, 100, 100));
- }
- Assert.Equal(2, node.DrawOperations.Count);
- Assert.IsType<RectangleNode>(node.DrawOperations[0].Item);
- Assert.IsType<RectangleNode>(node.DrawOperations[1].Item);
- }
- [Fact]
- public void Should_Not_Replace_Identical_DrawOperation()
- {
- var node = new VisualNode(new TestRoot(), null);
- var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0));
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- node.LayerRoot = node.Visual;
- node.AddDrawOperation(operation);
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Red, new Rect(0, 0, 100, 100));
- }
- Assert.Equal(1, node.DrawOperations.Count);
- Assert.Same(operation.Item, node.DrawOperations.Single().Item);
- Assert.IsType<RectangleNode>(node.DrawOperations[0].Item);
- }
- [Fact]
- public void Should_Replace_Different_DrawOperation()
- {
- var node = new VisualNode(new TestRoot(), null);
- var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0));
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- node.LayerRoot = node.Visual;
- node.AddDrawOperation(operation);
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Green, new Rect(0, 0, 100, 100));
- }
- Assert.Equal(1, node.DrawOperations.Count);
- Assert.NotSame(operation, node.DrawOperations.Single());
- Assert.IsType<RectangleNode>(node.DrawOperations[0].Item);
- }
- [Fact]
- public void Should_Update_DirtyRects()
- {
- var node = new VisualNode(new TestRoot(), null);
- var operation = new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0);
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- node.LayerRoot = node.Visual;
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Green, new Rect(0, 0, 100, 100));
- }
- Assert.Equal(new Rect(0, 0, 100, 100), layers.Single().Dirty.Single());
- }
- [Fact]
- public void Should_Trim_DrawOperations()
- {
- var node = new VisualNode(new TestRoot(), null);
- node.LayerRoot = node.Visual;
- node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 10, 100), 0)));
- node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 20, 100), 0)));
- node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 30, 100), 0)));
- node.AddDrawOperation(RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 40, 100), 0)));
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Green, new Rect(0, 0, 10, 100));
- target.FillRectangle(Brushes.Blue, new Rect(0, 0, 20, 100));
- }
- Assert.Equal(2, node.DrawOperations.Count);
- }
- [Fact]
- public void Trimmed_DrawOperations_Releases_Reference()
- {
- var node = new VisualNode(new TestRoot(), null);
- var operation = RefCountable.Create(new RectangleNode(Matrix.Identity, Brushes.Red, null, new Rect(0, 0, 100, 100), 0));
- var layers = new SceneLayers(node.Visual);
- var target = new DeferredDrawingContextImpl(null, layers);
- node.LayerRoot = node.Visual;
- node.AddDrawOperation(operation);
- Assert.Equal(2, operation.RefCount);
- using (target.BeginUpdate(node))
- {
- target.FillRectangle(Brushes.Green, new Rect(0, 0, 100, 100));
- }
- Assert.Equal(1, node.DrawOperations.Count);
- Assert.NotSame(operation, node.DrawOperations.Single());
- Assert.Equal(1, operation.RefCount);
- }
- }
- }
|