-- CA11022.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 body of a child unit can instantiate its generic sibling.
--      
-- TEST DESCRIPTION:
--      Declare a package that provides some types for the graphic 
--      application.  Add a generic child package with a subprogram parameter
--      to provide algorithms that can be used by different terminal types
--      but that have to be customized to the specific terminal. Add child 
--      packages to take advantage of the parent types and to provide a 
--      customized operation for each of the different terminals.  The 
--      customized operation will be passed as a generic subprogram parameter 
--      to the child package's sibling.
--
--      The main program "with"s the child packages.  Check that the
--      operations in child units perform as expected.  
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

package CA11022_0 is    -- Graphic Manager
 
   type Row is range 1 .. 66;
   type Column is range 1 .. 80;
   type Radius is range 1 .. 3;
   type Length is range 5 .. 10;

   -- Testing artifice.
   TC_Screen : array (Row, Column) of boolean := (others => (others => false));
   TC_Draw_Circle : boolean := false;
   TC_Draw_Square : boolean := false;

   -- ... and other complicated ones.

end CA11022_0;

-- No bodies required for CA11022_0.

     --==================================================================--

-- Child package to provide general graphic functionalities.

generic               

   with procedure Put_Dot (X : in Column;
                           Y : in Row);

package CA11022_0.CA11022_1 is     

   procedure Draw_Square (At_Col : in Column;
                          At_Row : in Row;
                          Len    : in Length);

   procedure Draw_Circle (At_Col : in Column;
                          At_Row : in Row;
                          Rad    : in Radius);

   -- procedure Draw_Ellipse ...
   -- and other drawings ...

end CA11022_0.CA11022_1;

     --==================================================================--

package body CA11022_0.CA11022_1 is

   procedure Draw_Square (At_Col : in Column;
                          At_Row : in Row;
                          Len    : in Length) is
   begin
      -- use square drawing algorithm 
      -- call
      Put_Dot (At_Col + Column (Len), At_Row + Row(Len));
      -- as needed in the algorithm.
      TC_Draw_Square := true;
   end Draw_Square;

   -------------------------------------------------------
   procedure Draw_Circle (At_Col : in Column;
                          At_Row : in Row;
                          Rad    : in Radius) is
   begin
      -- use circle drawing algorithm 
      -- call
      for I in 1 .. Rad loop
         Put_Dot (At_Col + Column(I), At_Row + Row(I));
      end loop;
      -- as needed in the algorithm.
      TC_Draw_Circle := true;
   end Draw_Circle;

end CA11022_0.CA11022_1;

     --==================================================================--

with CA11022_0.CA11022_1;                -- Generic sibling.

-- Child package to provide customized graphic functions for the
-- VT100.
package CA11022_0.CA11022_2 is           -- VT100 Graphic.

   X : Column := 8;
   Y : Row    := 3;
   R : Radius := 2;
   L : Length := 6;

   procedure VT100_Graphic;

end CA11022_0.CA11022_2;

     --==================================================================--

package body CA11022_0.CA11022_2 is    

   procedure VT100_Graphic is
      procedure VT100_Putdot (X : in Column;
                              Y : in Row) is
      begin   
         -- Light a pixel at location (X, Y);
         TC_Screen (Y, X) := true;
      end VT100_Putdot;

                  ------------------------------------

      -- Declare instance of the generic sibling package to draw a circle, 
      -- a square, or an ellipse customized for the VT100.
      package VT100_Graphic is new CA11022_0.CA11022_1 (VT100_Putdot);
   
   begin  
      VT100_Graphic.Draw_Circle (X, Y, R);
      VT100_Graphic.Draw_Square (X, Y, L);
   end VT100_Graphic;

end CA11022_0.CA11022_2;

     --==================================================================--

with CA11022_0.CA11022_1;                -- Generic sibling.

-- Child package to provide customized graphic functions for the
-- IBM3270.
package CA11022_0.CA11022_3 is           -- IBM3270 Graphic.

   X : Column := 39;
   Y : Row    := 11;
   R : Radius := 3;
   L : Length := 7;

   procedure IBM3270_Graphic;

end CA11022_0.CA11022_3;

     --==================================================================--

package body CA11022_0.CA11022_3 is    

   procedure IBM3270_Graphic is
      procedure IBM3270_Putdot (X : in Column;
                             Y : in Row) is
      begin   
         -- Light a pixel at location (X + 2, Y);
         TC_Screen (Y, X + Column(2)) := true;
      end IBM3270_Putdot;

                  ------------------------------------

      -- Declare instance of the generic sibling package to draw a circle, 
      -- a square, or an ellipse customized for the IBM3270.
      package IBM3270_Graphic is new CA11022_0.CA11022_1 (IBM3270_Putdot);
   
   begin  
      IBM3270_Graphic.Draw_Circle (X, Y, R);
      IBM3270_Graphic.Draw_Square (X, Y, L);
   end IBM3270_Graphic;

end CA11022_0.CA11022_3;

     --==================================================================--

with CA11022_0.CA11022_2;              -- VT100 Graphic, implicitly with
                                       -- CA11022_0, Graphic Manager.
with CA11022_0.CA11022_3;              -- IBM3270 Graphic.
with Report;

procedure CA11022 is

begin

   Report.Test ("CA11022", "Check that body of a child unit can depend on " &
                "its generic sibling");

   -- Customized graphic functions for the VT100 terminal.
   CA11022_0.CA11022_2.VT100_Graphic;

   if not CA11022_0.TC_Screen (4,9) and not CA11022_0.TC_Screen (5,10) 
     and not CA11022_0.TC_Screen (9,14) and not CA11022_0.TC_Draw_Circle 
       and not CA11022_0.TC_Draw_Square then
          Report.Failed ("Wrong results for the VT100");
   end if;

   CA11022_0.TC_Draw_Circle := false;
   CA11022_0.TC_Draw_Square := false;

   -- Customized graphic functions for the IBM3270 terminal.
   CA11022_0.CA11022_3.IBM3270_Graphic;

   if not CA11022_0.TC_Screen (12,42) and not CA11022_0.TC_Screen (13,43) 
     and not CA11022_0.TC_Screen (14,44) and not CA11022_0.TC_Screen (46,18) 
       and not CA11022_0.TC_Draw_Circle and not CA11022_0.TC_Draw_Square then
          Report.Failed ("Wrong results for the IBM3270");
   end if;

   Report.Result;

end CA11022;
