blob: 41493c227795dc10924d54664a4c5f36629c0875 [file] [log] [blame]
-- C392002.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 use of a class-wide formal parameter allows for the
-- proper dispatching of objects to the appropriate implementation of
-- a primitive operation. Check this in the case where the root tagged
-- type is defined in a generic package, and the type derived from it is
-- defined in that same generic package.
--
-- TEST DESCRIPTION:
-- Declare a root tagged type, and some associated primitive operations.
-- Extend the root type, and override one or more primitive operations,
-- inheriting the other primitive operations from the root type.
-- Derive from the extended type, again overriding some primitive
-- operations and inheriting others (including some that the parent
-- inherited).
-- Define a subprogram with a class-wide parameter, inside of which is a
-- call on a dispatching primitive operation. These primitive operations
-- modify global variables (the class-wide parameter has mode IN).
--
-- The following hierarchy of tagged types and primitive operations is
-- utilized in this test:
--
--
-- type Vehicle (root)
-- |
-- type Motorcycle
-- |
-- | Operations
-- | Engine_Size
-- | Catalytic_Converter
-- | Emissions_Produced
-- |
-- type Automobile (extended from Motorcycle)
-- |
-- | Operations
-- | (Engine_Size) (inherited)
-- | Catalytic_Converter (overridden)
-- | Emissions_Produced (overridden)
-- |
-- type Truck (extended from Automobile)
-- |
-- | Operations
-- | (Engine_Size) (inherited twice - Motorcycle)
-- | (Catalytic_Converter) (inherited - Automobile)
-- | Emissions_Produced (overridden)
--
--
-- In this test, we are concerned with the following selection of dispatching
-- calls, accomplished with the use of a Vehicle'Class IN procedure
-- parameter :
--
-- \ Type
-- Prim. Op \ Motorcycle Automobile Truck
-- \------------------------------------------------
-- Engine_Size | X X X
-- Catalytic_Converter | X X X
-- Emissions_Produced | X X X
--
--
--
-- The location of the declaration and derivation of the root and extended
-- types will be varied over a series of tests. Locations of declaration
-- and derivation for a particular test are marked with an asterisk (*).
--
-- Root type:
--
-- Declared in package.
-- * Declared in generic package.
--
-- Extended types:
--
-- * Derived in parent location.
-- Derived in a nested package.
-- Derived in a nested subprogram.
-- Derived in a nested generic package.
-- Derived in a separate package.
-- Derived in a separate visible child package.
-- Derived in a separate private child package.
--
-- Primitive Operations:
--
-- * Procedures with same parameter profile.
-- Procedures with different parameter profile.
-- * Functions with same parameter profile.
-- Functions with different parameter profile.
-- * Mixture of Procedures and Functions.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
-- 09 May 96 SAIC Made single-file for 2.1
--
--!
------------------------------------------------------------------- C392002_0
-- Declare the root and extended types, along with their primitive
-- operations in a generic package.
generic
type Cubic_Inches is range <>;
type Emission_Measure is digits <>;
Emissions_per_Engine_Cubic_Inch : Emission_Measure;
package C392002_0 is -- package Vehicle_Simulation
--
-- Equipment types and their primitive operations.
--
-- Root type.
type Vehicle is abstract tagged
record
Weight : Integer;
Wheels : Positive;
end record;
-- Abstract operations of type Vehicle.
function Engine_Size (V : in Vehicle) return Cubic_Inches
is abstract;
function Catalytic_Converter (V : in Vehicle) return Boolean
is abstract;
function Emissions_Produced (V : in Vehicle) return Emission_Measure
is abstract;
--
type Motorcycle is new Vehicle with
record
Size_Of_Engine : Cubic_Inches;
end record;
-- Primitive operations of type Motorcycle.
function Engine_Size (V : in Motorcycle) return Cubic_Inches;
function Catalytic_Converter (V : in Motorcycle) return Boolean;
function Emissions_Produced (V : in Motorcycle) return Emission_Measure;
--
type Automobile is new Motorcycle with
record
Passenger_Capacity : Integer;
end record;
-- Function Engine_Size inherited from parent (Motorcycle).
-- Primitive operations (Overridden).
function Catalytic_Converter (V : in Automobile) return Boolean;
function Emissions_Produced (V : in Automobile) return Emission_Measure;
--
type Truck is new Automobile with
record
Hauling_Capacity : Natural;
end record;
-- Function Engine_Size inherited twice.
-- Function Catalytic_Converter inherited from parent (Automobile).
-- Primitive operation (Overridden).
function Emissions_Produced (V : in Truck) return Emission_Measure;
end C392002_0;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
package body c392002_0 is
--
-- Primitive operations for Motorcycle.
--
function Engine_Size (V : in Motorcycle) return Cubic_Inches is
begin
return (V.Size_Of_Engine);
end Engine_Size;
function Catalytic_Converter (V : in Motorcycle) return Boolean is
begin
return (False);
end Catalytic_Converter;
function Emissions_Produced (V : in Motorcycle) return Emission_Measure is
begin
return 100.00;
end Emissions_Produced;
--
-- Overridden operations for Automobile type.
--
function Catalytic_Converter (V : in Automobile) return Boolean is
begin
return (True);
end Catalytic_Converter;
function Emissions_Produced (V : in Automobile) return Emission_Measure is
begin
return 200.00;
end Emissions_Produced;
--
-- Overridden operation for Truck type.
--
function Emissions_Produced (V : in Truck) return Emission_Measure is
begin
return 300.00;
end Emissions_Produced;
end C392002_0;
--------------------------------------------------------------------- C392002
with C392002_0; -- with Vehicle_Simulation;
with Report;
procedure C392002 is
type Decade is (c1970, c1980, c1990);
type Vehicle_Emissions is digits 6;
type Engine_Emissions_by_Decade is array (Decade) of Vehicle_Emissions;
subtype Engine_Size is Integer range 100 .. 1000;
Five_Tons : constant Natural := 10000;
Catalytic_Converter_Offset : constant Vehicle_Emissions := 0.8;
Truck_Adjustment_Factor : constant Vehicle_Emissions := 1.2;
Engine_Emission_Factor : Engine_Emissions_by_Decade := (c1970 => 10.00,
c1980 => 8.00,
c1990 => 5.00);
-- Instantiate generic package for 1970 simulation.
package Sim_1970 is new C392002_0
(Cubic_Inches => Engine_Size,
Emission_Measure => Vehicle_Emissions,
Emissions_Per_Engine_Cubic_Inch => Engine_Emission_Factor (c1970));
-- Declare and initialize vehicle objects.
Cycle_1970 : Sim_1970.Motorcycle := (Weight => 400,
Wheels => 2,
Size_Of_Engine => 100);
Auto_1970 : Sim_1970.Automobile := (2000, 4, 500, 5);
Truck_1970 : Sim_1970.Truck := (Weight => 5000,
Wheels => 18,
Size_Of_Engine => 1000,
Passenger_Capacity => 2,
Hauling_Capacity => Five_Tons);
-- Function Get_Engine_Size performs a dispatching call on a
-- primitive operation that has been defined for an ancestor type and
-- inherited by each type derived from the ancestor.
function Get_Engine_Size (V : in Sim_1970.Vehicle'Class)
return Engine_Size is
begin
return (Sim_1970.Engine_Size (V)); -- Dispatch according to tag.
end Get_Engine_Size;
-- Function Catalytic_Converter_Present performs a dispatching call on
-- a primitive operation that has been defined for an ancestor type,
-- overridden in the parent extended type, and inherited by the subsequent
-- extended type.
function Catalytic_Converter_Present (V : in Sim_1970.Vehicle'Class)
return Boolean is
begin
return (Sim_1970.Catalytic_Converter (V)); -- Dispatch according to tag.
end Catalytic_Converter_Present;
-- Function Air_Quality_Measure performs a dispatching call on
-- a primitive operation that has been defined for an ancestor type, and
-- overridden in each subsequent extended type.
function Air_Quality_Measure (V : in Sim_1970.Vehicle'Class)
return Vehicle_Emissions is
begin
return (Sim_1970.Emissions_Produced (V)); -- Dispatch according to tag.
end Air_Quality_Measure;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
begin -- Main test procedure.
Report.Test ("C392002", "Check that the use of a class-wide parameter "
& "allows for proper dispatching where root type "
& "and extended types are declared in the same "
& "generic package" );
if (Get_Engine_Size (Cycle_1970) /= 100) or
(Get_Engine_Size (Auto_1970) /= 500) or
(Get_Engine_Size (Truck_1970) /= 1000)
then
Report.Failed ("Failed dispatch to Get_Engine_Size");
end if;
if Catalytic_Converter_Present (Cycle_1970) or
not Catalytic_Converter_Present (Auto_1970) or
not Catalytic_Converter_Present (Truck_1970)
then
Report.Failed ("Failed dispatch to Catalytic_Converter_Present");
end if;
if ((Air_Quality_Measure (Cycle_1970) /= 100.00) or
(Air_Quality_Measure (Auto_1970) /= 200.00) or
(Air_Quality_Measure (Truck_1970) /= 300.00))
then
Report.Failed ("Failed dispatch to Air_Quality_Measure");
end if;
Report.Result;
end C392002;