-- C974004.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 aborted if it does not complete before the triggering statement
--      completes, where the triggering statement is a task entry call,
--      the entry call is queued, and the entry call completes by propagating
--      an exception and that the sequence of statements of the triggering 
--      alternative is not executed after the abortable part is left and that
--      the exception propagated by the entry call is re-raised immediately
--      following the asynchronous select.
--
-- TEST DESCRIPTION:
--      Declare a main procedure containing an asynchronous select with a task
--      entry call as triggering statement. Force the entry call to be
--      queued by having the task call a procedure, prior to the corresponding
--      accept statement, which simulates a routine waiting for user input
--      (with a delay). 
--
--      Simulate a time-consuming routine in the abortable part by calling a
--      procedure containing an infinite loop. Meanwhile, simulate input by
--      the user (the delay expires), which causes the task to execute the
--      accept statement corresponding to the triggering entry call. Raise
--      an exception in the accept statement which is not handled by the task,
--      and which is thus propagated to the caller.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

package C974004_0 is  -- Automated teller machine abstraction.


   -- Flags for testing purposes:

   Count                          : Integer := 1234;  -- Global to defeat
                                                      -- optimization.
   Propagated_From_Task : exception;


   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 Validate_Card (Card : in 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 C974004_0;


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


with Report;
with ImpDef;

package body C974004_0 is


   procedure Listen_For_Input (Key : out Key_Enum) is
   begin
      -- Simulate the situation where a user waits a bit for the card to
      -- be validated, then presses cancel before it completes.

      -- Delay long enough to force queuing of Keyboard.Cancel_Pressed.
      delay ImpDef.Clear_Ready_Queue;

      if Report.Equal (3, 3) then  -- Always true.
         Key := Cancel;
      end if;
   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
      loop
                                               -- Force entry calls to be
         Listen_For_Input (Key_Pressed);       -- queued, then set guard to
                                               -- true.
         select
            when (Key_Pressed = Cancel) =>     -- Guard is now true, so accept
               accept Cancel_Pressed do        -- queued entry call.
                  null;  --:::: user code for cancel
                  -- Now simulate an unexpected exception arising in the
                  -- user code
                  raise Propagated_From_Task;  -- Propagate an exception.
                  
               end Cancel_Pressed;

               Report.Failed 
                          ("Exception not propagated in ATM_Keyboard_Task");
               
               -- User has canceled the transaction so we exit the
               -- loop and allow the task to terminate
               exit;
         else
            Key_Pressed := None;
         end select;
      end loop;
   exception
      when Propagated_From_Task =>
          null;  -- This is the expected test behavior
      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 Validate_Card (Card : in ATM_Card_Type) is
   begin
      -- Simulate an exceedingly long validation activity.
      loop                                             -- Infinite loop.
         Count := (Count + 1) mod Integer (Card.PIN);
         -- Synch. point to allow transfer of control to Keyboard
         -- task during this simulation
         delay ImpDef.Minimum_Task_Switch;
         exit when not Report.Equal (Count, Count);    -- Always false.
      end loop;
   end Validate_Card;


   procedure Perform_Transaction (Card : in ATM_Card_Type) is
   begin
      Report.Failed ("Exception not re-raised immediately following " &
                     "asynchronous select");
      if Count = 1234 then
         -- Initial value is unchanged
         Report.Failed ("Abortable part did not execute");
      end if;
   end Perform_Transaction;


end C974004_0;


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


with Report;

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

procedure C974004 is

   Card_Data : ATM_Card_Type;

begin  -- Main program.

   Report.Test ("C974004", "Asynchronous Select: Trigger is queued on a " &
                           "task entry and is completed first by an " &
                           "exception");

   Read_Card (Card_Data);

   begin

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

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

         select
            Keyboard.Cancel_Pressed;     -- Entry call initially queued, so
                                         -- abortable part starts.

            raise Transaction_Canceled;  -- Should not be executed.
         then abort
            Validate_Card (Card_Data);   -- Keyboard.Cancel_Pressed is accepted
                                         -- and propagates an exception before
                                         -- this call finishes; it is then
                                         -- aborted.

            -- Check that the whole of the abortable part is aborted, not
            -- just the statement in the abortable part that was executing
            -- at the time
            Report.Failed ("Abortable part not aborted");
         end select;
                                         -- The propagated exception is
                                         -- re-raised here; control passes to
                                         -- the exception handler.

         Perform_Transaction(Card_Data); -- Should not be reached.
      exception
         when Transaction_Canceled =>
            Report.Failed ("Triggering alternative sequence of statements " &
                           "executed");
         when Propagated_From_Task =>
            -- This is the expected test path
            if Count = 1234 then
               -- Initial value is unchanged
               Report.Failed ("Abortable part did not execute");
            end if;
         when Tasking_Error  =>
            Report.Failed ("Tasking_Error raised");
         when others  =>
            Report.Failed ("Wrong exception raised"); 
      end;

   exception
      when Propagated_From_Task =>
         Report.Failed ("Correct exception raised at wrong level");
      when  others  =>
         Report.Failed ("Wrong exception raised at wrong level");
   end;

   Report.Result;

end C974004;
