-- CA11D013.AM -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, 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;