| -- 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; |