LineSegment2DTest.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. // MonoGame - Copyright (C) MonoGame Foundation, Inc
  2. // This file is subject to the terms and conditions defined in
  3. // file 'LICENSE.txt', which is part of this source code package.
  4. using System;
  5. using Microsoft.Xna.Framework;
  6. namespace MonoGame.Extended.Tests
  7. {
  8. public sealed class LineSegment2DTest
  9. {
  10. #region Constructor Tests
  11. [Fact]
  12. public void Constructor()
  13. {
  14. var start = new Vector2(1, 2);
  15. var end = new Vector2(3, 4);
  16. var segment = new LineSegment2D(start, end);
  17. Assert.Equal(start, segment.Start);
  18. Assert.Equal(end, segment.End);
  19. }
  20. #endregion
  21. #region Computed Property Tests
  22. [Fact]
  23. public void Direction_ReturnsVector()
  24. {
  25. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(3, 4));
  26. var direction = segment.Direction;
  27. Assert.Equal(new Vector2(3, 4), direction);
  28. }
  29. [Fact]
  30. public void Midpoint_ReturnsCenterPoint()
  31. {
  32. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 10));
  33. var midpoint = segment.Midpoint;
  34. Assert.Equal(new Vector2(5, 5), midpoint);
  35. }
  36. [Fact]
  37. public void Length_Horizontal()
  38. {
  39. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  40. float length = segment.Length;
  41. Assert.Equal(10.0f, length, Collision2D.Epsilon);
  42. }
  43. [Fact]
  44. public void Length_Diagonal()
  45. {
  46. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(3, 4));
  47. float length = segment.Length;
  48. Assert.Equal(5.0f, length, Collision2D.Epsilon);
  49. }
  50. [Fact]
  51. public void LengthSquared_AvoidsSqrt()
  52. {
  53. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(3, 4));
  54. float lengthSquared = segment.LengthSquared;
  55. Assert.Equal(25.0f, lengthSquared, Collision2D.Epsilon);
  56. }
  57. #endregion
  58. #region GetPoint Tests (Type-Specific Utility)
  59. [Fact]
  60. public void GetPoint_AtStart()
  61. {
  62. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  63. var point = segment.GetPoint(0.0f);
  64. Assert.Equal(new Vector2(0, 0), point);
  65. }
  66. [Fact]
  67. public void GetPoint_AtMidpoint()
  68. {
  69. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  70. var point = segment.GetPoint(0.5f);
  71. Assert.Equal(new Vector2(5, 0), point);
  72. }
  73. [Fact]
  74. public void GetPoint_AtEnd()
  75. {
  76. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  77. var point = segment.GetPoint(1.0f);
  78. Assert.Equal(new Vector2(10, 0), point);
  79. }
  80. [Fact]
  81. public void GetPoint_BeyondEnd()
  82. {
  83. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  84. var point = segment.GetPoint(1.5f);
  85. Assert.Equal(new Vector2(15, 0), point);
  86. }
  87. #endregion
  88. #region GetBounds Tests (Type-Specific Method)
  89. [Fact]
  90. public void GetBounds_HorizontalSegment()
  91. {
  92. var segment = new LineSegment2D(new Vector2(2, 5), new Vector2(8, 5));
  93. var bounds = segment.GetBounds();
  94. Assert.Equal(new Vector2(2, 5), bounds.Min);
  95. Assert.Equal(new Vector2(8, 5), bounds.Max);
  96. }
  97. [Fact]
  98. public void GetBounds_VerticalSegment()
  99. {
  100. var segment = new LineSegment2D(new Vector2(5, 2), new Vector2(5, 8));
  101. var bounds = segment.GetBounds();
  102. Assert.Equal(new Vector2(5, 2), bounds.Min);
  103. Assert.Equal(new Vector2(5, 8), bounds.Max);
  104. }
  105. [Fact]
  106. public void GetBounds_DiagonalSegment()
  107. {
  108. var segment = new LineSegment2D(new Vector2(1, 2), new Vector2(9, 7));
  109. var bounds = segment.GetBounds();
  110. Assert.Equal(new Vector2(1, 2), bounds.Min);
  111. Assert.Equal(new Vector2(9, 7), bounds.Max);
  112. }
  113. [Fact]
  114. public void GetBounds_ReversedEndpoints()
  115. {
  116. var segment = new LineSegment2D(new Vector2(9, 7), new Vector2(1, 2));
  117. var bounds = segment.GetBounds();
  118. Assert.Equal(new Vector2(1, 2), bounds.Min);
  119. Assert.Equal(new Vector2(9, 7), bounds.Max);
  120. }
  121. [Fact]
  122. public void GetBounds_DegenerateSegment()
  123. {
  124. var segment = new LineSegment2D(new Vector2(5, 5), new Vector2(5, 5));
  125. var bounds = segment.GetBounds();
  126. Assert.Equal(new Vector2(5, 5), bounds.Min);
  127. Assert.Equal(new Vector2(5, 5), bounds.Max);
  128. }
  129. #endregion
  130. #region Distance and Projection Tests (Delegation Spot Checks)
  131. [Fact]
  132. public void ClosestPoint_OnSegment()
  133. {
  134. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  135. var point = new Vector2(5, 3);
  136. var closest = segment.ClosestPoint(point, out float distanceAlongSegment);
  137. Assert.Equal(new Vector2(5, 0), closest);
  138. Assert.Equal(0.5f, distanceAlongSegment, Collision2D.Epsilon);
  139. }
  140. [Fact]
  141. public void ClosestPoint_BeforeStart()
  142. {
  143. var segment = new LineSegment2D(new Vector2(10, 0), new Vector2(20, 0));
  144. var point = new Vector2(5, 3);
  145. var closest = segment.ClosestPoint(point, out float distanceAlongSegment);
  146. Assert.Equal(new Vector2(10, 0), closest);
  147. Assert.Equal(0.0f, distanceAlongSegment, Collision2D.Epsilon);
  148. }
  149. [Fact]
  150. public void ClosestPoint_AfterEnd()
  151. {
  152. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  153. var point = new Vector2(15, 3);
  154. var closest = segment.ClosestPoint(point, out float distanceAlongSegment);
  155. Assert.Equal(new Vector2(10, 0), closest);
  156. }
  157. [Fact]
  158. public void DistanceToPoint_PerpendicularDistance()
  159. {
  160. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  161. var point = new Vector2(5, 3);
  162. float distance = segment.DistanceToPoint(point);
  163. Assert.Equal(3.0f, distance, Collision2D.Epsilon);
  164. }
  165. [Fact]
  166. public void DistanceSquaredToPoint_AvoidsSqrt()
  167. {
  168. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  169. var point = new Vector2(5, 3);
  170. float distanceSquared = segment.DistanceSquaredToPoint(point);
  171. Assert.Equal(9.0f, distanceSquared, Collision2D.Epsilon);
  172. }
  173. [Fact]
  174. public void DistanceToSegment_Parallel()
  175. {
  176. var segment1 = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  177. var segment2 = new LineSegment2D(new Vector2(0, 5), new Vector2(10, 5));
  178. float distance = segment1.DistanceToSegment(segment2);
  179. Assert.Equal(5.0f, distance, Collision2D.Epsilon);
  180. }
  181. #endregion
  182. #region Deconstruct Test
  183. [Fact]
  184. public void Deconstruct()
  185. {
  186. var segment = new LineSegment2D(new Vector2(1, 2), new Vector2(3, 4));
  187. var (start, end) = segment;
  188. Assert.Equal(new Vector2(1, 2), start);
  189. Assert.Equal(new Vector2(3, 4), end);
  190. }
  191. #endregion
  192. }
  193. }