with
     Ahven,
     float_Math.Algebra.linear.d2;



package body math_Tests.linear_Algebra_2d
is

   use Ahven,
       float_Math;


   function almost_Equal (Left, Right : in Real) return Boolean
   is
      Tolerance : constant := 0.000_000_1;
   begin
      return abs (Left - Right) <= Tolerance;
   end almost_Equal;




   procedure translation_Matrix_Test
   is
      use
          float_Math.Algebra.linear.d2;

      From : constant Vector_2 := [0.0, 0.0];
      To   : Vector_2;

   begin
      To := From * to_translation_Transform ([1.0, 0.0]);

      assert (To (1) = 1.0,  Image (To) & "  translation () failed !");
      assert (To (2) = 0.0,  Image (To) & "  translation () failed !");

      To := From * to_translation_Transform ([0.0, 1.0]);

      assert (To (1) = 0.0,  Image (To) & "  translation () failed !");
      assert (To (2) = 1.0,  Image (To) & "  translation () failed !");


      To := From * to_translation_Transform ([-1.0, 0.0]);

      assert (To (1) = -1.0,  Image (To) & "  translation () failed !");
      assert (To (2) =  0.0,  Image (To) & "  translation () failed !");

      To := From * to_translation_Transform ([0.0, -1.0]);

      assert (To (1) =  0.0,  Image (To) & "  translation () failed !");
      assert (To (2) = -1.0,  Image (To) & "  translation () failed !");


      To := From * to_translation_Transform ([1.0, 1.0]);

      assert (To (1) =  1.0,  Image (To) & "  translation () failed !");
      assert (To (2) =  1.0,  Image (To) & "  translation () failed !");

      To := From * to_translation_Transform ([-1.0, -1.0]);

      assert (To (1) = -1.0,  Image (To) & "  translation () failed !");
      assert (To (2) = -1.0,  Image (To) & "  translation () failed !");
   end translation_Matrix_Test;



   procedure rotation_Matrix_Test
   is
      use
          float_Math.Algebra.linear.d2;

      From : constant Vector_2 := [1.0, 0.0];
      To   : Vector_2;

   begin
      To := From * to_rotation_Matrix (to_Radians (90.0));

      assert (almost_Equal (To (1),  0.0),   Image (To, 16) & "  rotation (90a) failed !");
      assert (almost_Equal (To (2),  1.0),   Image (To, 16) & "  rotation (90b) failed !");

      To := From * to_rotation_Matrix (to_Radians (-90.0));

      assert (almost_Equal (To (1),  0.0),   Image (To, 16) & "  rotation (-90a) failed !");
      assert (almost_Equal (To (2), -1.0),   Image (To, 16) & "  rotation (-90b) failed !");


      To := From * to_rotation_Matrix (to_Radians (180.0));

      assert (almost_Equal (To (1), -1.0),   Image (To, 16) & "  rotation (180a) failed !");
      assert (almost_Equal (To (2),  0.0),   Image (To, 16) & "  rotation (180b) failed !");

      To := From * to_rotation_Matrix (to_Radians (-180.0));

      assert (almost_Equal (To (1), -1.0),   Image (To, 16) & "  rotation (-180a) failed !");
      assert (almost_Equal (To (2),  0.0),   Image (To, 16) & "  rotation (-180b) failed !");


      To := From * to_rotation_Matrix (to_Radians (270.0));

      assert (almost_Equal (To (1),  0.0),   Image (To, 16) & "  rotation (270a) failed !");
      assert (almost_Equal (To (2), -1.0),   Image (To, 16) & "  rotation (270b) failed !");

      To := From * to_rotation_Matrix (to_Radians (-270.0));

      assert (almost_Equal (To (1),  0.0),   Image (To, 16) & "  rotation (-270) failed !");
      assert (almost_Equal (To (2),  1.0),   Image (To, 16) & "  rotation (-270) failed !");
   end rotation_Matrix_Test;



   procedure transform_Test
   is
      use
          float_Math.Algebra.linear.d2;

      From : constant Vector_2 := [1.0, 0.0];
      To   : Vector_2;

      Transform : Transform_2d := to_Transform_2d (rotation    => to_Radians (90.0),
                                                   translation => [0.0, 0.0]);

   begin
      To := From * Transform;

      assert (almost_Equal (To (1),  0.0),   Image (To, 16) & "  transform (a) failed !");
      assert (almost_Equal (To (2),  1.0),   Image (To, 16) & "  transform (b) failed !");


      Transform.Translation := [1.0, 0.0];
      To := From * Transform;

      assert (almost_Equal (To (1),  1.0),   Image (To, 16) & "  transform (c) failed !");
      assert (almost_Equal (To (2),  1.0),   Image (To, 16) & "  transform (d) failed !");
   end transform_Test;



   overriding
   procedure Initialize (T : in out Test) is
   begin
      T.set_Name ("Linear Algebra (2D) Tests");

      Framework.add_test_Routine (T, translation_Matrix_Test'Access, "translation_Matrix_Test");
      Framework.add_test_Routine (T,    rotation_Matrix_Test'Access,    "rotation_Matrix_Test");
      Framework.add_test_Routine (T,          transform_Test'Access,          "transform_Test");
   end Initialize;


end math_Tests.linear_Algebra_2d;
