ShapeTests.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #nullable enable
  2. using Avalonia.Collections;
  3. using Avalonia.Controls.Shapes;
  4. using Avalonia.Media;
  5. using Avalonia.Platform;
  6. using Avalonia.Rendering.SceneGraph;
  7. using Avalonia.UnitTests;
  8. using Avalonia.Utilities;
  9. using Xunit;
  10. namespace Avalonia.Controls.UnitTests.Shapes;
  11. public class ShapeTests : ScopedTestBase
  12. {
  13. [Fact]
  14. public void StrokeMiterLimit_Default_Is_Applied_To_Pen()
  15. {
  16. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  17. var pen = RenderAndGetPen(new TestShape
  18. {
  19. StrokeThickness = 4,
  20. Stroke = Brushes.Black
  21. });
  22. Assert.NotNull(pen);
  23. Assert.Equal(10, pen.MiterLimit);
  24. }
  25. [Fact]
  26. public void StrokeMiterLimit_Update_Refreshes_Pen()
  27. {
  28. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  29. var shape = new TestShape
  30. {
  31. StrokeThickness = 4,
  32. Stroke = Brushes.Black
  33. };
  34. RenderAndGetPen(shape);
  35. shape.StrokeMiterLimit = 2;
  36. var pen = RenderAndGetPen(shape);
  37. Assert.NotNull(pen);
  38. Assert.Equal(2, pen.MiterLimit);
  39. }
  40. [Fact]
  41. public void StrokeThickness_Is_Applied_To_Pen()
  42. {
  43. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  44. var pen = RenderAndGetPen(new TestShape
  45. {
  46. StrokeThickness = 6,
  47. Stroke = Brushes.Black
  48. });
  49. Assert.NotNull(pen);
  50. Assert.Equal(6, pen.Thickness);
  51. }
  52. [Fact]
  53. public void StrokeLineCap_And_Join_Are_Applied_To_Pen()
  54. {
  55. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  56. var pen = RenderAndGetPen(new TestShape
  57. {
  58. Stroke = Brushes.Black,
  59. StrokeThickness = 4,
  60. StrokeLineCap = PenLineCap.Round,
  61. StrokeJoin = PenLineJoin.Bevel
  62. });
  63. Assert.NotNull(pen);
  64. Assert.Equal(PenLineCap.Round, pen.LineCap);
  65. Assert.Equal(PenLineJoin.Bevel, pen.LineJoin);
  66. }
  67. [Fact]
  68. public void StrokeDashArray_And_Offset_Are_Applied_To_Pen()
  69. {
  70. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  71. var pen = RenderAndGetPen(new TestShape
  72. {
  73. Stroke = Brushes.Black,
  74. StrokeThickness = 4,
  75. StrokeDashArray = new AvaloniaList<double>(1, 2, 3),
  76. StrokeDashOffset = 1.5
  77. });
  78. Assert.NotNull(pen);
  79. Assert.NotNull(pen.DashStyle);
  80. Assert.Equal(3, pen.DashStyle!.Dashes!.Count);
  81. Assert.Equal(1, pen.DashStyle.Dashes[0]);
  82. Assert.Equal(2, pen.DashStyle.Dashes[1]);
  83. Assert.Equal(3, pen.DashStyle.Dashes[2]);
  84. Assert.Equal(1.5, pen.DashStyle.Offset);
  85. }
  86. [Fact]
  87. public void No_Stroke_Produces_No_Pen()
  88. {
  89. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  90. var pen = RenderAndGetPen(new TestShape
  91. {
  92. Stroke = null,
  93. StrokeThickness = 4
  94. });
  95. Assert.Null(pen);
  96. }
  97. private static IPen? RenderAndGetPen(Shape shape)
  98. {
  99. using var context = new RecordingDrawingContext();
  100. shape.Render(context);
  101. return context.LastPen;
  102. }
  103. private class TestShape : Shape
  104. {
  105. protected override Geometry CreateDefiningGeometry() =>
  106. new RectangleGeometry(new Rect(0, 0, 20, 20));
  107. }
  108. private class RecordingDrawingContext : DrawingContext
  109. {
  110. public IPen? LastPen { get; private set; }
  111. public void Reset() => LastPen = null;
  112. internal override void DrawBitmap(IRef<IBitmapImpl> source, double opacity, Rect sourceRect, Rect destRect)
  113. {
  114. }
  115. protected override void DrawLineCore(IPen pen, Point p1, Point p2)
  116. {
  117. }
  118. protected override void DrawGeometryCore(IBrush? brush, IPen? pen, IGeometryImpl geometry)
  119. {
  120. LastPen = pen;
  121. }
  122. protected override void DrawRectangleCore(IBrush? brush, IPen? pen, RoundedRect rrect, BoxShadows boxShadows = default)
  123. {
  124. }
  125. protected override void DrawEllipseCore(IBrush? brush, IPen? pen, Rect rect)
  126. {
  127. }
  128. public override void Custom(ICustomDrawOperation custom)
  129. {
  130. }
  131. public override void DrawGlyphRun(IBrush? foreground, GlyphRun glyphRun)
  132. {
  133. }
  134. protected override void PushClipCore(RoundedRect rect)
  135. {
  136. }
  137. protected override void PushClipCore(Rect rect)
  138. {
  139. }
  140. protected override void PushGeometryClipCore(Geometry clip)
  141. {
  142. }
  143. protected override void PushOpacityCore(double opacity)
  144. {
  145. }
  146. protected override void PushOpacityMaskCore(IBrush mask, Rect bounds)
  147. {
  148. }
  149. protected override void PushRenderOptionsCore(RenderOptions renderOptions)
  150. {
  151. }
  152. protected override void PushTransformCore(Matrix matrix)
  153. {
  154. }
  155. protected override void PopClipCore()
  156. {
  157. }
  158. protected override void PopGeometryClipCore()
  159. {
  160. }
  161. protected override void PopOpacityCore()
  162. {
  163. }
  164. protected override void PopOpacityMaskCore()
  165. {
  166. }
  167. protected override void PopTransformCore()
  168. {
  169. }
  170. protected override void PopRenderOptionsCore()
  171. {
  172. }
  173. protected override void DisposeCore()
  174. {
  175. }
  176. }
  177. }