view gcc/testsuite/ada/acats/tests/ca/ca11d013.am @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- CA11D013.AM
--
--                             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 a child unit can raise an exception that is declared in 
--      parent.                
--
-- TEST DESCRIPTION:
--      Declare a package which defines complex number abstraction with
--      user-defined exceptions (foundation code).
--
--      Add a public child package to the above package. Declare two 
--      subprograms for the parent type.  Each of the subprograms raises a 
--      different exception, based on the value of an input parameter.
--
--      Add a public child procedure to the foundation package.  This
--      procedure raises an exception based on the value of an input 
--      parameter.
--
--      Add a public child function to the foundation package.  This
--      function raises an exception based on the value of an input 
--      parameter.
--
--      In the main program, "with" the child packages, then check that
--      the exceptions are raised and handled as expected.  Ensure that
--      exceptions are:
--         1) raised in the public child package and handled/reraised to
--            be handled by the main program.
--         2) raised and handled locally in the public child package.
--         3) raised and handled locally by "others" in the public child 
--            procedure.
--         4) raised in the public child function and propagated to the
--            main program.
--
-- TEST FILES:
--      The following files comprise this test:
--
--         FA11D00.A
--         CA11D010.A
--         CA11D011.A
--         CA11D012.A
--      => CA11D013.AM
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

with FA11D00.CA11D010;               -- Add_Subtract_Complex
with FA11D00.CA11D011;               -- Multiply_Complex
with FA11D00.CA11D012;               -- Divide_Complex

with Report;


procedure CA11D013 is

   package Complex_Pkg renames FA11D00;
   package Add_Subtract_Complex_Pkg renames FA11D00.CA11D010;
   use Complex_Pkg;

begin

   Report.Test ("CA11D013", "Check that a child unit can raise an " &
                "exception that is declared in parent");


   Add_Complex_Subtest:
   declare
      First       : Complex_Type := Complex (Int_Type (Report.Ident_Int (3)), 
                                    Int_Type (Report.Ident_Int (7)));  
      Second      : Complex_Type := Complex (Int_Type (Report.Ident_Int (5)), 
                                    Int_Type (Report.Ident_Int (3)));  
      Add_Result  : Complex_Type := Complex (Int_Type (Report.Ident_Int (8)), 
                                    Int_Type (Report.Ident_Int (10)));  
      Third       : Complex_Type := Complex (Int_Type(Report.Ident_Int(-100)), 
                                    Int_Type (Report.Ident_Int (100)));  
      Complex_Num : Complex_Type := Zero;  

   begin
      Add_Subtract_Complex_Pkg.Add (First, Second, Complex_Num);

      if (Complex_Num /= Add_Result) then
         Report.Failed ("Incorrect results from addition");
      end if;
  
      -- Error is raised in child package and exception 
      -- will be handled/reraised to caller.

      Add_Subtract_Complex_Pkg.Add (First, Third, Complex_Num);

      -- Error was not raised in child package.
      Report.Failed ("Exception was not reraised in addition");

   exception
      when Add_Error     => 
         if not TC_Handled_In_Child_Pkg_Proc then
            Report.Failed ("Exception was not raised in addition");
         else
            TC_Handled_In_Caller := true;  -- Exception is reraised from
                                           -- child package.
         end if;

      when others => 
         Report.Failed ("Unexpected exception in addition subtest"); 
         TC_Handled_In_Caller := false;  -- Improper exception handling
                                         -- in caller.

   end Add_Complex_Subtest;


   Subtract_Complex_Subtest:
   declare
      First       : Complex_Type := Complex (Int_Type (Report.Ident_Int (3)), 
                                    Int_Type (Report.Ident_Int (6)));  
      Second      : Complex_Type := Complex (Int_Type (Report.Ident_Int (5)), 
                                    Int_Type (Report.Ident_Int (7)));  
      Sub_Result  : Complex_Type := Complex (Int_Type (Report.Ident_Int (2)), 
                                    Int_Type (Report.Ident_Int (1)));  
      Third       : Complex_Type := Complex (Int_Type(Report.Ident_Int(-200)), 
                                    Int_Type (Report.Ident_Int (1)));  
      Complex_Num : Complex_Type;

   begin
      Complex_Num := Add_Subtract_Complex_Pkg.Subtract (Second, First);

      if (Complex_Num /= Sub_Result) then
         Report.Failed ("Incorrect results from subtraction");
      end if;
  
      -- Error is raised and exception will be handled in child package.
      Complex_Num := Add_Subtract_Complex_Pkg.Subtract (Second, Third);

   exception
      when Subtract_Error => 
         Report.Failed ("Exception raised in subtraction and " &
                        "propagated to caller");
         TC_Handled_In_Child_Pkg_Func := false; -- Improper exception handling
                                                -- in caller.

      when others => 
         Report.Failed ("Unexpected exception in subtraction subtest"); 
         TC_Handled_In_Child_Pkg_Func := false; -- Improper exception handling
                                                -- in caller.

   end Subtract_Complex_Subtest;


   Multiply_Complex_Subtest:
   declare
      First       : Complex_Type := Complex (Int_Type(Report.Ident_Int(3)), 
                                    Int_Type (Report.Ident_Int (4)));  
      Second      : Complex_Type := Complex (Int_Type(Report.Ident_Int(5)), 
                                    Int_Type (Report.Ident_Int (3)));  
      Mult_Result : Complex_Type := Complex(Int_Type(Report.Ident_Int(15)), 
                                    Int_Type(Report.Ident_Int (12)));  
      Third       : Complex_Type := Complex(Int_Type(Report.Ident_Int(10)), 
                                    Int_Type(Report.Ident_Int (-10)));  
      Complex_Num : Complex_Type;

   begin
      CA11D011 (First, Second, Complex_Num);

      if (Complex_Num /= Mult_Result) then
         Report.Failed ("Incorrect results from multiplication");
      end if;
  
      -- Error is raised and exception will be handled in child package.
     CA11D011 (First, Third, Complex_Num);

   exception
      when Multiply_Error => 
         Report.Failed ("Exception raised in multiplication and " &
                        "propagated to caller");
         TC_Handled_In_Child_Sub := false;     -- Improper exception handling
                                               -- in caller.

      when others => 
         Report.Failed ("Unexpected exception in multiplication subtest"); 
         TC_Handled_In_Child_Sub := false;     -- Improper exception handling
                                               -- in caller.
   end Multiply_Complex_Subtest;


   Divide_Complex_Subtest:
   declare
      First       : Complex_Type := Complex (Int_Type (Report.Ident_Int(10)), 
                                    Int_Type (Report.Ident_Int (15)));  
      Second      : Complex_Type := Complex (Int_Type(Report.Ident_Int(5)), 
                                    Int_Type (Report.Ident_Int (3)));  
      Div_Result  : Complex_Type := Complex (Int_Type(Report.Ident_Int(2)), 
                                    Int_Type (Report.Ident_Int (5)));  
      Third       : Complex_Type := Complex (Int_Type(Report.Ident_Int(-10)), 
                                    Int_Type (Report.Ident_Int (0)));  
      Complex_Num : Complex_Type := Zero;

   begin
      Complex_Num := CA11D012 (First, Second);

      if (Complex_Num /= Div_Result) then
         Report.Failed ("Incorrect results from division");
      end if;
  
      -- Error is raised in child package; exception will be
      -- propagated to caller.
      Complex_Num := CA11D012 (Second, Third);

      -- Error was not raised in child package.
      Report.Failed ("Exception was not raised in division subtest ");

   exception
      when Divide_Error => 
         TC_Propagated_To_Caller := true;  -- Exception is propagated.

      when others => 
         Report.Failed ("Unexpected exception in division subtest"); 
         TC_Propagated_To_Caller := false;  -- Improper exception handling
                                            -- in caller.
   end Divide_Complex_Subtest;


   if not (TC_Handled_In_Caller         and     -- Check to see that all 
           TC_Handled_In_Child_Pkg_Proc and     -- exceptions were handled in
           TC_Handled_In_Child_Pkg_Func and     -- the proper locations.
           TC_Handled_In_Child_Sub      and     
           TC_Propagated_To_Caller)
   then
      Report.Failed ("Exceptions handled in incorrect locations");
   end if;

   Report.Result;

end CA11D013;