csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
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.
98 lines
3.4 KiB
98 lines
3.4 KiB
using Avalonia.Media;
|
|
using Avalonia.Platform;
|
|
using Avalonia.Rendering.Composition.Drawing;
|
|
using Avalonia.Rendering.Composition.Transport;
|
|
using Moq;
|
|
using Xunit;
|
|
|
|
namespace Avalonia.Base.UnitTests.Rendering.SceneGraph
|
|
{
|
|
public class RenderDataStreamSerializationTests
|
|
{
|
|
[Fact]
|
|
public void Round_Trip_Preserves_Bounds()
|
|
{
|
|
using var source = new RenderDataStream();
|
|
source.DrawRectangle(Brushes.Black, null, null,
|
|
new RoundedRect(new Rect(0, 0, 10, 10)), default);
|
|
source.PushTransform(Matrix.CreateTranslation(40, 40));
|
|
source.DrawRectangle(Brushes.Black, null, null,
|
|
new RoundedRect(new Rect(0, 0, 10, 10)), default);
|
|
source.Pop();
|
|
|
|
using var result = RoundTrip(source);
|
|
|
|
Assert.Equal(source.CalculateBounds(), result.CalculateBounds());
|
|
Assert.Equal(new Rect(0, 0, 50, 50), result.CalculateBounds());
|
|
}
|
|
|
|
[Fact]
|
|
public void Round_Trip_Preserves_Hit_Testing()
|
|
{
|
|
using var source = new RenderDataStream();
|
|
source.PushClip(new RoundedRect(new Rect(0, 0, 10, 10)));
|
|
source.DrawRectangle(Brushes.Black, null, null,
|
|
new RoundedRect(new Rect(0, 0, 100, 100)), default);
|
|
source.Pop();
|
|
|
|
using var result = RoundTrip(source);
|
|
|
|
Assert.True(result.HitTest(new Point(5, 5)));
|
|
Assert.False(result.HitTest(new Point(50, 50)));
|
|
}
|
|
|
|
[Fact]
|
|
public void Round_Trip_Preserves_Resource_References()
|
|
{
|
|
var brush = Mock.Of<IBrush>();
|
|
using var source = new RenderDataStream();
|
|
source.DrawRectangle(brush, null, null,
|
|
new RoundedRect(new Rect(0, 0, 10, 10)), default);
|
|
|
|
using var result = RoundTrip(source);
|
|
|
|
var context = new Mock<IDrawingContextImpl>();
|
|
result.Replay(context.Object);
|
|
context.Verify(x => x.DrawRectangle(brush, null,
|
|
It.IsAny<RoundedRect>(), It.IsAny<BoxShadows>()), Times.Once);
|
|
}
|
|
|
|
[Fact]
|
|
public void Round_Trip_Of_Empty_Stream_Produces_Empty_Stream()
|
|
{
|
|
using var source = new RenderDataStream();
|
|
using var result = RoundTrip(source);
|
|
|
|
Assert.Null(result.CalculateBounds());
|
|
}
|
|
|
|
[Fact]
|
|
public void Round_Trip_Spanning_Multiple_Stream_Segments()
|
|
{
|
|
using var source = new RenderDataStream();
|
|
for (var i = 0; i < 50; i++)
|
|
source.DrawRectangle(Brushes.Black, null, null,
|
|
new RoundedRect(new Rect(i, i, 1, 1)), default);
|
|
|
|
using var result = RoundTrip(source);
|
|
|
|
Assert.Equal(source.CalculateBounds(), result.CalculateBounds());
|
|
}
|
|
|
|
private static RenderDataStream RoundTrip(RenderDataStream source)
|
|
{
|
|
var data = new BatchStreamData();
|
|
var memoryPool = new BatchStreamMemoryPool(false, 64, _ => { });
|
|
var objectPool = new BatchStreamObjectPool<object?>(false, 8, _ => { });
|
|
|
|
using (var writer = new BatchStreamWriter(data, memoryPool, objectPool))
|
|
source.SerializeTo(writer);
|
|
|
|
var result = new RenderDataStream();
|
|
using (var reader = new BatchStreamReader(data, memoryPool, objectPool))
|
|
result.DeserializeFrom(reader);
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|