| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- // MonoGame - Copyright (C) MonoGame Foundation, Inc
- // This file is subject to the terms and conditions defined in
- // file 'LICENSE.txt', which is part of this source code package.
- using System;
- using Microsoft.Xna.Framework;
- namespace MonoGame.Extended.Tests
- {
- public sealed class BoundingBox2DTest
- {
- #region Constructor Tests
- [Fact]
- public void Constructor()
- {
- var min = new Vector2(1, 2);
- var max = new Vector2(10, 20);
- var box = new BoundingBox2D(min, max);
- Assert.Equal(min, box.Min);
- Assert.Equal(max, box.Max);
- }
- #endregion
- #region Computed Property Tests
- [Fact]
- public void Center_ReturnsMiddlePoint()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var center = box.Center;
- Assert.Equal(new Vector2(5, 10), center);
- }
- [Fact]
- public void Size_ReturnsWidthAndHeight()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var size = box.Size;
- Assert.Equal(new Vector2(10, 20), size);
- }
- [Fact]
- public void HalfExtents_ReturnsHalfSize()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var halfExtents = box.HalfExtents;
- Assert.Equal(new Vector2(5, 10), halfExtents);
- }
- [Fact]
- public void Width_ReturnsHorizontalExtent()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- float width = box.Width;
- Assert.Equal(10.0f, width, Collision2D.Epsilon);
- }
- [Fact]
- public void Height_ReturnsVerticalExtent()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- float height = box.Height;
- Assert.Equal(20.0f, height, Collision2D.Epsilon);
- }
- [Fact]
- public void Area_ReturnsWidthTimesHeight()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- float area = box.Area;
- Assert.Equal(200.0f, area, Collision2D.Epsilon);
- }
- #endregion
- #region Factory Method Tests
- [Fact]
- public void CreateFromMinMax()
- {
- var min = new Vector2(1, 2);
- var max = new Vector2(10, 20);
- var box = BoundingBox2D.CreateFromMinMax(min, max);
- Assert.Equal(min, box.Min);
- Assert.Equal(max, box.Max);
- }
- [Fact]
- public void CreateFromCenterAndExtents()
- {
- var center = new Vector2(5, 10);
- var halfExtents = new Vector2(5, 10);
- var box = BoundingBox2D.CreateFromCenterAndExtents(center, halfExtents);
- Assert.Equal(new Vector2(0, 0), box.Min);
- Assert.Equal(new Vector2(10, 20), box.Max);
- }
- [Fact]
- public void CreateFromPositionAndSize()
- {
- var position = new Vector2(1, 2);
- var size = new Vector2(9, 18);
- var box = BoundingBox2D.CreateFromPositionAndSize(position, size);
- Assert.Equal(new Vector2(1, 2), box.Min);
- Assert.Equal(new Vector2(10, 20), box.Max);
- }
- [Fact]
- public void CreateFromPoints_SinglePoint()
- {
- var points = new[] { new Vector2(5, 5) };
- var box = BoundingBox2D.CreateFromPoints(points);
- Assert.Equal(new Vector2(5, 5), box.Min);
- Assert.Equal(new Vector2(5, 5), box.Max);
- }
- [Fact]
- public void CreateFromPoints_MultiplePoints()
- {
- var points = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 5),
- new Vector2(5, 15),
- new Vector2(-5, 3)
- };
- var box = BoundingBox2D.CreateFromPoints(points);
- Assert.Equal(new Vector2(-5, 0), box.Min);
- Assert.Equal(new Vector2(10, 15), box.Max);
- }
- [Fact]
- public void CreateFromPoints_ThrowsWhenNull()
- {
- Assert.Throws<ArgumentNullException>(() => BoundingBox2D.CreateFromPoints(null));
- }
- [Fact]
- public void CreateFromPoints_ThrowsWhenEmpty()
- {
- Assert.Throws<ArgumentException>(() => BoundingBox2D.CreateFromPoints(new Vector2[0]));
- }
- [Fact]
- public void CreateMerged_EnclosesBoth()
- {
- var box1 = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var box2 = new BoundingBox2D(new Vector2(5, 5), new Vector2(15, 15));
- var merged = BoundingBox2D.CreateMerged(box1, box2);
- Assert.Equal(new Vector2(0, 0), merged.Min);
- Assert.Equal(new Vector2(15, 15), merged.Max);
- }
- [Fact]
- public void CreateMerged_OneBoxContainsOther()
- {
- var box1 = new BoundingBox2D(new Vector2(0, 0), new Vector2(20, 20));
- var box2 = new BoundingBox2D(new Vector2(5, 5), new Vector2(15, 15));
- var merged = BoundingBox2D.CreateMerged(box1, box2);
- Assert.Equal(box1.Min, merged.Min);
- Assert.Equal(box1.Max, merged.Max);
- }
- #endregion
- #region GetCorners Tests (Type-Specific Method)
- [Fact]
- public void GetCorners_ReturnsArray()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var corners = box.GetCorners();
- Assert.Equal(4, corners.Length);
- Assert.Contains(new Vector2(0, 0), corners);
- Assert.Contains(new Vector2(10, 0), corners);
- Assert.Contains(new Vector2(10, 20), corners);
- Assert.Contains(new Vector2(0, 20), corners);
- }
- [Fact]
- public void GetCorners_FillsExistingArray()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var corners = new Vector2[4];
- box.GetCorners(corners);
- Assert.Contains(new Vector2(0, 0), corners);
- Assert.Contains(new Vector2(10, 0), corners);
- Assert.Contains(new Vector2(10, 20), corners);
- Assert.Contains(new Vector2(0, 20), corners);
- }
- [Fact]
- public void GetCorners_ThrowsWhenArrayNull()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- Assert.Throws<ArgumentNullException>(() => box.GetCorners(null));
- }
- [Fact]
- public void GetCorners_ThrowsWhenArrayTooSmall()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 20));
- var corners = new Vector2[3];
- Assert.Throws<ArgumentException>(() => box.GetCorners(corners));
- }
- #endregion
- #region Transform Tests
- [Fact]
- public void Transform_Translation()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var matrix = Matrix.CreateTranslation(5, 10, 0);
- var transformed = box.Transform(matrix);
- Assert.Equal(new Vector2(5, 10), transformed.Min);
- Assert.Equal(new Vector2(15, 20), transformed.Max);
- }
- [Fact]
- public void Transform_Scale()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var matrix = Matrix.CreateScale(2.0f);
- var transformed = box.Transform(matrix);
- Assert.Equal(new Vector2(0, 0), transformed.Min);
- Assert.Equal(new Vector2(20, 20), transformed.Max);
- }
- [Fact]
- public void Transform_Rotation()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 0));
- var matrix = Matrix.CreateRotationZ(MathHelper.PiOver2);
- var transformed = box.Transform(matrix);
- Assert.Equal(0, transformed.Min.X, Collision2D.Epsilon);
- Assert.Equal(0, transformed.Min.Y, Collision2D.Epsilon);
- Assert.Equal(0, transformed.Max.X, Collision2D.Epsilon);
- Assert.Equal(10, transformed.Max.Y, Collision2D.Epsilon);
- }
- [Fact]
- public void Translate_OffsetsPosition()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var offset = new Vector2(5, 10);
- var translated = box.Translate(offset);
- Assert.Equal(new Vector2(5, 10), translated.Min);
- Assert.Equal(new Vector2(15, 20), translated.Max);
- }
- #endregion
- #region ContainsPoint Tests (Delegation Spot Check)
- [Fact]
- public void ContainsPoint_Inside()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var point = new Vector2(5, 5);
- var result = box.Contains(point);
- Assert.Equal(ContainmentType.Contains, result);
- }
- [Fact]
- public void ContainsPoint_OnBoundary()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var point = new Vector2(10, 5);
- var result = box.Contains(point);
- Assert.Equal(ContainmentType.Contains, result);
- }
- [Fact]
- public void ContainsPoint_Outside()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var point = new Vector2(15, 5);
- var result = box.Contains(point);
- Assert.Equal(ContainmentType.Disjoint, result);
- }
- #endregion
- #region Deconstruct Test
- [Fact]
- public void Deconstruct()
- {
- var box = new BoundingBox2D(new Vector2(1, 2), new Vector2(10, 20));
- var (min, max) = box;
- Assert.Equal(new Vector2(1, 2), min);
- Assert.Equal(new Vector2(10, 20), max);
- }
- #endregion
- }
- }
|