A stealth-based 2D platformer where you don't have to kill anyone unless you want to. https://www.semicolin.games
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.0 KiB

  1. using Microsoft.Xna.Framework;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using System;
  4. namespace SemiColinGames.Tests {
  5. [TestClass]
  6. public class GeometryTests {
  7. [TestMethod]
  8. public void TestIntersectSegmentNotColliding() {
  9. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  10. Assert.IsNull(box.IntersectSegment(new Vector2(-16, -16), new Vector2(32, 0)));
  11. }
  12. [TestMethod]
  13. public void TestIntersectSegmentHit() {
  14. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  15. var point = new Vector2(-16, 4);
  16. var delta = new Vector2(32, 0);
  17. Hit? maybeHit = box.IntersectSegment(point, delta);
  18. Assert.IsNotNull(maybeHit);
  19. Hit hit = (Hit) maybeHit;
  20. Assert.AreEqual(box, hit.Collider);
  21. Assert.AreEqual(0.25, hit.Time);
  22. Assert.AreEqual(point.X + delta.X * hit.Time, hit.Position.X);
  23. Assert.AreEqual(point.Y + delta.Y * hit.Time, hit.Position.Y);
  24. Assert.AreEqual((1.0f - hit.Time) * -delta.X, hit.Delta.X);
  25. Assert.AreEqual((1.0f - hit.Time) * -delta.Y, hit.Delta.Y);
  26. Assert.AreEqual(-1, hit.Normal.X);
  27. Assert.AreEqual(0, hit.Normal.Y);
  28. }
  29. [TestMethod]
  30. public void TestIntersectSegmentFromInsideBox() {
  31. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  32. var point = new Vector2(-4, 4);
  33. var delta = new Vector2(32, 0);
  34. Hit? maybeHit = box.IntersectSegment(point, delta);
  35. Assert.IsNotNull(maybeHit);
  36. Hit hit = (Hit) maybeHit;
  37. Assert.AreEqual(box, hit.Collider);
  38. Assert.AreEqual(0.0, hit.Time);
  39. Assert.AreEqual(-4, hit.Position.X);
  40. Assert.AreEqual(4, hit.Position.Y);
  41. Assert.AreEqual(-delta.X, hit.Delta.X);
  42. Assert.AreEqual(-delta.Y, hit.Delta.Y);
  43. Assert.AreEqual(-1, hit.Normal.X);
  44. Assert.AreEqual(0, hit.Normal.Y);
  45. }
  46. [TestMethod]
  47. public void TestIntersectSegmentWithPadding() {
  48. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  49. var point = new Vector2(-16, 4);
  50. var delta = new Vector2(32, 0);
  51. int padding = 4;
  52. Hit? maybeHit = box.IntersectSegment(point, delta, new Vector2(padding, padding));
  53. Assert.IsNotNull(maybeHit);
  54. Hit hit = (Hit) maybeHit;
  55. Assert.AreEqual(box, hit.Collider);
  56. Assert.AreEqual(0.125, hit.Time);
  57. Assert.AreEqual(point.X + delta.X * hit.Time, hit.Position.X);
  58. Assert.AreEqual(point.Y + delta.Y * hit.Time, hit.Position.Y);
  59. Assert.AreEqual((1.0f - hit.Time) * -delta.X, hit.Delta.X);
  60. Assert.AreEqual((1.0f - hit.Time) * -delta.Y, hit.Delta.Y);
  61. Assert.AreEqual(-1, hit.Normal.X);
  62. Assert.AreEqual(0, hit.Normal.Y);
  63. }
  64. [TestMethod]
  65. public void TestIntersectSegmentFromTwoDirections() {
  66. AABB box = new AABB(new Vector2(0, 0), new Vector2(32, 32));
  67. var farPos = new Vector2(64, 0);
  68. var farToNearDelta = new Vector2(-32, 0);
  69. Assert.IsNull(box.IntersectSegment(farPos, farToNearDelta));
  70. var nearPos = new Vector2(32, 0);
  71. var nearToFarDelta = new Vector2(32, 0);
  72. Assert.IsNull(box.IntersectSegment(nearPos, nearToFarDelta));
  73. }
  74. [TestMethod]
  75. public void TestIntersectSegmentXAxisAligned() {
  76. AABB box = new AABB(new Vector2(0, 0), new Vector2(16, 16));
  77. var pos = new Vector2(-32, 0);
  78. var delta = new Vector2(64, 0);
  79. Hit? maybeHit = box.IntersectSegment(pos, delta);
  80. Assert.IsNotNull(maybeHit);
  81. Hit hit = (Hit) maybeHit;
  82. Assert.AreEqual(0.25, hit.Time);
  83. Assert.AreEqual(-1, hit.Normal.X);
  84. Assert.AreEqual(0, hit.Normal.Y);
  85. }
  86. [TestMethod]
  87. public void TestIntersectSegmentYAxisAligned() {
  88. AABB box = new AABB(new Vector2(0, 0), new Vector2(16, 16));
  89. var pos = new Vector2(0, -32);
  90. var delta = new Vector2(0, 64);
  91. Hit? maybeHit = box.IntersectSegment(pos, delta);
  92. Assert.IsNotNull(maybeHit);
  93. Hit hit = (Hit) maybeHit;
  94. Assert.AreEqual(0.25, hit.Time);
  95. Assert.AreEqual(0, hit.Normal.X);
  96. Assert.AreEqual(-1, hit.Normal.Y);
  97. }
  98. }
  99. }