blob: 189e1944c772b9bf238245d8142ece1edd0d0083 [file] [log] [blame]
-- CA11002.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 a public child can utilize its parent unit's visible
-- definitions.
--
-- TEST DESCRIPTION:
-- Declare a parent package that contains the following: type, object,
-- constant, exception, and subprograms. Declare a public child unit
-- that utilizes the components found in the visible part of its parent.
--
-- Demonstrate utilization of the following parent components in the
-- child package:
--
-- Parent
-- Type X
-- Constant X
-- Object X
-- Subprogram X
-- Exception X
--
-- This abstraction simulates a portion of a simple operating system.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package CA11002_0 is -- Package OS.
type File_Descriptor is new Integer;
type File_Mode is (Read_Only, Write_Only, Read_Write);
Null_File : constant File_Descriptor := 0;
Default_Mode : constant File_Mode := Read_Only;
Active_Mode : constant File_Mode := Read_Write;
type File_Type is
record
Descriptor : File_Descriptor := Null_File;
Mode : File_Mode := Default_Mode;
end record;
System_File : File_Type;
File_Mode_Error : exception;
function Next_Available_File return File_Descriptor;
function Mode_Of_File (File : File_Type) return File_Mode;
end CA11002_0; -- Package OS.
--=================================================================--
package body CA11002_0 is -- Package body OS.
File_Count : Integer := 0;
function Next_Available_File return File_Descriptor is
begin
File_Count := File_Count + 1;
return (File_Descriptor(File_Count)); -- Type conversion.
end Next_Available_File;
--------------------------------------------------------------
function Mode_Of_File (File : File_Type) return File_Mode is
Mode : File_Mode := File.Mode;
begin
return (Mode);
end Mode_Of_File;
end CA11002_0; -- Package body OS.
--=================================================================--
package CA11002_0.CA11002_1 is -- Child package OS.Operations.
-- Dot qualification of types, objects, etc. from parent is not required
-- in a child unit.
procedure Create_File (Mode : in File_Mode:= Active_Mode;
File : out File_Type);
end CA11002_0.CA11002_1; -- Child package OS.Operations.
--=================================================================--
with Report;
package body CA11002_0.CA11002_1 is -- Child package body OS.Operations.
function New_File_Validated (File : File_Type) -- Ensure that a newly
return Boolean is -- created file has
Result : Boolean := False; -- appropriate values.
begin
if (File.Descriptor > System_File.Descriptor) and -- Parent object.
(File.Mode in File_Mode ) -- Parent type.
then
Result := True;
end if;
return (Result);
end New_File_Validated;
--------------------------------------------------------------
procedure Create_File
(Mode : in File_Mode := Active_Mode; -- Parent constant.
File : out File_Type) is -- Parent type.
New_File : File_Type;
begin
New_File.Descriptor := Next_Available_File; -- Parent subprogram.
New_File.Mode := Mode;
if New_File_Validated (File => New_File) then
File := New_File;
end if;
end Create_File;
end CA11002_0.CA11002_1; -- Child Package body OS.Operations.
--=================================================================--
-- Child library subprogram Convert_File_Mode specification.
procedure CA11002_0.CA11002_2 (File : in out File_Type; -- Parent type.
New_Mode : in File_Mode); -- Parent type.
--=================================================================--
with Report;
-- Child library subprogram Convert_File_Mode body.
procedure CA11002_0.CA11002_2 (File : in out File_Type;
New_Mode : in File_Mode) is
begin
if File.Mode = New_Mode then
raise File_Mode_Error; -- Parent exception.
Report.Failed ("Exception not raised in child unit");
else
File.Mode := New_Mode;
end if;
end CA11002_0.CA11002_2;
--=================================================================--
with Report;
with CA11002_0.CA11002_1; -- Child package OS.Operations.
with CA11002_0.CA11002_2; -- Child subprogram OS.Convert_File_Mode,
-- Implicitly with parent, OS.
use CA11002_0; -- All user-defined operators directly
-- visible.
procedure CA11002 is
begin
Report.Test ("CA11002", "Check that a public child can utilize its " &
"parent unit's visible definitions");
File_Creation: -- This processing block will demonstrate
-- use of child package subroutine that
-- takes advantage of components declared
-- in the parent package.
declare
User_File : File_Type;
begin
CA11002_0.CA11002_1.Create_File (File => User_File); -- Default mode
-- parameter used in
-- this call.
if (User_File.Descriptor = System_File.Descriptor) or
(User_File.Mode = Default_Mode)
then
Report.Failed ("Incorrect file creation");
end if;
end File_Creation;
--------------------------------------------------------------
File_Mode_Conversion: -- This processing block will demonstrate
-- the occurrence of a (forced) exception
-- being raised in a child subprogram, and
-- propagated to the caller. The exception
-- is handled, and the child subprogram
-- is called again, this time to perform
-- without error.
declare
procedure Convert_File_Mode (File : in out File_Type;
New_Mode : in File_Mode) renames CA11002_0.CA11002_2;
New_File : File_Type;
begin -- Raise an exception with this
-- illegal conversion operation
-- (attempt to change to current mode).
Convert_File_Mode (File => New_File,
New_Mode => Default_Mode);
Report.Failed ("Exception should have been raised in child unit");
exception
when File_Mode_Error => -- Perform the conversion again, this
-- time with a different file mode.
Convert_File_Mode (File => New_File,
New_Mode => CA11002_0.Active_Mode);
if New_File.Mode /= Read_Write then
Report.Failed ("Incorrect result from mode conversion operation");
end if;
when others =>
Report.Failed ("Unexpected exception raised in File_Mode_Conversion");
end File_Mode_Conversion;
Report.Result;
end CA11002;