blob: ccfad52e41e8a5b2a959378bd1657fdcf11ef4b3 [file] [log] [blame]
-- CB20001.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 exceptions can be handled in accept bodies, and that a
-- task object that has an exception handled in an accept body is still
-- viable for future use.
--
-- TEST DESCRIPTION:
-- Declare a task that has exception handlers within an accept
-- statement in the task body. Declare a task object, and make entry
-- calls with data that will cause various exceptions to be raised
-- by the accept statement. Ensure that the exceptions are:
-- 1) raised and handled locally in the accept body
-- 2) raised in the accept body and handled/reraised to be handled
-- by the task body
-- 3) raised in the accept body and propagated to the calling
-- procedure.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
with Report;
package CB20001_0 is
Incorrect_Data,
Location_Error,
Off_Screen_Data : exception;
TC_Handled_In_Accept,
TC_Reraised_In_Accept,
TC_Handled_In_Task_Block,
TC_Handled_In_Caller : boolean := False;
type Location_Type is range 0 .. 2000;
task type Submarine_Type is
entry Contact (Location : in Location_Type);
end Submarine_Type;
Current_Position : Location_Type := 0;
end CB20001_0;
--=================================================================--
package body CB20001_0 is
task body Submarine_Type is
begin
loop
Task_Block:
begin
select
accept Contact (Location : in Location_Type) do
if Location > 1000 then
raise Off_Screen_Data;
elsif (Location > 500) and (Location <= 1000) then
raise Location_Error;
elsif (Location > 100) and (Location <= 500) then
raise Incorrect_Data;
else
Current_Position := Location;
end if;
exception
when Off_Screen_Data =>
TC_Handled_In_Accept := True;
when Location_Error =>
TC_Reraised_In_Accept := True;
raise; -- Reraise the Location_Error exception
-- in the task block.
end Contact;
or
terminate;
end select;
exception
when Off_Screen_Data =>
TC_Handled_In_Accept := False;
Report.Failed ("Off_Screen_Data exception " &
"improperly handled in task block");
when Location_Error =>
TC_Handled_In_Task_Block := True;
end Task_Block;
end loop;
exception
when Location_Error | Off_Screen_Data =>
TC_Handled_In_Accept := False;
TC_Handled_In_Task_Block := False;
Report.Failed ("Exception improperly propagated out to task body");
when others =>
null;
end Submarine_Type;
end CB20001_0;
--=================================================================--
with CB20001_0;
with Report;
with ImpDef;
procedure CB20001 is
package Submarine_Tracking renames CB20001_0;
Trident : Submarine_Tracking.Submarine_Type; -- Declare task
Sonar_Contact : Submarine_Tracking.Location_Type;
TC_LEB_Error,
TC_Main_Handler_Used : Boolean := False;
begin
Report.Test ("CB20001", "Check that exceptions can be handled " &
"in accept bodies");
Off_Screen_Block:
begin
Sonar_Contact := 1500;
Trident.Contact (Sonar_Contact); -- Cause Off_Screen_Data exception
-- to be raised and handled in a task
-- accept body.
exception
when Submarine_Tracking.Off_Screen_Data =>
TC_Main_Handler_Used := True;
Report.Failed ("Off_Screen_Data exception improperly handled " &
"in calling procedure");
when others =>
Report.Failed ("Exception handled unexpectedly in " &
"Off_Screen_Block");
end Off_Screen_Block;
Location_Error_Block:
begin
Sonar_Contact := 700;
Trident.Contact (Sonar_Contact); -- Cause Location_Error exception
-- to be raised in task accept body,
-- propogated to a task block, and
-- handled there. Corresponding
-- exception propagated here also.
Report.Failed ("Expected exception not raised");
exception
when Submarine_Tracking.Location_Error =>
TC_LEB_Error := True;
when others =>
Report.Failed ("Exception handled unexpectedly in " &
"Location_Error_Block");
end Location_Error_Block;
Incorrect_Data_Block:
begin
Sonar_Contact := 200;
Trident.Contact (Sonar_Contact); -- Cause Incorrect_Data exception
-- to be raised in task accept body,
-- propogated to calling procedure.
Report.Failed ("Expected exception not raised");
exception
when Submarine_Tracking.Incorrect_Data =>
Submarine_Tracking.TC_Handled_In_Caller := True;
when others =>
Report.Failed ("Exception handled unexpectedly in " &
"Incorrect_Data_Block");
end Incorrect_Data_Block;
if TC_Main_Handler_Used or
not (Submarine_Tracking.TC_Handled_In_Caller and -- Check to see that
Submarine_Tracking.TC_Handled_In_Task_Block and -- all exceptions
Submarine_Tracking.TC_Handled_In_Accept and -- were handled in
Submarine_Tracking.TC_Reraised_In_Accept and -- proper locations.
TC_LEB_Error)
then
Report.Failed ("Exceptions handled in incorrect locations");
end if;
if Integer(Submarine_Tracking.Current_Position) /= 0 then
Report.Failed ("Variable incorrectly written in task processing");
end if;
delay ImpDef.Minimum_Task_Switch;
if Trident'Callable then
Report.Failed ("Task didn't terminate with exception propagation");
end if;
Report.Result;
end CB20001;