view gcc/testsuite/ada/acats/tests/cxa/cxacc01.a @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
line wrap: on
line source

-- CXACC01.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 use of 'Class'Output and 'Class'Input allow stream 
--      manipulation of objects of non-limited class-wide types.
--
-- TEST DESCRIPTION:
--      This test demonstrates the uses of 'Class'Output and 'Class'Input
--      in moving objects of a particular class to and from a stream file.
--      A procedure uses a class-wide parameter to move objects of specific 
--      types in the class to the stream, using the 'Class'Output attribute 
--      of the root type of the class.  A function returns a class-wide object, 
--      using the 'Class'Input attribute of the root type of the class to 
--      extract the object from the stream.
--      A field-by-field comparison of record objects is performed to validate
--      the data read from the stream.  Operator precedence rules are used
--      in the comparison rather than parentheses.
--      
-- APPLICABILITY CRITERIA: 
--      This test is applicable to all implementations capable of supporting
--      external Stream_IO files.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      14 Nov 95   SAIC    Corrected prefix of 'Tag attribute for ACVC 2.0.1.
--      24 Aug 96   SAIC    Changed a call to "Create" to "Reset".
--      26 Feb 97   CTA.PWB Allowed for non-support of some IO operations.
--!

with FXACC00, Ada.Streams.Stream_IO, Ada.Tags, Report;

procedure CXACC01 is

   Order_File     : Ada.Streams.Stream_IO.File_Type;
   Order_Stream   : Ada.Streams.Stream_IO.Stream_Access;
   Order_Filename : constant String := 
                           Report.Legal_File_Name ( Nam => "CXACC01" );
   Incomplete : exception;

begin

   Report.Test ("CXACC01", "Check that the use of 'Class'Output "        &
                           "and 'Class'Input allow stream manipulation " &
                           "of objects of non-limited class-wide types");

   Test_for_Stream_IO_Support:
   begin

      -- If an implementation does not support Stream_IO in a particular
      -- environment, the exception Use_Error or Name_Error will be raised on 
      -- calls to various Stream_IO operations.  This block statement 
      -- encloses a call to Create, which should produce an exception in a 
      -- non-supportive environment.  These exceptions will be handled to 
      -- produce a Not_Applicable result.

      Ada.Streams.Stream_IO.Create (Order_File, 
                                    Ada.Streams.Stream_IO.Out_File,
                                    Order_Filename);

   exception

       when Ada.Streams.Stream_IO.Use_Error | Ada.Streams.Stream_IO.Name_Error =>
          Report.Not_Applicable
             ( "Files not supported - Create as Out_File for Stream_IO" );
          raise Incomplete;

   end Test_for_Stream_IO_Support;

   Operational_Test_Block:
   declare

      -- Store tag values associated with objects of tagged types.

      TC_Box_Office_Tag : constant String :=
        Ada.Tags.External_Tag(FXACC00.Ticket_Request'Tag);

      TC_Summer_Tag     : constant String :=
        Ada.Tags.External_Tag(FXACC00.Subscriber_Request'Tag);

      TC_Mayoral_Tag    : constant String :=
        Ada.Tags.External_Tag(FXACC00.VIP_Request'Tag);

      TC_Late_Tag       : constant String :=
        Ada.Tags.External_Tag(FXACC00.Last_Minute_Request'Tag);

         -- The following procedure will take an object of the Ticket_Request
         -- class and output it to the stream.  Objects of any extended type
         -- in the class can be output to the stream with this procedure.

      procedure Order_Entry (Order : FXACC00.Ticket_Request'Class) is
      begin
         FXACC00.Ticket_Request'Class'Output (Order_Stream, Order);
      end Order_Entry;


      -- The following function will retrieve from the stream an object of
      -- the Ticket_Request class.

      function Order_Retrieval return FXACC00.Ticket_Request'Class is
      begin
         return FXACC00.Ticket_Request'Class'Input (Order_Stream);
      end Order_Retrieval;

   begin

      Order_Stream := Ada.Streams.Stream_IO.Stream (Order_File);

      -- Store the data objects in the stream.
      -- Each of the objects is of a different type within the class.

      Order_Entry (FXACC00.Box_Office_Request);     -- Object of root type
      Order_Entry (FXACC00.Summer_Subscription);    -- Obj. of extended type
      Order_Entry (FXACC00.Mayoral_Ticket_Request); -- Obj. of extended type
      Order_Entry (FXACC00.Late_Request);           -- Object of twice 
                                                    -- extended type.

      -- Reset mode of stream to In_File prior to reading data from it.
      Reset1:
      begin
         Ada.Streams.Stream_IO.Reset (Order_File, 
                                      Ada.Streams.Stream_IO.In_File);
      exception
         when Ada.Streams.Stream_IO.Use_Error =>
            Report.Not_Applicable
               ( "Reset to In_File not supported for Stream_IO - 1" );
            raise Incomplete;
      end Reset1;

      Process_Order_Block:
      declare

         use FXACC00;

         -- Declare variables of the root type class,
         -- and initialize them with class-wide objects returned from
         -- the stream as function result.

         Order_1 : Ticket_Request'Class := Order_Retrieval;
         Order_2 : Ticket_Request'Class := Order_Retrieval;
         Order_3 : Ticket_Request'Class := Order_Retrieval;
         Order_4 : Ticket_Request'Class := Order_Retrieval;

         -- Declare objects of the specific types from within the class
         -- that correspond to the types of the data written to the
         -- stream.  Perform a type conversion on the class-wide objects.

         Ticket_Order      : Ticket_Request := 
                                Ticket_Request(Order_1);
         Subscriber_Order  : Subscriber_Request := 
                                Subscriber_Request(Order_2);
         VIP_Order         : VIP_Request := 
                                VIP_Request(Order_3);
         Last_Minute_Order : Last_Minute_Request := 
                                Last_Minute_Request(Order_4);

      begin

         -- Perform a field-by-field comparison of all the class-wide 
         -- objects input from the stream with specific type objects
         -- originally written to the stream.

         if Ticket_Order.Location                /= 
            Box_Office_Request.Location          or
            Ticket_Order.Number_Of_Tickets       /=
            Box_Office_Request.Number_Of_Tickets 
         then
            Report.Failed ("Ticket_Request object validation failure");
         end if;

         if Subscriber_Order.Location               /=
            Summer_Subscription.Location            or
            Subscriber_Order.Number_Of_Tickets      /=
            Summer_Subscription.Number_Of_Tickets   or
            Subscriber_Order.Subscription_Number    /=
            Summer_Subscription.Subscription_Number
         then
            Report.Failed ("Subscriber_Request object validation failure");
         end if;

         if VIP_Order.Location                       /=
            Mayoral_Ticket_Request.Location          or
            VIP_Order.Number_Of_Tickets              /=
            Mayoral_Ticket_Request.Number_Of_Tickets or
            VIP_Order.Rank                           /=
            Mayoral_Ticket_Request.Rank              
         then
            Report.Failed ("VIP_Request object validation failure");
         end if;

         if Last_Minute_Order.Location               /=
            Late_Request.Location                    or
            Last_Minute_Order.Number_Of_Tickets      /=
            Late_Request.Number_Of_Tickets           or
            Last_Minute_Order.Rank                   /=
            Late_Request.Rank                        or
            Last_Minute_Order.Special_Consideration  /=
            Late_Request.Special_Consideration       or
            Last_Minute_Order.Donation               /=
            Late_Request.Donation                    
         then
            Report.Failed ("Last_Minute_Request object validation failure");
         end if;

         -- Verify tag values from before and after processing.
         -- The 'Tag attribute is used with objects of a class-wide type.
   
         if TC_Box_Office_Tag /= 
            Ada.Tags.External_Tag(Order_1'Tag)
         then
            Report.Failed("Failed tag comparison - 1");
         end if;
     
         if TC_Summer_Tag /=
            Ada.Tags.External_Tag(Order_2'Tag)
         then
            Report.Failed("Failed tag comparison - 2");
         end if;

         if TC_Mayoral_Tag /=  
            Ada.Tags.External_Tag(Order_3'Tag)
         then
            Report.Failed("Failed tag comparison - 3");
         end if;

         if TC_Late_Tag /=     
            Ada.Tags.External_Tag(Order_4'Tag)
         then
            Report.Failed("Failed tag comparison - 4");
         end if;

      end Process_Order_Block;

         -- After all the data has been correctly extracted, the file 
         -- should be empty.

      if not Ada.Streams.Stream_IO.End_Of_File (Order_File) then
         Report.Failed ("Stream file not empty");
      end if;

   exception
      when Incomplete =>
         raise; 
      when Constraint_Error =>
         Report.Failed ("Constraint_Error raised in Operational Block");
      when others => 
         Report.Failed ("Exception raised in Operational Test Block");
   end Operational_Test_Block;

   Deletion:
   begin
      if Ada.Streams.Stream_IO.Is_Open (Order_File) then
         Ada.Streams.Stream_IO.Delete (Order_File);
      else
         Ada.Streams.Stream_IO.Open (Order_File,
                                     Ada.Streams.Stream_IO.Out_File, 
                                     Order_Filename);
         Ada.Streams.Stream_IO.Delete (Order_File);
      end if;
   exception
      when others =>
         Report.Failed
            ( "Delete not properly implemented for Stream_IO" );
   end Deletion;

   Report.Result;

exception

   when Incomplete =>
      Report.Result;
   when others     =>
      Report.Failed ( "Unexpected exception" );
      Report.Result;

end CXACC01;