RectITests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. using System;
  2. using ChunkyImageLib.DataHolders;
  3. using PixiEditor.DrawingApi.Core.Numerics;
  4. using PixiEditor.Numerics;
  5. using Xunit;
  6. namespace ChunkyImageLibTest;
  7. public class RectITests
  8. {
  9. [Fact]
  10. public void EmptyConstructor_Call_ResultsInZeroVec()
  11. {
  12. RectI rect = new RectI();
  13. Assert.Equal(0, rect.Left);
  14. Assert.Equal(0, rect.Right);
  15. Assert.Equal(0, rect.Top);
  16. Assert.Equal(0, rect.Bottom);
  17. }
  18. [Fact]
  19. public void RegularConstructor_WithBasicArgs_Works()
  20. {
  21. RectI rect = new RectI(800, 600, 200, 300);
  22. Assert.Equal(800, rect.Left);
  23. Assert.Equal(600, rect.Top);
  24. Assert.Equal(800 + 200, rect.Right);
  25. Assert.Equal(600 + 300, rect.Bottom);
  26. }
  27. [Fact]
  28. public void FromTwoPoints_DiagonalsCombinations_ReturnsStandardizedRects()
  29. {
  30. RectI refR = new RectI(3, 4, 8 - 3, 9 - 4);
  31. Span<RectI> rects = stackalloc RectI[]
  32. {
  33. RectI.FromTwoPoints(new VecI(3, 4), new VecI(8, 9)),
  34. RectI.FromTwoPoints(new VecI(8, 9), new VecI(3, 4)),
  35. RectI.FromTwoPoints(new VecI(8, 9), new VecI(3, 4)),
  36. RectI.FromTwoPoints(new VecI(8, 9), new VecI(3, 4)),
  37. };
  38. foreach (var rect in rects)
  39. {
  40. Assert.Equal(
  41. (refR.Left, refR.Top, refR.Right, refR.Bottom),
  42. (rect.Left, rect.Top, rect.Right, rect.Bottom));
  43. }
  44. }
  45. [Fact]
  46. public void Properties_OfStandardRectangle_ReturnCorrectValues()
  47. {
  48. RectI r = new(new VecI(2, 3), new VecI(4, 5));
  49. Assert.Equal(2, r.Left);
  50. Assert.Equal(3, r.Top);
  51. Assert.Equal(2 + 4, r.Right);
  52. Assert.Equal(3 + 5, r.Bottom);
  53. Assert.Equal(r.Left, r.X);
  54. Assert.Equal(r.Top, r.Y);
  55. Assert.Equal(new VecI(r.Left, r.Top), r.Pos);
  56. Assert.Equal(new VecI(r.Right - r.Left, r.Bottom - r.Top), r.Size);
  57. Assert.Equal(new VecI(r.Left, r.Bottom), r.BottomLeft);
  58. Assert.Equal(new VecI(r.Right, r.Bottom), r.BottomRight);
  59. Assert.Equal(new VecI(r.Left, r.Top), r.TopLeft);
  60. Assert.Equal(new VecI(r.Right, r.Top), r.TopRight);
  61. Assert.Equal(r.Size.X, r.Width);
  62. Assert.Equal(r.Size.Y, r.Height);
  63. Assert.False(r.IsZeroArea);
  64. }
  65. [Fact]
  66. public void PropertySetters_SetPlainValues_UpdateSidesCorrectly()
  67. {
  68. RectI r = new();
  69. // left, top, right bottom
  70. (r.Left, r.Top, r.Right, r.Bottom) = (2, 3, 6, 8);
  71. Assert.Equal((2, 3, 6, 8), (r.Left, r.Top, r.Right, r.Bottom));
  72. // x, y
  73. (r.X, r.Y) = (4, 5);
  74. Assert.Equal((4, 5), (r.Left, r.Top));
  75. // pos
  76. var oldSize = new VecI(r.Right - r.Left, r.Bottom - r.Top);
  77. r.Pos = new VecI(5, 6);
  78. var newSize = new VecI(r.Right - r.Left, r.Bottom - r.Top);
  79. Assert.Equal((5, 6), (r.Left, r.Top));
  80. Assert.Equal(oldSize, newSize);
  81. // size
  82. var oldPos = r.Pos;
  83. r.Size = new(18, 14);
  84. var newPos = r.Pos;
  85. Assert.Equal(oldPos, newPos);
  86. Assert.Equal((18, 14), (r.Right - r.Left, r.Bottom - r.Top));
  87. // corners
  88. r.BottomLeft = new VecI(-13, -14);
  89. Assert.Equal((-13, -14), (r.Left, r.Bottom));
  90. r.BottomRight = new VecI(46, -12);
  91. Assert.Equal((46, -12), (r.Right, r.Bottom));
  92. r.TopLeft = new VecI(-46, 24);
  93. Assert.Equal((-46, 24), (r.Left, r.Top));
  94. r.TopRight = new VecI(100, 101);
  95. Assert.Equal((100, 101), (r.Right, r.Top));
  96. // width, height
  97. var oldPos2 = r.Pos;
  98. (r.Width, r.Height) = (1, 2);
  99. var newPos2 = r.Pos;
  100. Assert.Equal(oldPos2, newPos2);
  101. Assert.Equal((1, 2), (r.Right - r.Left, r.Bottom - r.Top));
  102. }
  103. [Fact]
  104. public void IsZeroArea_NormalRectangles_ReturnsFalse()
  105. {
  106. Assert.False(new RectI(new(5, 6), new VecI(1, 1)).IsZeroArea);
  107. Assert.False(new RectI(new(-5, -6), new VecI(-1, -1)).IsZeroArea);
  108. }
  109. [Fact]
  110. public void IsZeroArea_ZeroAreaRectangles_ReturnsFalse()
  111. {
  112. Assert.True(new RectI(new(5, 6), new VecI(0, 10)).IsZeroArea);
  113. Assert.True(new RectI(new(-5, -6), new VecI(10, 0)).IsZeroArea);
  114. Assert.True(new RectI(new(-5, -6), new VecI(0, 0)).IsZeroArea);
  115. }
  116. [Fact]
  117. public void Standardize_StandardRects_RemainUnchanged()
  118. {
  119. var rect1 = new RectI(new(4, 5), new(1, 1));
  120. Assert.Equal(rect1, rect1.Standardize());
  121. var rect2 = new RectI(new(-4, -5), new(1, 1));
  122. Assert.Equal(rect2, rect2.Standardize());
  123. }
  124. [Fact]
  125. public void Standardize_NonStandardRects_BecomeStandard()
  126. {
  127. var rect1 = new RectI(4, 5, -1, -1);
  128. Assert.Equal(new RectI(3, 4, 1, 1), rect1.Standardize());
  129. var rect2 = new RectI(-4, -5, -1, 1);
  130. Assert.Equal(new RectI(-5, -5, 1, 1), rect2.Standardize());
  131. var rect3 = new RectI(-4, -5, 1, -1);
  132. Assert.Equal(new RectI(-4, -6, 1, 1), rect3.Standardize());
  133. }
  134. [Fact]
  135. public void ReflectX_BasicRect_ReturnsReflected()
  136. {
  137. var rect = new RectI(4, 5, 6, 7);
  138. Assert.Equal(new RectI(-4, 5, 6, 7), rect.ReflectX(3));
  139. }
  140. [Fact]
  141. public void ReflectY_BasicRect_ReturnsReflected()
  142. {
  143. var rect = new RectI(4, 5, 6, 7);
  144. Assert.Equal(new RectI(4, -6, 6, 7), rect.ReflectY(3));
  145. }
  146. [Fact]
  147. public void Inflate_BasicRect_ReturnsInflated()
  148. {
  149. var rect = new RectI(4, 5, 6, 7);
  150. var infInt = rect.Inflate(2);
  151. var infVec = rect.Inflate(2, 3);
  152. Assert.Equal(new RectI(2, 3, 10, 11), infInt);
  153. Assert.Equal(new RectI(2, 2, 10, 13), infVec);
  154. }
  155. [Fact]
  156. public void AspectFit_FitPortraitIntoLandscape_FitsCorrectly()
  157. {
  158. RectI landscape = new(-1, 4, 5, 3);
  159. RectI portrait = new(32, -41, 41, 41 * 3);
  160. RectI fitted = landscape.AspectFit(portrait);
  161. Assert.Equal(new RectI(1, 4, 1, 3), fitted);
  162. }
  163. [Fact]
  164. public void AspectFit_FitLandscapeIntoPortrait_FitsCorrectly()
  165. {
  166. RectI portrait = new(1, -10, 7, 15);
  167. RectI landscape = new(-314, 1592, 23 * 7, 23 * 3);
  168. RectI fitted = portrait.AspectFit(landscape);
  169. Assert.Equal(new RectI(1, -4, 7, 3), fitted);
  170. }
  171. [Fact]
  172. public void ContainsInclusive_BasicRect_DeterminedCorrectly()
  173. {
  174. RectI rect = new(5, 4, 10, 11);
  175. Assert.True(rect.ContainsInclusive(5, 4));
  176. Assert.True(rect.ContainsInclusive(5 + 10, 4 + 11));
  177. Assert.True(rect.ContainsInclusive(5, 4 + 2));
  178. Assert.True(rect.ContainsInclusive(5 + 2, 4));
  179. Assert.True(rect.ContainsInclusive(6, 5));
  180. Assert.False(rect.ContainsInclusive(0, 0));
  181. Assert.False(rect.ContainsInclusive(6, 80));
  182. Assert.False(rect.ContainsInclusive(80, 6));
  183. Assert.False(rect.ContainsInclusive(5 + 11, 4 + 10));
  184. }
  185. [Fact]
  186. public void ContainsExclusive_BasicRect_DeterminedCorrectly()
  187. {
  188. RectI rect = new(5, 4, 10, 11);
  189. Assert.False(rect.ContainsExclusive(5, 4));
  190. Assert.False(rect.ContainsExclusive(5 + 10, 4 + 11));
  191. Assert.False(rect.ContainsExclusive(5, 4 + 2));
  192. Assert.False(rect.ContainsExclusive(5 + 2, 4));
  193. Assert.True(rect.ContainsExclusive(6, 5));
  194. Assert.True(rect.ContainsExclusive(5 + 9, 4 + 10));
  195. Assert.False(rect.ContainsExclusive(0, 0));
  196. Assert.False(rect.ContainsExclusive(6, 80));
  197. Assert.False(rect.ContainsExclusive(80, 6));
  198. Assert.False(rect.ContainsExclusive(5 + 11, 4 + 10));
  199. }
  200. [Fact]
  201. public void ContainsPixel_BasicRect_DeterminedCorrectly()
  202. {
  203. RectI rect = new RectI(960, 540, 1920, 1080);
  204. Assert.True(rect.ContainsPixel(960, 540));
  205. Assert.True(rect.ContainsPixel(1920 - 1, 1080 - 1));
  206. Assert.True(rect.ContainsPixel(960 + 960 / 2, 540 + 540 / 2));
  207. Assert.False(rect.ContainsPixel(960 - 1, 540 - 1));
  208. Assert.False(rect.ContainsPixel(960 + 1920, 540 + 1080));
  209. Assert.False(rect.ContainsPixel(960 + 960, 1080 + 540));
  210. }
  211. [Fact]
  212. public void IntersectsWithInclusive_BasicRects_ReturnsTrue()
  213. {
  214. RectI rect = new RectI(960, 540, 1920, 1080);
  215. Span<RectI> rects = stackalloc RectI[]
  216. {
  217. rect.Offset(1920, 1080),
  218. rect.Offset(-1920, 0).Inflate(-1).Offset(1, 0),
  219. rect.Offset(0, 1080).Inflate(-1).Offset(0, -1),
  220. rect.Inflate(-1),
  221. rect.Inflate(1),
  222. };
  223. foreach (var testRect in rects)
  224. Assert.True(rect.IntersectsWithInclusive(testRect));
  225. }
  226. [Fact]
  227. public void IntersectsWithInclusive_BasicRects_ReturnsFalse()
  228. {
  229. RectI rect = new RectI(960, 540, 1920, 1080);
  230. Span<RectI> rects = stackalloc RectI[]
  231. {
  232. rect.Offset(1921, 1080),
  233. rect.Offset(-1921, 0).Inflate(-1).Offset(1, 0),
  234. rect.Offset(0, 1081).Inflate(-1).Offset(0, -1)
  235. };
  236. foreach (var testRect in rects)
  237. Assert.False(rect.IntersectsWithInclusive(testRect));
  238. }
  239. [Fact]
  240. public void IntersectsWithExclusive_BasicRects_ReturnsTrue()
  241. {
  242. RectI rect = new RectI(960, 540, 1920, 1080);
  243. Span<RectI> rects = stackalloc RectI[]
  244. {
  245. rect.Offset(1920 - 1, 1080 - 1),
  246. rect.Offset(-1920, 0).Inflate(-1).Offset(2, 0),
  247. rect.Offset(0, 1080).Inflate(-1).Offset(0, -2),
  248. rect.Inflate(-1),
  249. rect.Inflate(1),
  250. };
  251. foreach (var testRect in rects)
  252. Assert.True(rect.IntersectsWithExclusive(testRect));
  253. }
  254. [Fact]
  255. public void IntersectsWithExclusive_BasicRects_ReturnsFalse()
  256. {
  257. RectI rect = new RectI(960, 540, 1920, 1080);
  258. Span<RectI> rects = stackalloc RectI[]
  259. {
  260. rect.Offset(1920, 1080),
  261. rect.Offset(-1920, 0).Inflate(-1).Offset(1, 0),
  262. rect.Offset(0, 1080).Inflate(-1).Offset(0, -1),
  263. rect.Offset(1921, 1080),
  264. rect.Offset(-1921, 0).Inflate(-1).Offset(1, 0),
  265. rect.Offset(0, 1081).Inflate(-1).Offset(0, -1)
  266. };
  267. foreach (var testRect in rects)
  268. Assert.False(rect.IntersectsWithExclusive(testRect));
  269. }
  270. [Fact]
  271. public void Intersect_IntersectingRectangles_ReturnsIntersection()
  272. {
  273. Assert.Equal(
  274. new RectI(400, 300, 400, 300),
  275. new RectI(400, 300, 800, 600).Intersect(new RectI(0, 0, 800, 600)));
  276. }
  277. [Fact]
  278. public void Intersect_NonIntersectingRectangles_ReturnsEmpty()
  279. {
  280. Assert.Equal(
  281. RectI.Empty,
  282. new RectI(-123, -456, 78, 10).Intersect(new RectI(123, 456, 789, 101)));
  283. }
  284. [Fact]
  285. public void Union_BasicRectangles_ReturnsUnion()
  286. {
  287. var rect1 = new RectI(4, 5, 1, 1);
  288. var rect2 = new RectI(-4, -5, 1, 1);
  289. Assert.Equal(new RectI(-4, -5, 9, 11), rect1.Union(rect2));
  290. Assert.Equal(new RectI(-4, -5, 9, 11), rect2.Union(rect1));
  291. }
  292. }