Files
sbox-public/engine/Sandbox.Test/System/Math/BBoxTest.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

124 lines
4.9 KiB
C#

namespace TestSystem.Math;
[TestClass]
public partial class BBoxTest
{
[TestMethod]
public void ContainsPoint()
{
var bbox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
// Test points inside
Assert.IsTrue( bbox.Contains( new Vector3( 0, 0, 0 ) ), "Center point should be inside" );
Assert.IsTrue( bbox.Contains( new Vector3( 9.9f, 9.9f, 9.9f ) ), "Point near max corner should be inside" );
Assert.IsTrue( bbox.Contains( new Vector3( -9.9f, -9.9f, -9.9f ) ), "Point near min corner should be inside" );
// Test points outside
Assert.IsFalse( bbox.Contains( new Vector3( 11, 0, 0 ) ), "Point outside x max should not be inside" );
Assert.IsFalse( bbox.Contains( new Vector3( -11, 0, 0 ) ), "Point outside x min should not be inside" );
Assert.IsFalse( bbox.Contains( new Vector3( 10.1f, 10.1f, 10.1f ) ), "Point just beyond max corner should not be inside" );
}
[TestMethod]
public void ContainsBBox()
{
var outerBox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
var innerBox = new BBox( new Vector3( -5, -5, -5 ), new Vector3( 5, 5, 5 ) );
var overlappingBox = new BBox( new Vector3( -15, -15, -15 ), new Vector3( 0, 0, 0 ) );
var separateBox = new BBox( new Vector3( 20, 20, 20 ), new Vector3( 30, 30, 30 ) );
Assert.IsTrue( outerBox.Contains( innerBox ), "Outer box should contain inner box" );
Assert.IsFalse( outerBox.Contains( overlappingBox ), "Outer box should not contain overlapping box" );
Assert.IsFalse( outerBox.Contains( separateBox ), "Outer box should not contain separate box" );
Assert.IsFalse( innerBox.Contains( outerBox ), "Inner box should not contain outer box" );
}
[TestMethod]
public void OverlapsBBox()
{
var boxA = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
var boxB = new BBox( new Vector3( 5, 5, 5 ), new Vector3( 15, 15, 15 ) );
var boxC = new BBox( new Vector3( 20, 20, 20 ), new Vector3( 30, 30, 30 ) );
Assert.IsTrue( boxA.Overlaps( boxB ), "Boxes A and B should overlap" );
Assert.IsFalse( boxA.Overlaps( boxC ), "Boxes A and C should not overlap" );
Assert.IsTrue( boxB.Overlaps( boxA ), "Overlap should be commutative" );
}
[TestMethod]
public void AddPointTest()
{
var bbox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
// Add a point outside the box
var expandedBox = bbox.AddPoint( new Vector3( 20, 5, 15 ) );
// Check that the box expanded in the right dimensions
Assert.AreEqual( new Vector3( -10, -10, -10 ), expandedBox.Mins );
Assert.AreEqual( new Vector3( 20, 10, 15 ), expandedBox.Maxs );
}
[TestMethod]
public void GrowTest()
{
var bbox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
var grownBox = bbox.Grow( 5 );
// Check that the box grew in all dimensions
Assert.AreEqual( new Vector3( -15, -15, -15 ), grownBox.Mins );
Assert.AreEqual( new Vector3( 15, 15, 15 ), grownBox.Maxs );
}
[TestMethod]
public void ClosestPointTest()
{
var bbox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
// Test points inside the box
var insidePoint = new Vector3( 5, 5, 5 );
var closestToInside = bbox.ClosestPoint( insidePoint );
Assert.IsTrue( closestToInside.AlmostEqual( insidePoint ), "Closest point to an inside point should be the point itself" );
// Test points outside the box
var outsidePoint = new Vector3( 20, 5, 5 );
var closestToOutside = bbox.ClosestPoint( outsidePoint );
Assert.IsTrue( closestToOutside.AlmostEqual( new Vector3( 10, 5, 5 ) ), "Closest point should be on the box surface" );
// Test point outside on multiple axes
var cornerPoint = new Vector3( 20, 20, 20 );
var closestToCorner = bbox.ClosestPoint( cornerPoint );
Assert.IsTrue( closestToCorner.AlmostEqual( new Vector3( 10, 10, 10 ) ), "Closest point should be the box corner" );
}
[TestMethod]
public void FromPositionAndSizeTest()
{
var bbox1 = BBox.FromPositionAndSize( new Vector3( 10, 20, 30 ), 10.0f );
Assert.AreEqual( new Vector3( 5, 15, 25 ), bbox1.Mins );
Assert.AreEqual( new Vector3( 15, 25, 35 ), bbox1.Maxs );
var bbox2 = BBox.FromPositionAndSize( new Vector3( 10, 20, 30 ), new Vector3( 2, 4, 6 ) );
Assert.AreEqual( new Vector3( 9, 18, 27 ), bbox2.Mins );
Assert.AreEqual( new Vector3( 11, 22, 33 ), bbox2.Maxs );
}
[TestMethod]
public void GetEdgeDistanceTest()
{
var bbox = new BBox( new Vector3( -10, -10, -10 ), new Vector3( 10, 10, 10 ) );
// Test center point (should be 10 units from any edge)
float centerDist = bbox.GetEdgeDistance( new Vector3( 0, 0, 0 ) );
Assert.AreEqual( 10.0f, centerDist );
// Test point near edge
float nearEdgeDist = bbox.GetEdgeDistance( new Vector3( 9, 0, 0 ) );
Assert.AreEqual( 1.0f, nearEdgeDist );
// Test point outside bbox (should return distance to nearest edge, which is 0)
float outsideDist = bbox.GetEdgeDistance( new Vector3( 20, 0, 0 ) );
Assert.AreEqual( 10.0f, outsideDist );
}
}