1-- CXAA005.A
2--
3--                             Grant of Unlimited Rights
4--
5--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7--     unlimited rights in the software and documentation contained herein.
8--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making
9--     this public release, the Government intends to confer upon all
10--     recipients unlimited rights  equal to those held by the Government.
11--     These rights include rights to use, duplicate, release or disclose the
12--     released technical data and computer software in whole or in part, in
13--     any manner and for any purpose whatsoever, and to have or permit others
14--     to do so.
15--
16--                                    DISCLAIMER
17--
18--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23--     PARTICULAR PURPOSE OF SAID MATERIAL.
24--*
25--
26-- OBJECTIVE:
27--      Check that the procedure Put, when called with string parameters, does
28--      not update the line number of a text file of mode Append_File, when
29--      the line length is unbounded (i.e., only the column number is
30--      updated).
31--      Check that a call to the procedure Put with a null string argument
32--      has no measurable effect on a text file of mode Append_File.
33--
34-- TEST DESCRIPTION:
35--      This test is designed to ensure that when a string is appended to an
36--      unbounded text file, it is placed following the last element currently
37--      in the file.  For an unbounded text file written with Put procedures
38--      only (not Put_Line), the line number should not be incremented by
39--      subsequent calls to Put in Append_File mode.  Only the column number
40--      should be incremented based on the length of the string parameter
41--      placed in the file.  If a call to Put with a null string argument is
42--      made, no change to the line or column number should occur, and no
43--      element(s) should be added to the file, so that there would be no
44--      measurable change to the file.
45--
46-- APPLICABILITY CRITERIA:
47--      This test is applicable to all implementations that support Text_IO
48--      processing and external files.
49--
50--
51-- CHANGE HISTORY:
52--      06 Dec 94   SAIC    ACVC 2.0
53--      24 Feb 97   CTA.PWB Allowed for non-support of some IO operations.
54--!
55
56with Ada.Text_IO;
57with Report;
58
59procedure CXAA005 is
60   An_Unbounded_File   : Ada.Text_IO.File_Type;
61   Unbounded_File_Name : constant String :=
62                            Report.Legal_File_Name ( Nam => "CXAA005" );
63   Incomplete          : exception;
64
65begin
66
67   Report.Test ("CXAA005", "Check that the procedure Put does not " &
68                           "increment line numbers when used with " &
69                           "unbounded text files of mode Append_File");
70
71   Test_for_Text_IO_Support:
72   begin
73
74   -- An application creates a text file in mode Out_File, with the intention
75   -- of entering string data packets into the file as appropriate.  In the
76   -- event that the particular environment where the application is running
77   -- does not support Text_IO, Use_Error will be raised on calls to Text_IO
78   -- operations.
79   -- This exception will be handled to produce a Not_Applicable result.
80
81      Ada.Text_IO.Create (File => An_Unbounded_File,
82                          Mode => Ada.Text_IO.Out_File,
83                          Name => Unbounded_File_Name);
84   exception
85      when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error =>
86         Report.Not_Applicable
87            ( "Files not supported - Create for Text_IO" );
88         raise Incomplete;
89   end Test_For_Text_IO_Support;
90
91   Operational_Test_Block:
92   declare
93      subtype String_Sequence_Type is string (1 .. 20);
94      type    String_Pointer_Type  is access String_Sequence_Type;
95
96-- During the course of processing, the application creates a variety of data
97-- pointers that refer to particular data items.  The possibility of having
98-- null data values in this environment exists.
99
100      Data_Packet_1     : String_Pointer_Type :=
101        new String_Sequence_Type'("One Data Sequence 01");
102
103      Data_Packet_2     : String_Pointer_Type :=
104        new String_Sequence_Type'("New Data Sequence 02");
105
106      Blank_Data_Packet : String_Pointer_Type :=
107        new String_Sequence_Type'("                    ");
108
109      Null_Data_Packet  : constant String     := "";
110
111      TC_Line, TC_Col   : Natural := 0;
112
113      function TC_Mode_Selection (Selector : Integer)
114         return Ada.Text_IO.File_Mode is
115      begin
116         case Selector is
117            when 1       => return Ada.Text_IO.In_File;
118            when 2       => return Ada.Text_IO.Out_File;
119            when others  => return Ada.Text_IO.Append_File;
120         end case;
121      end TC_Mode_Selection;
122
123   begin
124
125-- The application places some data into the file, using the Put subroutine.
126-- This operation can occur one-to-many times.
127
128       Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_1.all);
129
130       -- Test control code.
131       if (Integer(Ada.Text_IO.Col (An_Unbounded_File))  /=
132           Report.Ident_Int(21))                            or
133          (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /=
134           Report.Ident_Int(1))                             then
135          Report.Failed ("Incorrect Col position after 1st Put");
136       end if;
137
138-- The application may close the file at some point following its initial
139-- entry of data.
140
141      Ada.Text_IO.Close (An_Unbounded_File);
142
143-- At some later point in the processing, more data needs to be added to the
144-- file, so the application opens the file in Append_File mode.
145
146      Ada.Text_IO.Open (File => An_Unbounded_File,
147                        Mode => Ada.Text_IO.Append_File,
148                        Name => Unbounded_File_Name);
149
150      -- Test control code.
151      -- Store line/column number for later comparison.
152      TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File));
153      TC_Col  := Natural(Ada.Text_IO.Col(An_Unbounded_File));
154
155-- Additional data items can then be appended to the file.
156
157      Ada.Text_IO.Put (An_Unbounded_File, Blank_Data_Packet.all);
158
159      -- Test control code.
160      if (Natural(Ada.Text_IO.Col (An_Unbounded_File))  /=
161          (TC_Col + 20))                                   or
162         (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /=
163          TC_Line)                                         then
164         Report.Failed ("Incorrect Col position after 2nd Put");
165      end if;
166
167-- In order to accommodate various scenarios, the application may have changed
168-- the mode of the data file to In_File in order to retrieve/verify some of
169-- the data contained there.  However, with the need to place more data into
170-- the file, the file can be reset to Append_File mode.
171
172      Reset1:
173      begin
174         Ada.Text_IO.Reset (An_Unbounded_File,
175                            TC_Mode_Selection (Report.Ident_Int(3)));
176      exception
177         when Ada.Text_IO.Use_Error =>
178            Report.Not_Applicable
179               ( "Reset to Append_File not supported for Text_IO" );
180            raise Incomplete;
181      end Reset1;
182
183      -- Test control code.
184      -- Store line/column number for later comparison.
185      TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File));
186      TC_Col  := Natural(Ada.Text_IO.Col(An_Unbounded_File));
187
188-- Additional data can then be appended to the file.  On some occasions, an
189-- attempt to enter a null string value into the file may occur.  This should
190-- have no effect on the file, leaving it unchanged.
191
192      -- No measurable effect from Put with null string.
193      Ada.Text_IO.Put (An_Unbounded_File, Null_Data_Packet);
194
195      -- Test control code.
196      -- There should be no change following the Put above.
197      if (Natural(Ada.Text_IO.Col (An_Unbounded_File))  /=
198          TC_Col)                                          or
199         (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /=
200          TC_Line)                                         then
201         Report.Failed ("Incorrect Col position after 3rd Put");
202      end if;
203
204-- Additional data can be appended to the file.
205
206      Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_2.all);
207
208      -- Test control code.
209      if (Natural(Ada.Text_IO.Col (An_Unbounded_File))  /=
210          (TC_Col + 20))                                    or
211         (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /=
212          TC_Line)                                         then
213         Report.Failed ("Incorrect Col position after 4th Put");
214      end if;
215
216      Test_Verification_Block:
217      declare
218         File_Data : String (1 .. 80);
219         TC_Width  : Natural;
220      begin
221
222-- The application has the capability to reset the file to In_File mode to
223-- verify some of the data that is contained there.
224
225      Reset2:
226      begin
227         Ada.Text_IO.Reset (An_Unbounded_File, Ada.Text_IO.In_File);
228      exception
229         when Ada.Text_IO.Use_Error =>
230            Report.Not_Applicable
231               ( "Reset to In_File not supported - Text_IO" );
232            raise Incomplete;
233      end Reset2;
234
235      Ada.Text_IO.Get_Line (An_Unbounded_File,
236                            File_Data,
237                            TC_Width);
238
239      -- Test control code.
240      -- Since it is implementation defined whether a page
241      -- terminator separates preexisting text from new text
242      -- following an open in append mode (as occurred above),
243      -- verify only that the first data item written to the
244      -- file was not overwritten by any subsequent call to Put.
245
246      if (File_Data (File_Data'First) /= 'O') or
247          (File_Data (20)              /= '1') then
248         Report.Failed ("Data placed incorrectly in file");
249      end if;
250
251      exception
252         when Incomplete =>
253            raise;
254         when others =>
255            Report.Failed ("Error raised during data verification");
256      end Test_Verification_Block;
257
258   exception
259      when Incomplete =>
260         raise;
261      when others =>
262         Report.Failed ("Exception in Text_IO processing");
263   end Operational_Test_Block;
264
265   Final_Block:
266   begin
267      -- Delete the external file.
268      if Ada.Text_IO.Is_Open(An_Unbounded_File) then
269         Ada.Text_IO.Delete (An_Unbounded_File);
270      else
271         Ada.Text_IO.Open(An_Unbounded_File,
272                          Ada.Text_IO.In_File,
273                          Unbounded_File_Name);
274         Ada.Text_IO.Delete (An_Unbounded_File);
275      end if;
276   exception
277      when others =>
278         Report.Failed
279            ( "Delete not properly implemented -- Text_IO" );
280   end Final_Block;
281
282   Report.Result;
283
284exception
285
286   when Incomplete =>
287      Report.Result;
288   when others     =>
289      Report.Failed ( "Unexpected exception" );
290      Report.Result;
291
292end CXAA005;
293