| -- C3A0013.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 general access type object may reference allocated |
| -- pool objects as well as aliased objects. (3,4) |
| -- Check that formal parameters of tagged types are implicitly |
| -- defined as aliased; check that the 'Access of these formal |
| -- parameters designates the correct object with the correct |
| -- tag. (5) |
| -- Check that the current instance of a limited type is defined as |
| -- aliased. (5) |
| -- |
| -- TEST DESCRIPTION: |
| -- This test takes from the hierarchy defined in C390003; making |
| -- the root type Vehicle limited private. It also shifts the |
| -- abstraction to include the notion of a transmission, an object |
| -- which is contained within any vehicle. Using an access |
| -- discriminant, any subprogram which operates on a transmission |
| -- may also reference the vehicle in which it is installed. |
| -- |
| -- Class Hierarchy: |
| -- Vehicle Transmission |
| -- / \ |
| -- Truck Car |
| -- |
| -- Contains: |
| -- Vehicle( Transmission ) |
| -- |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- 16 Dec 94 SAIC Fixed accessibility problems |
| -- |
| --! |
| |
| package C3A0013_1 is |
| type Vehicle is tagged limited private; |
| type Vehicle_ID is access all Vehicle'Class; |
| |
| -- Constructors |
| procedure Create ( It : in out Vehicle; |
| Wheels : Natural := 4 ); |
| -- Modifiers |
| procedure Accelerate ( It : in out Vehicle ); |
| procedure Decelerate ( It : in out Vehicle ); |
| procedure Up_Shift ( It : in out Vehicle ); |
| procedure Stop ( It : in out Vehicle ); |
| |
| -- Selectors |
| function Speed ( It : Vehicle ) return Natural; |
| function Wheels ( It : Vehicle ) return Natural; |
| function Gear_Factor( It : Vehicle ) return Natural; |
| |
| -- TC_Ops |
| procedure TC_Validate( It : in out Vehicle; Speed_Trap : Natural ); |
| |
| -- dispatching procedure used to check tag correctness |
| procedure TC_Validate( It : Vehicle; |
| TC_ID : Character); |
| |
| private |
| |
| type Transmission(Within: access Vehicle'Class) is limited record |
| Engaged : Boolean := False; |
| Gear : Integer range -1..5 := 0; |
| end record; |
| |
| -- Current instance of a limited type is defined as aliased |
| |
| type Vehicle is tagged limited record |
| Wheels: Natural; |
| Speed : Natural; |
| Power_Train: Transmission( Vehicle'Access ); |
| end record; |
| end C3A0013_1; |
| |
| with C3A0013_1; |
| package C3A0013_2 is |
| type Car is new C3A0013_1.Vehicle with private; |
| procedure TC_Validate( It : Car; |
| TC_ID : Character); |
| function Gear_Factor( It : Car ) return Natural; |
| private |
| type Car is new C3A0013_1.Vehicle with record |
| Displacement : Natural; |
| end record; |
| end C3A0013_2; |
| |
| with C3A0013_1; |
| package C3A0013_3 is |
| type Truck is new C3A0013_1.Vehicle with private; |
| procedure TC_Validate( It : Truck; |
| TC_ID : Character); |
| function Gear_Factor( It : Truck ) return Natural; |
| private |
| type Truck is new C3A0013_1.Vehicle with record |
| Displacement : Natural; |
| end record; |
| end C3A0013_3; |
| |
| with Report; |
| package body C3A0013_1 is |
| |
| procedure Create ( It : in out Vehicle; |
| Wheels : Natural := 4 ) is |
| begin |
| It.Wheels := Wheels; |
| It.Speed := 0; |
| end Create; |
| |
| procedure Accelerate( It : in out Vehicle ) is |
| begin |
| It.Speed := It.Speed + Gear_Factor( It.Power_Train.Within.all ); |
| end Accelerate; |
| |
| procedure Decelerate( It : in out Vehicle ) is |
| begin |
| It.Speed := It.Speed - Gear_Factor( It.Power_Train.Within.all ); |
| end Decelerate; |
| |
| procedure Stop ( It : in out Vehicle ) is |
| begin |
| It.Speed := 0; |
| It.Power_Train.Engaged := False; |
| end Stop; |
| |
| function Gear_Factor( It : Vehicle ) return Natural is |
| begin |
| return It.Power_Train.Gear; |
| end Gear_Factor; |
| |
| function Speed ( It : Vehicle ) return Natural is |
| begin |
| return It.Speed; |
| end Speed; |
| |
| function Wheels ( It : Vehicle ) return Natural is |
| begin |
| return It.Wheels; |
| end Wheels; |
| |
| -- formal tagged parameters are implicitly aliased |
| |
| procedure TC_Validate( It : in out Vehicle; Speed_Trap : Natural ) is |
| License: Vehicle_ID := It'Unchecked_Access; |
| begin |
| if Speed( License.all ) /= Speed_Trap then |
| Report.Failed("Speed Trap: expected: " & Natural'Image(Speed_Trap)); |
| end if; |
| end TC_Validate; |
| |
| procedure TC_Validate( It : Vehicle; |
| TC_ID : Character) is |
| begin |
| if TC_ID /= 'V' then |
| Report.Failed("Dispatched to Vehicle"); |
| end if; |
| if Wheels( It ) /= 1 then |
| Report.Failed("Not a Vehicle"); |
| end if; |
| end TC_Validate; |
| |
| procedure Up_Shift( It: in out Vehicle ) is |
| begin |
| It.Power_Train.Gear := It.Power_Train.Gear +1; |
| It.Power_Train.Engaged := True; |
| Accelerate( It ); |
| end Up_Shift; |
| end C3A0013_1; |
| |
| with Report; |
| package body C3A0013_2 is |
| |
| procedure TC_Validate( It : Car; |
| TC_ID : Character ) is |
| begin |
| if TC_ID /= 'C' then |
| Report.Failed("Dispatched to Car"); |
| end if; |
| if Wheels( It ) /= 4 then |
| Report.Failed("Not a Car"); |
| end if; |
| end TC_Validate; |
| |
| function Gear_Factor( It : Car ) return Natural is |
| begin |
| return C3A0013_1.Gear_Factor( C3A0013_1.Vehicle( It ) )*2; |
| end Gear_Factor; |
| |
| end C3A0013_2; |
| |
| with Report; |
| package body C3A0013_3 is |
| |
| procedure TC_Validate( It : Truck; |
| TC_ID : Character) is |
| begin |
| if TC_ID /= 'T' then |
| Report.Failed("Dispatched to Truck"); |
| end if; |
| if Wheels( It ) /= 3 then |
| Report.Failed("Not a Truck"); |
| end if; |
| end TC_Validate; |
| |
| function Gear_Factor( It : Truck ) return Natural is |
| begin |
| return C3A0013_1.Gear_Factor( C3A0013_1.Vehicle( It ) )*3; |
| end Gear_Factor; |
| |
| end C3A0013_3; |
| |
| package C3A0013_4 is |
| procedure Perform_Tests; |
| end C3A0013_4; |
| |
| with Report; |
| with C3A0013_1; |
| with C3A0013_2; |
| with C3A0013_3; |
| package body C3A0013_4 is |
| package Root renames C3A0013_1; |
| package Cars renames C3A0013_2; |
| package Trucks renames C3A0013_3; |
| |
| type Car_Pool is array(1..4) of aliased Cars.Car; |
| Commuters : Car_Pool; |
| |
| My_Car : aliased Cars.Car; |
| Company_Car : Root.Vehicle_ID; |
| Repair_Shop : Root.Vehicle_ID; |
| |
| The_Vehicle : Root.Vehicle; |
| The_Car : Cars.Car; |
| The_Truck : Trucks.Truck; |
| |
| procedure TC_Dispatch( Ptr : Root.Vehicle_ID; |
| Char : Character ) is |
| begin |
| Root.TC_Validate( Ptr.all, Char ); |
| end TC_Dispatch; |
| |
| procedure TC_Check_Formal_Access( Item: in out Root.Vehicle'Class; |
| Char: Character) is |
| begin |
| TC_Dispatch( Item'Unchecked_Access, Char ); |
| end TC_Check_Formal_Access; |
| |
| procedure Perform_Tests is |
| begin -- Main test procedure. |
| |
| for Lane in Commuters'Range loop |
| Cars.Create( Commuters(Lane) ); |
| for Excitement in 1..Lane loop |
| Cars.Up_Shift( Commuters(Lane) ); |
| end loop; |
| end loop; |
| |
| Cars.Create( My_Car ); |
| Cars.Up_Shift( My_Car ); |
| Cars.TC_Validate( My_Car, 2 ); |
| |
| Root.Create( The_Vehicle, 1 ); |
| Cars.Create( The_Car , 4 ); |
| Trucks.Create( The_Truck, 3 ); |
| |
| TC_Check_Formal_Access( The_Vehicle, 'V' ); |
| TC_Check_Formal_Access( The_Car, 'C' ); |
| TC_Check_Formal_Access( The_Truck, 'T' ); |
| |
| Root.Up_Shift( The_Vehicle ); |
| Cars.Up_Shift( The_Car ); |
| Trucks.Up_Shift( The_Truck ); |
| |
| Root.TC_Validate( The_Vehicle, 1 ); |
| Cars.TC_Validate( The_Car, 2 ); |
| Trucks.TC_Validate( The_Truck, 3 ); |
| |
| -- general access type may reference allocated objects |
| |
| Company_Car := new Cars.Car; |
| Root.Create( Company_Car.all ); |
| Root.Up_Shift( Company_Car.all ); |
| Root.Up_Shift( Company_Car.all ); |
| Root.TC_Validate( Company_Car.all, 6 ); |
| |
| -- general access type may reference aliased objects |
| |
| Repair_Shop := My_Car'Access; |
| Root.TC_Validate( Repair_Shop.all, 2 ); |
| |
| -- general access type may reference aliased objects |
| |
| Construction: declare |
| type Speed_List is array(Commuters'Range) of Natural; |
| Accelerations : constant Speed_List := (2, 6, 12, 20); |
| begin |
| for Rotation in Commuters'Range loop |
| Repair_Shop := Commuters(Rotation)'Access; |
| Root.TC_Validate( Repair_Shop.all, Accelerations(Rotation) ); |
| end loop; |
| end Construction; |
| |
| end Perform_Tests; |
| |
| end C3A0013_4; |
| |
| with C3A0013_4; |
| with Report; |
| procedure C3A0013 is |
| begin |
| |
| Report.Test ("C3A0013", "Check general access types. Check aliased " |
| & "nature of formal tagged type parameters. " |
| & "Check aliased nature of the current " |
| & "instance of a limited type. Check the " |
| & "constraining of actual subtypes for " |
| & "discriminated objects" ); |
| |
| C3A0013_4.Perform_Tests; |
| |
| Report.Result; |
| end C3A0013; |