diff --git a/src/GameUtils/Types/Geometry/AABB.cs b/src/GameUtils/Types/Geometry/AABB.cs index 297d1a6..ec09406 100644 --- a/src/GameUtils/Types/Geometry/AABB.cs +++ b/src/GameUtils/Types/Geometry/AABB.cs @@ -48,6 +48,14 @@ public bool Contains(Vector2 point) return point.X >= Min.X && point.X <= Max.X && point.Y >= Min.Y && point.Y <= Max.Y; } + /// + /// Returns true if the specified box is completely inside this box + /// + public bool Contains(AABB other) + { + return other.Min.X >= Min.X && other.Max.X <= Max.X && other.Min.Y >= Min.Y && other.Max.Y <= Max.Y; + } + /// /// Returns true if the specified box intersects with, or is inside the box /// diff --git a/tests/GameUtils.Tests/Geometry/AABBTests.cs b/tests/GameUtils.Tests/Geometry/AABBTests.cs index 6d32231..60e19d6 100644 --- a/tests/GameUtils.Tests/Geometry/AABBTests.cs +++ b/tests/GameUtils.Tests/Geometry/AABBTests.cs @@ -109,6 +109,69 @@ public void Contains_PointOutsideBox_ReturnsFalse() Assert.IsFalse(aabb.Contains(new Vector2(21, 15))); Assert.IsFalse(aabb.Contains(new Vector2(15, 9))); Assert.IsFalse(aabb.Contains(new Vector2(15, 21))); + Assert.IsFalse(aabb.Contains(new Vector2(9, 9))); + Assert.IsFalse(aabb.Contains(new Vector2(21, 21))); + } + + [TestMethod] + public void Contains_AABB_FullyContained_ReturnsTrue() + { + var outer = new AABB(new Vector2(0, 0), new Vector2(20, 20)); + var inner = new AABB(new Vector2(5, 5), new Vector2(15, 15)); + Assert.IsTrue(outer.Contains(inner)); + } + + [TestMethod] + public void Contains_AABB_Identical_ReturnsTrue() + { + var box1 = new AABB(new Vector2(10, 10), new Vector2(20, 20)); + var box2 = new AABB(new Vector2(10, 10), new Vector2(20, 20)); + Assert.IsTrue(box1.Contains(box2)); + } + + [TestMethod] + public void Contains_AABB_TouchingInternalBoundary_ReturnsTrue() + { + var outer = new AABB(new Vector2(0, 0), new Vector2(20, 20)); + var inner = new AABB(new Vector2(0, 0), new Vector2(10, 10)); + Assert.IsTrue(outer.Contains(inner)); + } + + [TestMethod] + public void Contains_AABB_PartiallyOverlapping_ReturnsFalse() + { + var box1 = new AABB(new Vector2(0, 0), new Vector2(10, 10)); + var box2 = new AABB(new Vector2(5, 5), new Vector2(15, 15)); + Assert.IsFalse(box1.Contains(box2)); + Assert.IsFalse(box2.Contains(box1)); + } + + [TestMethod] + public void Contains_AABB_Disjoint_ReturnsFalse() + { + var box1 = new AABB(new Vector2(0, 0), new Vector2(10, 10)); + var box2 = new AABB(new Vector2(20, 20), new Vector2(30, 30)); + Assert.IsFalse(box1.Contains(box2)); + Assert.IsFalse(box2.Contains(box1)); + } + + [TestMethod] + public void Contains_AABB_EnclosingBox_ReturnsFalse() + { + var inner = new AABB(new Vector2(5, 5), new Vector2(15, 15)); + var outer = new AABB(new Vector2(0, 0), new Vector2(20, 20)); + Assert.IsFalse(inner.Contains(outer)); + } + + [TestMethod] + public void Contains_AABB_ExceedsInSingleDimension_ReturnsFalse() + { + var baseBox = new AABB(new Vector2(10, 10), new Vector2(20, 20)); + + Assert.IsFalse(baseBox.Contains(new AABB(new Vector2(9, 11), new Vector2(19, 19)))); + Assert.IsFalse(baseBox.Contains(new AABB(new Vector2(11, 11), new Vector2(21, 19)))); + Assert.IsFalse(baseBox.Contains(new AABB(new Vector2(11, 9), new Vector2(19, 19)))); + Assert.IsFalse(baseBox.Contains(new AABB(new Vector2(11, 11), new Vector2(19, 21)))); } [TestMethod]