2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / ada / acats / tests / cxg / cxg1003.a
blobc3885136b86d4a365e3545ccdb8a03f11c4020c1
1 -- CXG1003.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.
16 -- DISCLAIMER
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 --*
26 -- OBJECTIVE:
27 -- Check that the subprograms defined in the package Text_IO.Complex_IO
28 -- provide correct results.
30 -- TEST DESCRIPTION:
31 -- The generic package Ada.Numerics.Generic_Complex_Types is instantiated
32 -- with a real type (new Float). The resulting new package is used as
33 -- the generic actual to package Complex_IO.
34 -- Two different versions of Put and Get are examined in this test,
35 -- those that input/output complex data values from/to Text_IO files,
36 -- and those that input/output complex data values from/to strings.
37 -- Two procedures are defined to perform the file data manipulations;
38 -- one to place complex data into the file, and one to retrieve the data
39 -- from the file and verify its correctness.
40 -- Complex data is also put into string variables using the Procedure
41 -- Put for strings, and this data is then retrieved and reconverted into
42 -- complex values using the Get procedure.
45 -- APPLICABILITY CRITERIA:
46 -- This test is only applicable to implementations that:
47 -- support Annex G,
48 -- support Text_IO and external files
50 --
51 -- CHANGE HISTORY:
52 -- 06 Dec 94 SAIC ACVC 2.0
53 -- 29 Dec 94 SAIC Modified Width parameter in Get function calls.
54 -- 16 Nov 95 SAIC Corrected visibility problems for ACVC 2.0.1.
55 -- 29 Sep 96 SAIC Incorporated reviewer comments.
57 --!
59 with Ada.Text_IO.Complex_IO;
60 with Ada.Numerics.Generic_Complex_Types;
61 with Report;
63 procedure CXG1003 is
64 begin
66 Report.Test ("CXG1003", "Check that the subprograms defined in " &
67 "the package Text_IO.Complex_IO " &
68 "provide correct results");
70 Test_for_Text_IO_Support:
71 declare
72 use Ada;
74 Data_File : Ada.Text_IO.File_Type;
75 Data_Filename : constant String := Report.Legal_File_Name;
77 begin
79 -- An application creates a text file in mode Out_File, with the
80 -- intention of entering complex data into the file as appropriate.
81 -- In the event that the particular environment where the application
82 -- is running does not support Text_IO, Use_Error or Name_Error will be
83 -- raised on calls to Text_IO operations. Either of these exceptions
84 -- will be handled to produce a Not_Applicable result.
86 Text_IO.Create (File => Data_File,
87 Mode => Ada.Text_IO.Out_File,
88 Name => Data_Filename);
90 Test_Block:
91 declare
93 TC_Verbose : Boolean := False;
95 type Real_Type is new Float;
97 package Complex_Pack is new
98 Ada.Numerics.Generic_Complex_Types(Real_Type);
100 package C_IO is new Ada.Text_IO.Complex_IO(Complex_Pack);
102 use Ada.Text_IO, C_IO;
103 use type Complex_Pack.Complex;
105 Number_Of_Complex_Items : constant := 6;
106 Number_Of_Error_Items : constant := 2;
108 TC_Complex : Complex_Pack.Complex;
109 TC_Last_Character_Read : Positive;
111 Complex_Array : array (1..Number_Of_Complex_Items)
112 of Complex_Pack.Complex := ( (3.0, 9.0),
113 (4.0, 7.0),
114 (5.0, 6.0),
115 (6.0, 3.0),
116 (2.0, 5.0),
117 (3.0, 7.0) );
120 procedure Load_Data_File (The_File : in out Text_IO.File_Type) is
121 use Ada.Text_IO;
122 begin
123 -- This procedure does not create, open, or close the data file;
124 -- The_File file object must be Open at this point.
125 -- This procedure is designed to load complex data into a data
126 -- file twice, first using Text_IO, then Complex_IO. In this
127 -- first case, the complex data values are entered as strings,
128 -- assuming a variety of legal formats, as provided in the
129 -- reference manual.
131 Put_Line(The_File, "(3.0, 9.0)");
132 Put_Line(The_File, "+4. +7."); -- Relaxed real literal format.
133 Put_Line(The_File, "(5.0 6.)");
134 Put_Line(The_File, "6., 3.0");
135 Put_Line(The_File, " ( 2.0 , 5.0 ) ");
136 Put_Line(The_File, "("); -- Complex data separated over
137 Put_Line(The_File, "3.0"); -- several (5) lines.
138 Put_Line(The_File, " , ");
139 Put_Line(The_File, "7.0 ");
140 Put_Line(The_File, ")");
142 if TC_Verbose then
143 Report.Comment("Complex values entered into data file using " &
144 "Text_IO, Procedure Load_Data_File");
145 end if;
147 -- Use the Complex_IO procedure Put to enter Complex data items
148 -- into the data file.
149 -- Note: Data is being entered into the file for the *second* time
150 -- at this point. (Using Complex_IO here, Text_IO above)
152 for i in 1..Number_Of_Complex_Items loop
153 C_IO.Put(File => The_File,
154 Item => Complex_Array(i),
155 Fore => 1,
156 Aft => 1,
157 Exp => 0);
158 end loop;
160 if TC_Verbose then
161 Report.Comment("Complex values entered into data file using " &
162 "Complex_IO, Procedure Load_Data_File");
163 end if;
165 Put_Line(The_File, "(5A,3)"); -- data to raise Data_Error.
166 Put_Line(The_File, "(3.0,,8.0)"); -- data to raise Data_Error.
168 end Load_Data_File;
172 procedure Process_Data_File (The_File : in out Text_IO.File_Type) is
173 TC_Complex : Complex_Pack.Complex := (0.0, 0.0);
174 TC_Width : Integer := 0;
175 begin
176 -- This procedure does not create, open, or close the data file;
177 -- The_File file object must be Open at this point.
178 -- Use procedure Get (for Files) to extract the complex data from
179 -- the Text_IO file. This data was placed into the file using
180 -- Text_IO.
183 for i in 1..Number_Of_Complex_Items loop
185 C_IO.Get(The_File, TC_Complex, TC_Width);
187 if TC_Complex /= Complex_Array(i) then
188 Report.Failed("Incorrect complex data read from file " &
189 "when using Text_IO procedure Get, " &
190 "data item #" & Integer'Image(i));
191 end if;
192 end loop;
194 if TC_Verbose then
195 Report.Comment("First set of complex values extracted " &
196 "from data file using Complex_IO, " &
197 "Procedure Process_Data_File");
198 end if;
200 -- Use procedure Get (for Files) to extract the complex data from
201 -- the Text_IO file. This data was placed into the file using
202 -- procedure Complex_IO.Put.
203 -- Note: Data is being extracted from the file for the *second*
204 -- time at this point (Using Complex_IO here, Text_IO above)
206 for i in 1..Number_Of_Complex_Items loop
208 C_IO.Get(The_File, TC_Complex, TC_Width);
210 if TC_Complex /= Complex_Array(i) then
211 Report.Failed("Incorrect complex data read from file " &
212 "when using Complex_IO procedure Get, " &
213 "data item #" & Integer'Image(i));
214 end if;
215 end loop;
217 if TC_Verbose then
218 Report.Comment("Second set of complex values extracted " &
219 "from data file using Complex_IO, " &
220 "Procedure Process_Data_File");
221 end if;
223 -- The final items in the Data_File are complex values with
224 -- incorrect syntax, which should raise Data_Error on an attempt
225 -- to read them from the file.
226 TC_Width := 10;
227 for i in 1..Number_Of_Error_Items loop
228 begin
229 C_IO.Get(The_File, TC_Complex, TC_Width);
230 Report.Failed
231 ("Exception Data_Error not raised when Complex_IO.Get " &
232 "was used to read complex data with incorrect " &
233 "syntax from the Data_File, data item #" &
234 Integer'Image(i));
235 exception
236 when Ada.Text_IO.Data_Error => -- OK, expected exception.
237 Text_IO.Skip_Line(The_File);
238 when others =>
239 Report.Failed
240 ("Unexpected exception raised when Complex_IO.Get " &
241 "was used to read complex data with incorrect " &
242 "syntax from the Data_File, data item #" &
243 Integer'Image(i));
244 end;
245 end loop;
247 if TC_Verbose then
248 Report.Comment("Erroneous set of complex values extracted " &
249 "from data file using Complex_IO, " &
250 "Procedure Process_Data_File");
251 end if;
254 exception
255 when others =>
256 Report.Failed
257 ("Unexpected exception raised in Process_Data_File");
258 end Process_Data_File;
262 begin -- Test_Block.
264 -- Place complex values into data file.
266 Load_Data_File(Data_File);
267 Text_IO.Close(Data_File);
269 if TC_Verbose then
270 Report.Comment("Data file loaded with Complex values");
271 end if;
273 -- Read complex values from data file.
275 Text_IO.Open(Data_File, Text_IO.In_File, Data_Filename);
276 Process_Data_File(Data_File);
278 if TC_Verbose then
279 Report.Comment("Complex values extracted from data file");
280 end if;
284 -- Verify versions of Procedures Put and Get for Strings.
286 declare
287 TC_String_Array : array (1..Number_Of_Complex_Items)
288 of String(1..15) := (others =>(others => ' '));
289 begin
291 -- Place complex values into strings using the Procedure Put.
293 for i in 1..Number_Of_Complex_Items loop
294 C_IO.Put(To => TC_String_Array(i),
295 Item => Complex_Array(i),
296 Aft => 1,
297 Exp => 0);
298 end loop;
300 if TC_Verbose then
301 Report.Comment("Complex values placed into string array");
302 end if;
304 -- Check the format of the strings containing a complex number.
305 -- The resulting strings are of 15 character length, with the
306 -- real component left justified within the string, followed by
307 -- a comma, and with the imaginary component and closing
308 -- parenthesis right justified in the string, with blank fill
309 -- for the balance of the string.
311 if TC_String_Array(1) /= "(3.0, 9.0)" or
312 TC_String_Array(2) /= "(4.0, 7.0)" or
313 TC_String_Array(3) /= "(5.0, 6.0)" or
314 TC_String_Array(4) /= "(6.0, 3.0)" or
315 TC_String_Array(5) /= "(2.0, 5.0)" or
316 TC_String_Array(6) /= "(3.0, 7.0)"
317 then
318 Report.Failed("Incorrect format for complex values that " &
319 "have been placed into string variables " &
320 "using the Complex_IO.Put procedure for " &
321 "strings");
322 end if;
324 if TC_Verbose then
325 Report.Comment("String format of Complex values verified");
326 end if;
328 -- Get complex values from strings using the Procedure Get.
329 -- Compare with expected complex values.
331 for i in 1..Number_Of_Complex_Items loop
333 C_IO.Get(From => TC_String_Array(i),
334 Item => TC_Complex,
335 Last => TC_Last_Character_Read);
337 if TC_Complex /= Complex_Array(i) then
338 Report.Failed("Incorrect complex data value obtained " &
339 "from String following use of Procedures " &
340 "Put and Get from Strings, Complex_Array " &
341 "item #" & Integer'Image(i));
342 end if;
343 end loop;
345 if TC_Verbose then
346 Report.Comment("Complex values removed from String array");
347 end if;
349 -- Verify that Layout_Error is raised if the given string is
350 -- too short to hold the formatted output.
351 Layout_Error_On_Put:
352 declare
353 Much_Too_Short : String(1..2);
354 Complex_Value : Complex_Pack.Complex := (5.0, 0.0);
355 begin
356 C_IO.Put(Much_Too_Short, Complex_Value);
357 Report.Failed("Layout_Error not raised by Procedure Put " &
358 "when the given string was too short to " &
359 "hold the formatted output");
360 exception
361 when Layout_Error => null; -- OK, expected exception.
362 when others =>
363 Report.Failed
364 ("Unexpected exception raised by Procedure Put when " &
365 "the given string was too short to hold the " &
366 "formatted output");
367 end Layout_Error_On_Put;
369 if TC_Verbose then
370 Report.Comment("Layout Errors verified");
371 end if;
373 exception
374 when others =>
375 Report.Failed("Unexpected exception raised during the " &
376 "evaluation of Put and Get for Strings");
377 end;
380 -- Place complex values into strings using a variety of legal
381 -- complex data formats.
382 declare
384 type String_Ptr is access String;
386 TC_Complex_String_Array :
387 array (1..Number_Of_Complex_Items) of String_Ptr :=
388 (new String'( "(3.0, 9.0 )" ),
389 new String'( "+4.0 +7.0" ),
390 new String'( "(5.0 6.0)" ),
391 new String'( "6.0, 3.0" ),
392 new String'( " ( 2.0 , 5.0 ) " ),
393 new String'( "(3.0 7.0)" ));
395 -- The following array contains Positive values that correspond
396 -- to the last character that will be read by Procedure Get when
397 -- given each of the above strings as input.
399 TC_Last_Char_Array : array (1..Number_Of_Complex_Items)
400 of Positive := (12,10,9,8,20,22);
402 begin
404 -- Get complex values from strings using the Procedure Get.
405 -- Compare with expected complex values.
407 for i in 1..Number_Of_Complex_Items loop
409 C_IO.Get(TC_Complex_String_Array(i).all,
410 TC_Complex,
411 TC_Last_Character_Read);
413 if TC_Complex /= Complex_Array(i) then
414 Report.Failed
415 ("Incorrect complex data value obtained from " &
416 "Procedure Get with complex data input of: " &
417 TC_Complex_String_Array(i).all);
418 end if;
420 if TC_Last_Character_Read /= TC_Last_Char_Array(i) then
421 Report.Failed
422 ("Incorrect value returned as the last character of " &
423 "the input string processed by Procedure Get, " &
424 "string value : " & TC_Complex_String_Array(i).all &
425 " expected last character value read : " &
426 Positive'Image(TC_Last_Char_Array(i)) &
427 " last character value read : " &
428 Positive'Image(TC_Last_Character_Read));
429 end if;
431 end loop;
433 if TC_Verbose then
434 Report.Comment("Complex values removed from strings and " &
435 "verified against expected values");
436 end if;
438 exception
439 when others =>
440 Report.Failed("Unexpected exception raised during the " &
441 "evaluation of Get for Strings");
442 end;
444 exception
445 when others => Report.Failed ("Exception raised in Test_Block");
446 end Test_Block;
449 -- Delete the external file.
450 if Ada.Text_IO.Is_Open(Data_File) then
451 Ada.Text_IO.Delete(Data_File);
452 else
453 Ada.Text_IO.Open(Data_File,
454 Ada.Text_IO.In_File,
455 Data_Filename);
456 Ada.Text_IO.Delete(Data_File);
457 end if;
459 exception
461 -- Since Use_Error can be raised if, for the specified mode,
462 -- the environment does not support Text_IO operations, the
463 -- following handlers are included:
465 when Ada.Text_IO.Use_Error =>
466 Report.Not_Applicable ("Use_Error raised on Text_IO Create");
468 when Ada.Text_IO.Name_Error =>
469 Report.Not_Applicable ("Name_Error raised on Text_IO Create");
471 when others =>
472 Report.Failed ("Unexpected exception raised on text file Create");
474 end Test_for_Text_IO_Support;
476 Report.Result;
478 end CXG1003;