Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/GameUtils/Types/Geometry/AABB.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/// <summary>
/// Returns true if the specified box is completely inside this box
/// </summary>
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;
}

/// <summary>
/// Returns true if the specified box intersects with, or is inside the box
/// </summary>
Expand Down
63 changes: 63 additions & 0 deletions tests/GameUtils.Tests/Geometry/AABBTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
Loading