blob: 24cf8e0fdc56925767074af6529f9ce01b7cddda [file] [log] [blame]
-- C730001.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 both dispatching and non-dispatching cases.
--
-- TEST DESCRIPTION:
-- Consider:
--
-- package P is
-- type Ancestor is tagged ...
-- procedure Op (P1: Ancestor; P2: Boolean := True);
-- end P;
--
-- with P;
-- package Q is
-- type Derived is new P.Ancestor with ...
-- procedure Op (X: Ancestor; Y: Boolean := False);
-- end Q;
--
-- 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.Derived 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. For a call to Op (from outside the scope of the
-- full view) with an operand of type Priv_Ext, the formal parameter
-- names and default expression come from that of P.Op (the ancestor
-- type's version), but the body executed will be that of
-- Q.Op (the parent type's version)
--
-- One half of the test mirrors the above template, where an inherited
-- subprogram (Set_Display) is called using the formal parameter
-- name (C) and default parameter expression of the ancestor type's
-- version (type Clock), but the version of the body executed is from
-- the parent type.
--
-- The test also includes an examination of the dynamic evaluation
-- case, where correct body associations are required through dispatching
-- calls. As described for the non-dispatching case above, the formal
-- parameter name and default values of the ancestor type's (Phone)
-- version of the inherited subprogram (Answer) are used in the
-- dispatching call, but the body executed is from the parent type.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
package C730001_0 is
type Display_Kind is (None, Analog, Digital);
type Illumination_Type is (None, Light, Phosphorescence);
type Capability_Type is (Available, In_Use, Call_Waiting, Conference);
type Indicator_Type is (None, Light, Bell, Buzzer, Click, Modem);
type Clock is abstract tagged record -- ancestor type associated
Display : Display_Kind := None; -- with non-dispatching case.
Illumination : Illumination_Type := None;
end record;
type Phone is tagged record -- ancestor type associated
Status : Capability_Type := Available; -- with dispatching case.
Indicator : Indicator_Type := None;
end record;
-- The Set_Display procedure for type Clock implements a basic, no-frills
-- clock display.
procedure Set_Display (C : in out Clock;
Disp: in Display_Kind := Digital);
-- The Answer procedure for type Phone implements a phone status change
-- operation.
procedure Answer (The_Phone : in out Phone;
Ind : in Indicator_Type := Light);
-- ...Other general clock and/or phone operations (not specified in this
-- test scenario).
end C730001_0;
--==================================================================--
package body C730001_0 is
procedure Set_Display (C : in out Clock;
Disp: in Display_Kind := Digital) is
begin
C.Display := Disp;
C.Illumination := Light;
end Set_Display;
procedure Answer (The_Phone : in out Phone;
Ind : in Indicator_Type := Light) is
begin
The_Phone.Status := In_Use;
The_Phone.Indicator := Ind;
end Answer;
end C730001_0;
--==================================================================--
with C730001_0; use C730001_0;
package C730001_1 is
type Power_Supply_Type is (Spring, Battery, AC_Current);
type Speaker_Type is (None, Present, Adjustable, Stereo);
type Wall_Clock is new Clock with record
Power_Source : Power_Supply_Type := Spring;
end record;
type Office_Phone is new Phone with record
Speaker : Speaker_Type := Present;
end record;
-- Note: Both procedures below, parameter names and defaults differ from
-- parent's version.
-- The Set_Display procedure for type Wall_Clock improves upon the
-- basic Set_Display procedure of type Clock.
procedure Set_Display (WC: in out Wall_Clock;
D : in Display_Kind := Analog);
procedure Answer (OP : in out Office_Phone;
OI : in Indicator_Type := Buzzer);
-- ...Other wall clock and/or Office_Phone operations (not specified in
-- this test scenario).
end C730001_1;
--==================================================================--
package body C730001_1 is
-- Note: This body is the one that should be executed in the test block
-- below, not the version of the body corresponding to type Clock.
procedure Set_Display (WC: in out Wall_Clock;
D : in Display_Kind := Analog) is
begin
WC.Display := D;
WC.Illumination := Phosphorescence;
end Set_Display;
procedure Answer (OP : in out Office_Phone;
OI : in Indicator_Type := Buzzer) is
begin
OP.Status := Call_Waiting;
OP.Indicator := OI;
end Answer;
end C730001_1;
--==================================================================--
with C730001_0; use C730001_0;
with C730001_1; use C730001_1;
package C730001_2 is
type Alarm_Type is (Buzzer, Radio, Both);
type Video_Type is (None, TV_Monitor, Wall_Projection);
type Alarm_Clock is new Clock with private;
-- Inherits proc Set_Display (C : in out Clock;
-- Disp: in Display_Kind := Digital); -- (A)
--
-- Would also inherit other general clock operations (if present).
type Conference_Room_Phone is new Office_Phone with record
Display : Video_Type := TV_Monitor;
end record;
procedure Answer (CP : in out Conference_Room_Phone;
CI : in Indicator_Type := Modem);
function TC_Get_Display (C: Alarm_Clock) return Display_Kind;
function TC_Get_Display_Illumination (C: Alarm_Clock)
return Illumination_Type;
private
-- ...however, certain of the wall clock's operations (Set_Display, in
-- this example) improve on the implementations provided for the general
-- clock. We want to call the improved implementations, so we
-- derive from Wall_Clock in the private part.
type Alarm_Clock is new Wall_Clock with record
Alarm : Alarm_Type := Buzzer;
end record;
-- Inherits proc Set_Display (WC: in out Wall_Clock;
-- D : in Display_Kind := Analog); -- (B)
-- The implicit Set_Display at (B) overrides the implicit Set_Display at
-- (A), but only within the scope of the full view.
--
-- Outside the scope of the full view, only (A) is visible, so calls
-- from outside the scope will get the formal parameter names and default
-- from (A). Both inside and outside the scope, however, the body executed
-- will be that corresponding to Set_Display of the parent type.
end C730001_2;
--==================================================================--
package body C730001_2 is
procedure Answer (CP : in out Conference_Room_Phone;
CI : in Indicator_Type := Modem)is
begin
CP.Status := Conference;
CP.Indicator := CI;
end Answer;
function TC_Get_Display (C: Alarm_Clock) return Display_Kind is
begin
return C.Display;
end TC_Get_Display;
function TC_Get_Display_Illumination (C: Alarm_Clock)
return Illumination_Type is
begin
return C.Illumination;
end TC_Get_Display_Illumination;
end C730001_2;
--==================================================================--
with C730001_0; use C730001_0;
with C730001_1; use C730001_1;
with C730001_2; use C730001_2;
package C730001_3 is
-- Types extended from the ancestor (Phone) type in the specification.
type Secure_Phone_Type is new Phone with private;
type Auditorium_Phone_Type is new Phone with private;
-- Inherit versions of Answer from ancestor (Phone).
function TC_Get_Phone_Status (P : Phone'Class) return Capability_Type;
function TC_Get_Indicator (P : Phone'Class) return Indicator_Type;
private
-- Types extended from descendents of Phone_Type in the private part.
type Secure_Phone_Type is new Office_Phone with record
Scrambled_Communication : Boolean := True;
end record;
type Auditorium_Phone_Type is new Conference_Room_Phone with record
Volume_Control : Boolean := True;
end record;
end C730001_3;
--==================================================================--
package body C730001_3 is
function TC_Get_Phone_Status (P : Phone'Class) return Capability_Type is
begin
return P.Status;
end TC_Get_Phone_Status;
function TC_Get_Indicator (P : Phone'Class) return Indicator_Type is
begin
return P.Indicator;
end TC_Get_Indicator;
end C730001_3;
--==================================================================--
with C730001_0; use C730001_0;
with C730001_1; use C730001_1;
with C730001_2; use C730001_2;
with C730001_3; use C730001_3;
with Report;
procedure C730001 is
begin
Report.Test ("C730001","Check that the full view of a private extension " &
"may be derived indirectly from 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");
Test_Block:
declare
Alarm : Alarm_Clock;
Hot_Line : Secure_Phone_Type;
TeleConference_Phone : Auditorium_Phone_Type;
begin
-- Evaluate non-dispatching case:
-- Call Set_Display using formal parameter name from
-- C730001_0.Set_Display.
-- Give no 2nd parameter so that default expression must be used.
Set_Display (C => Alarm);
-- The value of the Display component should equal Digital, which is
-- the default value from the ancestor's version of Set_Display,
-- and not the default value from the parent's version of Set_Display.
if TC_Get_Display (Alarm) /= Digital then
Report.Failed ("Default expression for ancestor op not used " &
"in non-dispatching case");
end if;
-- However, the value of the Illumination component should equal
-- Phosphorescence, which is assigned in the parent type's version of
-- the body of Set_Display.
if TC_Get_Display_Illumination (Alarm) /= Phosphorescence then
Report.Failed ("Wrong body was executed in non-dispatching case");
end if;
-- Evaluate dispatching case:
declare
Hot_Line : Secure_Phone_Type;
TeleConference_Phone : Auditorium_Phone_Type;
procedure Answer_The_Phone (P : in out Phone'Class) is
begin
-- Give no 2nd parameter so that default expression must be used.
Answer (P);
end Answer_The_Phone;
begin
Answer_The_Phone (Hot_Line);
Answer_The_Phone (TeleConference_Phone);
-- The value of the Indicator field shold equal "Light", the default
-- value from the ancestor's version of Answer, and not the default
-- from either of the parent versions of Answer.
if TC_Get_Indicator(Hot_Line) /= Light or
TC_Get_Indicator(TeleConference_Phone) /= Light
then
Report.Failed("Default expression from ancestor operation " &
"not used in dispatching case");
end if;
-- However, the value of the Status component should equal
-- Call_Waiting or Conference respectively, based on the assignment
-- in the parent type's version of the body of Answer.
if TC_Get_Phone_Status(Hot_Line) /= Call_Waiting then
Report.Failed("Wrong body executed in dispatching case - 1");
end if;
if TC_Get_Phone_Status(TeleConference_Phone) /= Conference then
Report.Failed("Wrong body executed in dispatching case - 2");
end if;
end;
exception
when others => Report.Failed ("Exception raised in Test_Block");
end Test_Block;
Report.Result;
end C730001;