-- C954025.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 if the original entry call was a conditional entry call,
--      the call is cancelled if a requeue-with-abort of the call is not
--      selected immediately.
--      Check that if the original entry call was a timed entry call, the 
--      expiration time for a requeue-with-abort is the original expiration 
--      time.
--
-- TEST DESCRIPTION:
--      This test declares two tasks: Launch_Control and Mission_Control.
--      Mission_Control instructs Launch_Control to start its countdown
--      and then requeues (with abort) to the Launch_Control.Launch 
--      entry.  This call to Launch will be accepted at the end of the
--      countdown (if the task is still waiting).
--      The main task does an unconditional, conditional, and timed 
--      entry call to Mission_Control and checks to see if the launch
--      was accepted.
--
--
-- CHANGE HISTORY:
--      18 OCT 95   SAIC    ACVC 2.1
--      10 JUL 96   SAIC    Incorporated reviewer's comments.
--
--!

with Calendar;   use type Calendar.Time;
with Report;
with ImpDef;
procedure C954025 is
  Verbose : constant Boolean := False;
  Countdown_Amount : constant Duration := 2.0 * Impdef.One_Second;
  Plenty_Of_Time : constant Duration := 
         Countdown_Amount + ImpDef.Clear_Ready_Queue + 1.0 * Impdef.One_Second;
  Not_Enough_Time : constant Duration :=
         Countdown_Amount - 0.5 * Impdef.One_Second;
begin
  Report.Test ("C954025",
               "Check that if the original entry" &
               " call was a conditional or timed entry call, the" &
               " expiration time for a requeue with abort is the" &
               " original expiration time");
  declare
     -- note that the following object is a shared object and its use
     -- governed by the rules of 9.10(3,4,8);6.0
     Launch_Accepted : Boolean := False;

     task Launch_Control is
        entry Enable_Launch_Control;
        entry Start_Countdown (How_Long : Duration);
        -- Launch will be accepted if a call is waiting when the countdown
        -- reaches 0
        entry Launch;
     end Launch_Control;

     task body Launch_Control is
        Wait_Amount : Duration := 0.0;
     begin
        loop
           select
              accept Enable_Launch_Control do
                 Launch_Accepted := False;
              end Enable_Launch_Control;
           or
              terminate;
           end select;

           accept Start_Countdown (How_Long : Duration) do
                 Wait_Amount := How_Long;
           end Start_Countdown;

           delay Wait_Amount;

           select
              accept Launch do
                 Launch_Accepted := True;
              end Launch;
           else
              null;
              -- note that Launch_Accepted is False here
           end select;
        end loop;
     end Launch_Control;

     task Mission_Control is
        --  launch will occur if we are given enough time to complete
        --  a standard countdown.  We will not be rushed!
        entry Do_Launch;
     end Mission_Control;

     task body Mission_Control is
     begin
        loop
           select
              accept Do_Launch do
                 Launch_Control.Start_Countdown (Countdown_Amount);
                 requeue Launch_Control.Launch with abort;
              end Do_Launch;
           or
              terminate;
           end select;
        end loop;
     end Mission_Control;
     
  begin   -- test encapsulation
     -- unconditional entry call to check the simple case
     Launch_Control.Enable_Launch_Control;
     Mission_Control.Do_Launch;
     if Launch_Accepted then
        if Verbose then
           Report.Comment ("simple case passed");
        end if;
      else
         Report.Failed ("simple case");
      end if;

  
     -- timed but with plenty of time - delay relative
     Launch_Control.Enable_Launch_Control;
     select
        Mission_Control.Do_Launch;
     or 
        delay Plenty_Of_Time;
        if Launch_Accepted then
           Report.Failed ("plenty of time timed out after accept (1)");
        end if;
     end select;
     if Launch_Accepted then
        if Verbose then
           Report.Comment ("plenty of time case passed (1)");
        end if;
      else
         Report.Failed ("plenty of time (1)");
      end if;

  
     -- timed but with plenty of time  -- delay until
     Launch_Control.Enable_Launch_Control;
     select
        Mission_Control.Do_Launch;
     or 
        delay until Calendar.Clock + Plenty_Of_Time;
        if Launch_Accepted then
           Report.Failed ("plenty of time timed out after accept(2)");
        end if;
     end select;
     if Launch_Accepted then
        if Verbose then
           Report.Comment ("plenty of time case passed (2)");
        end if;
      else
         Report.Failed ("plenty of time (2)");
      end if;

  
     -- timed without enough time - delay relative
     Launch_Control.Enable_Launch_Control;
     select
        Mission_Control.Do_Launch;
        Report.Failed ("not enough time completed accept (1)");
     or 
        delay Not_Enough_Time;
     end select;
     if Launch_Accepted then
        Report.Failed ("not enough time (1)");
      else
        if Verbose then
           Report.Comment ("not enough time case passed (1)");
        end if;
      end if;

  
     -- timed without enough time - delay until
     Launch_Control.Enable_Launch_Control;
     select
        Mission_Control.Do_Launch;
        Report.Failed ("not enough time completed accept (2)");
     or 
        delay until Calendar.Clock + Not_Enough_Time;
     end select;
     if Launch_Accepted then
        Report.Failed ("not enough time (2)");
      else
        if Verbose then
           Report.Comment ("not enough time case passed (2)");
        end if;
      end if;

  
     -- conditional case
     Launch_Control.Enable_Launch_Control;
     -- make sure Mission_Control is ready to accept immediately
     delay ImpDef.Clear_Ready_Queue; 
     select
        Mission_Control.Do_Launch;
        Report.Failed ("no time completed accept");
     else
        if Verbose then
           Report.Comment ("conditional case - else taken");
         end if;
     end select;
     if Launch_Accepted then
        Report.Failed ("no time");
      else
        if Verbose then
           Report.Comment ("no time case passed");
        end if;
      end if;

  end;

  Report.Result;
end C954025;
