view gcc/testsuite/ada/acats/tests/cxg/cxg1001.a @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
line wrap: on
line source

-- CXG1001.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      Check that the subprograms defined in the package
--      Ada.Numerics.Generic_Complex_Types provide correct results.  
--      Specifically, check the functions Re, Im (both versions), procedures
--      Set_Re, Set_Im (both versions), functions Compose_From_Cartesian (all
--      versions), Compose_From_Polar, Modulus, Argument, and "abs".
--
-- TEST DESCRIPTION:
--      The generic package Generic_Complex_Types 
--      is instantiated with a real type (new Float), and the results
--      produced by the specified subprograms are verified.
--
-- APPLICABILITY CRITERIA:
--      This test applies only to implementations supporting the
--      Numerics Annex.
--
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      15 Nov 95   SAIC    Corrected visibility problems for ACVC 2.0.1.
--                          Modified subtest for Compose_From_Polar.
--      29 Sep 96   SAIC    Incorporated reviewer comments.
--
--!

with Ada.Numerics.Generic_Complex_Types;
with Report;

procedure CXG1001 is

begin

   Report.Test ("CXG1001", "Check that the subprograms defined in " &
                           "the package Ada.Numerics.Generic_Complex_Types " & 
                           "provide correct results");

   Test_Block:
   declare

      type Real_Type is new Float;

      package Complex_Pack is new 
        Ada.Numerics.Generic_Complex_Types(Real_Type);

      use type Complex_Pack.Complex;

      -- Declare a zero valued complex number.
      Complex_Zero : constant Complex_Pack.Complex := (0.0, 0.0);

      TC_Complex   : Complex_Pack.Complex := Complex_Zero;
      TC_Imaginary : Complex_Pack.Imaginary;    

   begin

      -- Check that the procedures Set_Re and Set_Im (both versions) provide
      -- correct results.

      declare
         TC_Complex_Real_Field : Complex_Pack.Complex := (5.0, 0.0);
         TC_Complex_Both_Fields : Complex_Pack.Complex := (5.0, 7.0);
      begin

         Complex_Pack.Set_Re(X => TC_Complex, Re => 5.0);

         if TC_Complex /= TC_Complex_Real_Field then
            Report.Failed("Incorrect results from Procedure Set_Re");
         end if;

         Complex_Pack.Set_Im(X => TC_Complex, Im => 7.0);

         if TC_Complex.Re /= 5.0 or
            TC_Complex.Im /= 7.0 or
            TC_Complex    /= TC_Complex_Both_Fields 
         then
            Report.Failed("Incorrect results from Procedure Set_Im " &
                          "with Complex argument");
         end if;

         Complex_Pack.Set_Im(X => TC_Imaginary, Im => 3.0);


         if Complex_Pack.Im(TC_Imaginary) /= 3.0 then
            Report.Failed("Incorrect results returned following the use " &
                          "of Procedure Set_Im with Imaginary argument");
         end if;

      end;


      -- Check that the functions Re and Im (both versions) provide
      -- correct results.

      declare
         TC_Complex_1 : Complex_Pack.Complex := (1.0, 0.0);
         TC_Complex_2 : Complex_Pack.Complex := (0.0, 2.0);
         TC_Complex_3 : Complex_Pack.Complex := (4.0, 3.0);
      begin

         -- Function Re.

         if Complex_Pack.Re(X => TC_Complex_1) /= 1.0  or
            Complex_Pack.Re(X => TC_Complex_2) /= 0.0  or
            Complex_Pack.Re(X => TC_Complex_3) /= 4.0 
         then
            Report.Failed("Incorrect results from Function Re");
         end if;

         -- Function Im; version with Complex argument.

         if Complex_Pack.Im(X => TC_Complex_1) /= 0.0  or
            Complex_Pack.Im(X => TC_Complex_2) /= 2.0  or
            Complex_Pack.Im(X => TC_Complex_3) /= 3.0 
         then
            Report.Failed("Incorrect results from Function Im " &
                          "with Complex argument");
         end if;


         -- Function Im; version with Imaginary argument.

         if Complex_Pack.Im(Complex_Pack.i) /= 1.0  or
            Complex_Pack.Im(Complex_Pack.j) /= 1.0
         then
            Report.Failed("Incorrect results from use of Function Im " &
                          "when used with an Imaginary argument");
         end if;

      end;


      -- Verify the results of the three versions of Function
      -- Compose_From_Cartesian

      declare

         Zero  : constant Real_Type := 0.0;
         Six   : constant Real_Type := 6.0;

         TC_Complex_1 : Complex_Pack.Complex := (3.0, 8.0);
         TC_Complex_2 : Complex_Pack.Complex := (Six, Zero);
         TC_Complex_3 : Complex_Pack.Complex := (Zero, 1.0);

      begin

         TC_Complex := Complex_Pack.Compose_From_Cartesian(3.0, 8.0);

         if TC_Complex /= TC_Complex_1 then
            Report.Failed("Incorrect results from Function " &
                          "Compose_From_Cartesian - 1");
         end if;

         -- If only one component is given, the other component is 
         -- implicitly zero (Both components are set by the following two
         -- function calls).

         TC_Complex := Complex_Pack.Compose_From_Cartesian(Re => 6.0);

         if TC_Complex /= TC_Complex_2 then
            Report.Failed("Incorrect results from Function " &
                          "Compose_From_Cartesian - 2");
         end if;

         TC_Complex := 
           Complex_Pack.Compose_From_Cartesian(Im => Complex_Pack.i);

         if TC_Complex /= TC_Complex_3 then
            Report.Failed("Incorrect results from Function " &
                          "Compose_From_Cartesian - 3");
         end if;

      end; 


      -- Verify the results of Function Compose_From_Polar, Modulus, "abs",
      -- and Argument.

      declare

         use Complex_Pack;

         TC_Modulus,
         TC_Argument : Real_Type := 0.0;


         Angle_0     : constant Real_Type :=   0.0;
         Angle_90    : constant Real_Type :=  90.0;
         Angle_180   : constant Real_Type := 180.0;
         Angle_270   : constant Real_Type := 270.0;
         Angle_360   : constant Real_Type := 360.0;

      begin

         -- Verify the result of Function Compose_From_Polar.
         -- When the value of the parameter Modulus is zero, the 
         -- Compose_From_Polar function yields a result of zero.

         if Compose_From_Polar(0.0, 30.0, 360.0) /= Complex_Zero
         then
            Report.Failed("Incorrect result from Function " &
                          "Compose_From_Polar - 1");
         end if;

         -- When the value of the parameter Argument is equal to a multiple
         -- of the quarter cycle, the result of the Compose_From_Polar
         -- function with specified cycle lies on one of the axes.

         if Compose_From_Polar( 5.0,  Angle_0,   Angle_360) /= (5.0,  0.0) or
            Compose_From_Polar( 5.0,  Angle_90,  Angle_360) /= (0.0,  5.0) or
            Compose_From_Polar(-5.0,  Angle_180, Angle_360) /= (5.0,  0.0) or
            Compose_From_Polar(-5.0,  Angle_270, Angle_360) /= (0.0,  5.0) or
            Compose_From_Polar(-5.0,  Angle_90,  Angle_360) /= (0.0, -5.0) or
            Compose_From_Polar( 5.0,  Angle_270, Angle_360) /= (0.0, -5.0) 
         then
            Report.Failed("Incorrect result from Function " &
                          "Compose_From_Polar - 2");
         end if;

         -- When the parameter to Function Argument represents a point on 
         -- the non-negative real axis, the function yields a zero result.

         if Argument(Complex_Zero, Angle_360) /= 0.0 then
            Report.Failed("Incorrect result from Function Argument");
         end if;

         -- Function Modulus

         if Modulus(Complex_Zero) /= 0.0  or
            Modulus(Compose_From_Polar( 5.0, Angle_90,  Angle_360)) /= 5.0 or
            Modulus(Compose_From_Polar(-5.0, Angle_180, Angle_360)) /= 5.0 
         then
            Report.Failed("Incorrect results from Function Modulus");
         end if;

         -- Function "abs", a rename of Function Modulus.

         if "abs"(Complex_Zero) /= 0.0  or
            "abs"(Compose_From_Polar( 5.0, Angle_90,  Angle_360)) /= 5.0 or
            "abs"(Compose_From_Polar(-5.0, Angle_180, Angle_360)) /= 5.0 
         then
            Report.Failed("Incorrect results from Function abs");
         end if;

      end;

   exception
      when others => Report.Failed ("Exception raised in Test_Block");
   end Test_Block;

   Report.Result;

end CXG1001;