using Azimuth; using System; using UnitTestSharp; using Blacklight.Core.Drawables; namespace Blacklight.Core.UnitTests.Drawables { public class ModelToWorldTests : TestFixture { public void DefaultAnchor_IsCenter() { AffineMatrix matrix = Rectangle.ModelToWorld(new Vector(10, 20), position: new Vector(100, 200)); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.Center)); } public void ZeroAngle_CenterAnchor_PinsFullMatrix() { var matrix = Rectangle.ModelToWorld( size: new Vector(10, 20), position: new Vector(100, 200)); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.Center)); CheckEqual(new Vector(105, 200), matrix.TransformPoint(new Vector(1, 0))); CheckEqual(new Vector(95, 200), matrix.TransformPoint(new Vector(-1, 0))); CheckEqual(new Vector(100, 210), matrix.TransformPoint(new Vector(0, 1))); CheckEqual(new Vector(100, 190), matrix.TransformPoint(new Vector(0, -1))); } public void ZeroAngle_TopLeftAnchor_CornersMapCorrectly() { var matrix = Rectangle.ModelToWorld( new Vector(10, 20), position: new Vector(100, 200), anchor: Rectangle.TopLeft); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.TopLeft)); CheckEqual(new Vector(110, 200), matrix.TransformPoint(Rectangle.TopRight)); CheckEqual(new Vector(110, 220), matrix.TransformPoint(Rectangle.BottomRight)); CheckEqual(new Vector(100, 220), matrix.TransformPoint(Rectangle.BottomLeft)); } public void NinetyDegreeRotation_CenterAnchor_PinsFullMatrix() { var matrix = Rectangle.ModelToWorld( new Vector(10, 20), position: new Vector(100, 200), angle: Math.PI / 2); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.Center)); CheckEqual(new Vector(100, 205), matrix.TransformPoint(new Vector(1, 0))); CheckEqual(new Vector(90, 200), matrix.TransformPoint(new Vector(0, 1))); } public void NinetyDegreeRotation_TopLeftAnchor_AnchorMapsToPosition() { var matrix = Rectangle.ModelToWorld( new Vector(10, 20), position: new Vector(100, 200), angle: Math.PI / 2, anchor: Rectangle.TopLeft); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.TopLeft)); } public void FortyFiveDegreeRotation_NonSquare_PinsOffAxisTerms() { Scalar angle = Math.PI / 4; Scalar cos = Math.Cos(angle); Scalar sin = Math.Sin(angle); var matrix = Rectangle.ModelToWorld( new Vector(12, 8), position: new Vector(0, 0), angle: angle); CheckEqual(new Vector(6 * cos, 6 * sin), matrix.TransformPoint(new Vector(1, 0))); CheckEqual(new Vector(-4 * sin, 4 * cos), matrix.TransformPoint(new Vector(0, 1))); } public void NegativeWidth_FlipsXAxis() { var matrix = Rectangle.ModelToWorld(new Vector(-10, 20), position: new Vector(100, 200)); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.Center)); CheckEqual(new Vector(95, 200), matrix.TransformPoint(new Vector(1, 0))); CheckEqual(new Vector(105, 200), matrix.TransformPoint(new Vector(-1, 0))); } public void AllNonDefaultValues() { Scalar angle = Math.PI / 4; Scalar cos = Math.Cos(angle); Scalar sin = Math.Sin(angle); var matrix = Rectangle.ModelToWorld( new Vector(12, 8), position: new Vector(100, 200), angle: angle, anchor: Rectangle.TopLeft); CheckEqual(new Vector(100, 200), matrix.TransformPoint(Rectangle.TopLeft)); CheckEqual(new Vector(100 + 12 * cos, 200 + 12 * sin), matrix.TransformPoint(new Vector(1, -1))); CheckEqual(new Vector(100 - 8 * sin, 200 + 8 * cos), matrix.TransformPoint(new Vector(-1, 1))); } } }