LayoutTransformControlTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using Avalonia.Controls.Shapes;
  2. using Avalonia.Media;
  3. using Avalonia.UnitTests;
  4. using Xunit;
  5. namespace Avalonia.Controls.UnitTests
  6. {
  7. public class LayoutTransformControlTests
  8. {
  9. [Fact]
  10. public void Measure_On_Scale_x2_Is_Correct()
  11. {
  12. double scale = 2;
  13. TransformMeasureSizeTest(
  14. new Size(100, 50),
  15. new ScaleTransform() { ScaleX = scale, ScaleY = scale },
  16. new Size(200, 100));
  17. }
  18. [Fact]
  19. public void Measure_On_Scale_x0_5_Is_Correct()
  20. {
  21. double scale = 0.5;
  22. TransformMeasureSizeTest(
  23. new Size(100, 50),
  24. new ScaleTransform() { ScaleX = scale, ScaleY = scale },
  25. new Size(50, 25));
  26. }
  27. [Fact]
  28. public void Measure_On_Skew_X_axis_45_degrees_Is_Correct()
  29. {
  30. TransformMeasureSizeTest(
  31. new Size(100, 100),
  32. new SkewTransform() { AngleX = 45 },
  33. new Size(200, 100));
  34. }
  35. [Fact]
  36. public void Measure_On_Skew_Y_axis_45_degrees_Is_Correct()
  37. {
  38. TransformMeasureSizeTest(
  39. new Size(100, 100),
  40. new SkewTransform() { AngleY = 45 },
  41. new Size(100, 200));
  42. }
  43. [Fact]
  44. public void Measure_On_Skew_X_axis_minus_45_degrees_Is_Correct()
  45. {
  46. TransformMeasureSizeTest(
  47. new Size(100, 100),
  48. new SkewTransform() { AngleX = -45 },
  49. new Size(200, 100));
  50. }
  51. [Fact]
  52. public void Measure_On_Skew_Y_axis_minus_45_degrees_Is_Correct()
  53. {
  54. TransformMeasureSizeTest(
  55. new Size(100, 100),
  56. new SkewTransform() { AngleY = -45 },
  57. new Size(100, 200));
  58. }
  59. [Fact]
  60. public void Measure_On_Skew_0_degrees_Is_Correct()
  61. {
  62. TransformMeasureSizeTest(
  63. new Size(100, 100),
  64. new SkewTransform() { AngleX = 0, AngleY = 0 },
  65. new Size(100, 100));
  66. }
  67. [Fact]
  68. public void Measure_On_Rotate_90_degrees_Is_Correct()
  69. {
  70. TransformMeasureSizeTest(
  71. new Size(100, 25),
  72. new RotateTransform() { Angle = 90 },
  73. new Size(25, 100));
  74. }
  75. [Fact]
  76. public void Measure_On_Rotate_minus_90_degrees_Is_Correct()
  77. {
  78. TransformMeasureSizeTest(
  79. new Size(100, 25),
  80. new RotateTransform() { Angle = -90 },
  81. new Size(25, 100));
  82. }
  83. [Fact]
  84. public void Measure_On_Rotate_0_degrees_Is_Correct()
  85. {
  86. TransformMeasureSizeTest(
  87. new Size(100, 25),
  88. new RotateTransform() { Angle = 0 },
  89. new Size(100, 25));
  90. }
  91. [Fact]
  92. public void Measure_On_Rotate_180_degrees_Is_Correct()
  93. {
  94. TransformMeasureSizeTest(
  95. new Size(100, 25),
  96. new RotateTransform() { Angle = 180 },
  97. new Size(100, 25));
  98. }
  99. [Fact]
  100. public void Bounds_On_Scale_x2_Are_correct()
  101. {
  102. double scale = 2;
  103. TransformRootBoundsTest(
  104. new Size(100, 50),
  105. new ScaleTransform() { ScaleX = scale, ScaleY = scale },
  106. new Rect(0, 0, 100, 50));
  107. }
  108. [Fact]
  109. public void Bounds_On_Scale_x0_5_Are_correct()
  110. {
  111. double scale = 0.5;
  112. TransformRootBoundsTest(
  113. new Size(100, 50),
  114. new ScaleTransform() { ScaleX = scale, ScaleY = scale },
  115. new Rect(0, 0, 100, 50));
  116. }
  117. [Fact]
  118. public void Bounds_On_Rotate_180_degrees_Are_correct()
  119. {
  120. TransformRootBoundsTest(
  121. new Size(100, 25),
  122. new RotateTransform() { Angle = 180 },
  123. new Rect(100, 25, 100, 25));
  124. }
  125. [Fact]
  126. public void Bounds_On_Rotate_0_degrees_Are_correct()
  127. {
  128. TransformRootBoundsTest(
  129. new Size(100, 25),
  130. new RotateTransform() { Angle = 0 },
  131. new Rect(0, 0, 100, 25));
  132. }
  133. [Fact]
  134. public void Bounds_On_Rotate_90_degrees_Are_correct()
  135. {
  136. TransformRootBoundsTest(
  137. new Size(100, 25),
  138. new RotateTransform() { Angle = 90 },
  139. new Rect(25, 0, 100, 25));
  140. }
  141. [Fact]
  142. public void Bounds_On_Rotate_minus_90_degrees_Are_correct()
  143. {
  144. TransformRootBoundsTest(
  145. new Size(100, 25),
  146. new RotateTransform() { Angle = -90 },
  147. new Rect(0, 100, 100, 25));
  148. }
  149. [Fact]
  150. public void Should_Generate_RotateTransform_90_degrees()
  151. {
  152. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  153. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  154. 100,
  155. 25,
  156. new RotateTransform() { Angle = 90 });
  157. Assert.NotNull(lt.TransformRoot.RenderTransform);
  158. Matrix m = lt.TransformRoot.RenderTransform.Value;
  159. Matrix res = Matrix.CreateRotation(Matrix.ToRadians(90));
  160. Assert.Equal(m.M11, res.M11, 3);
  161. Assert.Equal(m.M12, res.M12, 3);
  162. Assert.Equal(m.M21, res.M21, 3);
  163. Assert.Equal(m.M22, res.M22, 3);
  164. Assert.Equal(m.M31, res.M31, 3);
  165. Assert.Equal(m.M32, res.M32, 3);
  166. }
  167. [Fact]
  168. public void Should_Generate_RotateTransform_minus_90_degrees()
  169. {
  170. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  171. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  172. 100,
  173. 25,
  174. new RotateTransform() { Angle = -90 });
  175. Assert.NotNull(lt.TransformRoot.RenderTransform);
  176. var m = lt.TransformRoot.RenderTransform.Value;
  177. var res = Matrix.CreateRotation(Matrix.ToRadians(-90));
  178. Assert.Equal(m.M11, res.M11, 3);
  179. Assert.Equal(m.M12, res.M12, 3);
  180. Assert.Equal(m.M21, res.M21, 3);
  181. Assert.Equal(m.M22, res.M22, 3);
  182. Assert.Equal(m.M31, res.M31, 3);
  183. Assert.Equal(m.M32, res.M32, 3);
  184. }
  185. [Fact]
  186. public void Should_Generate_ScaleTransform_x2()
  187. {
  188. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  189. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  190. 100,
  191. 50,
  192. new ScaleTransform() { ScaleX = 2, ScaleY = 2 });
  193. Assert.NotNull(lt.TransformRoot.RenderTransform);
  194. Matrix m = lt.TransformRoot.RenderTransform.Value;
  195. Matrix res = Matrix.CreateScale(2, 2);
  196. Assert.Equal(m.M11, res.M11, 3);
  197. Assert.Equal(m.M12, res.M12, 3);
  198. Assert.Equal(m.M21, res.M21, 3);
  199. Assert.Equal(m.M22, res.M22, 3);
  200. Assert.Equal(m.M31, res.M31, 3);
  201. Assert.Equal(m.M32, res.M32, 3);
  202. }
  203. [Fact]
  204. public void Should_Generate_SkewTransform_45_degrees()
  205. {
  206. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  207. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  208. 100,
  209. 100,
  210. new SkewTransform() { AngleX = 45, AngleY = 45 });
  211. Assert.NotNull(lt.TransformRoot.RenderTransform);
  212. Matrix m = lt.TransformRoot.RenderTransform.Value;
  213. Matrix res = Matrix.CreateSkew(Matrix.ToRadians(45), Matrix.ToRadians(45));
  214. Assert.Equal(m.M11, res.M11, 3);
  215. Assert.Equal(m.M12, res.M12, 3);
  216. Assert.Equal(m.M21, res.M21, 3);
  217. Assert.Equal(m.M22, res.M22, 3);
  218. Assert.Equal(m.M31, res.M31, 3);
  219. Assert.Equal(m.M32, res.M32, 3);
  220. }
  221. [Fact]
  222. public void Should_Generate_SkewTransform_minus_45_degrees()
  223. {
  224. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  225. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  226. 100,
  227. 100,
  228. new SkewTransform() { AngleX = -45, AngleY = -45 });
  229. Assert.NotNull(lt.TransformRoot.RenderTransform);
  230. Matrix m = lt.TransformRoot.RenderTransform.Value;
  231. Matrix res = Matrix.CreateSkew(Matrix.ToRadians(-45), Matrix.ToRadians(-45));
  232. Assert.Equal(m.M11, res.M11, 3);
  233. Assert.Equal(m.M12, res.M12, 3);
  234. Assert.Equal(m.M21, res.M21, 3);
  235. Assert.Equal(m.M22, res.M22, 3);
  236. Assert.Equal(m.M31, res.M31, 3);
  237. Assert.Equal(m.M32, res.M32, 3);
  238. }
  239. private static void TransformMeasureSizeTest(Size size, Transform transform, Size expectedSize)
  240. {
  241. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  242. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  243. size.Width,
  244. size.Height,
  245. transform);
  246. Size outSize = lt.DesiredSize;
  247. Assert.Equal(outSize.Width, expectedSize.Width);
  248. Assert.Equal(outSize.Height, expectedSize.Height);
  249. }
  250. private static void TransformRootBoundsTest(Size size, Transform transform, Rect expectedBounds)
  251. {
  252. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  253. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(size.Width, size.Height, transform);
  254. Rect outBounds = lt.TransformRoot.Bounds;
  255. Assert.Equal(outBounds.X, expectedBounds.X);
  256. Assert.Equal(outBounds.Y, expectedBounds.Y);
  257. Assert.Equal(outBounds.Width, expectedBounds.Width);
  258. Assert.Equal(outBounds.Height, expectedBounds.Height);
  259. }
  260. private static LayoutTransformControl CreateWithChildAndMeasureAndTransform(
  261. double width,
  262. double height,
  263. Transform transform)
  264. {
  265. var lt = new LayoutTransformControl()
  266. {
  267. LayoutTransform = transform
  268. };
  269. lt.Child = new Rectangle() { Width = width, Height = height };
  270. lt.Measure(Size.Infinity);
  271. lt.Arrange(new Rect(lt.DesiredSize));
  272. return lt;
  273. }
  274. }
  275. }