A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

236 lines
7.2 KiB

using Avalonia.Controls;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.UnitTests;
using Moq;
using Xunit;
namespace Avalonia.Base.UnitTests
{
public class RenderTests_Culling
{
[Fact]
public void In_Bounds_Control_Should_Be_Rendered()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Canvas
{
Width = 100,
Height = 100,
ClipToBounds = true,
Children =
{
(target = new TestControl
{
Width = 10, Height = 10, [Canvas.LeftProperty] = 98, [Canvas.TopProperty] = 98,
})
}
};
Render(container);
Assert.True(target.Rendered);
}
}
[Fact]
public void Out_Of_Bounds_Control_Should_Not_Be_Rendered()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Canvas
{
Width = 100,
Height = 100,
ClipToBounds = true,
Children =
{
(target = new TestControl
{
Width = 10,
Height = 10,
ClipToBounds = true,
[Canvas.LeftProperty] = 110,
[Canvas.TopProperty] = 110,
})
}
};
Render(container);
Assert.False(target.Rendered);
}
}
[Fact]
public void Out_Of_Bounds_Child_Control_Should_Not_Be_Rendered()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Canvas
{
Width = 100,
Height = 100,
ClipToBounds = true,
Children =
{
new Canvas
{
Width = 100,
Height = 100,
[Canvas.LeftProperty] = 50,
[Canvas.TopProperty] = 50,
Children =
{
(target = new TestControl
{
Width = 10,
Height = 10,
ClipToBounds = true,
[Canvas.LeftProperty] = 50,
[Canvas.TopProperty] = 50,
})
}
}
}
};
Render(container);
Assert.False(target.Rendered);
}
}
[Fact]
public void Transformed_Child_Control_With_ClipToBounds_True_Should_Be_Rendered()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Panel
{
Width = 100,
Height = 20,
ClipToBounds = true,
Children =
{
new Panel
{
Width = 100,
Height = 20,
RenderTransform = new TranslateTransform(0, 30),
Children =
{
(target = new TestControl
{
Width = 100,
Height = 20,
ClipToBounds = true,
RenderTransform = new TranslateTransform(0, -30),
})
}
}
}
};
Render(container);
Assert.True(target.Rendered);
}
}
[Fact]
public void RenderTransform_Should_Be_Respected()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Canvas
{
Width = 100,
Height = 100,
ClipToBounds = true,
Children =
{
(target = new TestControl
{
Width = 10,
Height = 10,
[Canvas.LeftProperty] = 110,
[Canvas.TopProperty] = 110,
RenderTransform = new TranslateTransform(-100, -100),
})
}
};
Render(container);
Assert.True(target.Rendered);
}
}
[Fact]
public void Negative_Margin_Should_Be_Respected()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
TestControl target;
var container = new Canvas
{
Width = 100,
Height = 100,
ClipToBounds = true,
Children =
{
new Border
{
Margin = new Thickness(100, 100, 0, 0),
Child = target = new TestControl
{
Width = 10, Height = 10, Margin = new Thickness(-100, -100, 0, 0),
}
}
}
};
Render(container);
Assert.True(target.Rendered);
}
}
private void Render(Control control)
{
var ctx = CreateDrawingContext();
control.Measure(Size.Infinity);
control.Arrange(new Rect(control.DesiredSize));
ImmediateRenderer.Render(ctx, control);
}
private DrawingContext CreateDrawingContext()
{
return new PlatformDrawingContext(Mock.Of<IDrawingContextImpl>());
}
private class TestControl : Control
{
public bool Rendered { get; private set; }
public override void Render(DrawingContext context)
{
Rendered = true;
}
}
}
}