using System; using Chernobyl.Mathematics.Geometry; using NUnit.Framework; namespace Chernobyl.Mathematics.Movement { [TestFixture, Description("Test for the CagedTransform2D type.")] public class CagedTransform2DTests { [Test, Description("A test that ensures the CagedTransform2D constructor " + "throws an ArgumentNullException when it is given a null Rectangle.")] public void ConstructorArgumentNullException() { // ReSharper disable ObjectCreationAsStatement Assert.Throws(() => new CagedTransform2D(null)); // ReSharper restore ObjectCreationAsStatement } [Test, Description("A test that ensures the CagedTransform2D does not " + "try to move itself when it is inside its cage.")] public void InsideCageTest() { Rectangle cage = new Rectangle(5, 5); CagedTransform2D transform = new CagedTransform2D(cage); transform.Translate(1, 2); Assert.True(cage.Encloses((Point2D)transform.Position.Xy), "The transform is not within the cage, when it should be."); } [Test, Description("A test that ensures the CagedTransform2D moves " + "itself back inside its cage when it is moved out of it.")] public void OutsideCageTest() { Rectangle cage = new Rectangle(5, 5); CagedTransform2D transform = new CagedTransform2D(cage); transform.Translate(6, 7); Assert.True(cage.Encloses((Point2D)transform.Position.Xy), "The transform is not within the cage, when it should be."); } [Test, Description("A test that ensures a parented CagedTransform2D does " + "not try to move itself when it is inside its cage.")] public void ParentedInsideCageTest() { Rectangle cage = new Rectangle(5, 5); MatrixTransform parent = new MatrixTransform(); CagedTransform2D transform = new CagedTransform2D(cage); Transform.MakeParentChild(parent, transform); parent.Translate(1, 2); Assert.True(cage.Encloses((Point2D)transform.Position.Xy), "The transform is not within the cage, when it should be."); } [Test, Description("A test that ensures a parented CagedTransform2D moves " + "itself back inside its cage when it is moved out of it.")] public void ParentedOutsideCageTest() { Rectangle cage = new Rectangle(5, 5); MatrixTransform parent = new MatrixTransform(); CagedTransform2D transform = new CagedTransform2D(cage); Transform.MakeParentChild(parent, transform); parent.Translate(6, 7); Assert.True(cage.Encloses((Point2D)transform.Position.Xy), "The transform is not within the cage, when it should be."); } [Test, Description("A test that ensures CagedTransform2D moves " + "itself back inside its cage when the cage itself is moved.")] public void CageMovesTest() { Rectangle cage = new Rectangle(5, 5); CagedTransform2D transform = new CagedTransform2D(cage); cage.Translate(6, 7); Assert.True(cage.Encloses((Point2D)transform.Position.Xy), "The transform is not within the cage, when it should be."); } // TODO: tests needed: // ArgumentOutOfRangeException if BorderDistance is set to 0. // ArgumentOutOfRangeException if BorderDistance is set to less than 0. // Ensure BorderDistance is defaulted to the proper value after construction. // Ensure BorderDistance is used properly. // What happens if given a Rectangle with an area of 0? Need to add a test for this case. } }