| -- CXAA006.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 for a bounded line length text file of mode Append_File, |
| -- when the number of characters to be output exceeds the number of |
| -- columns remaining on the current line, a call to Put will output |
| -- characters of the string sufficient to fill the remaining columns of |
| -- the line (up to line length), then output a line terminator, reset the |
| -- column number, increment the line number, then output the balance of |
| -- the item. |
| -- |
| -- Check that the procedure Put does not raise Layout_Error when the |
| -- number of characters to be output exceeds the line length of a bounded |
| -- text file of mode Append_File. |
| -- |
| -- TEST DESCRIPTION: |
| -- This test demonstrates the situation where an application intends to |
| -- output variable length string elements to a text file in the most |
| -- efficient manner possible. This is the case in a typesetting |
| -- environment where text is compressed and split between lines of a |
| -- bounded length. |
| -- |
| -- The procedure Put will break string parameters placed in the file at |
| -- the point of the line length. Two examples are demonstrated in this |
| -- test, one being the case where only one column remains on a line, and |
| -- the other being the case where a larger portion of the line remains |
| -- unfilled, but still not sufficient to contain the entire output |
| -- string. |
| -- |
| -- During the course of the test, the file is reset to Append_File mode, |
| -- and the bounded line length is modified for different lines of 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 |
| -- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations |
| --! |
| |
| with Ada.Text_IO; |
| with Report; |
| |
| procedure CXAA006 is |
| |
| A_Bounded_File : Ada.Text_IO.File_Type; |
| Bounded_File_Name : constant String := |
| Report.Legal_File_Name ( Nam => "CXAA006" ); |
| Incomplete : exception; |
| |
| begin |
| |
| Report.Test ("CXAA006", "Check that procedure Put will correctly " & |
| "output string items to a bounded line " & |
| "length text file of mode Append_File"); |
| |
| Test_for_Text_IO_Support: |
| begin |
| |
| -- An application creates a text file in mode Append_File, with the intention |
| -- of using the procedure Put to compress variable length string data into the |
| -- file in the most efficient manner possible. |
| |
| Ada.Text_IO.Create (File => A_Bounded_File, |
| Mode => Ada.Text_IO.Append_File, |
| Name => Bounded_File_Name); |
| exception |
| when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => |
| Report.Not_Applicable |
| ( "Files not supported - Create with Append_File for Text_IO" ); |
| raise Incomplete; |
| end Test_For_Text_IO_Support; |
| |
| Operational_Test_Block: |
| declare |
| Twelve_Characters : constant String := "12Characters"; |
| Nineteen_Characters : constant String := "Nineteen_Characters"; |
| TC_Line : 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 sets the line length of the file to be bound at 20. All |
| -- lines in this file will be limited to that length. |
| |
| Ada.Text_IO.Set_Line_Length (A_Bounded_File, 20); |
| |
| Ada.Text_IO.Put (A_Bounded_File, Nineteen_Characters); |
| |
| -- Test control code. |
| if (Integer(Ada.Text_IO.Line (A_Bounded_File)) /= |
| Report.Ident_Int(1)) or |
| (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= |
| Report.Ident_Int(20)) then |
| Report.Failed ("Incorrect position after 1st Put"); |
| end if; |
| |
| -- The application finds that there is only one column available on the |
| -- current line, so the next string item to be output must be broken at |
| -- the appropriate place (following the first character). |
| |
| Ada.Text_IO.Put (File => A_Bounded_File, |
| Item => Twelve_Characters); |
| |
| -- Test control code. |
| if (Integer(Ada.Text_IO.Line (A_Bounded_File)) /= |
| Report.Ident_Int(2)) or |
| (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= |
| Report.Ident_Int(12)) then |
| Report.Failed ("Incorrect position after 2nd Put"); |
| end if; |
| |
| -- The application subsequently modifies the processing, resetting the file |
| -- at this point to In_File mode in order to verify data that has been written |
| -- to the file. Following this, the application resets the file to Append_File |
| -- mode in order to continue the placement of data into the file, but modifies |
| -- the original bounded line length for subsequent lines to be appended. |
| |
| -- Reset to Append mode; call outputs page terminator and |
| -- resets line length to Unbounded. |
| Reset1: |
| begin |
| Ada.Text_IO.Reset (A_Bounded_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; |
| |
| Ada.Text_IO.Set_Line_Length (A_Bounded_File, 15); |
| |
| -- Store line number for later comparison. |
| TC_Line := Natural(Ada.Text_IO.Line(A_Bounded_File)); |
| |
| -- The application finds that fifteen columns are available on the current |
| -- line but that the string item to be output exceeds this available space. |
| -- It must be split at the end of the line, and the balance placed on the |
| -- next file line. |
| |
| Ada.Text_IO.Put (File => A_Bounded_File, |
| Item => Nineteen_Characters); |
| |
| -- Test control code. |
| -- Positioned on new line at col 5. |
| if (Natural(Ada.Text_IO.Line (A_Bounded_File)) /= |
| (TC_Line + 1)) or |
| (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= |
| Report.Ident_Int(5)) then |
| Report.Failed ("Incorrect position after 3rd Put"); |
| end if; |
| |
| |
| Test_Verification_Block: |
| declare |
| First_String : String (1 .. 80); |
| Second_String : String (1 .. 80); |
| Third_String : String (1 .. 80); |
| Fourth_String : String (1 .. 80); |
| TC_Width1 : Natural; |
| TC_Width2 : Natural; |
| TC_Width3 : Natural; |
| TC_Width4 : Natural; |
| begin |
| |
| -- The application has the capability to reset the file to In_File mode to |
| -- verify some or all of the data that is contained there. |
| |
| Reset2: |
| begin |
| Ada.Text_IO.Reset (A_Bounded_File, Ada.Text_IO.In_File); |
| exception |
| when others => |
| Report.Not_Applicable |
| ( "Reset to In_File not supported for Text_IO" ); |
| raise Incomplete; |
| end Reset2; |
| |
| Ada.Text_IO.Get_Line |
| (A_Bounded_File, First_String, TC_Width1); |
| Ada.Text_IO.Get_Line |
| (A_Bounded_File, Second_String, TC_Width2); |
| Ada.Text_IO.Get_Line |
| (A_Bounded_File, Third_String, TC_Width3); |
| Ada.Text_IO.Get_Line |
| (A_Bounded_File, Fourth_String, TC_Width4); |
| |
| -- Test control code. |
| if (First_String (1..TC_Width1) /= Nineteen_Characters & "1") or |
| (Second_String (1..TC_Width2) /= "2Characters") or |
| (Third_String (1..TC_Width3) /= |
| Nineteen_Characters(1..15)) or |
| (Fourth_String (1..TC_Width4) /= "ters") |
| then |
| Report.Failed ("Data placed incorrectly in file"); |
| end if; |
| |
| exception |
| |
| when Incomplete => |
| raise; |
| |
| when Ada.Text_IO.End_Error => |
| Report.Failed ("Incorrect number of lines in file"); |
| |
| when others => |
| Report.Failed ("Error raised during data verification"); |
| |
| end Test_Verification_Block; |
| |
| exception |
| |
| when Ada.Text_IO.Layout_Error => |
| Report.Failed ("Layout Error raised when positioning text"); |
| |
| 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(A_Bounded_File) then |
| Ada.Text_IO.Delete (A_Bounded_File); |
| else |
| Ada.Text_IO.Open (A_Bounded_File, |
| Ada.Text_IO.In_File, |
| Bounded_File_Name); |
| Ada.Text_IO.Delete (A_Bounded_File); |
| end if; |
| |
| exception |
| when others => |
| Report.Failed |
| ( "Delete not properly implemented for Text_IO" ); |
| end Final_Block; |
| |
| Report.Result; |
| |
| exception |
| |
| when Incomplete => |
| Report.Result; |
| when others => |
| Report.Failed ( "Unexpected exception" ); |
| Report.Result; |
| |
| end CXAA006; |