-- C974003.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, and
--      the entry call is 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. 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.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

package C974003_0 is  -- Automated teller machine abstraction.


   -- Flags for testing purposes:
   --
   TC_Triggering_Statement_Completed : Boolean := False;
   TC_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 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 C974003_0;


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


with Report;
with ImpDef;

package body C974003_0 is


   procedure Listen_For_Input (Key : out Key_Enum) is
   begin
      -- Model the situation where the 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.Minimum_Task_Switch;

      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
         Listen_For_Input (Key_Pressed);                   -- to be queued,
                                                           -- then set guard to
                                                           -- true.
         select
            when (Key_Pressed = Cancel) =>                 -- Guard is now
               accept Cancel_Pressed do                    -- true, so accept
                  TC_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 Validate_Card (Card : in ATM_Card_Type) is
   begin
      -- Simulate an exceedingly long validation activity.
      loop                                             -- Infinite loop.
         TC_Count := (TC_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 (TC_Count, TC_Count);    -- Always false.
      end loop;
   end Validate_Card;


   procedure Perform_Transaction (Card : in ATM_Card_Type) is
   begin
      Report.Failed ("Triggering alternative sequence of statements " &
                     "not executed");
      if not TC_Triggering_Statement_Completed then
         Report.Failed ("Triggering statement did not complete");
      end if;
      if TC_Count = 1234 then
         -- Initial value is unchanged
         Report.Failed ("Abortable part did not execute");
      end if;
   end Perform_Transaction;


end C974003_0;


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


with Report;

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

procedure C974003 is

   Card_Data : ATM_Card_Type;

begin  -- Main program.

   Report.Test ("C974003", "Asynchronous Select: Trigger is queued on a " &
                            "task entry and completes first");

   Read_Card (Card_Data);

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

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

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

         raise Transaction_Canceled;   -- This is executed after Validate_Card
                                       -- is aborted.
      then abort
         Validate_Card (Card_Data);    -- Keyboard.Cancel_Pressed is accepted
                                       -- and completes 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;

      Perform_Transaction (Card_Data); -- Should not be reached.
   exception
      when Transaction_Canceled =>
         if not TC_Triggering_Statement_Completed then
            Report.Failed ("Triggering alternative sequence of statements " &
                           "executed but triggering statement not complete");
         end if;
         if TC_Count = 1234 then
            -- Initial value is unchanged
            Report.Failed ("Abortable part did not execute");
         end if;
   end;

   Report.Result;

end C974003;
