view gcc/testsuite/ada/acats/tests/cxa/cxac004.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- CXAC004.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 Stream_Access type and Stream function found in package
--      Ada.Text_IO.Text_Streams allows a text file to be processed with the 
--      functionality of streams.
--
-- TEST DESCRIPTION:
--      This test verifies that the package Ada.Text_IO.Text_Streams is 
--      available and that the functionality it contains allows a text file to
--      be manipulated as a stream.
--      The test defines data objects of a variety of types that can be stored
--      in a text file.  A text file and associated text stream are then 
--      defined, and the 'Write attribute is used to enter the individual data
--      items into the text stream.  Once all the individual data items have 
--      been written to the stream, the 'Output attribute is used to write 
--      arrays of these same data objects to the stream.
--      The text file is reset to serve as an input file, and the 'Read 
--      attribute is used to extract the individual data items from the 
--      stream.  These items are then verified against the data originally 
--      written to the stream. Finally, the 'Input attribute is used to 
--      extract the data arrays from the stream. These arrays are then 
--      verified against the original data written to the stream.
--
-- APPLICABILITY CRITERIA: 
--      Applicable to implementations that support external text files.
--       
-- CHANGE HISTORY:
--      06 Jul 95   SAIC    Initial prerelease version.
--      26 Feb 97   PWB.CTA Allowed for non-support of some IO operations;
--                          removed requirement for support of decimal types.
--!

with Report;
with Ada.Text_IO;
with Ada.Text_IO.Text_Streams;
with Ada.Characters.Latin_1;
with Ada.Strings.Unbounded;

procedure CXAC004 is

   Data_File     : Ada.Text_IO.File_Type;
   Data_Filename : constant String := 
                           Report.Legal_File_Name ( Nam => "CXAC004" );
   Incomplete : exception;

begin

   Report.Test ("CXAC004", "Check that the Stream_Access type and Stream "   &
                           "function found in package "                      &
                           "Ada.Text_IO.Text_Streams allows a text file to " &
                           "be processed with the functionality of streams");

   Test_for_IO_Support:
   begin

      -- Check for Text_IO support in creating the data file.  If the 
      -- implementation does not support external files, Name_Error or 
      -- Use_Error will be raised at the point of the following call to 
      -- Create, resulting in a Not_Applicable test result.

      Ada.Text_IO.Create(Data_File, Ada.Text_IO.Out_File, Data_Filename);

   exception

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

   end Test_for_IO_Support;

   Test_Block:
   declare
      use Ada.Characters.Latin_1, Ada.Strings.Unbounded;
      TC_Items  : constant := 3;

      -- Declare types and objects that will be used as data values to be
      -- written to and read from the text file/stream.

      type Enum_Type          is (Red, Yellow, Green, Blue, Indigo);
      type Fixed_Type         is delta 0.125 range 0.0..255.0;
      type Float_Type         is digits 7 range 0.0..1.0E5;
      type Modular_Type       is mod 256;  
      subtype Str_Type        is String(1..4);

      type Char_Array_Type    is array (1..TC_Items) of Character;
      type Enum_Array_Type    is array (1..TC_Items) of Enum_Type;
      type Fixed_Array_Type   is array (1..TC_Items) of Fixed_Type;
      type Float_Array_Type   is array (1..TC_Items) of Float_Type;
      type Int_Array_Type     is array (1..TC_Items) of Integer;
      type Mod_Array_Type     is array (1..TC_Items) of Modular_Type;
      type Str_Array_Type     is array (1..TC_Items) of Str_Type;
      type Unb_Str_Array_Type is array (1..TC_Items) of Unbounded_String;

      Char_Array      : Char_Array_Type    := ('A', 'z', Yen_Sign);
      TC_Char_Array_1,
      TC_Char_Array_2 : Char_Array_Type    := (others => Space);

      Enum_Array      : Enum_Array_Type    := (Blue, Yellow, Indigo);
      TC_Enum_Array_1,
      TC_Enum_Array_2 : Enum_Array_Type    := (others => Red);

      Fix_Array       : Fixed_Array_Type   := (0.125, 123.5, 250.750);
      TC_Fix_Array_1,
      TC_Fix_Array_2  : Fixed_Array_Type   := (others => 0.0);

      Flt_Array       : Float_Array_Type   := (1.0, 150.0, 1500.0);
      TC_Flt_Array_1,
      TC_Flt_Array_2  : Float_Array_Type   := (others => 0.0);

      Int_Array       : Int_Array_Type     := (124, 2349, -24_001);
      TC_Int_Array_1,
      TC_Int_Array_2  : Int_Array_Type     := (others => -99);

      Mod_Array       : Mod_Array_Type     := (10, 127, 255);
      TC_Mod_Array_1,
      TC_Mod_Array_2  : Mod_Array_Type     := (others => 0);

      Str_Array       : Str_Array_Type     := ("abcd", "klmn", "wxyz");
      TC_Str_Array_1,
      TC_Str_Array_2  : Str_Array_Type     := (others => "    ");

      UStr_Array      : Unb_Str_Array_Type := 
                                        (To_Unbounded_String("cat"),
                                         To_Unbounded_String("testing"),
                                         To_Unbounded_String("ACVC"));
      TC_UStr_Array_1,
      TC_UStr_Array_2 : Unb_Str_Array_Type := 
                                        (others => Null_Unbounded_String);

      -- Create a stream access object pointing to the data file.

      Data_Stream : Ada.Text_IO.Text_Streams.Stream_Access := 
                      Ada.Text_IO.Text_Streams.Stream(File => Data_File);

   begin

      -- Use the 'Write attribute to enter the three sets of data items
      -- into the data stream.  
      -- Note that the data will be mixed within the text file.

      for i in 1..TC_Items loop
         Character'Write       (Data_Stream, Char_Array(i));
         Enum_Type'Write       (Data_Stream, Enum_Array(i));
         Fixed_Type'Write      (Data_Stream, Fix_Array(i));
         Float_Type'Write      (Data_Stream, Flt_Array(i));
         Integer'Write         (Data_Stream, Int_Array(i));
         Modular_Type'Write    (Data_Stream, Mod_Array(i));
         Str_Type'Write        (Data_Stream, Str_Array(i));
         Unbounded_String'Write(Data_Stream, UStr_Array(i));
      end loop;

      -- Use the 'Output attribute to enter the entire arrays of each 
      -- type of data items into the data stream.  
      -- Note that the array bounds will be written to the stream as part 
      -- of the action of the 'Output attribute.

      Char_Array_Type'Output    (Data_Stream, Char_Array);
      Enum_Array_Type'Output    (Data_Stream, Enum_Array);
      Fixed_Array_Type'Output   (Data_Stream, Fix_Array);
      Float_Array_Type'Output   (Data_Stream, Flt_Array);
      Int_Array_Type'Output     (Data_Stream, Int_Array);
      Mod_Array_Type'Output     (Data_Stream, Mod_Array);
      Str_Array_Type'Output     (Data_Stream, Str_Array);
      Unb_Str_Array_Type'Output (Data_Stream, UStr_Array);

      -- Reset the data file to mode In_File.  The data file will now serve
      -- as the source of data which will be compared to the original data
      -- written to the file above.
      Reset1:
      begin
         Ada.Text_IO.Reset (File => Data_File, Mode => Ada.Text_IO.In_File);
      exception
         when Ada.Text_IO.Use_Error =>
            Report.Not_Applicable
               ( "Reset to In_File not supported for Text_IO" );
            raise Incomplete;
      end Reset1;

      -- Extract and validate all the single data items from the stream.

      for i in 1..TC_Items loop
         Character'Read        (Data_Stream, TC_Char_Array_1(i));
         Enum_Type'Read        (Data_Stream, TC_Enum_Array_1(i));
         Fixed_Type'Read       (Data_Stream, TC_Fix_Array_1(i));
         Float_Type'Read       (Data_Stream, TC_Flt_Array_1(i));
         Integer'Read          (Data_Stream, TC_Int_Array_1(i));
         Modular_Type'Read     (Data_Stream, TC_Mod_Array_1(i));
         Str_Type'Read         (Data_Stream, TC_Str_Array_1(i));
         Unbounded_String'Read (Data_Stream, TC_UStr_Array_1(i));
      end loop;

      if TC_Char_Array_1 /= Char_Array then
         Report.Failed("Character values do not match");
      end if;
      if TC_Enum_Array_1 /= Enum_Array then
         Report.Failed("Enumeration values do not match");
      end if;
      if TC_Fix_Array_1 /= Fix_Array then
         Report.Failed("Fixed point values do not match");
      end if;
      if TC_Flt_Array_1 /= Flt_Array then
         Report.Failed("Floating point values do not match");
      end if;
      if TC_Int_Array_1 /= Int_Array then
         Report.Failed("Integer values do not match");
      end if;
      if TC_Mod_Array_1 /= Mod_Array then
         Report.Failed("Modular values do not match");
      end if;
      if TC_Str_Array_1 /= Str_Array then
         Report.Failed("String values do not match");
      end if;
      if TC_UStr_Array_1 /= UStr_Array then
         Report.Failed("Unbounded_String values do not match");
      end if;

      -- Extract and validate all data arrays from the data stream.
      -- Note that the 'Input attribute denotes a function, whereas the
      -- other stream oriented attributes in this test denote procedures.

      TC_Char_Array_2 := Char_Array_Type'Input(Data_Stream);
      TC_Enum_Array_2 := Enum_Array_Type'Input(Data_Stream);
      TC_Fix_Array_2  := Fixed_Array_Type'Input(Data_Stream);
      TC_Flt_Array_2  := Float_Array_Type'Input(Data_Stream);
      TC_Int_Array_2  := Int_Array_Type'Input(Data_Stream);
      TC_Mod_Array_2  := Mod_Array_Type'Input(Data_Stream);
      TC_Str_Array_2  := Str_Array_Type'Input(Data_Stream);
      TC_UStr_Array_2 := Unb_Str_Array_Type'Input(Data_Stream);

      if TC_Char_Array_2 /= Char_Array then
         Report.Failed("Character array values do not match");
      end if;
      if TC_Enum_Array_2 /= Enum_Array then
         Report.Failed("Enumeration array values do not match");
      end if;
      if TC_Fix_Array_2 /= Fix_Array then
         Report.Failed("Fixed point array values do not match");
      end if;
      if TC_Flt_Array_2 /= Flt_Array then
         Report.Failed("Floating point array values do not match");
      end if;
      if TC_Int_Array_2 /= Int_Array then
         Report.Failed("Integer array values do not match");
      end if;
      if TC_Mod_Array_2 /= Mod_Array then
         Report.Failed("Modular array values do not match");
      end if;
      if TC_Str_Array_2 /= Str_Array then
         Report.Failed("String array values do not match");
      end if;
      if TC_UStr_Array_2 /= UStr_Array then
         Report.Failed("Unbounded_String array values do not match");
      end if;

   exception
      when Incomplete =>
         raise;
      when others => Report.Failed ("Exception raised in Test_Block");
   end Test_Block;

   Deletion:
   begin
      -- Delete the data file.
      if not Ada.Text_IO.Is_Open(Data_File) then
         Ada.Text_IO.Open(Data_File, Ada.Text_IO.In_File, Data_Filename);
      end if;
      Ada.Text_IO.Delete(Data_File);

   exception
      when others =>
         Report.Failed
            ( "Delete not properly implemented for Text_IO" );

   end Deletion;

   Report.Result;

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

end CXAC004;