diff gcc/testsuite/ada/acats/tests/cxg/cxg1001.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/ada/acats/tests/cxg/cxg1001.a	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,276 @@
+-- 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;