1-- CXAA015.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 exception Status_Error is raised when an attempt is
28--      made to create or open a file in Append_File mode when the file is
29--      already open.
30--      Check that the exception Name_Error is raised by procedure Open when
31--      attempting to open a file in Append_File mode when the name supplied
32--      as the filename does not correspond to an existing external file.
33--
34-- TEST DESCRIPTION:
35--      A scenario is created that demonstrates the potential for the
36--      inappropriate usage of text processing subprograms Create and Open,
37--      resulting in the raising of Status_Error and Name_Error exceptions.
38--      A count is kept to ensure that each anticipated exception is in fact
39--      raised and handled properly.
40--
41-- APPLICABILITY CRITERIA:
42--      This test is applicable only to implementations that support text
43--      files.
44--
45--
46-- CHANGE HISTORY:
47--      06 Dec 94   SAIC    ACVC 2.0
48--      28 Feb 97   PWB.CTA Allowed for non-support of some IO operations
49--!
50
51with Ada.Text_IO;
52with Report;
53
54procedure CXAA015 is
55   use Ada;
56   Text_File     : Text_IO.File_Type;
57   Text_Filename : constant String :=
58                              Report.Legal_File_Name ( Nam => "CXAA015" );
59   Incomplete : exception;
60
61begin
62
63         Report.Test ("CXAA015", "Check that the appropriate exceptions "    &
64                                 "are raised when procedures Create and "    &
65                                 "Open are used to inappropriately operate " &
66                                 "on files of mode Append_File");
67
68         Test_for_Text_IO_Support:
69         begin
70
71-- An application creates a text file with mode Append_File.
72-- Use_Error will be raised if Text_IO operations or external files are not
73-- supported.
74
75            Text_IO.Create (Text_File, Text_IO.Append_File, Text_Filename);
76         exception
77
78             when Text_IO.Use_Error | Text_IO.Name_Error =>
79                Report.Not_Applicable
80                   ( "Files not supported - Create as Append_File for Text_IO" );
81                raise Incomplete;
82
83         end Test_for_Text_IO_Support;
84
85
86-- The application writes some amount of data to the file.
87
88            for I in 1 .. 5 loop
89               Text_IO.Put_Line (Text_File, "Data entered into the file");
90            end loop;
91
92            Operational_Test_Block:
93            declare
94               TC_Number_Of_Forced_Errors : constant Natural := 3;
95               TC_Errors                  :          Natural := 0;
96            begin
97
98
99               Test_for_Create:
100               begin
101
102-- During the course of its processing, the application may (erroneously)
103-- attempt to create the same file already in existence in Append_File mode.
104-- This results in the raising of Status_Error.
105
106                  Text_IO.Create (Text_File,
107                                  Text_IO.Append_File,
108                                  Text_Filename);
109                  Report.Failed ("Exception not raised by Create");
110
111-- An exception handler present within the application handles the exception
112-- and processing can continue.
113
114               exception
115                  when Text_IO.Status_Error =>
116                     TC_Errors := TC_Errors + 1;
117                  when others =>
118                     Report.Failed("Exception in Create processing");
119               end Test_for_Create;
120
121
122               First_Test_For_Open:
123               begin
124
125-- Again, during the course of its processing, the application incorrectly
126-- attempts to Open a file (in Append_File mode) that is already open.
127
128                  Text_IO.Open (Text_File, Text_IO.Append_File, Text_Filename);
129                  Report.Failed ("Exception not raised by improper Open - 1");
130
131-- Once again, an exception handler present within the application handles
132-- the exception and processing continues.
133
134               exception
135                  when Text_IO.Status_Error =>
136                     TC_Errors := TC_Errors + 1;
137
138-- At some point in its processing, the application closes the file that is
139-- currently open.
140
141                     Text_IO.Close (Text_File);
142                  when others =>
143                     Report.Failed("Exception in Open processing - 1");
144               end First_Test_For_Open;
145
146
147               Open_With_Wrong_Filename:
148               declare
149                  TC_Wrong_Filename : constant String :=
150                    Report.Legal_File_Name(2);
151               begin
152
153-- At this point, the application attempts to Open (in Append_File mode) the
154-- file used in previous processing, but it attempts this Open using a name
155-- string that does not correspond to any existing external file.
156-- First make sure the file doesn't exist.  (If it did, then the check
157-- for open in append mode wouldn't work.)
158
159                  Verify_No_File:
160                  begin
161                     Text_IO.Open (Text_File,
162                                   Text_IO.In_File,
163                                   TC_Wrong_Filename);
164                  exception
165                     when Text_IO.Name_Error =>
166                        null;
167                     when others =>
168                        Report.Failed ( "Unexpected exception on Open check" );
169                  end Verify_No_File;
170
171                  Delete_No_File:
172                  begin
173                     if Text_IO.Is_Open (Text_File) then
174                        Text_IO.Delete (Text_File);
175                     end if;
176                  exception
177                     when others =>
178                       Report.Failed ( "Unexpected exception - Delete check" );
179                  end Delete_No_File;
180
181                  Text_IO.Open (Text_File,
182                                Text_IO.Append_File,
183                                TC_Wrong_Filename);
184                  Report.Failed ("Exception not raised by improper Open - 2");
185
186-- An exception handler for the Name_Error, present within the application,
187-- catches the exception and processing continues.
188
189               exception
190                  when Text_IO.Name_Error =>
191                     TC_Errors := TC_Errors + 1;
192                  when others =>
193                     Report.Failed("Exception in Open processing - 2");
194               end Open_With_Wrong_Filename;
195
196
197               if (TC_Errors /= TC_Number_Of_Forced_Errors) then
198                  Report.Failed ("Incorrect number of exceptions handled");
199               end if;
200
201            end Operational_Test_Block;
202
203            Deletion:
204            begin
205               -- Delete the external file.
206               if Text_IO.Is_Open (Text_File) then
207                  Text_IO.Delete (Text_File);
208               else
209                  Text_IO.Open (Text_File, Text_IO.In_File, Text_Filename);
210                  Text_IO.Delete (Text_File);
211               end if;
212            exception
213               when others =>
214                  Report.Failed
215                     ( "Delete not properly implemented for Text_IO" );
216            end Deletion;
217
218         Report.Result;
219
220exception
221   when Incomplete =>
222      Report.Result;
223   when others     =>
224      Report.Failed ( "Unexpected exception" );
225      Report.Result;
226
227end CXAA015;
228