using FluentAssertions;
using NUnit.Framework;

using MoonTools.Structs;
using System.Numerics;

namespace Tests
{
    public class Transform2DTest
    {
        [Test]
        public void Equals()
        {
            var transformA = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));
            var transformB = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));

            transformA.Equals(transformB).Should().BeTrue();
        }

        [Test]
        public void NotEquals()
        {
            var transformA = new Transform2D(new Position2D(2, 3));
            var transformB = new Transform2D(new Position2D(5, 1));

            transformA.Equals(transformB).Should().BeFalse();
        }

        [Test]
        public void EqualsOperator()
        {
            var transformA = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));
            var transformB = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));

            (transformA == transformB).Should().BeTrue();
        }

        [Test]
        public void NotEqualsOperator()
        {
            var transformA = new Transform2D(new Position2D(2, 3));
            var transformB = new Transform2D(new Position2D(5, 1));

            (transformA != transformB).Should().BeTrue();
        }

        [Test]
        public void Compose()
        {
            var transformA = new Transform2D(new Position2D(4, 1), (float)System.Math.PI / 2, new Vector2(3, 1));
            var transformB = new Transform2D(new Position2D(15, 2), (float)System.Math.PI / 4, new Vector2(1, 2));

            transformA.Compose(transformB).Should().BeEquivalentTo(new Transform2D(new Position2D(19, 3), 3 * (float)System.Math.PI / 4, new Vector2(3, 2)));
        }

        [Test]
        public void Transform()
        {
            var transformA = new Transform2D(Position2D.Zero, (float)System.Math.PI / 2, Vector2.One);
            var transformB = new Transform2D(new Vector2(0, 2), (float)System.Math.PI, Vector2.One);
            var transformC = new Transform2D(new Vector2(-2, 0), (float)System.Math.PI * 2, new Vector2(3, 1));

            Vector2.Transform(new Vector2(-1, 0), transformA.TransformMatrix).Should().Be(new Vector2(0, -1));
            Vector2.Transform(new Vector2(-1, 0), transformB.TransformMatrix).Should().Be(new Vector2(1, 2));
            Vector2.Transform(new Vector2(-1, 0), transformC.TransformMatrix).Should().Be(new Vector2(-5, 0));
        }
    }
}