| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544 |
- // 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 BoundingPolygon2DTest
- {
- #region Constructor Tests
- [Fact]
- public void Constructor_Triangle()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(5, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- Assert.Equal(3, polygon.VertexCount);
- }
- [Fact]
- public void Constructor_Square()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- Assert.Equal(4, polygon.VertexCount);
- }
- [Fact]
- public void Constructor_ThrowsWhenNull()
- {
- Assert.Throws<ArgumentNullException>(() => new BoundingPolygon2D(null));
- }
- [Fact]
- public void Constructor_ThrowsWhenTooFewVertices()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0)
- };
- Assert.Throws<ArgumentException>(() => new BoundingPolygon2D(vertices));
- }
- [Fact]
- public void Constructor_WithNormals()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var normals = new[]
- {
- new Vector2(0, -1),
- new Vector2(1, 0),
- new Vector2(-0.707f, 0.707f)
- };
- var polygon = new BoundingPolygon2D(vertices, normals);
- Assert.Equal(3, polygon.VertexCount);
- }
- [Fact]
- public void Constructor_WithNormals_ThrowsWhenNullVertices()
- {
- var normals = new[]
- {
- new Vector2(0, -1),
- new Vector2(1, 0),
- new Vector2(0, 1)
- };
- Assert.Throws<ArgumentNullException>(() => new BoundingPolygon2D(null, normals));
- }
- [Fact]
- public void Constructor_WithNormals_ThrowsWhenNullNormals()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- Assert.Throws<ArgumentNullException>(() => new BoundingPolygon2D(vertices, null));
- }
- [Fact]
- public void Constructor_WithNormals_ThrowsWhenLengthMismatch()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var normals = new[]
- {
- new Vector2(0, -1),
- new Vector2(1, 0)
- };
- Assert.Throws<ArgumentException>(() => new BoundingPolygon2D(vertices, normals));
- }
- #endregion
- #region Computed Property Tests
- [Fact]
- public void VertexCount_ReturnsCorrectCount()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- Assert.Equal(4, polygon.VertexCount);
- }
- [Fact]
- public void Centroid_TriangleReturnsCorrectValue()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(5, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var centroid = polygon.Centroid;
- Assert.Equal(5, centroid.X, Collision2D.Epsilon);
- Assert.Equal(10.0f / 3.0f, centroid.Y, Collision2D.Epsilon);
- }
- [Fact]
- public void Centroid_SquareReturnsCenter()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var centroid = polygon.Centroid;
- Assert.Equal(5, centroid.X, Collision2D.Epsilon);
- Assert.Equal(5, centroid.Y, Collision2D.Epsilon);
- }
- [Fact]
- public void Area_TriangleReturnsCorrectValue()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(5, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- float area = polygon.Area;
- Assert.Equal(50.0f, area, Collision2D.Epsilon);
- }
- [Fact]
- public void Area_SquareReturnsCorrectValue()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- float area = polygon.Area;
- Assert.Equal(100.0f, area, Collision2D.Epsilon);
- }
- #endregion
- #region Factory Method Tests
- [Fact]
- public void CreateFromVertices()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var polygon = BoundingPolygon2D.CreateFromVertices(vertices);
- Assert.Equal(3, polygon.VertexCount);
- }
- [Fact]
- public void CreateRegular_Triangle()
- {
- var center = new Vector2(5, 5);
- var radius = 10.0f;
- var sides = 3;
- var polygon = BoundingPolygon2D.CreateRegular(center, radius, sides);
- Assert.Equal(3, polygon.VertexCount);
- for (int i = 0; i < 3; i++)
- {
- float distance = Vector2.Distance(center, polygon.Vertices[i]);
- Assert.Equal(radius, distance, Collision2D.Epsilon);
- }
- }
- [Fact]
- public void CreateRegular_Square()
- {
- var center = new Vector2(0, 0);
- var radius = 10.0f;
- var sides = 4;
- var polygon = BoundingPolygon2D.CreateRegular(center, radius, sides);
- Assert.Equal(4, polygon.VertexCount);
- }
- [Fact]
- public void CreateRegular_Hexagon()
- {
- var center = new Vector2(0, 0);
- var radius = 10.0f;
- var sides = 6;
- var polygon = BoundingPolygon2D.CreateRegular(center, radius, sides);
- Assert.Equal(6, polygon.VertexCount);
- }
- [Fact]
- public void CreateRegular_WithRotation()
- {
- var center = new Vector2(0, 0);
- var radius = 10.0f;
- var sides = 4;
- var rotation = MathHelper.PiOver4;
- var polygon = BoundingPolygon2D.CreateRegular(center, radius, sides, rotation);
- Assert.Equal(4, polygon.VertexCount);
- float angle = MathHelper.PiOver4;
- float expectedX = radius * MathF.Cos(angle);
- float expectedY = radius * MathF.Sin(angle);
- Assert.Equal(expectedX, polygon.Vertices[0].X, Collision2D.Epsilon);
- Assert.Equal(expectedY, polygon.Vertices[0].Y, Collision2D.Epsilon);
- }
- [Fact]
- public void CreateRegular_ThrowsWhenTooFewSides()
- {
- var center = new Vector2(0, 0);
- var radius = 10.0f;
- var sides = 2;
- Assert.Throws<ArgumentException>(() => BoundingPolygon2D.CreateRegular(center, radius, sides));
- }
- [Fact]
- public void CreateFromBoundingBox2D()
- {
- var box = new BoundingBox2D(new Vector2(0, 0), new Vector2(10, 10));
- var polygon = BoundingPolygon2D.CreateFromBoundingBox2D(box);
- Assert.Equal(4, polygon.VertexCount);
- Assert.Contains(new Vector2(0, 0), polygon.Vertices);
- Assert.Contains(new Vector2(10, 0), polygon.Vertices);
- Assert.Contains(new Vector2(10, 10), polygon.Vertices);
- Assert.Contains(new Vector2(0, 10), polygon.Vertices);
- }
- [Fact]
- public void CreateMerged_NonOverlapping()
- {
- var vertices1 = new[]
- {
- new Vector2(0, 0),
- new Vector2(5, 0),
- new Vector2(5, 5),
- new Vector2(0, 5)
- };
- var polygon1 = new BoundingPolygon2D(vertices1);
- var vertices2 = new[]
- {
- new Vector2(10, 10),
- new Vector2(15, 10),
- new Vector2(15, 15),
- new Vector2(10, 15)
- };
- var polygon2 = new BoundingPolygon2D(vertices2);
- var merged = BoundingPolygon2D.CreateMerged(polygon1, polygon2);
- Assert.Equal(ContainmentType.Contains, merged.Contains(polygon1));
- Assert.Equal(ContainmentType.Contains, merged.Contains(polygon2));
- }
- [Fact]
- public void CreateMerged_Overlapping()
- {
- var vertices1 = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon1 = new BoundingPolygon2D(vertices1);
- var vertices2 = new[]
- {
- new Vector2(5, 5),
- new Vector2(15, 5),
- new Vector2(15, 15),
- new Vector2(5, 15)
- };
- var polygon2 = new BoundingPolygon2D(vertices2);
- var merged = BoundingPolygon2D.CreateMerged(polygon1, polygon2);
- Assert.Equal(ContainmentType.Contains, merged.Contains(polygon1));
- Assert.Equal(ContainmentType.Contains, merged.Contains(polygon2));
- }
- #endregion
- #region Transform Tests
- [Fact]
- public void Transform_Translation()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var matrix = Matrix.CreateTranslation(5, 10, 0);
- var transformed = polygon.Transform(matrix);
- Assert.Equal(new Vector2(5, 10), transformed.Vertices[0]);
- Assert.Equal(new Vector2(15, 10), transformed.Vertices[1]);
- Assert.Equal(new Vector2(15, 20), transformed.Vertices[2]);
- }
- [Fact]
- public void Transform_UniformScale()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var matrix = Matrix.CreateScale(2.0f);
- var transformed = polygon.Transform(matrix);
- Assert.Equal(new Vector2(0, 0), transformed.Vertices[0]);
- Assert.Equal(new Vector2(20, 0), transformed.Vertices[1]);
- Assert.Equal(new Vector2(20, 20), transformed.Vertices[2]);
- }
- [Fact]
- public void Transform_Rotation()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var matrix = Matrix.CreateRotationZ(MathHelper.PiOver2);
- var transformed = polygon.Transform(matrix);
- Assert.Equal(0, transformed.Vertices[0].X, Collision2D.Epsilon);
- Assert.Equal(0, transformed.Vertices[0].Y, Collision2D.Epsilon);
- Assert.Equal(0, transformed.Vertices[1].X, Collision2D.Epsilon);
- Assert.Equal(10, transformed.Vertices[1].Y, Collision2D.Epsilon);
- Assert.Equal(-10, transformed.Vertices[2].X, Collision2D.Epsilon);
- Assert.Equal(0, transformed.Vertices[2].Y, Collision2D.Epsilon);
- }
- [Fact]
- public void Translate_OffsetsPosition()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var offset = new Vector2(5, 10);
- var translated = polygon.Translate(offset);
- Assert.Equal(new Vector2(5, 10), translated.Vertices[0]);
- Assert.Equal(new Vector2(15, 10), translated.Vertices[1]);
- Assert.Equal(new Vector2(15, 20), translated.Vertices[2]);
- }
- #endregion
- #region ContainsPoint Tests (Delegation Spot Check)
- [Fact]
- public void ContainsPoint_Inside()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var point = new Vector2(5, 5);
- var result = polygon.Contains(point);
- Assert.Equal(ContainmentType.Contains, result);
- }
- [Fact]
- public void ContainsPoint_OnBoundary()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var point = new Vector2(10, 5);
- var result = polygon.Contains(point);
- Assert.Equal(ContainmentType.Contains, result);
- }
- [Fact]
- public void ContainsPoint_Outside()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10),
- new Vector2(0, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var point = new Vector2(15, 5);
- var result = polygon.Contains(point);
- Assert.Equal(ContainmentType.Disjoint, result);
- }
- #endregion
- #region Deconstruct Test
- [Fact]
- public void Deconstruct()
- {
- var vertices = new[]
- {
- new Vector2(0, 0),
- new Vector2(10, 0),
- new Vector2(10, 10)
- };
- var polygon = new BoundingPolygon2D(vertices);
- var (v, n) = polygon;
- Assert.Equal(vertices, v);
- Assert.NotNull(n);
- }
- #endregion
- }
- }
|