BoundingCapsule2DTest.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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 BoundingCapsule2DTest
  9. {
  10. #region Constructor Tests
  11. [Fact]
  12. public void Constructor()
  13. {
  14. var pointA = new Vector2(0, 0);
  15. var pointB = new Vector2(10, 0);
  16. var radius = 5.0f;
  17. var capsule = new BoundingCapsule2D(pointA, pointB, radius);
  18. Assert.Equal(pointA, capsule.PointA);
  19. Assert.Equal(pointB, capsule.PointB);
  20. Assert.Equal(radius, capsule.Radius);
  21. }
  22. #endregion
  23. #region Computed Property Tests
  24. [Fact]
  25. public void Center_ReturnsMidpoint()
  26. {
  27. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  28. var center = capsule.Center;
  29. Assert.Equal(new Vector2(5, 0), center);
  30. }
  31. [Fact]
  32. public void Length_ReturnsDistance()
  33. {
  34. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(3, 4), 5.0f);
  35. float length = capsule.Length;
  36. Assert.Equal(5.0f, length, Collision2D.Epsilon);
  37. }
  38. [Fact]
  39. public void LengthSquared_ReturnsSquaredDistance()
  40. {
  41. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(3, 4), 5.0f);
  42. float lengthSquared = capsule.LengthSquared;
  43. Assert.Equal(25.0f, lengthSquared, Collision2D.Epsilon);
  44. }
  45. [Fact]
  46. public void Direction_ReturnsUnitVector()
  47. {
  48. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(3, 4), 5.0f);
  49. var direction = capsule.Direction;
  50. Assert.Equal(1.0f, direction.Length(), Collision2D.Epsilon);
  51. Assert.Equal(0.6f, direction.X, Collision2D.Epsilon);
  52. Assert.Equal(0.8f, direction.Y, Collision2D.Epsilon);
  53. }
  54. [Fact]
  55. public void Direction_DegenerateCapsule()
  56. {
  57. var capsule = new BoundingCapsule2D(new Vector2(5, 5), new Vector2(5, 5), 3.0f);
  58. var direction = capsule.Direction;
  59. Assert.Equal(Vector2.Zero, direction);
  60. }
  61. [Fact]
  62. public void Area_CalculatesCorrectly()
  63. {
  64. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  65. float area = capsule.Area;
  66. float expected = 100.0f + MathF.PI * 25.0f;
  67. Assert.Equal(expected, area, Collision2D.Epsilon);
  68. }
  69. #endregion
  70. #region Factory Method Tests
  71. [Fact]
  72. public void CreateFromCenterAndDirection()
  73. {
  74. var center = new Vector2(5, 5);
  75. var direction = new Vector2(1, 0);
  76. var length = 10.0f;
  77. var radius = 3.0f;
  78. var capsule = BoundingCapsule2D.CreateFromCenterAndDirection(center, direction, length, radius);
  79. Assert.Equal(new Vector2(0, 5), capsule.PointA);
  80. Assert.Equal(new Vector2(10, 5), capsule.PointB);
  81. Assert.Equal(radius, capsule.Radius);
  82. }
  83. [Fact]
  84. public void CreateFromCenterAndDirection_UnnormalizedDirection()
  85. {
  86. var center = new Vector2(5, 5);
  87. var direction = new Vector2(3, 4);
  88. var length = 10.0f;
  89. var radius = 3.0f;
  90. var capsule = BoundingCapsule2D.CreateFromCenterAndDirection(center, direction, length, radius);
  91. float distance = Vector2.Distance(capsule.PointA, capsule.PointB);
  92. Assert.Equal(10.0f, distance, Collision2D.Epsilon);
  93. }
  94. [Fact]
  95. public void CreateFromSegment()
  96. {
  97. var segment = new LineSegment2D(new Vector2(0, 0), new Vector2(10, 0));
  98. var radius = 3.0f;
  99. var capsule = BoundingCapsule2D.CreateFromSegment(segment, radius);
  100. Assert.Equal(segment.Start, capsule.PointA);
  101. Assert.Equal(segment.End, capsule.PointB);
  102. Assert.Equal(radius, capsule.Radius);
  103. }
  104. [Fact]
  105. public void CreateMerged_NonOverlapping()
  106. {
  107. var capsule1 = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(5, 0), 2.0f);
  108. var capsule2 = new BoundingCapsule2D(new Vector2(20, 0), new Vector2(25, 0), 2.0f);
  109. var merged = BoundingCapsule2D.CreateMerged(capsule1, capsule2);
  110. Assert.Equal(ContainmentType.Contains, merged.Contains(capsule1));
  111. Assert.Equal(ContainmentType.Contains, merged.Contains(capsule2));
  112. }
  113. [Fact]
  114. public void CreateMerged_OneContainsOther()
  115. {
  116. var capsule1 = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(20, 0), 5.0f);
  117. var capsule2 = new BoundingCapsule2D(new Vector2(8, 0), new Vector2(12, 0), 2.0f);
  118. var merged = BoundingCapsule2D.CreateMerged(capsule1, capsule2);
  119. Assert.Equal(capsule1.PointA.X, merged.PointA.X, Collision2D.Epsilon);
  120. Assert.Equal(capsule1.PointA.Y, merged.PointA.Y, Collision2D.Epsilon);
  121. Assert.Equal(capsule1.PointB.X, merged.PointB.X, Collision2D.Epsilon);
  122. Assert.Equal(capsule1.PointB.Y, merged.PointB.Y, Collision2D.Epsilon);
  123. }
  124. [Fact]
  125. public void CreateMerged_PartiallyOverlapping()
  126. {
  127. var capsule1 = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  128. var capsule2 = new BoundingCapsule2D(new Vector2(8, 0), new Vector2(18, 0), 3.0f);
  129. var merged = BoundingCapsule2D.CreateMerged(capsule1, capsule2);
  130. Assert.Equal(ContainmentType.Contains, merged.Contains(capsule1));
  131. Assert.Equal(ContainmentType.Contains, merged.Contains(capsule2));
  132. }
  133. #endregion
  134. #region Transform Tests
  135. [Fact]
  136. public void Transform_Translation()
  137. {
  138. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  139. var matrix = Matrix.CreateTranslation(5, 10, 0);
  140. var transformed = capsule.Transform(matrix);
  141. Assert.Equal(new Vector2(5, 10), transformed.PointA);
  142. Assert.Equal(new Vector2(15, 10), transformed.PointB);
  143. Assert.Equal(3.0f, transformed.Radius, Collision2D.Epsilon);
  144. }
  145. [Fact]
  146. public void Transform_UniformScale()
  147. {
  148. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  149. var matrix = Matrix.CreateScale(2.0f);
  150. var transformed = capsule.Transform(matrix);
  151. Assert.Equal(new Vector2(0, 0), transformed.PointA);
  152. Assert.Equal(new Vector2(20, 0), transformed.PointB);
  153. Assert.Equal(6.0f, transformed.Radius, Collision2D.Epsilon);
  154. }
  155. [Fact]
  156. public void Transform_NonUniformScale()
  157. {
  158. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  159. var matrix = Matrix.CreateScale(2.0f, 3.0f, 1.0f);
  160. var transformed = capsule.Transform(matrix);
  161. Assert.Equal(new Vector2(0, 0), transformed.PointA);
  162. Assert.Equal(new Vector2(20, 0), transformed.PointB);
  163. Assert.True(transformed.Radius >= 6.0f);
  164. }
  165. [Fact]
  166. public void Transform_Rotation()
  167. {
  168. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  169. var matrix = Matrix.CreateRotationZ(MathHelper.PiOver2);
  170. var transformed = capsule.Transform(matrix);
  171. Assert.Equal(0, transformed.PointA.X, Collision2D.Epsilon);
  172. Assert.Equal(0, transformed.PointA.Y, Collision2D.Epsilon);
  173. Assert.Equal(0, transformed.PointB.X, Collision2D.Epsilon);
  174. Assert.Equal(10, transformed.PointB.Y, Collision2D.Epsilon);
  175. Assert.Equal(3.0f, transformed.Radius, Collision2D.Epsilon);
  176. }
  177. [Fact]
  178. public void Translate_OffsetsPosition()
  179. {
  180. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 3.0f);
  181. var offset = new Vector2(5, 10);
  182. var translated = capsule.Translate(offset);
  183. Assert.Equal(new Vector2(5, 10), translated.PointA);
  184. Assert.Equal(new Vector2(15, 10), translated.PointB);
  185. Assert.Equal(3.0f, translated.Radius, Collision2D.Epsilon);
  186. }
  187. #endregion
  188. #region ContainsPoint Tests (Delegation Spot Check)
  189. [Fact]
  190. public void ContainsPoint_Inside()
  191. {
  192. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  193. var point = new Vector2(5, 2);
  194. var result = capsule.Contains(point);
  195. Assert.Equal(ContainmentType.Contains, result);
  196. }
  197. [Fact]
  198. public void ContainsPoint_OnBoundary()
  199. {
  200. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  201. var point = new Vector2(5, 5);
  202. var result = capsule.Contains(point);
  203. Assert.Equal(ContainmentType.Contains, result);
  204. }
  205. [Fact]
  206. public void ContainsPoint_Outside()
  207. {
  208. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  209. var point = new Vector2(5, 10);
  210. var result = capsule.Contains(point);
  211. Assert.Equal(ContainmentType.Disjoint, result);
  212. }
  213. [Fact]
  214. public void ContainsPoint_AtEndCap()
  215. {
  216. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  217. var point = new Vector2(-3, 4);
  218. var result = capsule.Contains(point);
  219. Assert.Equal(ContainmentType.Contains, result);
  220. }
  221. #endregion
  222. #region Deconstruct Test
  223. [Fact]
  224. public void Deconstruct()
  225. {
  226. var capsule = new BoundingCapsule2D(new Vector2(0, 0), new Vector2(10, 0), 5.0f);
  227. var (pointA, pointB, radius) = capsule;
  228. Assert.Equal(new Vector2(0, 0), pointA);
  229. Assert.Equal(new Vector2(10, 0), pointB);
  230. Assert.Equal(5.0f, radius);
  231. }
  232. #endregion
  233. }
  234. }