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.
 
 
 

237 lines
7.9 KiB

using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Rendering.Composition.Drawing;
using Xunit;
namespace Avalonia.Base.UnitTests.Rendering.SceneGraph
{
public class RenderDataWriterReaderTests
{
[Fact]
public void Primitives_Round_Trip()
{
var writer = new RenderDataWriter();
try
{
writer.Write<byte>(200);
writer.WriteOpcode(RenderDataOpcode.DrawGeometry);
writer.Write(-123456);
writer.Write(4000000000u);
writer.Write(3.14159);
writer.Write(true);
writer.Write(false);
var reader = new RenderDataReader(writer.Written);
Assert.Equal(200, reader.Read<byte>());
Assert.Equal(RenderDataOpcode.DrawGeometry, reader.Read<RenderDataOpcode>());
Assert.Equal(-123456, reader.Read<int>());
Assert.Equal(4000000000u, reader.Read<uint>());
Assert.Equal(3.14159, reader.Read<double>());
Assert.True(reader.Read<bool>());
Assert.False(reader.Read<bool>());
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void Geometric_Structs_Round_Trip()
{
var point = new Point(1, 2);
var vector = new Vector(3, 4);
var rect = new Rect(5, 6, 7, 8);
var roundedRect = new RoundedRect(new Rect(1, 2, 30, 40),
new Vector(1, 1), new Vector(2, 2), new Vector(3, 3), new Vector(4, 4));
var matrix = new Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9);
var writer = new RenderDataWriter();
try
{
writer.Write(point);
writer.Write(vector);
writer.Write(rect);
writer.Write(roundedRect);
writer.Write(matrix);
var reader = new RenderDataReader(writer.Written);
Assert.Equal(point, reader.Read<Point>());
Assert.Equal(vector, reader.Read<Vector>());
Assert.Equal(rect, reader.Read<Rect>());
var readRounded = reader.Read<RoundedRect>();
Assert.Equal(roundedRect.Rect, readRounded.Rect);
Assert.Equal(roundedRect.RadiiTopLeft, readRounded.RadiiTopLeft);
Assert.Equal(roundedRect.RadiiTopRight, readRounded.RadiiTopRight);
Assert.Equal(roundedRect.RadiiBottomRight, readRounded.RadiiBottomRight);
Assert.Equal(roundedRect.RadiiBottomLeft, readRounded.RadiiBottomLeft);
Assert.Equal(matrix, reader.Read<Matrix>());
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void Color_And_BoxShadow_Round_Trip()
{
var color = Color.FromArgb(10, 20, 30, 40);
var shadow = new BoxShadow
{
OffsetX = 1.5,
OffsetY = -2.5,
Blur = 3,
Spread = 4,
Color = Color.FromArgb(255, 1, 2, 3),
IsInset = true
};
var writer = new RenderDataWriter();
try
{
writer.Write(color);
writer.Write(shadow);
var reader = new RenderDataReader(writer.Written);
Assert.Equal(color, reader.Read<Color>());
var readShadow = reader.Read<BoxShadow>();
Assert.Equal(shadow.OffsetX, readShadow.OffsetX);
Assert.Equal(shadow.OffsetY, readShadow.OffsetY);
Assert.Equal(shadow.Blur, readShadow.Blur);
Assert.Equal(shadow.Spread, readShadow.Spread);
Assert.Equal(shadow.Color, readShadow.Color);
Assert.Equal(shadow.IsInset, readShadow.IsInset);
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void RenderOptions_And_TextOptions_Round_Trip()
{
var renderOptions = new RenderOptions
{
#pragma warning disable CS0618
TextRenderingMode = TextRenderingMode.Antialias,
#pragma warning restore CS0618
BitmapInterpolationMode = BitmapInterpolationMode.HighQuality,
EdgeMode = EdgeMode.Aliased,
BitmapBlendingMode = BitmapBlendingMode.Plus,
RequiresFullOpacityHandling = true
};
var textOptions = new TextOptions
{
TextRenderingMode = TextRenderingMode.SubpixelAntialias,
TextHintingMode = TextHintingMode.Light,
BaselinePixelAlignment = BaselinePixelAlignment.Aligned
};
var writer = new RenderDataWriter();
try
{
writer.Write(renderOptions);
writer.Write(textOptions);
var reader = new RenderDataReader(writer.Written);
Assert.Equal(renderOptions, reader.Read<RenderOptions>());
Assert.Equal(textOptions, reader.Read<TextOptions>());
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
[Theory]
[InlineData(null)]
[InlineData(true)]
[InlineData(false)]
public void Nullable_Boolean_Round_Trips_All_Three_States(bool? value)
{
var writer = new RenderDataWriter();
try
{
writer.Write(new RenderOptions { RequiresFullOpacityHandling = value });
var reader = new RenderDataReader(writer.Written);
Assert.Equal(value, reader.Read<RenderOptions>().RequiresFullOpacityHandling);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void Length_Tracks_Written_Bytes()
{
var writer = new RenderDataWriter();
try
{
Assert.Equal(0, writer.Length);
writer.Write<byte>(1);
Assert.Equal(1, writer.Length);
writer.Write(2);
Assert.Equal(5, writer.Length);
writer.Write(3d);
Assert.Equal(13, writer.Length);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void Writer_Grows_Buffer_To_Fit_Large_Payloads()
{
var writer = new RenderDataWriter();
try
{
for (var i = 0; i < 1000; i++)
writer.Write(i);
Assert.Equal(4000, writer.Length);
var reader = new RenderDataReader(writer.Written);
for (var i = 0; i < 1000; i++)
Assert.Equal(i, reader.Read<int>());
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
[Fact]
public void Payload_Auto_Prepends_Opcode()
{
var writer = new RenderDataWriter();
try
{
writer.WritePayload(new PushOpacityPayload { Opacity = 0.5 });
var reader = new RenderDataReader(writer.Written);
Assert.Equal(RenderDataOpcode.PushOpacity, reader.Read<RenderDataOpcode>());
var payload = reader.Read<PushOpacityPayload>();
Assert.Equal(0.5, payload.Opacity);
Assert.True(reader.IsAtEnd);
}
finally
{
writer.Dispose();
}
}
}
}