with
     Ahven,
     float_Math.Geometry.d2;


package body math_Tests.Geometry_2d
is

   use Ahven,
       float_Math;


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




   procedure Polygon_is_convex_Test
   is
      use float_Math.Geometry.d2;

      the_Poly : Polygon := (vertex_Count => 4,
                             vertices     => [[-1.0, -1.0],
                                              [ 1.0, -1.0],
                                              [ 1.0,  1.0],
                                              [-1.0,  1.0]]);
   begin
      assert (is_Convex (the_Poly),
              "T1 => " & Image (the_Poly) & " should be convex ... failed !");

      the_Poly.Vertices (3) := [0.0, 0.0];
      assert (is_Convex (the_Poly),
              "T2 => " & Image (the_Poly) & " should be convex ... failed !");

      the_Poly.Vertices (3) := [0.0, 0.1];
      assert (is_Convex (the_Poly),
              "T3 => " & Image (the_Poly) & " should be convex ... failed !");

      the_Poly.Vertices (3) := [0.0, -0.1];
      assert (not is_Convex (the_Poly),
              "T4 => " & Image (the_Poly) & " should not be convex ... failed !");
   end Polygon_is_convex_Test;



   procedure triangle_Area_Test
   is
      use float_Math.Geometry.d2;

      the_Tri : Triangle := (vertices => [[0.0, 0.0],
                                          [1.0, 0.0],
                                          [1.0, 1.0]]);
   begin
      assert (almost_Equal (Area (the_Tri), 0.5),
              "T1 =>  & Image (the_Tri) &  area should be 0.5 ... failed !   " & Image (Area (the_Tri), 12));


      the_Tri := (vertices => [[-0.11073643,  -0.179634809],
                               [-0.0553682148, 0.410182595],
                               [-0.0276841074, 0.705091298]]);
      assert (Area (the_Tri) >= 0.0,
              "T2 =>  & Image (the_Tri) &  area should be positive ... failed !");


      the_Tri := (vertices => [[-1.0, -1.0],
                               [ 1.0, -1.0],
                               [ 1.0, -0.999999]]);
      assert (Area (the_Tri) > 0.0,
              "T3 =>  & Image (the_Tri) &  area should be positive ... failed !");

      the_Tri := (vertices => [[-0.11073643,  -0.179634809],
                               [-0.0276841074, 0.705091298],
                               [-0.0553682148, 0.410182595]]);
      assert (Area (the_Tri) >= 0.0,
              "T4 =>  & Image (the_Tri) &  area should be positive ... failed !");

      -- tbd: Add tests for degenerate triangles.
   end triangle_Area_Test;



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

      Framework.add_test_Routine (T, Polygon_is_convex_Test'Access, "Polygon is convex Test");
      Framework.add_test_Routine (T, triangle_Area_Test    'Access, "Triangle area Test");
   end Initialize;


end math_Tests.Geometry_2d;
