From 7f53edec72b00d81964e3fddc652ad9228f8da29 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 19:58:52 +0000 Subject: [PATCH] Add AABB Contains(AABB) overload and expand unit tests Added Contains(AABB) to AABB.cs to check if an AABB is completely inside another. Added comprehensive unit tests in AABBTests.cs for point and box containment scenarios. Co-authored-by: johnstrand <11484777+johnstrand@users.noreply.github.com> --- src/GameUtils/Types/Geometry/AABB.cs | 8 +++ tests/GameUtils.Tests/Geometry/AABBTests.cs | 63 +++++++++++++++++++++ 2 files changed, 71 insertions(+) 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]