|
|
|
@ -6,6 +6,7 @@ using Avalonia.Rendering.SceneGraph; |
|
|
|
using Avalonia.UnitTests; |
|
|
|
using Avalonia.VisualTree; |
|
|
|
using Xunit; |
|
|
|
using Avalonia.Layout; |
|
|
|
|
|
|
|
namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
{ |
|
|
|
@ -35,10 +36,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var initial = new Scene(tree); |
|
|
|
var result = SceneBuilder.Update(initial); |
|
|
|
var result = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(result); |
|
|
|
|
|
|
|
Assert.NotSame(initial, result); |
|
|
|
Assert.Equal(1, result.Root.Children.Count); |
|
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0]; |
|
|
|
@ -59,6 +59,41 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Respect_Margin_For_ClipBounds() |
|
|
|
{ |
|
|
|
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) |
|
|
|
{ |
|
|
|
Canvas canvas; |
|
|
|
var tree = new TestRoot |
|
|
|
{ |
|
|
|
Width = 200, |
|
|
|
Height = 300, |
|
|
|
Child = new Border |
|
|
|
{ |
|
|
|
Margin = new Thickness(10, 20, 30, 40), |
|
|
|
Child = canvas = new Canvas(), |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var result = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(result); |
|
|
|
|
|
|
|
var canvasNode = result.FindNode(canvas); |
|
|
|
Assert.Equal(new Rect(10, 20, 160, 240), canvasNode.ClipBounds); |
|
|
|
|
|
|
|
// Initial ClipBounds are correct, make sure they're still correct after updating canvas.
|
|
|
|
result = result.Clone(); |
|
|
|
Assert.True(SceneBuilder.Update(result, canvas)); |
|
|
|
|
|
|
|
canvasNode = result.FindNode(canvas); |
|
|
|
Assert.Equal(new Rect(10, 20, 160, 240), canvasNode.ClipBounds); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Respect_ZIndex() |
|
|
|
{ |
|
|
|
@ -84,7 +119,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
var result = SceneBuilder.Update(new Scene(tree)); |
|
|
|
var result = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(result); |
|
|
|
|
|
|
|
var panelNode = result.FindNode(tree.Child); |
|
|
|
var expected = new IVisual[] { back, front }; |
|
|
|
@ -116,7 +152,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var result = SceneBuilder.Update(new Scene(tree)); |
|
|
|
var result = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(result); |
|
|
|
|
|
|
|
var targetNode = result.FindNode(target); |
|
|
|
|
|
|
|
Assert.Equal(new Rect(50, 50, 100, 100), targetNode.ClipBounds); |
|
|
|
@ -148,7 +186,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var initial = SceneBuilder.Update(new Scene(tree)); |
|
|
|
var initial = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(initial); |
|
|
|
|
|
|
|
var initialBackgroundNode = initial.FindNode(border).Children[0]; |
|
|
|
var initialTextNode = initial.FindNode(textBlock).Children[0]; |
|
|
|
|
|
|
|
@ -156,9 +196,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
Assert.NotNull(initialTextNode); |
|
|
|
|
|
|
|
border.Background = Brushes.Green; |
|
|
|
var result = SceneBuilder.Update(initial); |
|
|
|
|
|
|
|
Assert.NotSame(initial, result); |
|
|
|
var result = initial.Clone(); |
|
|
|
SceneBuilder.Update(result, border); |
|
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0]; |
|
|
|
Assert.Same(border, borderNode.Visual); |
|
|
|
|
|
|
|
@ -174,13 +215,64 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Update_When_Control_Added() |
|
|
|
{ |
|
|
|
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) |
|
|
|
{ |
|
|
|
Border border; |
|
|
|
var tree = new TestRoot |
|
|
|
{ |
|
|
|
Width = 100, |
|
|
|
Height = 100, |
|
|
|
Child = border = new Border |
|
|
|
{ |
|
|
|
Background = Brushes.Red, |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
Canvas canvas; |
|
|
|
var decorator = new Decorator |
|
|
|
{ |
|
|
|
Child = canvas = new Canvas(), |
|
|
|
}; |
|
|
|
|
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var initial = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(initial); |
|
|
|
|
|
|
|
border.Child = decorator; |
|
|
|
var result = initial.Clone(); |
|
|
|
|
|
|
|
Assert.True(SceneBuilder.Update(result, decorator)); |
|
|
|
|
|
|
|
// Updating canvas should result in no-op as it should have been updated along
|
|
|
|
// with decorator as part of the add opeation.
|
|
|
|
Assert.False(SceneBuilder.Update(result, canvas)); |
|
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0]; |
|
|
|
Assert.Equal(2, borderNode.Children.Count); |
|
|
|
|
|
|
|
var decoratorNode = (VisualNode)borderNode.Children[1]; |
|
|
|
Assert.Same(decorator, decoratorNode.Visual); |
|
|
|
Assert.Same(decoratorNode, result.FindNode(decorator)); |
|
|
|
|
|
|
|
var canvasNode = (VisualNode)decoratorNode.Children[0]; |
|
|
|
Assert.Same(canvas, canvasNode.Visual); |
|
|
|
Assert.Same(canvasNode, result.FindNode(canvas)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Update_When_Control_Removed() |
|
|
|
{ |
|
|
|
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) |
|
|
|
{ |
|
|
|
Border border; |
|
|
|
TextBlock textBlock; |
|
|
|
Decorator decorator; |
|
|
|
Canvas canvas; |
|
|
|
var tree = new TestRoot |
|
|
|
{ |
|
|
|
Width = 100, |
|
|
|
@ -188,9 +280,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
Child = border = new Border |
|
|
|
{ |
|
|
|
Background = Brushes.Red, |
|
|
|
Child = textBlock = new TextBlock |
|
|
|
Child = decorator = new Decorator |
|
|
|
{ |
|
|
|
Text = "Hello World", |
|
|
|
Child = canvas = new Canvas() |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
@ -198,15 +290,115 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph |
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var initial = SceneBuilder.Update(new Scene(tree)); |
|
|
|
var initial = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(initial); |
|
|
|
|
|
|
|
border.Child = null; |
|
|
|
var result = SceneBuilder.Update(initial); |
|
|
|
var result = initial.Clone(); |
|
|
|
|
|
|
|
Assert.True(SceneBuilder.Update(result, decorator)); |
|
|
|
Assert.False(SceneBuilder.Update(result, canvas)); |
|
|
|
|
|
|
|
Assert.NotSame(initial, result); |
|
|
|
var borderNode = (VisualNode)result.Root.Children[0]; |
|
|
|
Assert.Equal(1, borderNode.Children.Count); |
|
|
|
|
|
|
|
Assert.Null(result.FindNode(decorator)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Update_When_Control_Made_Invisible() |
|
|
|
{ |
|
|
|
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) |
|
|
|
{ |
|
|
|
Decorator decorator; |
|
|
|
Border border; |
|
|
|
Canvas canvas; |
|
|
|
var tree = new TestRoot |
|
|
|
{ |
|
|
|
Width = 100, |
|
|
|
Height = 100, |
|
|
|
Child = decorator = new Decorator |
|
|
|
{ |
|
|
|
Child = border = new Border |
|
|
|
{ |
|
|
|
Background = Brushes.Red, |
|
|
|
Child = canvas = new Canvas(), |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
tree.Measure(Size.Infinity); |
|
|
|
tree.Arrange(new Rect(tree.DesiredSize)); |
|
|
|
|
|
|
|
var initial = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(initial); |
|
|
|
|
|
|
|
border.IsVisible = false; |
|
|
|
var result = initial.Clone(); |
|
|
|
|
|
|
|
Assert.True(SceneBuilder.Update(result, border)); |
|
|
|
Assert.False(SceneBuilder.Update(result, canvas)); |
|
|
|
|
|
|
|
var decoratorNode = (VisualNode)result.Root.Children[0]; |
|
|
|
Assert.Equal(0, decoratorNode.Children.Count); |
|
|
|
|
|
|
|
Assert.Null(result.FindNode(border)); |
|
|
|
Assert.Null(result.FindNode(canvas)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_Update_Descendent_Tranform_When_Margin_Changed() |
|
|
|
{ |
|
|
|
using (TestApplication()) |
|
|
|
{ |
|
|
|
Decorator decorator; |
|
|
|
Border border; |
|
|
|
Canvas canvas; |
|
|
|
var tree = new TestRoot |
|
|
|
{ |
|
|
|
Width = 100, |
|
|
|
Height = 100, |
|
|
|
Child = decorator = new Decorator |
|
|
|
{ |
|
|
|
Margin = new Thickness(0, 10, 0, 0), |
|
|
|
Child = border = new Border |
|
|
|
{ |
|
|
|
Child = canvas = new Canvas(), |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
var layout = AvaloniaLocator.Current.GetService<ILayoutManager>(); |
|
|
|
layout.ExecuteInitialLayoutPass(tree); |
|
|
|
|
|
|
|
var scene = new Scene(tree); |
|
|
|
SceneBuilder.UpdateAll(scene); |
|
|
|
|
|
|
|
var borderNode = scene.FindNode(border); |
|
|
|
var canvasNode = scene.FindNode(canvas); |
|
|
|
Assert.Equal(Matrix.CreateTranslation(0, 10), borderNode.Transform); |
|
|
|
Assert.Equal(Matrix.CreateTranslation(0, 10), canvasNode.Transform); |
|
|
|
|
|
|
|
decorator.Margin = new Thickness(0, 20, 0, 0); |
|
|
|
layout.ExecuteLayoutPass(); |
|
|
|
|
|
|
|
scene = scene.Clone(); |
|
|
|
SceneBuilder.Update(scene, decorator); |
|
|
|
|
|
|
|
borderNode = scene.FindNode(border); |
|
|
|
canvasNode = scene.FindNode(canvas); |
|
|
|
Assert.Equal(Matrix.CreateTranslation(0, 20), borderNode.Transform); |
|
|
|
Assert.Equal(Matrix.CreateTranslation(0, 20), canvasNode.Transform); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private IDisposable TestApplication() |
|
|
|
{ |
|
|
|
return UnitTestApplication.Start( |
|
|
|
TestServices.MockPlatformRenderInterface.With( |
|
|
|
layoutManager: new LayoutManager())); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|