| -- C730004.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 for a type declared in a package, descendants of the package |
| -- use the full view of type. Specifically check that full view of the |
| -- limited type is visible only in private descendants (children) and in |
| -- the private parts and bodies of public descendants (children). |
| -- Check that a limited type may be used as an out parameter outside |
| -- the package that defines the type. |
| -- |
| -- TEST DESCRIPTION: |
| -- This test defines a parent package containing limited private type |
| -- definitions. Children packages are defined (one public, one private) |
| -- that use the nonlimited full view of the types defined in the private |
| -- part of the parent specification. |
| -- The main declares a procedure with an out parameter that was defined |
| -- as limited in the specification of the parent package. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 15 Sep 95 SAIC Initial prerelease version. |
| -- 23 Apr 96 SAIC Added prefix for parameter in Call_Modify_File. |
| -- 02 Nov 96 SAIC ACVC 2.1: Modified prologue and Test.Report. |
| -- |
| --! |
| |
| package C730004_0 is |
| |
| -- Full views of File_Descriptor, File_Mode, File_Name, and File_Type are |
| -- are nonlimited. |
| |
| type File_Descriptor is limited private; |
| |
| type File_Mode is limited private; |
| |
| Active_Mode : constant File_Mode; |
| |
| type File_Name is limited private; |
| |
| type File_Type is limited private; |
| |
| function Next_Available_File return File_Descriptor; |
| |
| private |
| |
| type File_Descriptor is new Integer; |
| |
| Null_File : constant File_Descriptor := 0; |
| First_File : constant File_Descriptor := 1; |
| |
| type File_Mode is |
| (Read_Only, Write_Only, Read_Write, Archived, Corrupt, Lost); |
| |
| Default_Mode : constant File_Mode := Read_Only; |
| Active_Mode : constant File_Mode := Read_Write; |
| |
| type File_Name is array (1 .. 6) of Character; |
| |
| Null_String : File_Name := " "; |
| String1 : File_Name := "ACVC "; |
| String2 : File_Name := " 1995"; |
| |
| type File_Type is |
| record |
| Descriptor : File_Descriptor := Null_File; |
| Mode : File_Mode := Default_Mode; |
| Name : File_Name := Null_String; |
| end record; |
| |
| end C730004_0; |
| |
| --=================================================================-- |
| |
| package body C730004_0 is |
| |
| 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; |
| |
| end C730004_0; |
| |
| --=================================================================-- |
| |
| private |
| package C730004_0.C730004_1 is -- private child |
| |
| -- Since full view of the nontagged File_Name is nonlimited in the parent |
| -- package, it is not limited in the private child, so concatenation is |
| -- available. |
| |
| System_File_Name : constant File_Name |
| := String1(1..4) & String2(5..6); |
| |
| -- Since full view of the nontagged File_Type is nonlimited in the parent |
| -- package, it is not limited in the private child, so a default expression |
| -- is available. |
| |
| function New_File_Validated (File : File_Type |
| := (Descriptor => First_File, |
| Mode => Active_Mode, |
| Name => System_File_Name)) |
| return Boolean; |
| |
| -- Since full view of the nontagged File_Type is nonlimited in the parent |
| -- package, it is not limited in the private child, so initialization |
| -- expression in an object declaration is available. |
| |
| System_File : File_Type |
| := (Null_File, Read_Only, System_File_Name); |
| |
| |
| end C730004_0.C730004_1; |
| |
| --=================================================================-- |
| |
| package body C730004_0.C730004_1 is |
| |
| function New_File_Validated (File : File_Type |
| := (Descriptor => First_File, |
| Mode => Active_Mode, |
| Name => System_File_Name)) |
| return Boolean is |
| Result : Boolean := False; |
| begin |
| if (File.Descriptor > System_File.Descriptor) and |
| (File.Mode in Read_Only .. Read_Write) and (File.Name = "ACVC95") |
| then |
| Result := True; |
| end if; |
| |
| return (Result); |
| |
| end New_File_Validated; |
| |
| end C730004_0.C730004_1; |
| |
| --=================================================================-- |
| |
| package C730004_0.C730004_2 is -- public child |
| |
| -- File_Type is limited here. |
| |
| procedure Create_File (File : out File_Type); |
| |
| procedure Modify_File (File : out File_Type); |
| |
| type File_Dir is limited private; |
| |
| -- The following three validation functions provide the capability to |
| -- check the limited private types defined in the parent and the |
| -- private child package from within the client program. |
| |
| function Validate_Create (File : in File_Type) return Boolean; |
| |
| function Validate_Modification (File : in File_Type) |
| return Boolean; |
| |
| function Validate_Dir (Dir : in File_Dir) return Boolean; |
| |
| private |
| |
| -- Since full view of the nontagged File_Type is nonlimited in the parent |
| -- package, it is not limited in the private part of the public child, so |
| -- aggregates are available. |
| |
| Child_File : File_Type |
| := File_Type'(Descriptor => Null_File, |
| Mode => Write_Only, |
| Name => String2); |
| |
| -- Since full view of the nontagged component File_Type is nonlimited in |
| -- the parent package, it is not limited in the private part of the public |
| -- child, so default expressions are available. |
| |
| type File_Dir is |
| record |
| Comp : File_Type := Child_File; |
| end record; |
| |
| end C730004_0.C730004_2; |
| |
| --=================================================================-- |
| |
| with C730004_0.C730004_1; |
| |
| package body C730004_0.C730004_2 is |
| |
| procedure Create_File (File : out File_Type) is |
| New_File : File_Type; |
| |
| begin |
| New_File.Descriptor := Next_Available_File; |
| New_File.Mode := Default_Mode; |
| New_File.Name := C730004_0.C730004_1.System_File_Name; |
| |
| if C730004_0.C730004_1.New_File_Validated (New_File) then |
| File := New_File; |
| else |
| File := (Null_File, Lost, "MISSED"); |
| end if; |
| |
| end Create_File; |
| |
| -------------------------------------------------------------- |
| procedure Modify_File (File : out File_Type) is |
| begin |
| File.Descriptor := Next_Available_File; |
| File.Mode := Active_Mode; |
| File.Name := String1; |
| end Modify_File; |
| |
| -------------------------------------------------------------- |
| function Validate_Create (File : in File_Type) return Boolean is |
| begin |
| if ((File.Descriptor /= Child_File.Descriptor) and |
| (File.Mode = Read_Only) and (File.Name = "ACVC95")) |
| then |
| return True; |
| else |
| return False; |
| end if; |
| end Validate_Create; |
| |
| ------------------------------------------------------------------------ |
| function Validate_Modification (File : in File_Type) |
| return Boolean is |
| begin |
| if ((File.Descriptor /= C730004_0.C730004_1.System_File.Descriptor) and |
| (File.Mode = Read_Write) and (File.Name = "ACVC ")) |
| then |
| return True; |
| else |
| return False; |
| end if; |
| end Validate_Modification; |
| |
| ------------------------------------------------------------------------ |
| function Validate_Dir (Dir : in File_Dir) return Boolean is |
| begin |
| if ((Dir.Comp.Descriptor = C730004_0.C730004_1.System_File.Descriptor) |
| and (Dir.Comp.Mode = Write_Only) and (Dir.Comp.Name = String2)) |
| then |
| return True; |
| else |
| return False; |
| end if; |
| end Validate_Dir; |
| |
| end C730004_0.C730004_2; |
| |
| --=================================================================-- |
| |
| with C730004_0.C730004_2; |
| with Report; |
| |
| procedure C730004 is |
| |
| package File renames C730004_0; |
| package File_Ops renames C730004_0.C730004_2; |
| |
| Validation_File : File.File_Type; |
| |
| Validation_Dir : File_Ops.File_Dir; |
| |
| ------------------------------------------------------------------------ |
| -- Limited File_Type is allowed as an out parameter outside package File. |
| |
| procedure Call_Modify_File (Modified_File : out File.File_Type) is |
| begin |
| File_Ops.Modify_File (Modified_File); |
| end Call_Modify_File; |
| |
| begin |
| |
| Report.Test ("C730004", "Check that for a type declared in a package, " & |
| "descendants of the package use the full view " & |
| "of the type. Specifically check that full " & |
| "view of the limited type is visible only in " & |
| "private children and in the private parts and " & |
| "bodies of public children"); |
| |
| File_Ops.Create_File (Validation_File); |
| |
| if not File_Ops.Validate_Create (Validation_File) then |
| Report.Failed ("Incorrect creation of file"); |
| end if; |
| |
| Call_Modify_File (Validation_File); |
| |
| if not File_Ops.Validate_Modification (Validation_File) then |
| Report.Failed ("Incorrect modification of file"); |
| end if; |
| |
| if not File_Ops.Validate_Dir (Validation_Dir) then |
| Report.Failed ("Incorrect creation of directory"); |
| end if; |
| |
| Report.Result; |
| |
| end C730004; |