LayoutTransformControlTests.cs 11 KB

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