blob: 7d417ce69d9f34b4290eb94cad51c7e0259ff65c [file] [log] [blame]
-- C431001.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 record aggregate can be given for a nonprivate,
-- nonlimited record extension and that the tag of the aggregate
-- values are initialized to the tag of the record extension.
--
-- TEST DESCRIPTION:
-- From an initial parent tagged type, several type extensions
-- are declared. Each type extension adds components onto
-- the existing record structure.
--
-- In the main procedure, aggregates are declared in two ways.
-- In the declarative part, aggregates are used to supply
-- initial values for objects of specific types. In the executable
-- part, aggregates are used directly as actual parameters to
-- a class-wide formal parameter.
--
-- The abstraction is for a catalog of recordings. A recording
-- can be a CD or a record (vinyl). Additionally, a CD may also
-- be a CD-ROM, containing both music and data. This type is declared
-- as an extension to a type extension, to test that the inclusion
-- of record components is transitive across multiple extensions.
--
-- That the aggregate has the correct tag is verify by feeding
-- it to a dispatching operation and confirming that the
-- expected subprogram is called as a result. To accomplish this,
-- an enumeration type is declared with an enumeration literal
-- representing each of the declared types in the hierarchy. A value
-- of this type is passed as a parameter to the dispatching
-- operation which passes it along to the dispatched subprogram.
-- Each dispatched subprogram verifies that it received the
-- expected enumeration literal.
--
-- Not quite fitting the above abstraction are several test cases
-- for null records. These tests verify that the new syntax for
-- null record aggregates, (null record), is supported. A type is
-- declared which extends a null tagged type and adds components.
-- Aggregates of this type should include associations for the
-- components of the type extension only. Finally, a type is
-- declared that adds a null type extension onto a non-null tagged
-- type. The aggregate associations should remain the same.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
-- 19 Dec 94 SAIC Removed RM references from objective text.
--
--!
--
package C431001_0 is
-- Values of TC_Type_ID are passed through to dispatched subprogram
-- calls so that it can be verified that the dispatching resulted in
-- the expected call.
type TC_Type_ID is (TC_Recording, TC_CD, TC_Vinyl, TC_CD_ROM);
type Genre is (Classical, Country, Jazz, Rap, Rock, World);
type Recording is tagged record
Artist : String (1..20);
Category : Genre;
Length : Duration;
Selections : Positive;
end record;
function Summary (R : in Recording;
TC_Type : in TC_Type_ID) return String;
type Recording_Method is (Audio, Digital);
type CD is new Recording with record
Recorded : Recording_Method;
Mastered : Recording_Method;
end record;
function Summary (Disc : in CD;
TC_Type : in TC_Type_ID) return String;
type Playing_Speed is (LP_33, Single_45, Old_78);
type Vinyl is new Recording with record
Speed : Playing_Speed;
end record;
function Summary (Album : in Vinyl;
TC_Type : in TC_Type_ID) return String;
type CD_ROM is new CD with record
Storage : Positive;
end record;
function Summary (Disk : in CD_ROM;
TC_Type : in TC_Type_ID) return String;
function Catalog_Entry (R : in Recording'Class;
TC_Type : in TC_Type_ID) return String;
procedure Print (S : in String); -- provides somewhere for the
-- results of Catalog_Entry to
-- "go", so they don't get
-- optimized away.
-- The types and procedures declared below are not a continuation
-- of the Recording abstraction. These types are intended to test
-- support for null tagged types and type extensions. TC_Check mirrors
-- the operation of function Summary, above. Similarly, TC_Dispatch
-- mirrors the operation of Catalog_Entry.
type TC_N_Type_ID is
(TC_Null_Tagged, TC_Null_Extension,
TC_Extension_Of_Null, TC_Null_Extension_Of_Nonnull);
type Null_Tagged is tagged null record;
procedure TC_Check (N : in Null_Tagged;
TC_Type : in TC_N_Type_ID);
type Null_Extension is new Null_Tagged with null record;
procedure TC_Check (N : in Null_Extension;
TC_Type : in TC_N_Type_ID);
type Extension_Of_Null is new Null_Tagged with record
New_Component1 : Boolean;
New_Component2 : Natural;
end record;
procedure TC_Check (N : in Extension_Of_Null;
TC_Type : in TC_N_Type_ID);
type Null_Extension_Of_Nonnull is new Extension_Of_Null
with null record;
procedure TC_Check (N : in Null_Extension_Of_Nonnull;
TC_Type : in TC_N_Type_ID);
procedure TC_Dispatch (N : in Null_Tagged'Class;
TC_Type : in TC_N_Type_ID);
end C431001_0;
with Report;
package body C431001_0 is
function Summary (R : in Recording;
TC_Type : in TC_Type_ID) return String is
begin
if TC_Type /= TC_Recording then
Report.Failed ("Did not dispatch on tag for tagged parent " &
"type Recording");
end if;
return R.Artist (1..10)
& ' ' & Genre'Image (R.Category) (1..2)
& ' ' & Duration'Image (R.Length)
& ' ' & Integer'Image (R.Selections);
end Summary;
function Summary (Disc : in CD;
TC_Type : in TC_Type_ID) return String is
begin
if TC_Type /= TC_CD then
Report.Failed ("Did not dispatch on tag for type extension " &
"CD");
end if;
return Summary (Recording (Disc), TC_Type => TC_Recording)
& ' ' & Recording_Method'Image(Disc.Recorded)(1)
& Recording_Method'Image(Disc.Mastered)(1);
end Summary;
function Summary (Album : in Vinyl;
TC_Type : in TC_Type_ID) return String is
begin
if TC_Type /= TC_Vinyl then
Report.Failed ("Did not dispatch on tag for type extension " &
"Vinyl");
end if;
case Album.Speed is
when LP_33 =>
return Summary (Recording (Album), TC_Type => TC_Recording)
& " 33";
when Single_45 =>
return Summary (Recording (Album), TC_Type => TC_Recording)
& " 45";
when Old_78 =>
return Summary (Recording (Album), TC_Type => TC_Recording)
& " 78";
end case;
end Summary;
function Summary (Disk : in CD_ROM;
TC_Type : in TC_Type_ID) return String is
begin
if TC_Type /= TC_CD_ROM then
Report.Failed ("Did not dispatch on tag for type extension " &
"CD_ROM. This is an extension of the type " &
"extension CD");
end if;
return Summary (Recording(Disk), TC_Type => TC_Recording)
& ' ' & Integer'Image (Disk.Storage) & 'K';
end Summary;
function Catalog_Entry (R : in Recording'Class;
TC_Type : in TC_Type_ID) return String is
begin
return Summary (R, TC_Type); -- dispatched call
end Catalog_Entry;
procedure Print (S : in String) is
T : String (1..S'Length) := Report.Ident_Str (S);
begin
-- Ada.Text_IO.Put_Line (S);
null;
end Print;
-- Bodies for null type checks
procedure TC_Check (N : in Null_Tagged;
TC_Type : in TC_N_Type_ID) is
begin
if TC_Type /= TC_Null_Tagged then
Report.Failed ("Did not dispatch on tag for null tagged " &
"type Null_Tagged");
end if;
end TC_Check;
procedure TC_Check (N : in Null_Extension;
TC_Type : in TC_N_Type_ID) is
begin
if TC_Type /= TC_Null_Extension then
Report.Failed ("Did not dispatch on tag for null tagged " &
"type extension Null_Extension");
end if;
end TC_Check;
procedure TC_Check (N : in Extension_Of_Null;
TC_Type : in TC_N_Type_ID) is
begin
if TC_Type /= TC_Extension_Of_Null then
Report.Failed
("Did not dispatch on tag for extension of null parent" &
"type");
end if;
end TC_Check;
procedure TC_Check (N : in Null_Extension_Of_Nonnull;
TC_Type : in TC_N_Type_ID) is
begin
if TC_Type /= TC_Null_Extension_Of_Nonnull then
Report.Failed
("Did not dispatch on tag for null extension of nonnull " &
"parent type");
end if;
end TC_Check;
procedure TC_Dispatch (N : in Null_Tagged'Class;
TC_Type : in TC_N_Type_ID) is
begin
TC_Check (N, TC_Type); -- dispatched call
end TC_Dispatch;
end C431001_0;
with C431001_0;
with Report;
procedure C431001 is
-- Tagged type
-- Named component associations
DAT : C431001_0.Recording :=
(Artist => "Aerosmith ",
Category => C431001_0.Rock,
Length => 48.5,
Selections => 10);
-- Type extensions
-- Named component associations
Disc1 : C431001_0.CD :=
(Artist => "London Symphony ",
Category => C431001_0.Classical,
Length => 55.0,
Selections => 4,
Recorded => C431001_0.Digital,
Mastered => C431001_0.Digital);
-- Named component associations with others
Disc2 : C431001_0.CD :=
(Artist => "Pink Floyd ",
Category => C431001_0.Rock,
Length => 51.8,
Selections => 5,
others => C431001_0.Audio); -- Recorded
-- Mastered
-- Positional component associations
Album1 : C431001_0.Vinyl :=
("Hammer ", -- Artist
C431001_0.Rap, -- Category
46.2, -- Length
9, -- Selections
C431001_0.LP_33); -- Speed
-- Mixed positional and named component associations
-- Named component associations out of order
Album2 : C431001_0.Vinyl :=
("Balinese Gamelan ", -- Artist
C431001_0.World, -- Category
42.6, -- Length
14, -- Selections
C431001_0.LP_33); -- Speed
-- Type extension, parent is also type extension
-- Named notation, components out of order
Data : C431001_0.CD_ROM :=
(Storage => 140,
Mastered => C431001_0.Digital,
Category => C431001_0.Rock,
Selections => 10,
Recorded => C431001_0.Digital,
Artist => "Black, Clint ",
Length => 48.5);
-- Null tagged type
Null_Rec : C431001_0.Null_Tagged := (null record);
-- Null type extension
Null_Ext : C431001_0.Null_Extension := (null record);
-- Nonnull extension of null parent
Ext_Of_Null : C431001_0.Extension_Of_Null := (True, 0);
-- Null extension of nonnull parent
Null_Ext_Of_Nonnull : C431001_0.Null_Extension_Of_Nonnull
:= (False, 1);
begin
Report.Test ("C431001", "Aggregate values for type extensions");
C431001_0.Print (C431001_0.Catalog_Entry (DAT, C431001_0.TC_Recording));
C431001_0.Print (C431001_0.Catalog_Entry (Disc1, C431001_0.TC_CD));
C431001_0.Print (C431001_0.Catalog_Entry (Disc2, C431001_0.TC_CD));
C431001_0.Print (C431001_0.Catalog_Entry (Album1, C431001_0.TC_Vinyl));
C431001_0.Print (C431001_0.Catalog_Entry (Album2, C431001_0.TC_Vinyl));
C431001_0.Print (C431001_0.Catalog_Entry (Data, C431001_0.TC_CD_ROM));
C431001_0.TC_Dispatch (Null_Rec, C431001_0.TC_Null_Tagged);
C431001_0.TC_Dispatch (Null_Ext, C431001_0.TC_Null_Extension);
C431001_0.TC_Dispatch (Ext_Of_Null, C431001_0.TC_Extension_Of_Null);
C431001_0.TC_Dispatch
(Null_Ext_Of_Nonnull, C431001_0.TC_Null_Extension_Of_Nonnull);
-- Tagged type
-- Named component associations
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_Recording,
R => C431001_0.Recording'(Artist => "Zappa, Frank ",
Category => C431001_0.Rock,
Length => 70.0,
Selections => 38)));
-- Type extensions
-- Named component associations
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_CD,
R => C431001_0.CD'(Artist => "Dog, Snoop Doggy ",
Category => C431001_0.Rap,
Length => 37.3,
Selections => 8,
Recorded => C431001_0.Audio,
Mastered => C431001_0.Digital)));
-- Named component associations with others
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_CD,
R => C431001_0.CD'(Artist => "Judd, Winona ",
Category => C431001_0.Country,
Length => 51.2,
Selections => 11,
others => C431001_0.Digital))); -- Recorded
-- Mastered
-- Positional component associations
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_Vinyl,
R => C431001_0.Vinyl'("Davis, Miles ", -- Artist
C431001_0.Jazz, -- Category
50.4, -- Length
10, -- Selections
C431001_0.LP_33))); -- Speed
-- Mixed positional and named component associations
-- Named component associations out of order
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_Vinyl,
R => C431001_0.Vinyl'("Zamfir ", -- Artist
C431001_0.World, -- Category
Speed => C431001_0.LP_33,
Selections => 14,
Length => 56.5)));
-- Type extension, parent is also type extension
-- Named notation, components out of order
C431001_0.Print (C431001_0.Catalog_Entry
(TC_Type => C431001_0.TC_CD_ROM,
R => C431001_0.CD_ROM'(Storage => 720,
Category => C431001_0.Classical,
Recorded => C431001_0.Digital,
Artist => "Baltimore Symphony ",
Length => 68.9,
Mastered => C431001_0.Digital,
Selections => 5)));
-- Null tagged type
C431001_0.TC_Dispatch
(TC_Type => C431001_0.TC_Null_Tagged,
N => C431001_0.Null_Tagged'(null record));
-- Null type extension
C431001_0.TC_Dispatch
(TC_Type => C431001_0.TC_Null_Extension,
N => C431001_0.Null_Extension'(null record));
-- Nonnull extension of null parent
C431001_0.TC_Dispatch
(TC_Type => C431001_0.TC_Extension_Of_Null,
N => C431001_0.Extension_Of_Null'(True, 3));
-- Null extension of nonnull parent
C431001_0.TC_Dispatch
(TC_Type => C431001_0.TC_Extension_Of_Null,
N => C431001_0.Extension_Of_Null'(False, 4));
Report.Result;
end C431001;