blob: 9213a7d92d316886490bae8f55f78b294a33e450 [file] [log] [blame]
-- C730002.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 the full view of a private extension may be derived
-- indirectly from the ancestor type (i.e., the parent type of the full
-- type may be any descendant of the ancestor type). Check that, for
-- a primitive subprogram of the private extension that is inherited from
-- the ancestor type and not overridden, the formal parameter names and
-- default expressions come from the corresponding primitive subprogram
-- of the ancestor type, while the body comes from that of the parent
-- type.
-- Check for a case where the parent type is derived from the ancestor
-- type through a series of types produced by generic instantiations.
-- Examine both the static and dynamic binding cases.
--
-- TEST DESCRIPTION:
-- Consider:
--
-- package P is
-- type Ancestor is tagged ...
-- procedure Op (P1: Ancestor; P2: Boolean := True);
-- end P;
--
-- with P;
-- generic
-- type T is new P.Ancestor with private;
-- package Gen1 is
-- type Enhanced is new T with private;
-- procedure Op (A: Enhanced; B: Boolean := True);
-- -- other specific procedures...
-- private
-- type Enhanced is new T with ...
-- end Gen1;
--
-- with P, Gen1;
-- package N is new Gen1 (P.Ancestor);
--
-- with N;
-- generic
-- type T is new N.Enhanced with private;
-- package Gen2 is
-- type Enhanced_Again is new T with private;
-- procedure Op (X: Enhanced_Again; Y: Boolean := False);
-- -- other specific procedures...
-- private
-- type Enhanced_Again is new T with ...
-- end Gen2;
--
-- with N, Gen2;
-- package Q is new Gen2 (N.Enhanced);
--
-- with P, Q;
-- package R is
-- type Priv_Ext is new P.Ancestor with private; -- (A)
-- -- Inherits procedure Op (P1: Priv_Ext; P2: Boolean := True);
-- -- But body executed is that of Q.Op.
-- private
-- type Priv_Ext is new Q.Enhanced_Again with record ... -- (B)
-- end R;
--
-- The ancestor type in (A) differs from the parent type in (B); the
-- parent of the full type is descended from the ancestor type of the
-- private extension, in this case through a series of types produced
-- by generic instantiations. Gen1 redefines the implementation of Op
-- for any type that has one. N is an instance of Gen1 for the ancestor
-- type. Gen2 again redefines the implementation of Op for any type that
-- has one. Q is an instance of Gen2 for the extension of the P.Ancestor
-- declared in N. Both N and Q could define other operations which we
-- don't want to be available in R. For a call to Op (from outside the
-- scope of the full view) with an operand of type R.Priv_Ext, the body
-- executed will be that of Q.Op (the parent type's version), but the
-- formal parameter names and default expression come from that of P.Op
-- (the ancestor type's version).
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
-- 27 Feb 97 CTA.PWB Added elaboration pragmas.
--!
package C730002_0 is
type Hours_Type is range 0..1000;
type Personnel_Type is range 0..10;
type Specialist_ID is (Manny, Moe, Jack, Curly, Joe, Larry);
type Engine_Type is tagged record
Ave_Repair_Time : Hours_Type := 0; -- Default init. for
Personnel_Required : Personnel_Type := 0; -- component fields.
Specialist : Specialist_ID := Manny;
end record;
procedure Routine_Maintenance (Engine : in out Engine_Type ;
Specialist : in Specialist_ID := Moe);
-- The Routine_Maintenance procedure implements the processing required
-- for an engine.
end C730002_0;
--==================================================================--
package body C730002_0 is
procedure Routine_Maintenance (Engine : in out Engine_Type ;
Specialist : in Specialist_ID := Moe) is
begin
Engine.Ave_Repair_Time := 3;
Engine.Personnel_Required := 1;
Engine.Specialist := Specialist;
end Routine_Maintenance;
end C730002_0;
--==================================================================--
with C730002_0; use C730002_0;
generic
type T is new C730002_0.Engine_Type with private;
package C730002_1 is
-- This generic package contains types/procedures specific to engines
-- of the diesel variety.
type Repair_Facility_Type is (On_Site, Repair_Shop, Factory);
type Diesel_Series is new T with private;
procedure Routine_Maintenance (Eng : in out Diesel_Series;
Spec_Req : in Specialist_ID := Jack);
-- Other diesel specific operations... (not required in this test).
private
type Diesel_Series is new T with record
Repair_Facility_Required : Repair_Facility_Type := On_Site;
end record;
end C730002_1;
--==================================================================--
package body C730002_1 is
procedure Routine_Maintenance (Eng : in out Diesel_Series;
Spec_Req : in Specialist_ID := Jack) is
begin
Eng.Ave_Repair_Time := 6;
Eng.Personnel_Required := 2;
Eng.Specialist := Spec_Req;
Eng.Repair_Facility_Required := On_Site;
end Routine_Maintenance;
end C730002_1;
--==================================================================--
with C730002_0;
with C730002_1;
pragma Elaborate (C730002_1);
package C730002_2 is new C730002_1 (C730002_0.Engine_Type);
--==================================================================--
with C730002_0; use C730002_0;
with C730002_2; use C730002_2;
generic
type T is new C730002_2.Diesel_Series with private;
package C730002_3 is
type Time_Of_Operation_Type is range 0..100_000;
type Electric_Series is new T with private;
procedure Routine_Maintenance (E : in out Electric_Series;
SR : in Specialist_ID := Curly);
-- Other electric specific operations... (not required in this test).
private
type Electric_Series is new T with record
Mean_Time_Between_Repair : Time_Of_Operation_Type := 0;
end record;
end C730002_3;
--==================================================================--
package body C730002_3 is
procedure Routine_Maintenance (E : in out Electric_Series;
SR : in Specialist_ID := Curly) is
begin
E.Ave_Repair_Time := 9;
E.Personnel_Required := 3;
E.Specialist := SR;
E.Mean_Time_Between_Repair := 1000;
end Routine_Maintenance;
end C730002_3;
--==================================================================--
with C730002_2;
with C730002_3;
pragma Elaborate (C730002_3);
package C730002_4 is new C730002_3 (C730002_2.Diesel_Series);
--==================================================================--
with C730002_0; use C730002_0;
with C730002_4; use C730002_4;
package C730002_5 is
type Inspection_Type is (AAA, MIL_STD, NRC);
type Nuclear_Series is new Engine_Type with private; -- (A)
-- Inherits procedure Routine_Maintenance from ancestor; does not override.
-- (Engine : in out Nuclear_Series;
-- Specialist : in Specialist_ID := Moe);
-- But body executed will be that of C730002_4.Routine_Maintenance,
-- the parent type.
function TC_Specialist (E : Nuclear_Series) return Specialist_ID;
function TC_Personnel_Required (E : Nuclear_Series) return Personnel_Type;
function TC_Time_Required (E : Nuclear_Series) return Hours_Type;
-- Dispatching subprogram.
procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class);
private
type Nuclear_Series is new Electric_Series with record -- (B)
Inspector_Rep : Inspection_Type := NRC;
end record;
-- The ancestor type is used in the type extension (A), while the parent
-- of the full type (B) is a descendent of the ancestor type, through a
-- series of types produced by generic instantiation.
end C730002_5;
--==================================================================--
package body C730002_5 is
function TC_Specialist (E : Nuclear_Series) return Specialist_ID is
begin
return E.Specialist;
end TC_Specialist;
function TC_Personnel_Required (E : Nuclear_Series)
return Personnel_Type is
begin
return E.Personnel_Required;
end TC_Personnel_Required;
function TC_Time_Required (E : Nuclear_Series) return Hours_Type is
begin
return E.Ave_Repair_Time;
end TC_Time_Required;
-- Dispatching subprogram.
procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class) is
begin
Routine_Maintenance (The_Engine);
end Maintain_The_Engine;
end C730002_5;
--==================================================================--
with Report;
with C730002_0; use C730002_0;
with C730002_2; use C730002_2;
with C730002_4; use C730002_4;
with C730002_5; use C730002_5;
procedure C730002 is
begin
Report.Test ("C730002", "Check that the full view of a private " &
"extension may be derived indirectly from " &
"the ancestor type. Check for a case where " &
"the parent type is derived from the ancestor " &
"type through a series of types produced by " &
"generic instantiations");
Test_Block:
declare
Nuclear_Drive : Nuclear_Series;
Warp_Drive : Nuclear_Series;
begin
-- Non-Dispatching Case:
-- Call Routine_Maintenance using formal parameter name from
-- C730002_0.Routine_Maintenance (ancestor version).
-- Give no second parameter so that the default expression must be
-- used.
Routine_Maintenance (Engine => Nuclear_Drive);
-- The value of the Specialist component should equal "Moe",
-- which is the default value from the ancestor's version of
-- Routine_Maintenance, and not the default value from the parent's
-- version of Routine_Maintenance.
if TC_Specialist (Nuclear_Drive) /= Moe then
Report.Failed
("Default expression for ancestor op not used " &
" - non-dispatching case");
end if;
-- However the value of the Ave_Repair_Time and Personnel_Required
-- components should be those assigned in the parent type's version
-- of the body of Routine_Maintenance.
-- Note: Only components associated with the ancestor type are
-- evaluated for the purposes of this test.
if TC_Personnel_Required (Nuclear_Drive) /= 3 or
TC_Time_Required (Nuclear_Drive) /= 9
then
Report.Failed("Wrong body was executed - non-dispatching case");
end if;
-- Dispatching Case:
-- Use a dispatching subprogram to ensure that the correct body is
-- used at runtime.
Maintain_The_Engine (Warp_Drive);
-- The resulting assignments to the fields of the Warp_Drive variable
-- should be the same as those of the Nuclear_Drive above, indicating
-- that the body of the parent version of the inherited subprogram
-- was used.
if TC_Specialist (Warp_Drive) /= Moe then
Report.Failed
("Default expression for ancestor op not used - dispatching case");
end if;
if TC_Personnel_Required (Nuclear_Drive) /= 3 or
TC_Time_Required (Nuclear_Drive) /= 9
then
Report.Failed("Wrong body was executed - dispatching case");
end if;
exception
when others => Report.Failed("Exception raised in Test_Block");
end Test_Block;
Report.Result;
end C730002;