-- CXAA005.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, 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 procedure Put, when called with string parameters, does -- not update the line number of a text file of mode Append_File, when -- the line length is unbounded (i.e., only the column number is -- updated). -- Check that a call to the procedure Put with a null string argument -- has no measurable effect on a text file of mode Append_File. -- -- TEST DESCRIPTION: -- This test is designed to ensure that when a string is appended to an -- unbounded text file, it is placed following the last element currently -- in the file. For an unbounded text file written with Put procedures -- only (not Put_Line), the line number should not be incremented by -- subsequent calls to Put in Append_File mode. Only the column number -- should be incremented based on the length of the string parameter -- placed in the file. If a call to Put with a null string argument is -- made, no change to the line or column number should occur, and no -- element(s) should be added to the file, so that there would be no -- measurable change to the file. -- -- APPLICABILITY CRITERIA: -- This test is applicable to all implementations that support Text_IO -- processing and external files. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- 24 Feb 97 CTA.PWB Allowed for non-support of some IO operations. --! with Ada.Text_IO; with Report; procedure CXAA005 is An_Unbounded_File : Ada.Text_IO.File_Type; Unbounded_File_Name : constant String := Report.Legal_File_Name ( Nam => "CXAA005" ); Incomplete : exception; begin Report.Test ("CXAA005", "Check that the procedure Put does not " & "increment line numbers when used with " & "unbounded text files of mode Append_File"); Test_for_Text_IO_Support: begin -- An application creates a text file in mode Out_File, with the intention -- of entering string data packets into the file as appropriate. In the -- event that the particular environment where the application is running -- does not support Text_IO, Use_Error will be raised on calls to Text_IO -- operations. -- This exception will be handled to produce a Not_Applicable result. Ada.Text_IO.Create (File => An_Unbounded_File, Mode => Ada.Text_IO.Out_File, Name => Unbounded_File_Name); exception when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => Report.Not_Applicable ( "Files not supported - Create for Text_IO" ); raise Incomplete; end Test_For_Text_IO_Support; Operational_Test_Block: declare subtype String_Sequence_Type is string (1 .. 20); type String_Pointer_Type is access String_Sequence_Type; -- During the course of processing, the application creates a variety of data -- pointers that refer to particular data items. The possibility of having -- null data values in this environment exists. Data_Packet_1 : String_Pointer_Type := new String_Sequence_Type'("One Data Sequence 01"); Data_Packet_2 : String_Pointer_Type := new String_Sequence_Type'("New Data Sequence 02"); Blank_Data_Packet : String_Pointer_Type := new String_Sequence_Type'(" "); Null_Data_Packet : constant String := ""; TC_Line, TC_Col : Natural := 0; function TC_Mode_Selection (Selector : Integer) return Ada.Text_IO.File_Mode is begin case Selector is when 1 => return Ada.Text_IO.In_File; when 2 => return Ada.Text_IO.Out_File; when others => return Ada.Text_IO.Append_File; end case; end TC_Mode_Selection; begin -- The application places some data into the file, using the Put subroutine. -- This operation can occur one-to-many times. Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_1.all); -- Test control code. if (Integer(Ada.Text_IO.Col (An_Unbounded_File)) /= Report.Ident_Int(21)) or (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /= Report.Ident_Int(1)) then Report.Failed ("Incorrect Col position after 1st Put"); end if; -- The application may close the file at some point following its initial -- entry of data. Ada.Text_IO.Close (An_Unbounded_File); -- At some later point in the processing, more data needs to be added to the -- file, so the application opens the file in Append_File mode. Ada.Text_IO.Open (File => An_Unbounded_File, Mode => Ada.Text_IO.Append_File, Name => Unbounded_File_Name); -- Test control code. -- Store line/column number for later comparison. TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File)); TC_Col := Natural(Ada.Text_IO.Col(An_Unbounded_File)); -- Additional data items can then be appended to the file. Ada.Text_IO.Put (An_Unbounded_File, Blank_Data_Packet.all); -- Test control code. if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= (TC_Col + 20)) or (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /= TC_Line) then Report.Failed ("Incorrect Col position after 2nd Put"); end if; -- In order to accommodate various scenarios, the application may have changed -- the mode of the data file to In_File in order to retrieve/verify some of -- the data contained there. However, with the need to place more data into -- the file, the file can be reset to Append_File mode. Reset1: begin Ada.Text_IO.Reset (An_Unbounded_File, TC_Mode_Selection (Report.Ident_Int(3))); exception when Ada.Text_IO.Use_Error => Report.Not_Applicable ( "Reset to Append_File not supported for Text_IO" ); raise Incomplete; end Reset1; -- Test control code. -- Store line/column number for later comparison. TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File)); TC_Col := Natural(Ada.Text_IO.Col(An_Unbounded_File)); -- Additional data can then be appended to the file. On some occasions, an -- attempt to enter a null string value into the file may occur. This should -- have no effect on the file, leaving it unchanged. -- No measurable effect from Put with null string. Ada.Text_IO.Put (An_Unbounded_File, Null_Data_Packet); -- Test control code. -- There should be no change following the Put above. if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= TC_Col) or (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /= TC_Line) then Report.Failed ("Incorrect Col position after 3rd Put"); end if; -- Additional data can be appended to the file. Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_2.all); -- Test control code. if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= (TC_Col + 20)) or (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /= TC_Line) then Report.Failed ("Incorrect Col position after 4th Put"); end if; Test_Verification_Block: declare File_Data : String (1 .. 80); TC_Width : Natural; begin -- The application has the capability to reset the file to In_File mode to -- verify some of the data that is contained there. Reset2: begin Ada.Text_IO.Reset (An_Unbounded_File, Ada.Text_IO.In_File); exception when Ada.Text_IO.Use_Error => Report.Not_Applicable ( "Reset to In_File not supported - Text_IO" ); raise Incomplete; end Reset2; Ada.Text_IO.Get_Line (An_Unbounded_File, File_Data, TC_Width); -- Test control code. -- Since it is implementation defined whether a page -- terminator separates preexisting text from new text -- following an open in append mode (as occurred above), -- verify only that the first data item written to the -- file was not overwritten by any subsequent call to Put. if (File_Data (File_Data'First) /= 'O') or (File_Data (20) /= '1') then Report.Failed ("Data placed incorrectly in file"); end if; exception when Incomplete => raise; when others => Report.Failed ("Error raised during data verification"); end Test_Verification_Block; exception when Incomplete => raise; when others => Report.Failed ("Exception in Text_IO processing"); end Operational_Test_Block; Final_Block: begin -- Delete the external file. if Ada.Text_IO.Is_Open(An_Unbounded_File) then Ada.Text_IO.Delete (An_Unbounded_File); else Ada.Text_IO.Open(An_Unbounded_File, Ada.Text_IO.In_File, Unbounded_File_Name); Ada.Text_IO.Delete (An_Unbounded_File); end if; exception when others => Report.Failed ( "Delete not properly implemented -- Text_IO" ); end Final_Block; Report.Result; exception when Incomplete => Report.Result; when others => Report.Failed ( "Unexpected exception" ); Report.Result; end CXAA005;