-- C910001.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 tasks may have discriminants. Specifically, check where -- the subtype of the discriminant is a discrete subtype and where it is -- an access subtype. Check the case where the default values of the -- discriminants are used. -- -- TEST DESCRIPTION: -- A task is defined with two discriminants, one a discrete subtype and -- another that is an access subtype. Tasks are created with various -- values for discriminants and code within the task checks that these -- are passed in correctly. One instance of a default is used. The -- values passed to the task as the discriminants are taken from an -- array of test data and the values received are checked against the -- same array. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! with Report; procedure C910001 is type App_Priority is range 1..10; Default_Priority : App_Priority := 5; type Message_ID is range 1..10_000; type TC_Number_of_Messages is range 1..5; type TC_rec is record TC_ID : Message_ID; A_Priority : App_Priority; TC_Checked : Boolean; end record; -- This table is used to create the messages and to check them TC_table : array (1..TC_Number_of_Messages'Last) of TC_Rec := ( ( 10, 6, false ), ( 20, 2, false ), ( 30, 9, false ), ( 40, 1, false ), ( 50, Default_Priority, false ) ); begin -- C910001 Report.Test ("C910001", "Check that tasks may have discriminants"); declare -- encapsulate the test type Transaction_Record is record ID : Message_ID; Account_Number : integer := 0; Stock_Number : integer := 0; Quantity : integer := 0; Return_Value : integer := 0; end record; -- type acc_Transaction_Record is access Transaction_Record; task type Message_Task (In_Message : acc_Transaction_Record := null; In_Priority : App_Priority := Default_Priority) is entry Start; end Message_Task; type acc_Message_Task is access Message_Task; -- -- task body Message_Task is This_Message : acc_Transaction_Record := In_Message; This_Priority : App_Priority := In_Priority; TC_Match_Found : Boolean := false; begin accept Start; -- In the example envisioned this task would then queue itself -- upon some Distributor task which would send it off (requeue) to -- the message processing tasks according to the priority of the -- message and the current load on the system. For the test we -- just verify the data passed in as discriminants and exit the task -- -- Check for the special case of default discriminants if This_Message = null then -- The default In_Message has been passed, check that the -- default priority was also passed if This_Priority /= Default_Priority then Report.Failed ("Incorrect Default Priority"); end if; if TC_Table (TC_Number_of_Messages'Last).TC_Checked then Report.Failed ("Duplicate Default messages"); else -- Mark that default has been seen TC_Table (TC_Number_of_Messages'Last).TC_Checked := True; end if; TC_Match_Found := true; else -- Check the data against the table for i in TC_Number_of_Messages loop if TC_Table(i).TC_ID = This_Message.ID then -- this is the right slot in the table if TC_Table(i).TC_checked then -- Already checked Report.Failed ("Duplicate Data"); else TC_Table(i).TC_checked := true; end if; TC_Match_Found := true; if TC_Table(i).A_Priority /= This_Priority then Report.Failed ("ID/Priority mismatch"); end if; exit; end if; end loop; end if; if not TC_Match_Found then Report.Failed ("No ID match in table"); end if; -- Allow the task to terminate end Message_Task; -- The Line Driver task accepts data from an external source and -- builds them into a transaction record. It then generates a -- message task. This message "contains" the record and is given -- a priority according to the contents of the message. The priority -- and transaction records are passed to the task as discriminants. -- In this test we use a dummy record. Only the ID is of interest -- so we pick that and the required priority from an array of -- test data. We artificially limit the endless driver-loop to -- the number of messages required for the test and add a special -- case to check the defaults. -- task Driver_Task; -- task body Driver_Task is begin -- Create all but one of the required tasks -- for i in 1..TC_Number_of_Messages'Last - 1 loop declare -- Create a record for the next message Next_Transaction : acc_Transaction_Record := new Transaction_Record; -- Create a task for the next message Next_Message_Task : acc_Message_Task := new Message_Task( Next_Transaction, TC_Table(i).A_Priority ); begin -- Artificially plug the ID with the next from the table -- In reality the whole record would be built here Next_Transaction.ID := TC_Table(i).TC_ID; -- Ensure the task does not start executing till the -- transaction record is properly constructed Next_Message_Task.Start; end; -- declare end loop; -- For this subtest create one task with the default discriminants -- declare -- Create the task Next_Message_Task : acc_Message_Task := new Message_Task; begin Next_Message_Task.Start; end; -- declare end Driver_Task; begin null; end; -- encapsulation -- Now verify that all the tasks executed and checked in for i in TC_Number_of_Messages loop if not TC_Table(i).TC_Checked then Report.Failed ("Task" & integer'image(integer (i) ) & " did not verify"); end if; end loop; Report.Result; end C910001;