LayoutTransformControlTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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 : ScopedTestBase
  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 Bounds_On_Transform_Applied_Then_Removed_Are_Correct()
  151. {
  152. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  153. var control = CreateWithChildAndMeasureAndTransform(
  154. 100,
  155. 25,
  156. new RotateTransform { Angle = 90 });
  157. Assert.Equal(new Size(25, 100), control.DesiredSize);
  158. control.LayoutTransform = null;
  159. control.Measure(Size.Infinity);
  160. control.Arrange(new Rect(control.DesiredSize));
  161. Assert.Equal(new Size(100, 25), control.DesiredSize);
  162. }
  163. [Fact]
  164. public void Should_Generate_RotateTransform_90_degrees()
  165. {
  166. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  167. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  168. 100,
  169. 25,
  170. new RotateTransform() { Angle = 90 });
  171. Assert.NotNull(lt.TransformRoot.RenderTransform);
  172. Matrix m = lt.TransformRoot.RenderTransform.Value;
  173. Matrix res = Matrix.CreateRotation(Matrix.ToRadians(90));
  174. Assert.Equal(m.M11, res.M11, 3);
  175. Assert.Equal(m.M12, res.M12, 3);
  176. Assert.Equal(m.M21, res.M21, 3);
  177. Assert.Equal(m.M22, res.M22, 3);
  178. Assert.Equal(m.M31, res.M31, 3);
  179. Assert.Equal(m.M32, res.M32, 3);
  180. }
  181. [Fact]
  182. public void Should_Generate_RotateTransform_minus_90_degrees()
  183. {
  184. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  185. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  186. 100,
  187. 25,
  188. new RotateTransform() { Angle = -90 });
  189. Assert.NotNull(lt.TransformRoot.RenderTransform);
  190. var m = lt.TransformRoot.RenderTransform.Value;
  191. var res = Matrix.CreateRotation(Matrix.ToRadians(-90));
  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_ScaleTransform_x2()
  201. {
  202. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  203. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  204. 100,
  205. 50,
  206. new ScaleTransform() { ScaleX = 2, ScaleY = 2 });
  207. Assert.NotNull(lt.TransformRoot.RenderTransform);
  208. Matrix m = lt.TransformRoot.RenderTransform.Value;
  209. Matrix res = Matrix.CreateScale(2, 2);
  210. Assert.Equal(m.M11, res.M11, 3);
  211. Assert.Equal(m.M12, res.M12, 3);
  212. Assert.Equal(m.M21, res.M21, 3);
  213. Assert.Equal(m.M22, res.M22, 3);
  214. Assert.Equal(m.M31, res.M31, 3);
  215. Assert.Equal(m.M32, res.M32, 3);
  216. }
  217. [Fact]
  218. public void Should_Generate_SkewTransform_45_degrees()
  219. {
  220. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  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. [Fact]
  236. public void Should_Generate_SkewTransform_minus_45_degrees()
  237. {
  238. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  239. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  240. 100,
  241. 100,
  242. new SkewTransform() { AngleX = -45, AngleY = -45 });
  243. Assert.NotNull(lt.TransformRoot.RenderTransform);
  244. Matrix m = lt.TransformRoot.RenderTransform.Value;
  245. Matrix res = Matrix.CreateSkew(Matrix.ToRadians(-45), Matrix.ToRadians(-45));
  246. Assert.Equal(m.M11, res.M11, 3);
  247. Assert.Equal(m.M12, res.M12, 3);
  248. Assert.Equal(m.M21, res.M21, 3);
  249. Assert.Equal(m.M22, res.M22, 3);
  250. Assert.Equal(m.M31, res.M31, 3);
  251. Assert.Equal(m.M32, res.M32, 3);
  252. }
  253. private static void TransformMeasureSizeTest(Size size, Transform transform, Size expectedSize)
  254. {
  255. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  256. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(
  257. size.Width,
  258. size.Height,
  259. transform);
  260. Size outSize = lt.DesiredSize;
  261. Assert.Equal(outSize.Width, expectedSize.Width);
  262. Assert.Equal(outSize.Height, expectedSize.Height);
  263. }
  264. private static void TransformRootBoundsTest(Size size, Transform transform, Rect expectedBounds)
  265. {
  266. using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  267. LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(size.Width, size.Height, transform);
  268. Rect outBounds = lt.TransformRoot.Bounds;
  269. Assert.Equal(outBounds.X, expectedBounds.X);
  270. Assert.Equal(outBounds.Y, expectedBounds.Y);
  271. Assert.Equal(outBounds.Width, expectedBounds.Width);
  272. Assert.Equal(outBounds.Height, expectedBounds.Height);
  273. }
  274. private static LayoutTransformControl CreateWithChildAndMeasureAndTransform(
  275. double width,
  276. double height,
  277. Transform transform)
  278. {
  279. var lt = new LayoutTransformControl()
  280. {
  281. LayoutTransform = transform
  282. };
  283. lt.Child = new Rectangle() { Width = width, Height = height };
  284. lt.Measure(Size.Infinity);
  285. lt.Arrange(new Rect(lt.DesiredSize));
  286. return lt;
  287. }
  288. }
  289. }