Browse Source

Add check for correct VisualNode.Parent.

Check that `VisualNode.Parent` is correct when adding a child. Causes a failing test for #3095.
pull/3119/head
Steven Kirk 7 years ago
parent
commit
e6790fe1d1
  1. 10
      src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs
  2. 12
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs
  3. 8
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs

10
src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs

@ -119,6 +119,11 @@ namespace Avalonia.Rendering.SceneGraph
throw new ObjectDisposedException("Visual node for {node.Visual}"); throw new ObjectDisposedException("Visual node for {node.Visual}");
} }
if (child.Parent != this)
{
throw new AvaloniaInternalException("VisualNode added to wrong parent.");
}
EnsureChildrenCreated(); EnsureChildrenCreated();
_children.Add(child); _children.Add(child);
} }
@ -155,6 +160,11 @@ namespace Avalonia.Rendering.SceneGraph
throw new ObjectDisposedException("Visual node for {node.Visual}"); throw new ObjectDisposedException("Visual node for {node.Visual}");
} }
if (node.Parent != this)
{
throw new AvaloniaInternalException("VisualNode added to wrong parent.");
}
EnsureChildrenCreated(); EnsureChildrenCreated();
_children[index] = node; _children[index] = node;
} }

12
tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DeferredDrawingContextImplTests.cs

@ -17,7 +17,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
public void Should_Add_VisualNode() public void Should_Add_VisualNode()
{ {
var parent = new VisualNode(new TestRoot(), null); var parent = new VisualNode(new TestRoot(), null);
var child = new VisualNode(Mock.Of<IVisual>(), null); var child = new VisualNode(Mock.Of<IVisual>(), parent);
var layers = new SceneLayers(parent.Visual); var layers = new SceneLayers(parent.Visual);
var target = new DeferredDrawingContextImpl(null, layers); var target = new DeferredDrawingContextImpl(null, layers);
@ -32,7 +32,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
public void Should_Not_Replace_Identical_VisualNode() public void Should_Not_Replace_Identical_VisualNode()
{ {
var parent = new VisualNode(new TestRoot(), null); var parent = new VisualNode(new TestRoot(), null);
var child = new VisualNode(Mock.Of<IVisual>(), null); var child = new VisualNode(Mock.Of<IVisual>(), parent);
var layers = new SceneLayers(parent.Visual); var layers = new SceneLayers(parent.Visual);
parent.AddChild(child); parent.AddChild(child);
@ -50,8 +50,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
public void Should_Replace_Different_VisualNode() public void Should_Replace_Different_VisualNode()
{ {
var parent = new VisualNode(new TestRoot(), null); var parent = new VisualNode(new TestRoot(), null);
var child1 = new VisualNode(Mock.Of<IVisual>(), null); var child1 = new VisualNode(Mock.Of<IVisual>(), parent);
var child2 = new VisualNode(Mock.Of<IVisual>(), null); var child2 = new VisualNode(Mock.Of<IVisual>(), parent);
var layers = new SceneLayers(parent.Visual); var layers = new SceneLayers(parent.Visual);
parent.AddChild(child1); parent.AddChild(child1);
@ -78,8 +78,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var layers = new SceneLayers(root); var layers = new SceneLayers(root);
var target = new DeferredDrawingContextImpl(null, layers); var target = new DeferredDrawingContextImpl(null, layers);
var child1 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root }; var child1 = new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root };
var child2 = new VisualNode(Mock.Of<IVisual>(), null) { LayerRoot = root }; var child2 = new VisualNode(Mock.Of<IVisual>(), node) { LayerRoot = root };
target.BeginUpdate(node); target.BeginUpdate(node);
using (target.BeginUpdate(child1)) { } using (target.BeginUpdate(child1)) { }

8
tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs

@ -24,7 +24,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var node = new VisualNode(Mock.Of<IVisual>(), null); var node = new VisualNode(Mock.Of<IVisual>(), null);
var collection = node.Children; var collection = node.Children;
node.AddChild(Mock.Of<IVisualNode>()); node.AddChild(Mock.Of<IVisualNode>(x => x.Parent == node));
Assert.NotSame(collection, node.Children); Assert.NotSame(collection, node.Children);
} }
@ -106,9 +106,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
public void TrimChildren_Should_Work_Correctly() public void TrimChildren_Should_Work_Correctly()
{ {
var parent = new VisualNode(Mock.Of<IVisual>(), null); var parent = new VisualNode(Mock.Of<IVisual>(), null);
var child1 = new VisualNode(Mock.Of<IVisual>(), null); var child1 = new VisualNode(Mock.Of<IVisual>(), parent);
var child2 = new VisualNode(Mock.Of<IVisual>(), null); var child2 = new VisualNode(Mock.Of<IVisual>(), parent);
var child3 = new VisualNode(Mock.Of<IVisual>(), null); var child3 = new VisualNode(Mock.Of<IVisual>(), parent);
parent.AddChild(child1); parent.AddChild(child1);
parent.AddChild(child2); parent.AddChild(child2);

Loading…
Cancel
Save