Ray2DTest.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 Ray2DTest
  9. {
  10. #region Constructor Tests
  11. [Fact]
  12. public void Constructor()
  13. {
  14. var origin = new Vector2(1, 2);
  15. var direction = new Vector2(3, 4);
  16. var ray = new Ray2D(origin, direction);
  17. Assert.Equal(origin, ray.Origin);
  18. Assert.Equal(direction, ray.Direction);
  19. }
  20. #endregion
  21. #region Factory Method Tests
  22. [Fact]
  23. public void CreateFromPoints()
  24. {
  25. var start = new Vector2(0, 0);
  26. var through = new Vector2(10, 0);
  27. var ray = Ray2D.CreateFromPoints(start, through);
  28. Assert.Equal(start, ray.Origin);
  29. Assert.Equal(new Vector2(1, 0), ray.Direction);
  30. }
  31. [Fact]
  32. public void CreateFromPoints_ThrowsWhenPointsTooClose()
  33. {
  34. var start = new Vector2(0, 0);
  35. var through = new Vector2(1e-7f, 0);
  36. Assert.Throws<ArgumentException>(() => Ray2D.CreateFromPoints(start, through));
  37. }
  38. #endregion
  39. #region GetPoint Tests (Type-Specific Utility)
  40. [Fact]
  41. public void GetPoint_AtOrigin()
  42. {
  43. var ray = new Ray2D(new Vector2(5, 5), new Vector2(1, 0));
  44. var point = ray.GetPoint(0);
  45. Assert.Equal(new Vector2(5, 5), point);
  46. }
  47. [Fact]
  48. public void GetPoint_ForwardDirection()
  49. {
  50. var ray = new Ray2D(new Vector2(0, 0), new Vector2(1, 0));
  51. var point = ray.GetPoint(10);
  52. Assert.Equal(new Vector2(10, 0), point);
  53. }
  54. [Fact]
  55. public void GetPoint_NegativeDistance()
  56. {
  57. var ray = new Ray2D(new Vector2(10, 0), new Vector2(1, 0));
  58. var point = ray.GetPoint(-5);
  59. Assert.Equal(new Vector2(5, 0), point);
  60. }
  61. #endregion
  62. #region Distance and Projection Tests (Delegation Spot Checks)
  63. [Fact]
  64. public void ClosestPoint_PointAhead()
  65. {
  66. var ray = new Ray2D(new Vector2(0, 0), new Vector2(1, 0));
  67. var point = new Vector2(5, 3);
  68. var closest = ray.ClosestPoint(point, out float distanceAlongRay);
  69. Assert.Equal(new Vector2(5, 0), closest);
  70. }
  71. [Fact]
  72. public void ClosestPoint_PointBehind()
  73. {
  74. var ray = new Ray2D(new Vector2(10, 0), new Vector2(1, 0));
  75. var point = new Vector2(5, 3);
  76. var closest = ray.ClosestPoint(point, out float distanceAlongRay);
  77. Assert.Equal(new Vector2(10, 0), closest);
  78. }
  79. [Fact]
  80. public void DistanceToPoint_PerpendicularDistance()
  81. {
  82. var ray = new Ray2D(new Vector2(0, 0), new Vector2(1, 0));
  83. var point = new Vector2(5, 3);
  84. float distance = ray.DistanceToPoint(point);
  85. Assert.Equal(3.0f, distance, Collision2D.Epsilon);
  86. }
  87. [Fact]
  88. public void DistanceSquaredToPoint_AvoidsSqrt()
  89. {
  90. var ray = new Ray2D(new Vector2(0, 0), new Vector2(1, 0));
  91. var point = new Vector2(5, 3);
  92. float distanceSquared = ray.DistanceSquaredToPoint(point);
  93. Assert.Equal(9.0f, distanceSquared, Collision2D.Epsilon);
  94. }
  95. #endregion
  96. #region Normalize Tests
  97. [Fact]
  98. public void Normalize_Static_CreatesUnitDirection()
  99. {
  100. var ray = new Ray2D(new Vector2(0, 0), new Vector2(3, 4));
  101. var normalized = Ray2D.Normalize(ray);
  102. Assert.Equal(1.0f, normalized.Direction.Length(), Collision2D.Epsilon);
  103. Assert.Equal(ray.Origin, normalized.Origin);
  104. }
  105. [Fact]
  106. public void Normalize_Instance_ModifiesInPlace()
  107. {
  108. var ray = new Ray2D(new Vector2(5, 5), new Vector2(3, 4));
  109. ray.Normalize();
  110. Assert.Equal(1.0f, ray.Direction.Length(), Collision2D.Epsilon);
  111. Assert.Equal(new Vector2(5, 5), ray.Origin);
  112. }
  113. #endregion
  114. #region Deconstruct Test
  115. [Fact]
  116. public void Deconstruct()
  117. {
  118. var ray = new Ray2D(new Vector2(1, 2), new Vector2(3, 4));
  119. var (origin, direction) = ray;
  120. Assert.Equal(new Vector2(1, 2), origin);
  121. Assert.Equal(new Vector2(3, 4), direction);
  122. }
  123. #endregion
  124. }
  125. }