-- C390004.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 tags of allocated objects correctly identify the
--     type of the allocated object.  Check that the tag corresponds
--     correctly to the value resulting from both normal and view
--     conversion.  Check that the tags of accessed values designating
--     aliased objects correctly identify the type of the object.  Check
--     that the tag of a function result correctly evaluates.  Check this
--     for class-wide functions.  The tag of a class-wide function result
--     should be the tag appropriate to the actual value returned, not the
--     tag of the ancestor type.
--
-- TEST DESCRIPTION:
--     This test defines a class hierarchy of types, with reference
--     semantics (an access type to the class-wide type).  Similar in
--     structure to C392005, this test checks that dynamic allocation does
--     not adversely impact the tagging of types.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

package C390004_1 is -- DMV
  type Equipment is ( T_Veh, T_Car, T_Con, T_Jep );

  type Vehicle is tagged record
    Wheels : Natural := 4;
    Parked : Boolean := False;
  end record;

  function  Wheels    ( It: Vehicle ) return Natural;
  procedure Park      ( It: in out Vehicle );
  procedure UnPark    ( It: in out Vehicle );
  procedure Set_Wheels( It: in out Vehicle; To_Count: in Natural );
  procedure TC_Check  ( It: in Vehicle; To_Equip: in Equipment );

  type Car is new Vehicle with record
    Passengers : Natural := 0;
  end record;

  function  Passengers     ( It: Car ) return Natural;
  procedure Load_Passengers( It: in out Car; To_Count: in Natural );
  procedure Park           ( It: in out Car );
  procedure TC_Check       ( It: in Car; To_Equip: in Equipment );

  type Convertible is new Car with record
    Top_Up : Boolean := True;
  end record;

  function  Top_Up   ( It: Convertible ) return Boolean;
  procedure Lower_Top( It: in out Convertible );
  procedure Park     ( It: in out Convertible );
  procedure Raise_Top( It: in out Convertible );
  procedure TC_Check ( It: in Convertible; To_Equip: in Equipment );

  type Jeep is new Convertible with record
    Windshield_Up : Boolean := True;
  end record;

  function  Windshield_Up   ( It: Jeep ) return Boolean;
  procedure Lower_Windshield( It: in out Jeep );
  procedure Park            ( It: in out Jeep );
  procedure Raise_Windshield( It: in out Jeep );
  procedure TC_Check        ( It: in Jeep; To_Equip: in Equipment );

end C390004_1;

with Report;
package body C390004_1 is

  procedure Set_Wheels( It: in out Vehicle; To_Count: in Natural ) is
  begin
    It.Wheels := To_Count;
  end Set_Wheels;

  function  Wheels( It: Vehicle ) return Natural is
  begin
    return It.Wheels;
  end Wheels;

  procedure Park      ( It: in out Vehicle ) is
  begin
    It.Parked := True;
  end Park;

  procedure UnPark    ( It: in out Vehicle ) is
  begin
    It.Parked := False;
  end UnPark;

  procedure TC_Check  ( It: in Vehicle; To_Equip: in Equipment ) is
  begin
    if To_Equip /= T_Veh then
      Report.Failed ("Failed, called Vehicle for "
                     & Equipment'Image(To_Equip));      
    end if;
  end TC_Check;

  procedure TC_Check  ( It: in Car; To_Equip: in Equipment ) is
  begin
    if To_Equip /= T_Car then
      Report.Failed ("Failed, called Car for "
                     & Equipment'Image(To_Equip));      
    end if;
  end TC_Check;

  procedure TC_Check  ( It: in Convertible; To_Equip: in Equipment ) is
  begin
    if To_Equip /= T_Con then
      Report.Failed ("Failed, called Convertible for "
                     & Equipment'Image(To_Equip));      
    end if;
  end TC_Check;

  procedure TC_Check  ( It: in Jeep; To_Equip: in Equipment ) is
  begin
    if To_Equip /= T_Jep then
      Report.Failed ("Failed, called Jeep for "
                     & Equipment'Image(To_Equip));      
    end if;
  end TC_Check;

  procedure Load_Passengers( It: in out Car; To_Count: in Natural ) is
  begin
    It.Passengers := To_Count;
    UnPark( It );
  end Load_Passengers;

  procedure Park( It: in out Car ) is
  begin
    It.Passengers := 0;
    Park( Vehicle( It ) );
  end Park;

  function  Passengers( It: Car ) return Natural is
  begin
    return It.Passengers;
  end Passengers;

  procedure Raise_Top( It: in out Convertible ) is
  begin
    It.Top_Up := True;
  end Raise_Top;

  procedure Lower_Top( It: in out Convertible ) is
  begin
    It.Top_Up := False;
  end Lower_Top;

  function  Top_Up   ( It: Convertible ) return Boolean is
  begin
    return It.Top_Up;
  end Top_Up;

  procedure Park     ( It: in out Convertible ) is
  begin
    It.Top_Up := True;
    Park( Car( It ) );
  end Park;

  procedure Raise_Windshield( It: in out Jeep ) is
  begin
    It.Windshield_Up := True;
  end Raise_Windshield;

  procedure Lower_Windshield( It: in out Jeep ) is
  begin
    It.Windshield_Up := False;
  end Lower_Windshield;

  function  Windshield_Up( It: Jeep ) return Boolean is
  begin
    return It.Windshield_Up;
  end Windshield_Up;

  procedure Park( It: in out Jeep ) is
  begin
    It.Windshield_Up := True;
    Park( Convertible( It ) );
  end Park;
end C390004_1;

with Report;
with Ada.Tags;
with C390004_1;
procedure C390004 is
  package DMV renames C390004_1;

  The_Vehicle     : aliased DMV.Vehicle;
  The_Car         : aliased DMV.Car;
  The_Convertible : aliased DMV.Convertible;
  The_Jeep        : aliased DMV.Jeep;

  type C_Reference is access all DMV.Car'Class;
  type V_Reference is access all DMV.Vehicle'Class;

  Designator : V_Reference;
  Storage    : Natural;

  procedure Valet( It: in out DMV.Vehicle'Class ) is
  begin
    DMV.Park( It );
  end Valet;

  procedure TC_Match( Object: DMV.Vehicle'Class;
                      Taglet: Ada.Tags.Tag;
                      Where : String ) is
    use Ada.Tags;
  begin
    if Object'Tag /= Taglet then
      Report.Failed("Tag mismatch: " & Where);
    end if;
  end TC_Match;

  procedure Parking_Validation( It: DMV.Vehicle; TC_Message: String ) is
  begin
    if DMV.Wheels( It ) /= 1  or not It.Parked then
      Report.Failed ("Failed Vehicle " & TC_Message);
    end if;
  end Parking_Validation;

  procedure Parking_Validation( It: DMV.Car; TC_Message: String ) is
  begin
    if DMV.Wheels( It ) /= 2 or DMV.Passengers( It ) /= 0
       or not It.Parked then
      Report.Failed ("Failed Car " & TC_Message);
    end if;
  end Parking_Validation;

  procedure Parking_Validation( It: DMV.Convertible;
                                TC_Message: String ) is
  begin
    if DMV.Wheels( It ) /= 3 or DMV.Passengers( It ) /= 0
       or not DMV.Top_Up( It ) or not It.Parked then
      Report.Failed ("Failed Convertible " & TC_Message);
    end if;
  end Parking_Validation;

  procedure Parking_Validation( It: DMV.Jeep; TC_Message: String ) is
  begin
    if DMV.Wheels( It ) /= 4 or DMV.Passengers( It ) /= 0
       or not DMV.Top_Up( It ) or not DMV.Windshield_Up( It )
       or not It.Parked then
      Report.Failed ("Failed Jeep " & TC_Message);
    end if;
  end Parking_Validation;

  function Wash( It: V_Reference; TC_Expect : Ada.Tags.Tag )
                                    return DMV.Vehicle'Class is
    This_Machine : DMV.Vehicle'Class := It.all;
  begin
    TC_Match( It.all, TC_Expect, "Class-wide object in Wash" );
    Storage := DMV.Wheels( This_Machine );
    return This_Machine;
  end Wash;

  function Wash( It: C_Reference; TC_Expect : Ada.Tags.Tag )
                                    return DMV.Car'Class is
    This_Machine : DMV.Car'Class := It.all;
  begin
    TC_Match( It.all, TC_Expect, "Class-wide object in Wash" );
    Storage := DMV.Wheels( This_Machine );
    return This_Machine;
  end Wash;

begin

  Report.Test( "C390004", "Check that the tags of allocated objects "
                        & "correctly identify the type of the allocated "
                        & "object.  Check that tags resulting from "
                        & "normal and view conversions.  Check tags of "
                        & "accessed values designating aliased objects. "
                        & "Check function result tags" );

  DMV.Set_Wheels( The_Vehicle, 1 );
  DMV.Set_Wheels( The_Car, 2 );
  DMV.Set_Wheels( The_Convertible, 3 );
  DMV.Set_Wheels( The_Jeep, 4 );

  Valet( The_Vehicle );
  Valet( The_Car );
  Valet( The_Convertible );
  Valet( The_Jeep );

  Parking_Validation( The_Vehicle,     "setup" );
  Parking_Validation( The_Car,         "setup" );
  Parking_Validation( The_Convertible, "setup" );
  Parking_Validation( The_Jeep,        "setup" );

-- Check that the tags of allocated objects correctly identify the type
-- of the allocated object.

  Designator := new DMV.Vehicle;
  DMV.TC_Check( Designator.all, DMV.T_Veh );
  TC_Match( Designator.all, DMV.Vehicle'Tag, "allocated Vehicle" );

  Designator := new DMV.Car;
  DMV.TC_Check( Designator.all, DMV.T_Car );
  TC_Match( Designator.all, DMV.Car'Tag, "allocated Car");

  Designator := new DMV.Convertible;
  DMV.TC_Check( Designator.all, DMV.T_Con );
  TC_Match( Designator.all, DMV.Convertible'Tag, "allocated Convertible" );

  Designator := new DMV.Jeep;
  DMV.TC_Check( Designator.all, DMV.T_Jep );
  TC_Match( Designator.all, DMV.Jeep'Tag, "allocated Jeep" );

-- Check that view conversion causes the correct dispatch
  DMV.TC_Check( DMV.Vehicle( The_Jeep ),     DMV.T_Veh );
  DMV.TC_Check( DMV.Car( The_Jeep ),         DMV.T_Car );
  DMV.TC_Check( DMV.Convertible( The_Jeep ), DMV.T_Con );

-- And that view conversion does not change the tag
  TC_Match( DMV.Vehicle( The_Jeep ),     DMV.Jeep'Tag, "View Conv Veh" );
  TC_Match( DMV.Car( The_Jeep ),         DMV.Jeep'Tag, "View Conv Car" );
  TC_Match( DMV.Convertible( The_Jeep ), DMV.Jeep'Tag, "View Conv Jep" );

-- Check that the tags of accessed values designating aliased objects
-- correctly identify the type of the object.
  Designator := The_Vehicle'Access;
  DMV.TC_Check( Designator.all, DMV.T_Veh );
  TC_Match( Designator.all, DMV.Vehicle'Tag, "aliased Vehicle" );

  Designator := The_Car'Access;
  DMV.TC_Check( Designator.all, DMV.T_Car );
  TC_Match( Designator.all, DMV.Car'Tag, "aliased Car" );

  Designator := The_Convertible'Access;
  DMV.TC_Check( Designator.all, DMV.T_Con );
  TC_Match( Designator.all, DMV.Convertible'Tag, "aliased Convertible" );

  Designator := The_Jeep'Access;
  DMV.TC_Check( Designator.all, DMV.T_Jep );
  TC_Match( Designator.all, DMV.Jeep'Tag, "aliased Jeep" );

-- Check that the tag of a function result correctly evaluates.
-- Check this for class-wide functions.  The tag of a class-wide
-- function result should be the tag appropriate to the actual value
-- returned, not the tag of the ancestor type.
  Function_Check: declare
    A_Vehicle     : V_Reference := new DMV.Vehicle'( The_Vehicle );
    A_Car         : C_Reference := new DMV.Car'( The_Car );
    A_Convertible : C_Reference := new DMV.Convertible'( The_Convertible );
    A_Jeep        : C_Reference := new DMV.Jeep'( The_Jeep );
  begin
    DMV.Unpark( A_Vehicle.all );
    DMV.Load_Passengers( A_Car.all, 5 );
    DMV.Load_Passengers( A_Convertible.all, 6 );
    DMV.Load_Passengers( A_Jeep.all, 7 );
    DMV.Lower_Top( DMV.Convertible(A_Convertible.all) );
    DMV.Lower_Top( DMV.Jeep(A_Jeep.all) );
    DMV.Lower_Windshield( DMV.Jeep(A_Jeep.all) );

    if DMV.Wheels( Wash( A_Jeep, DMV.Jeep'Tag ) ) /= 4
       or Storage /= 4 then
      Report.Failed("Did not correctly wash Jeep");
    end if;

    if DMV.Wheels( Wash( A_Convertible, DMV.Convertible'Tag ) ) /= 3
       or Storage /= 3 then
      Report.Failed("Did not correctly wash Convertible");
    end if;

    if DMV.Wheels( Wash( A_Car, DMV.Car'Tag ) ) /= 2
       or Storage /= 2 then
      Report.Failed("Did not correctly wash Car");
    end if;

    if DMV.Wheels( Wash( A_Vehicle, DMV.Vehicle'Tag ) ) /= 1
       or Storage /= 1 then
      Report.Failed("Did not correctly wash Vehicle");
    end if; 

  end Function_Check;

  Report.Result;
end C390004;
