blob: dab75b388f58b96caad0f38f7981cad7a331e230 [file] [log] [blame]
-- C432001.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 extension aggregates may be used to specify values
-- for types that are record extensions. Check that the
-- type of the ancestor expression may be any nonlimited type that
-- is a record extension, including private types and private
-- extensions. Check that the type for the aggregate is
-- derived from the type of the ancestor expression.
--
-- TEST DESCRIPTION:
--
-- Two progenitor nonlimited record types are declared, one
-- nonprivate and one private. Using these as parent types,
-- all possible combinations of record extensions are declared
-- (Nonprivate record extension of nonprivate type, private
-- extension of nonprivate type, nonprivate record extension of
-- private type, and private extension of private type). Finally,
-- each of these types is extended using nonprivate record
-- extensions.
--
-- Extension of private types is done in packages other than
-- the ones containing the parent declaration. This is done
-- to eliminate errors with extension of the partial view of
-- a type, which is not an objective of this test.
--
-- All components of private types and private extensions are given
-- default values. This eliminates the need for separate subprograms
-- whose sole purpose is to place a value into a private record type.
--
-- Types that have been extended are checked using an object of their
-- parent type as the ancestor expression. For those types that
-- have been extended twice, using only nonprivate record extensions,
-- a check is made using an object of their grandparent type as
-- the ancestor expression.
--
-- For each type, a subprogram is defined which checks the contents
-- of the parameter, which is a value of the record extension.
-- Components of nonprivate record extensions are checked against
-- passed-in parameters of the component type. Components of private
-- extensions are checked to ensure that they maintain their initial
-- values.
--
-- To check that the aggregate's type is derived from its ancestor,
-- each Check subprogram in turn calls the Check subprogram for
-- its parent type. Explicit conversion is used to convert the
-- record extension to the parent type.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
with Report;
package C432001_0 is
type Eras is (Precambrian, Paleozoic, Mesozoic, Cenozoic);
type N is tagged record
How_Long_Ago : Natural := Report.Ident_Int(1);
Era : Eras := Cenozoic;
end record;
function Check (Rec : in N;
N : in Natural;
E : in Eras) return Boolean;
type P is tagged private;
function Check (Rec : in P) return Boolean;
private
type P is tagged record
How_Long_Ago : Natural := Report.Ident_Int(150);
Era : Eras := Mesozoic;
end record;
end C432001_0;
package body C432001_0 is
function Check (Rec : in P) return Boolean is
begin
return Rec.How_Long_Ago = 150 and Rec.Era = Mesozoic;
end Check;
function Check (Rec : in N;
N : in Natural;
E : in Eras) return Boolean is
begin
return Rec.How_Long_Ago = N and Rec.Era = E;
end Check;
end C432001_0;
with C432001_0;
package C432001_1 is
type Periods is
(Aphebian, Helikian, Hadrynian,
Cambrian, Ordovician, Silurian, Devonian, Carboniferous, Permian,
Triassic, Jurassic, Cretaceous,
Tertiary, Quaternary);
type N_N is new C432001_0.N with record
Period : Periods := C432001_1.Quaternary;
end record;
function Check (Rec : in N_N;
N : in Natural;
E : in C432001_0.Eras;
P : in Periods) return Boolean;
type N_P is new C432001_0.N with private;
function Check (Rec : in N_P) return Boolean;
type P_N is new C432001_0.P with record
Period : Periods := C432001_1.Jurassic;
end record;
function Check (Rec : in P_N;
P : in Periods) return Boolean;
type P_P is new C432001_0.P with private;
function Check (Rec : in P_P) return Boolean;
type P_P_Null is new C432001_0.P with null record;
private
type N_P is new C432001_0.N with record
Period : Periods := C432001_1.Quaternary;
end record;
type P_P is new C432001_0.P with record
Period : Periods := C432001_1.Jurassic;
end record;
end C432001_1;
with Report;
package body C432001_1 is
function Check (Rec : in N_N;
N : in Natural;
E : in C432001_0.Eras;
P : in Periods) return Boolean is
begin
if not C432001_0.Check (C432001_0.N (Rec), N, E) then
Report.Failed ("Conversion to parent type of " &
"nonprivate portion of " &
"nonprivate extension failed");
end if;
return Rec.Period = P;
end Check;
function Check (Rec : in N_P) return Boolean is
begin
if not C432001_0.Check (C432001_0.N (Rec), 1, C432001_0.Cenozoic) then
Report.Failed ("Conversion to parent type of " &
"nonprivate portion of " &
"private extension failed");
end if;
return Rec.Period = C432001_1.Quaternary;
end Check;
function Check (Rec : in P_N;
P : in Periods) return Boolean is
begin
if not C432001_0.Check (C432001_0.P (Rec)) then
Report.Failed ("Conversion to parent type of " &
"private portion of " &
"nonprivate extension failed");
end if;
return Rec.Period = P;
end Check;
function Check (Rec : in P_P) return Boolean is
begin
if not C432001_0.Check (C432001_0.P (Rec)) then
Report.Failed ("Conversion to parent type of " &
"private portion of " &
"private extension failed");
end if;
return Rec.Period = C432001_1.Jurassic;
end Check;
end C432001_1;
with C432001_0;
with C432001_1;
package C432001_2 is
-- All types herein are nonprivate extensions, since aggregates
-- cannot be given for private extensions
type N_N_N is new C432001_1.N_N with record
Sample_On_Loan : Boolean;
end record;
function Check (Rec : in N_N_N;
N : in Natural;
E : in C432001_0.Eras;
P : in C432001_1.Periods;
B : in Boolean) return Boolean;
type N_P_N is new C432001_1.N_P with record
Sample_On_Loan : Boolean;
end record;
function Check (Rec : in N_P_N;
B : Boolean) return Boolean;
type P_N_N is new C432001_1.P_N with record
Sample_On_Loan : Boolean;
end record;
function Check (Rec : in P_N_N;
P : in C432001_1.Periods;
B : Boolean) return Boolean;
type P_P_N is new C432001_1.P_P with record
Sample_On_Loan : Boolean;
end record;
function Check (Rec : in P_P_N;
B : Boolean) return Boolean;
end C432001_2;
with Report;
package body C432001_2 is
-- direct access to operator
use type C432001_1.Periods;
function Check (Rec : in N_N_N;
N : in Natural;
E : in C432001_0.Eras;
P : in C432001_1.Periods;
B : in Boolean) return Boolean is
begin
if not C432001_1.Check (C432001_1.N_N (Rec), N, E, P) then
Report.Failed ("Conversion to parent " &
"nonprivate type extension " &
"failed");
end if;
return Rec.Sample_On_Loan = B;
end Check;
function Check (Rec : in N_P_N;
B : Boolean) return Boolean is
begin
if not C432001_1.Check (C432001_1.N_P (Rec)) then
Report.Failed ("Conversion to parent " &
"private type extension " &
"failed");
end if;
return Rec.Sample_On_Loan = B;
end Check;
function Check (Rec : in P_N_N;
P : in C432001_1.Periods;
B : Boolean) return Boolean is
begin
if not C432001_1.Check (C432001_1.P_N (Rec), P) then
Report.Failed ("Conversion to parent " &
"nonprivate type extension " &
"failed");
end if;
return Rec.Sample_On_Loan = B;
end Check;
function Check (Rec : in P_P_N;
B : Boolean) return Boolean is
begin
if not C432001_1.Check (C432001_1.P_P (Rec)) then
Report.Failed ("Conversion to parent " &
"private type extension " &
"failed");
end if;
return Rec.Sample_On_Loan = B;
end Check;
end C432001_2;
with C432001_0;
with C432001_1;
with C432001_2;
with Report;
procedure C432001 is
N_Object : C432001_0.N := (How_Long_Ago => Report.Ident_Int(375),
Era => C432001_0.Paleozoic);
P_Object : C432001_0.P; -- default value is (150,
-- C432001_0.Mesozoic)
N_N_Object : C432001_1.N_N :=
(N_Object with Period => C432001_1.Devonian);
P_N_Object : C432001_1.P_N :=
(P_Object with Period => C432001_1.Jurassic);
N_P_Object : C432001_1.N_P; -- default is (1,
-- C432001_0.Cenozoic,
-- C432001_1.Quaternary)
P_P_Object : C432001_1.P_P; -- default is (150,
-- C432001_0.Mesozoic,
-- C432001_1.Jurassic)
P_P_Null_Ob:C432001_1.P_P_Null := (P_Object with null record);
N_N_N_Object : C432001_2.N_N_N :=
(N_N_Object with Sample_On_Loan => Report.Ident_Bool(True));
N_P_N_Object : C432001_2.N_P_N :=
(N_P_Object with Sample_On_Loan => Report.Ident_Bool(False));
P_N_N_Object : C432001_2.P_N_N :=
(P_N_Object with Sample_On_Loan => Report.Ident_Bool(True));
P_P_N_Object : C432001_2.P_P_N :=
(P_P_Object with Sample_On_Loan => Report.Ident_Bool(False));
P_N_Object_2 : C432001_1.P_N := (C432001_0.P(P_N_N_Object)
with C432001_1.Carboniferous);
N_N_Object_2 : C432001_1.N_N := (C432001_0.N'(42,C432001_0.Precambrian)
with C432001_1.Carboniferous);
begin
Report.Test ("C432001", "Extension aggregates");
-- check ultimate ancestor types
if not C432001_0.Check (N_Object,
375,
C432001_0.Paleozoic) then
Report.Failed ("Object of " &
"nonprivate type " &
"failed content check");
end if;
if not C432001_0.Check (P_Object) then
Report.Failed ("Object of " &
"private type " &
"failed content check");
end if;
-- check direct type extensions
if not C432001_1.Check (N_N_Object,
375,
C432001_0.Paleozoic,
C432001_1.Devonian) then
Report.Failed ("Object of " &
"nonprivate extension of nonprivate type " &
"failed content check");
end if;
if not C432001_1.Check (N_P_Object) then
Report.Failed ("Object of " &
"private extension of nonprivate type " &
"failed content check");
end if;
if not C432001_1.Check (P_N_Object,
C432001_1.Jurassic) then
Report.Failed ("Object of " &
"nonprivate extension of private type " &
"failed content check");
end if;
if not C432001_1.Check (P_P_Object) then
Report.Failed ("Object of " &
"private extension of private type " &
"failed content check");
end if;
if not C432001_1.Check (P_P_Null_Ob) then
Report.Failed ("Object of " &
"private type " &
"failed content check");
end if;
-- check direct extensions of extensions
if not C432001_2.Check (N_N_N_Object,
375,
C432001_0.Paleozoic,
C432001_1.Devonian,
True) then
Report.Failed ("Object of " &
"nonprivate extension of nonprivate extension " &
"(of nonprivate parent) " &
"failed content check");
end if;
if not C432001_2.Check (N_P_N_Object, False) then
Report.Failed ("Object of " &
"nonprivate extension of private extension " &
"(of nonprivate parent) " &
"failed content check");
end if;
if not C432001_2.Check (P_N_N_Object,
C432001_1.Jurassic,
True) then
Report.Failed ("Object of " &
"nonprivate extension of nonprivate extension " &
"(of private parent) " &
"failed content check");
end if;
if not C432001_2.Check (P_P_N_Object, False) then
Report.Failed ("Object of " &
"nonprivate extension of private extension " &
"(of private parent) " &
"failed content check");
end if;
-- check that the extension aggregate may specify an expression of
-- a "grandparent" ancestor type
-- types tested are derived through nonprivate extensions only
-- (extension aggregates are not allowed if the path from the
-- ancestor type wanders through a private extension)
N_N_N_Object :=
(N_Object with Period => C432001_1.Devonian,
Sample_On_Loan => Report.Ident_Bool(True));
if not C432001_2.Check (N_N_N_Object,
375,
C432001_0.Paleozoic,
C432001_1.Devonian,
True) then
Report.Failed ("Object of " &
"nonprivate extension " &
"of nonprivate ancestor " &
"failed content check");
end if;
P_N_N_Object :=
(P_Object with Period => C432001_1.Jurassic,
Sample_On_Loan => Report.Ident_Bool(True));
if not C432001_2.Check (P_N_N_Object,
C432001_1.Jurassic,
True) then
Report.Failed ("Object of " &
"nonprivate extension " &
"of private ancestor " &
"failed content check");
end if;
-- Check additional cases
if not C432001_1.Check (P_N_Object_2,
C432001_1.Carboniferous) then
Report.Failed ("Additional Object of " &
"nonprivate extension of private type " &
"failed content check");
end if;
if not C432001_1.Check (N_N_Object_2,
42,
C432001_0.Precambrian,
C432001_1.Carboniferous) then
Report.Failed ("Additional Object of " &
"nonprivate extension of nonprivate type " &
"failed content check");
end if;
Report.Result;
end C432001;