using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Azimuth;

namespace Annulus.UnitTests
{
    public class RayTests : UnitTestSharp.TestFixture
    {
        public class Interpolate : UnitTestSharp.TestFixture
        {
            public void Basic()
            {
                var ray = new Ray(
                    new Vector(0, 0),
                    new Vector(1, 1)
                );

                var point = ray.Interpolate(2);

                CheckEqual(new Vector(2, 2), point);
            }

            public void Degenerate()
            {
                var ray = new Ray(
                    new Vector(0, 0),
                    new Vector(0, 0)
                );

                var point = ray.Interpolate(100);

                CheckEqual(new Vector(0, 0), point);
            }

            public void Straddling0()
            {
                var ray = new Ray(
                    new Vector(-1, 0),
                    new Vector(1, 0)
                );

                var point = ray.Interpolate(0.5);

                CheckEqual(new Vector(-0.5,0), point);
            }
        }

        public class IsDegenerate : UnitTestSharp.TestFixture
        {
            public void DegenerateDirection()
            {
                var ray = new Ray(new Vector(2, 2), new Vector(0, 0));

                Check(ray.IsDegenerate());
            }

            public void NaN_From_X()
            {
                var ray = new Ray(new Vector(Scalar.NaN, 0), new Vector(0, 0));

                Check(ray.IsDegenerate());
            }

            public void NaN_From_Y()
            {
                var ray = new Ray(new Vector(0, Scalar.NaN), new Vector(0, 0));

                Check(ray.IsDegenerate());
            }

            public void NaN_Dir_X()
            {
                var ray = new Ray(new Vector(0, 0), new Vector(Scalar.NaN, 0));

                Check(ray.IsDegenerate());
            }

            public void NaN_Dir_Y()
            {
                var ray = new Ray(new Vector(0, 0), new Vector(0, Scalar.NaN));

                Check(ray.IsDegenerate());
            }

            public void NotDegenerate()
            {
                var ray = new Ray(new Vector(1, 1), new Vector(1, 0));

                CheckFalse(ray.IsDegenerate());
            }
        }

        public class Project : UnitTestSharp.TestFixture
        {
            public void Basic()
            {
                var ray = new Ray(
                    new Vector(0, 0),
                    new Vector(1, 1)
                );

                var fraction = ray.ProjectPoint(new Vector(2, 2));

                CheckEqual(2, fraction);
            }

            public void Degenerate()
            {
                var ray = new Ray(
                    new Vector(0, 0),
                    new Vector(0, 0)
                );

                CheckThrow(typeof(Exception));
                var fraction = ray.ProjectPoint(new Vector(2, 2));
            }

            public void Straddling0()
            {
                var ray = new Ray(
                    new Vector(-1, 0),
                    new Vector(2, 0)
                );

                var fraction = ray.ProjectPoint(new Vector(1, 0));

                CheckEqual(1, fraction);
            }
        }
    }
}