PathTests.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using Avalonia.Controls.Shapes;
  2. using Avalonia.Media;
  3. using Avalonia.UnitTests;
  4. using Xunit;
  5. namespace Avalonia.Controls.UnitTests.Shapes
  6. {
  7. public class PathTests : ScopedTestBase
  8. {
  9. [Fact]
  10. public void Path_With_Null_Data_Does_Not_Throw_On_Measure()
  11. {
  12. var target = new Path();
  13. target.Measure(Size.Infinity);
  14. }
  15. [Fact]
  16. public void Subscribes_To_Geometry_Changes()
  17. {
  18. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  19. var geometry = new EllipseGeometry { Rect = new Rect(0, 0, 10, 10) };
  20. var target = new Path { Data = geometry };
  21. var root = new TestRoot(target);
  22. target.Measure(Size.Infinity);
  23. Assert.True(target.IsMeasureValid);
  24. geometry.Rect = new Rect(0, 0, 20, 20);
  25. Assert.False(target.IsMeasureValid);
  26. root.Child = null;
  27. }
  28. [Theory]
  29. [InlineData(Stretch.None, 100, 200)]
  30. [InlineData(Stretch.Fill, 500, 500)]
  31. [InlineData(Stretch.Uniform, 250, 500)]
  32. [InlineData(Stretch.UniformToFill, 500, 500)]
  33. public void Calculates_Correct_DesiredSize_For_Finite_Bounds(Stretch stretch, double expectedWidth, double expectedHeight)
  34. {
  35. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  36. var target = new Path()
  37. {
  38. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 200) },
  39. Stretch = stretch,
  40. };
  41. target.Measure(new Size(500, 500));
  42. Assert.Equal(new Size(expectedWidth, expectedHeight), target.DesiredSize);
  43. }
  44. [Theory]
  45. [InlineData(Stretch.None)]
  46. [InlineData(Stretch.Fill)]
  47. [InlineData(Stretch.Uniform)]
  48. [InlineData(Stretch.UniformToFill)]
  49. public void Calculates_Correct_DesiredSize_For_Infinite_Bounds(Stretch stretch)
  50. {
  51. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  52. var target = new Path()
  53. {
  54. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 200) },
  55. Stretch = stretch,
  56. };
  57. target.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
  58. Assert.Equal(new Size(100, 200), target.DesiredSize);
  59. }
  60. [Fact]
  61. public void Measure_Does_Not_Update_RenderedGeometry_Transform()
  62. {
  63. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  64. var target = new Path
  65. {
  66. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 200) },
  67. Stretch = Stretch.Fill,
  68. };
  69. target.Measure(new Size(500, 500));
  70. Assert.Null(target.RenderedGeometry.Transform);
  71. }
  72. [Theory]
  73. [InlineData(Stretch.None, 1, 1)]
  74. [InlineData(Stretch.Fill, 5, 2.5)]
  75. [InlineData(Stretch.Uniform, 2.5, 2.5)]
  76. [InlineData(Stretch.UniformToFill, 5, 5)]
  77. public void Arrange_Updates_RenderedGeometry_Transform(Stretch stretch, double expectedScaleX, double expectedScaleY)
  78. {
  79. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  80. var target = new Path
  81. {
  82. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 200) },
  83. Stretch = stretch,
  84. };
  85. target.Measure(new Size(500, 500));
  86. target.Arrange(new Rect(0, 0, 500, 500));
  87. if (expectedScaleX == 1 && expectedScaleY == 1)
  88. {
  89. Assert.Null(target.RenderedGeometry.Transform);
  90. }
  91. else
  92. {
  93. Assert.Equal(Matrix.CreateScale(expectedScaleX, expectedScaleY), target.RenderedGeometry.Transform.Value);
  94. }
  95. }
  96. [Fact]
  97. public void Arrange_Reserves_All_Of_Arrange_Rect()
  98. {
  99. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  100. RectangleGeometry geometry;
  101. var target = new Path
  102. {
  103. Data = geometry = new RectangleGeometry { Rect = new Rect(0, 0, 100, 200) },
  104. Stretch = Stretch.Uniform,
  105. };
  106. target.Measure(new Size(400, 400));
  107. target.Arrange(new Rect(0, 0, 400, 400));
  108. Assert.Equal(new Rect(0, 0, 100, 200), geometry.Rect);
  109. Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
  110. Assert.Equal(new Rect(0, 0, 400, 400), target.Bounds);
  111. }
  112. [Fact]
  113. public void Measure_Without_Arrange_Does_Not_Clear_RenderedGeometry_Transform()
  114. {
  115. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  116. var target = new Path
  117. {
  118. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 100) },
  119. Stretch = Stretch.Fill,
  120. };
  121. target.Measure(new Size(200, 200));
  122. target.Arrange(new Rect(0, 0, 200, 200));
  123. Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
  124. target.Measure(new Size(300, 300));
  125. Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
  126. }
  127. [Fact]
  128. public void Arrange_Without_Measure_Updates_RenderedGeometry_Transform()
  129. {
  130. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  131. var target = new Path
  132. {
  133. Data = new RectangleGeometry { Rect = new Rect(0, 0, 100, 100) },
  134. Stretch = Stretch.Fill,
  135. };
  136. target.Measure(new Size(200, 200));
  137. target.Arrange(new Rect(0, 0, 200, 200));
  138. Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
  139. target.Arrange(new Rect(0, 0, 300, 300));
  140. Assert.Equal(Matrix.CreateScale(3, 3), target.RenderedGeometry.Transform.Value);
  141. }
  142. }
  143. }