@ -7,14 +7,15 @@ using Avalonia.UnitTests;
using Avalonia.VisualTree ;
using Xunit ;
using Avalonia.Layout ;
using Avalonia.Rendering ;
using System.Reactive.Subjects ;
using Avalonia.Data ;
namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
{
public partial class SceneBuilderTests
{
[Fact]
public void Control_With_Transparenc y_Should_Start_New_Layer ( )
public void Control_With_Animated_Opacit y_Should_Start_New_Layer ( )
{
using ( TestApplication ( ) )
{
@ -31,7 +32,6 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Padding = new Thickness ( 1 1 ) ,
Child = border = new Border
{
Opacity = 0.5 ,
Background = Brushes . Red ,
Padding = new Thickness ( 1 2 ) ,
Child = canvas = new Canvas ( ) ,
@ -42,6 +42,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var layout = AvaloniaLocator . Current . GetService < ILayoutManager > ( ) ;
layout . ExecuteInitialLayoutPass ( tree ) ;
var animation = new BehaviorSubject < double > ( 0.5 ) ;
border . Bind ( Border . OpacityProperty , animation , BindingPriority . Animation ) ;
var scene = new Scene ( tree ) ;
var sceneBuilder = new SceneBuilder ( ) ;
sceneBuilder . UpdateAll ( scene ) ;
@ -58,7 +61,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Assert . Equal ( 2 , scene . Layers . Count ( ) ) ;
Assert . Empty ( scene . Layers . Select ( x = > x . LayerRoot ) . Except ( new IVisual [ ] { tree , border } ) ) ;
border . Opacity = 1 ;
animation . OnCompleted ( ) ;
scene = scene . Clone ( ) ;
sceneBuilder . Update ( scene , border ) ;
@ -80,7 +83,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
}
[Fact]
public void Control_With_OpacityMask_Should_Start_New_Layer ( )
public void Removing_Control_With_Animated_Opacity_Should_Remove_Layers ( )
{
using ( TestApplication ( ) )
{
@ -97,10 +100,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Padding = new Thickness ( 1 1 ) ,
Child = border = new Border
{
OpacityMask = Brushes . Red ,
Background = Brushes . Red ,
Padding = new Thickness ( 1 2 ) ,
Child = canvas = new Canvas ( ) ,
Child = canvas = new Canvas ( )
}
}
} ;
@ -108,74 +110,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var layout = AvaloniaLocator . Current . GetService < ILayoutManager > ( ) ;
layout . ExecuteInitialLayoutPass ( tree ) ;
var scene = new Scene ( tree ) ;
var sceneBuilder = new SceneBuilder ( ) ;
sceneBuilder . UpdateAll ( scene ) ;
var rootNode = ( VisualNode ) scene . Root ;
var borderNode = ( VisualNode ) scene . FindNode ( border ) ;
var canvasNode = ( VisualNode ) scene . FindNode ( canvas ) ;
Assert . Same ( tree , rootNode . LayerRoot ) ;
Assert . Same ( border , borderNode . LayerRoot ) ;
Assert . Same ( border , canvasNode . LayerRoot ) ;
Assert . Equal ( Brushes . Red , scene . Layers [ border ] . OpacityMask ) ;
Assert . Equal ( 2 , scene . Layers . Count ( ) ) ;
Assert . Empty ( scene . Layers . Select ( x = > x . LayerRoot ) . Except ( new IVisual [ ] { tree , border } ) ) ;
border . OpacityMask = null ;
scene = scene . Clone ( ) ;
sceneBuilder . Update ( scene , border ) ;
rootNode = ( VisualNode ) scene . Root ;
borderNode = ( VisualNode ) scene . FindNode ( border ) ;
canvasNode = ( VisualNode ) scene . FindNode ( canvas ) ;
Assert . Same ( tree , rootNode . LayerRoot ) ;
Assert . Same ( tree , borderNode . LayerRoot ) ;
Assert . Same ( tree , canvasNode . LayerRoot ) ;
Assert . Single ( scene . Layers ) ;
var rootDirty = scene . Layers [ tree ] . Dirty ;
Assert . Single ( rootDirty ) ;
Assert . Equal ( new Rect ( 2 1 , 2 1 , 5 8 , 7 8 ) , rootDirty . Single ( ) ) ;
}
}
[Fact]
public void Removing_Transparent_Control_Should_Remove_Layers ( )
{
using ( TestApplication ( ) )
{
Decorator decorator ;
Border border ;
Canvas canvas ;
var tree = new TestRoot
{
Padding = new Thickness ( 1 0 ) ,
Width = 1 0 0 ,
Height = 1 2 0 ,
Child = decorator = new Decorator
{
Padding = new Thickness ( 1 1 ) ,
Child = border = new Border
{
Opacity = 0.5 ,
Background = Brushes . Red ,
Padding = new Thickness ( 1 2 ) ,
Child = canvas = new Canvas
{
Opacity = 0.75 ,
} ,
}
}
} ;
var layout = AvaloniaLocator . Current . GetService < ILayoutManager > ( ) ;
layout . ExecuteInitialLayoutPass ( tree ) ;
var animation = new BehaviorSubject < double > ( 0.5 ) ;
border . Bind ( Border . OpacityProperty , animation , BindingPriority . Animation ) ;
canvas . Bind ( Canvas . OpacityProperty , animation , BindingPriority . Animation ) ;
var scene = new Scene ( tree ) ;
var sceneBuilder = new SceneBuilder ( ) ;
@ -210,13 +147,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Padding = new Thickness ( 1 1 ) ,
Child = border = new Border
{
Opacity = 0.5 ,
Background = Brushes . Red ,
Padding = new Thickness ( 1 2 ) ,
Child = canvas = new Canvas
{
Opacity = 0.75 ,
} ,
Child = canvas = new Canvas ( ) ,
}
}
} ;
@ -224,6 +157,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var layout = AvaloniaLocator . Current . GetService < ILayoutManager > ( ) ;
layout . ExecuteInitialLayoutPass ( tree ) ;
var animation = new BehaviorSubject < double > ( 0.5 ) ;
border . Bind ( Border . OpacityProperty , animation , BindingPriority . Animation ) ;
canvas . Bind ( Canvas . OpacityProperty , animation , BindingPriority . Animation ) ;
var scene = new Scene ( tree ) ;
var sceneBuilder = new SceneBuilder ( ) ;
sceneBuilder . UpdateAll ( scene ) ;
@ -263,6 +200,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var layout = AvaloniaLocator . Current . GetService < ILayoutManager > ( ) ;
layout . ExecuteInitialLayoutPass ( tree ) ;
var animation = new BehaviorSubject < double > ( 0.5 ) ;
border . Bind ( Border . OpacityProperty , animation , BindingPriority . Animation ) ;
var scene = new Scene ( tree ) ;
var sceneBuilder = new SceneBuilder ( ) ;
sceneBuilder . UpdateAll ( scene ) ;