-- C393A05.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 for a nonabstract private extension, any inherited
 --      abstract subprograms can be overridden in the private part of
 --      the immediately enclosing package and that calls can be made to
 --      private dispatching operations.
 --
 -- TEST DESCRIPTION:
 --      This test builds an additional layer upon the foundation code to
 --      provide the required "hidden" dispatching operation.  The procedure
 --      Swap, a private subprogram, should be called by dispatch.
 --
 -- TEST FILES:
 --      The following files comprise this test:
 --
 --         F393A00.A   (foundation code)
 --         C393A05.A
 --
 --
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
 --!
 
 with F393A00_4;
 package C393A05_0 is
   type Grinder is new F393A00_4.Mill with private;
   type Coarseness is (Whole_Bean, Coarse, Medium, Fine, Espresso);
 
   procedure Set_Grind( It: in out Grinder; The_Grind: Coarseness );
   function  Grind( It: Grinder ) return Coarseness;
 
   function  Create return Grinder;
 private
   procedure Swap( A,B: in out Grinder );
   type Grinder is new F393A00_4.Mill with
     record
       Grind : Coarseness := Whole_Bean;
     end record;
 end C393A05_0;
 
 with F393A00_0;
 package body C393A05_0 is
   procedure Set_Grind( It: in out Grinder; The_Grind: Coarseness ) is
   begin
     F393A00_0.TC_Touch( 'A' );
     It.Grind := The_Grind;
   end Set_Grind;
 
   function  Grind( It: Grinder ) return Coarseness is
   begin
     F393A00_0.TC_Touch( 'B' );
     return It.Grind;
   end Grind;
 
   procedure Swap( A,B: in out Grinder ) is
     T : constant Grinder := A;
   begin
     F393A00_0.TC_Touch( 'C' );
     A := B;
     B := T;
   end Swap;
 
   function  Create return Grinder is
     One: Grinder;  
   begin
     F393A00_0.TC_Touch( 'D' );
     F393A00_4.Initialize( F393A00_4.Mill( One ) );
     One.Grind := Fine;
     return One;
   end Create;
 end C393A05_0;
 
 with Report;
 with F393A00_0;
 with C393A05_0;
 procedure C393A05 is
 
   package Tracer renames F393A00_0;
   package Coffee renames C393A05_0;
   use type Coffee.Coarseness;
 
   Morning   : Coffee.Grinder;
   Afternoon : Coffee.Grinder;
 
   Gritty    : Coffee.Coarseness;
 
   procedure Class_Swap( A, B: in out Coffee.Grinder'Class ) is
   begin
     Coffee.Swap( A, B ); -- dispatch
   end Class_Swap;
 
 begin  -- Main test procedure.
 
   Report.Test ("C393A05",  "Check that nonabstract private extensions, "
                          & "inherited abstract subprograms overridden "
                          & "in the private part can be dispatched from "
                          & "outside the package" );
 
   Tracer.TC_Validate( "hh", "Declarations" );
 
   Morning := Coffee.Create;
   Tracer.TC_Validate( "hDa", "Creating Morning Coffee" );
   Gritty  := Coffee.Grind( Morning );
   Tracer.TC_Validate( "B", "Finding Morning Grind" );
 
   Afternoon := Coffee.Create;
   Tracer.TC_Validate( "hDa", "Creating Afternoon Coffee" );
   Coffee.Set_Grind( Afternoon, Coffee.Medium );
   Tracer.TC_Validate( "A", "Setting Afternoon Grind" );
 
   Coffee.Swap( Morning, Afternoon );
   Tracer.TC_Validate( "C", "Dispatching Swapping Coffees" );
 
   if Gritty /= Coffee.Grind( Afternoon )
      or Coffee.Grind ( Afternoon ) /= Coffee.Fine then
     Report.Failed ("Result of Swap");
   end if;
   Tracer.TC_Validate( "BB", "Finding Afternoon Grind" );
 
   Sunset: declare
     Evening   : Coffee.Grinder'Class := Coffee.Create;
   begin
     Tracer.TC_Validate( "hDa", "Creating Evening Coffee" );
 
     Coffee.Set_Grind( Evening, Coffee.Espresso );
     Tracer.TC_Validate( "A", "Setting Evening Grind" );
 
     Morning := Coffee.Grinder( Evening );
     Class_Swap( Morning, Evening );
     Tracer.TC_Validate( "C", "Swapping Coffees" );
     if Coffee.Grind( Morning ) /= Coffee.Espresso then
       Report.Failed ("Result of Assignment");
     end if;
   end Sunset;
 
   Report.Result;
 
 end C393A05;
 
 
 
