-- CA11016.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 child of a non-generic package can be a private generic 
--      package. Check that the private child instance can use its parent's
--      declarations and operations.  Check that the body of a public child 
--      package can instantiate its sibling private generic package.
--
-- TEST DESCRIPTION:
--      Declare a map abstraction in a package which manages basic physical
--      map[s].  Declare a private generic child of this package which can be
--      instantiated for any display device which has display locations of 
--      the physical map that can be characterized by any integer type, i.e., 
--      the intensity of the display point.
--
--      Declare a public child of the physical map which specifies the 
--      display device.  In the body of this child, declare an instance of 
--      its generic sibling to display the geographic locations.
--
--      In the main program, check that the operations in the parent, public 
--      child and instance of the private child package perform as expected.  
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      17 Apr 96   SAIC    ACVC 2.1: Added pragma Elaborate.
--
--!
-- Simulates map of physical features, i.e., desert, forest, or water.
package CA11016_0 is              
   type Map_Type is private;
   subtype Latitude is integer range 1 .. 9;
   subtype Longitude is integer range 1 .. 7;
   type Physical_Features is (Desert, Forest, Water);
   
   -- Use geographic database to initialize the basic map.
   procedure Initialize_Basic_Map (Map  : in out Map_Type);
   function Get_Physical_Feature (Lat  : Latitude;
                                  Long : Longitude;
                                  Map  : Map_Type) return Physical_Features;
private
   type Map_Type is array (Latitude, Longitude) of Physical_Features;
   Basic_Map : Map_Type;
end CA11016_0;
     --==================================================================--
package body CA11016_0 is              
   procedure Initialize_Basic_Map (Map : in out Map_Type) is
   -- Not a real initialization.  Real application can use geographic
   -- database to create the basic map.
   begin
      for I in Latitude'first .. Latitude'last loop
         for J in 1 .. 2 loop
            Map (I, J) := Desert;
         end loop;
         for J in 3 .. 4 loop
            Map (I, J) := Forest;
         end loop;
         for J in 5 .. 7 loop
            Map (I, J) := Water;
         end loop;
      end loop;
   end Initialize_Basic_Map;
   --------------------------------------------------------
   function Get_Physical_Feature (Lat  : Latitude;
                                  Long : Longitude;
                                  Map  : Map_Type) 
     return Physical_Features is
   begin
     return (Map (Lat, Long));
   end Get_Physical_Feature;
   --------------------------------------------------------
   begin
      -- Initialize a basic map.
      Initialize_Basic_Map (Basic_Map);
end CA11016_0;
     --==================================================================--
-- Private generic child package of physical map.  This generic package may
-- be instantiated for any display device which has display locations 
-- (latitude, longitude) that can be characterized by an integer value.
-- For example, the intensity of the display point might be so characterized.
-- It can be instantiated for any desired range of values (which would 
-- correspond to the range accepted by the display device).
private 
generic               
   type Display_Value is range <>;  -- Any display feature that is 
                                    -- represented by an integer.
package CA11016_0.CA11016_1 is              
   function Get_Display_Value (Lat  : Latitude;
                               Long : Longitude;
                               Map  : Map_Type) return Display_Value;
end CA11016_0.CA11016_1;
     --==================================================================--
package body CA11016_0.CA11016_1 is              
   function Get_Display_Value (Lat  : Latitude;
                               Long : Longitude;
                               Map  : Map_Type) 
     return Display_Value is
   begin
      case Get_Physical_Feature (Lat, Long, Map) is
                                          -- Parent's operation,
           when Forest => return (Display_Value'first);
                                          -- Parent's type.
           when Desert => return (Display_Value'last);
                                          -- Parent's type.
           when others => return 
                            ( (Display_Value'last - Display_Value'first) / 2 );
                                          -- NOTE: Results are truncated.
      end case;
   end Get_Display_Value;
end CA11016_0.CA11016_1;
     --==================================================================--
-- Map display operation, public child of physical map.
package CA11016_0.CA11016_2 is              
   -- Super-duper Ultra Geographic Display Device (SDUGD) can display 
   -- geographic locations with light intensity values ranging from 1 to 7.
   type Display_Val is range 1 .. 7;
   type Device_Color is (Brown, Blue, Green);
   type IO_Packet is
      record
         Lat       : Latitude;       -- Parent's type.
         Long      : Longitude;      -- Parent's type.
         Color     : Device_Color;
         Intensity : Display_Val;
      end record;
   procedure Data_For_SDUGD (Lat           : in     Latitude;
                             Long          : in     Longitude;
                             Output_Packet : in out IO_Packet);
end CA11016_0.CA11016_2;
     --==================================================================--
with CA11016_0.CA11016_1;          -- Private generic sibling.
pragma Elaborate (CA11016_0.CA11016_1);
package body CA11016_0.CA11016_2 is              
   -- Declare instance of the private generic sibling for 
   -- an integer type that represents color intensity.
   package SDUGD is new CA11016_0.CA11016_1 (Display_Val);
   procedure Data_For_SDUGD (Lat           : in     Latitude;
                             Long          : in     Longitude;
                             Output_Packet : in out IO_Packet) is
   -- Simulates sending control information to a display device.
   -- Control information consists of latitude, longitude, a
   -- color, and an intensity.
   begin
      case Get_Physical_Feature (Lat, Long, Basic_Map) is
                                           -- Parent's operation.
         when Water  => Output_Packet.Color     := Blue;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
         when Forest => Output_Packet.Color     := Green;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
         when others => Output_Packet.Color     := Brown;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
       end case;
   end Data_For_SDUGD;
end CA11016_0.CA11016_2;
     --==================================================================--
with CA11016_0.CA11016_2;            -- Map display device operation,
                                     -- implicitly withs parent, physical map
                                     -- application.
use CA11016_0.CA11016_2;             -- Allows direct visibility to the simple
                                     -- name of CA11016_0.CA11016_2.
with Report;
procedure CA11016 is
   TC_Packet : IO_Packet;
begin 
   Report.Test ("CA11016", "Check that body of a public child package can " &
                           "use its sibling private generic package "       &
                           "declarations and operations");
-- Simulate control information at coordinates 3 and 7 of the
-- basic map for the SDUGD.
         
         Water_Display_Subtest:
         begin
            TC_Packet.Lat  := 3;
            TC_Packet.Long := 7;
            -- Build color and light intensity of the basic map at 
            -- latitude 3 and longitude 7.
            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);
            if ( (TC_Packet.Color     /= Blue) or
                 (TC_Packet.Intensity /= 3) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for water subtest");
            end if;
         end Water_Display_Subtest;
-- Simulate control information at coordinates 2 and 1 of the
-- basic map for the SDUGD.
         
         Desert_Display_Subtest:
         begin
            TC_Packet.Lat  := 9;
            TC_Packet.Long := 2;
            -- Build color and light intensity of the basic map at 
            -- latitude 9 and longitude 2.
            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);
            if ( (TC_Packet.Color     /= Brown) or
                 (TC_Packet.Intensity /= 7) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for desert subtest");
            end if;
         end Desert_Display_Subtest;
-- Simulate control information at coordinates 8 and 4 of the
-- basic map for the SDUGD.
         
         Forest_Display_Subtest:
         begin
            TC_Packet.Lat  := 8;
            TC_Packet.Long := 4;
            -- Build color and light intensity of the basic map at 
            -- latitude 8 and longitude 4.
            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);
            if ( (TC_Packet.Color     /= Green) or
                 (TC_Packet.Intensity /= 1) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for forest subtest");
            end if;
         end Forest_Display_Subtest;
   Report.Result;
end CA11016;