c910001.a

来自「linux下编程用 编译软件」· A 代码 · 共 225 行

A
225
字号
-- 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;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?