LayoutTransformControlTests.cs 10 KB

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