BoundingCircleTest.cs 10.0 KB

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