-- C974008.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 abortable part of an asynchronous select statement
--      is not started if the triggering statement is a task entry call, and
--      the entry call is not queued.
--
--      Check that the sequence of statements of the triggering alternative
--      is executed after the abortable part is left.
--
-- TEST DESCRIPTION:
--      Declare a main procedure containing an asynchronous select with a task
--      entry call as triggering statement.  Ensure that the task is waiting
--      at the accept statement so the rendezvous is executed immediately (the
--      entry call is not queued). 
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

package C974008_0 is  -- Automated teller machine abstraction.


   -- Flags for testing purposes:

   Triggering_Statement_Completed : Boolean := False;
   Count                          : Integer := 1234;  -- Global to defeat
                                                      -- optimization.

   type Key_Enum is (None, Cancel, Deposit, Withdraw);

   type Card_Number_Type is private;
   type Card_PIN_Type    is private;
   type ATM_Card_Type    is private;


   Transaction_Canceled : exception;


   task type ATM_Keyboard_Task is
      entry Cancel_Pressed;
   end ATM_Keyboard_Task;


   procedure Read_Card (Card : in out ATM_Card_Type);


   procedure Perform_Transaction (Card : in ATM_Card_Type);

private

   type Card_Number_Type is range   1 .. 9999;
   type Card_PIN_Type    is range 100 ..  999;

   type ATM_Card_Type is record
      Number : Card_Number_Type;
      PIN    : Card_PIN_Type;
   end record;

end C974008_0;


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


with Report;
package body C974008_0 is


   procedure Listen_For_Input (Key : out Key_Enum) is
   begin
      -- Simulate the situation where the user presses the cancel key
      -- before the card is validated

      -- press the cancel key immediately
      Key := Cancel;

   end Listen_For_Input;



   -- One of these gets created as "Keyboard" for each transaction
   --
   task body ATM_Keyboard_Task is
      Key_Pressed : Key_Enum := None;
   begin
      -- NOTE:   Normal usage for this routine would be the loop with 
      --         the select statement included.  This particular test
      --         requires that the task be waiting at the accept 
      --         for the call.  To ensure that this is the case the 
      --         extraneous commands are commented out (we leave them
      --         in this form to show the reader the surrounds to the 
      --         fragment of code remaining)
 
      -- loop
                                         
         Listen_For_Input (Key_Pressed); 
                                         
         -- select
            -- when (Key_Pressed = Cancel) =>                 -- Guard is now
               accept Cancel_Pressed do                    -- true, so accept
                  Triggering_Statement_Completed := True;  -- queued entry
               end Cancel_Pressed;                         -- call.

               -- User has cancelled the transaction so we exit the
               -- loop and allow the task to terminate
               -- exit;
         -- else
            -- Key_Pressed := None;
         -- end select;

      -- end loop;
   exception
      when others =>
          Report.Failed ("Unexpected Exception in ATM_Keyboard_Task");
   end ATM_Keyboard_Task;



   procedure Read_Card (Card : in out ATM_Card_Type) is
   begin
      Card.Number := 9999;
      Card.PIN    := 111;
   end Read_Card;


   procedure Perform_Transaction (Card : in ATM_Card_Type) is
   begin
      Report.Failed ("Triggering alternative sequence of statements " &
                     "not executed");
      if not Triggering_Statement_Completed then
         Report.Failed ("Triggering statement did not complete");
      end if;
   end Perform_Transaction;


end C974008_0;


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


with Report;
with ImpDef;

with C974008_0;  -- Automated teller machine abstraction.
use  C974008_0;

procedure C974008 is

   Card_Data : ATM_Card_Type;

begin  -- Main program.

   Report.Test ("C974008", "Asynchronous Select: Trigger is a call to a " &
                           "waiting task entry and completes immediately");

   Read_Card (Card_Data);

   declare
      -- Create the task for this transaction
      Keyboard : C974008_0.ATM_Keyboard_Task;    
   begin

      -- Ensure task is waiting at the accept
      -- This is the time required to activate another task and allow it
      -- to run to its first accept statement.
      --
      delay ImpDef.Switch_To_New_Task;

      --                                    --
      -- Asynchronous select is tested here --
      --                                    --

      select
         Keyboard.Cancel_Pressed;      -- Entry call is executed immediately

         raise Transaction_Canceled;   -- This is executed after Validate_Card
                                       -- is aborted.
      then abort

         -- In other similar tests Validate_Card is called here.  In this 
         -- test we just check to see if the abortable part is called at
         -- all.  Since the triggering call is not queued the abortable 
         -- part should not be started
         --
         Report.Failed ("Abortable part started");

      end select;

      Perform_Transaction (Card_Data); -- Should not be reached.
   exception
      when Transaction_Canceled =>

         if not Triggering_Statement_Completed then
            Report.Failed ("Triggering alternative sequence of statements " &
                           "executed but triggering statement not complete");
         end if;

   end;

   Report.Result;

end C974008;
