committed by
Julien Lebosquain
2 changed files with 233 additions and 2 deletions
@ -0,0 +1,215 @@ |
|||||
|
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() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue