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.
217 lines
5.5 KiB
217 lines
5.5 KiB
#nullable enable
|
|
|
|
using Avalonia.Collections;
|
|
using Avalonia.Controls.Shapes;
|
|
using Avalonia.Media;
|
|
using Avalonia.Platform;
|
|
using Avalonia.Rendering.SceneGraph;
|
|
using Avalonia.UnitTests;
|
|
using Avalonia.Utilities;
|
|
using Xunit;
|
|
|
|
namespace Avalonia.Controls.UnitTests.Shapes;
|
|
|
|
public class ShapeTests : ScopedTestBase
|
|
{
|
|
[Fact]
|
|
public void StrokeMiterLimit_Default_Is_Applied_To_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var pen = RenderAndGetPen(new TestShape
|
|
{
|
|
StrokeThickness = 4,
|
|
Stroke = Brushes.Black
|
|
});
|
|
|
|
Assert.NotNull(pen);
|
|
Assert.Equal(10, pen.MiterLimit);
|
|
}
|
|
|
|
[Fact]
|
|
public void StrokeMiterLimit_Update_Refreshes_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var shape = new TestShape
|
|
{
|
|
StrokeThickness = 4,
|
|
Stroke = Brushes.Black
|
|
};
|
|
|
|
RenderAndGetPen(shape);
|
|
shape.StrokeMiterLimit = 2;
|
|
var pen = RenderAndGetPen(shape);
|
|
|
|
Assert.NotNull(pen);
|
|
Assert.Equal(2, pen.MiterLimit);
|
|
}
|
|
|
|
[Fact]
|
|
public void StrokeThickness_Is_Applied_To_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var pen = RenderAndGetPen(new TestShape
|
|
{
|
|
StrokeThickness = 6,
|
|
Stroke = Brushes.Black
|
|
});
|
|
|
|
Assert.NotNull(pen);
|
|
Assert.Equal(6, pen.Thickness);
|
|
}
|
|
|
|
[Fact]
|
|
public void StrokeLineCap_And_Join_Are_Applied_To_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var pen = RenderAndGetPen(new TestShape
|
|
{
|
|
Stroke = Brushes.Black,
|
|
StrokeThickness = 4,
|
|
StrokeLineCap = PenLineCap.Round,
|
|
StrokeJoin = PenLineJoin.Bevel
|
|
});
|
|
|
|
Assert.NotNull(pen);
|
|
Assert.Equal(PenLineCap.Round, pen.LineCap);
|
|
Assert.Equal(PenLineJoin.Bevel, pen.LineJoin);
|
|
}
|
|
|
|
[Fact]
|
|
public void StrokeDashArray_And_Offset_Are_Applied_To_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var pen = RenderAndGetPen(new TestShape
|
|
{
|
|
Stroke = Brushes.Black,
|
|
StrokeThickness = 4,
|
|
StrokeDashArray = new AvaloniaList<double>(1, 2, 3),
|
|
StrokeDashOffset = 1.5
|
|
});
|
|
|
|
Assert.NotNull(pen);
|
|
Assert.NotNull(pen.DashStyle);
|
|
Assert.Equal(3, pen.DashStyle!.Dashes!.Count);
|
|
Assert.Equal(1, pen.DashStyle.Dashes[0]);
|
|
Assert.Equal(2, pen.DashStyle.Dashes[1]);
|
|
Assert.Equal(3, pen.DashStyle.Dashes[2]);
|
|
Assert.Equal(1.5, pen.DashStyle.Offset);
|
|
}
|
|
|
|
[Fact]
|
|
public void No_Stroke_Produces_No_Pen()
|
|
{
|
|
using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
|
|
var pen = RenderAndGetPen(new TestShape
|
|
{
|
|
Stroke = null,
|
|
StrokeThickness = 4
|
|
});
|
|
|
|
Assert.Null(pen);
|
|
}
|
|
|
|
private static IPen? RenderAndGetPen(Shape shape)
|
|
{
|
|
using var context = new RecordingDrawingContext();
|
|
shape.Render(context);
|
|
return context.LastPen;
|
|
}
|
|
|
|
private class TestShape : Shape
|
|
{
|
|
protected override Geometry CreateDefiningGeometry() =>
|
|
new RectangleGeometry(new Rect(0, 0, 20, 20));
|
|
}
|
|
|
|
private class RecordingDrawingContext : DrawingContext
|
|
{
|
|
public IPen? LastPen { get; private set; }
|
|
|
|
public void Reset() => LastPen = null;
|
|
|
|
internal override void DrawBitmap(IRef<IBitmapImpl> source, double opacity, Rect sourceRect, Rect destRect)
|
|
{
|
|
}
|
|
|
|
protected override void DrawLineCore(IPen pen, Point p1, Point p2)
|
|
{
|
|
}
|
|
|
|
protected override void DrawGeometryCore(IBrush? brush, IPen? pen, IGeometryImpl geometry)
|
|
{
|
|
LastPen = pen;
|
|
}
|
|
|
|
protected override void DrawRectangleCore(IBrush? brush, IPen? pen, RoundedRect rrect, BoxShadows boxShadows = default)
|
|
{
|
|
}
|
|
|
|
protected override void DrawEllipseCore(IBrush? brush, IPen? pen, Rect rect)
|
|
{
|
|
}
|
|
|
|
public override void Custom(ICustomDrawOperation custom)
|
|
{
|
|
}
|
|
|
|
public override void DrawGlyphRun(IBrush? foreground, GlyphRun glyphRun)
|
|
{
|
|
}
|
|
|
|
protected override void PushClipCore(RoundedRect rect)
|
|
{
|
|
}
|
|
|
|
protected override void PushClipCore(Rect rect)
|
|
{
|
|
}
|
|
|
|
protected override void PushGeometryClipCore(Geometry clip)
|
|
{
|
|
}
|
|
|
|
protected override void PushOpacityCore(double opacity)
|
|
{
|
|
}
|
|
|
|
protected override void PushOpacityMaskCore(IBrush mask, Rect bounds)
|
|
{
|
|
}
|
|
|
|
protected override void PushRenderOptionsCore(RenderOptions renderOptions)
|
|
{
|
|
}
|
|
|
|
protected override void PushTransformCore(Matrix matrix)
|
|
{
|
|
}
|
|
|
|
protected override void PopClipCore()
|
|
{
|
|
}
|
|
|
|
protected override void PopGeometryClipCore()
|
|
{
|
|
}
|
|
|
|
protected override void PopOpacityCore()
|
|
{
|
|
}
|
|
|
|
protected override void PopOpacityMaskCore()
|
|
{
|
|
}
|
|
|
|
protected override void PopTransformCore()
|
|
{
|
|
}
|
|
|
|
protected override void PopRenderOptionsCore()
|
|
{
|
|
}
|
|
|
|
protected override void DisposeCore()
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|