3 -- Grant of Unlimited Rights
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
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.
27 -- Check that the subprograms defined in the package Text_IO.Complex_IO
28 -- provide correct results.
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:
48 -- support Text_IO and external files
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.
59 with Ada
.Text_IO
.Complex_IO
;
60 with Ada
.Numerics
.Generic_Complex_Types
;
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
:
74 Data_File
: Ada
.Text_IO
.File_Type
;
75 Data_Filename
: constant String := Report
.Legal_File_Name
;
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
);
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),
120 procedure Load_Data_File
(The_File
: in out Text_IO
.File_Type
) is
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
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
, ")");
143 Report
.Comment
("Complex values entered into data file using " &
144 "Text_IO, Procedure Load_Data_File");
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
),
161 Report
.Comment
("Complex values entered into data file using " &
162 "Complex_IO, Procedure Load_Data_File");
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.
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;
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
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
));
195 Report
.Comment
("First set of complex values extracted " &
196 "from data file using Complex_IO, " &
197 "Procedure Process_Data_File");
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
));
218 Report
.Comment
("Second set of complex values extracted " &
219 "from data file using Complex_IO, " &
220 "Procedure Process_Data_File");
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.
227 for i
in 1..Number_Of_Error_Items
loop
229 C_IO
.Get
(The_File
, TC_Complex
, TC_Width
);
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 #" &
236 when Ada
.Text_IO
.Data_Error
=> -- OK, expected exception.
237 Text_IO
.Skip_Line
(The_File
);
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 #" &
248 Report
.Comment
("Erroneous set of complex values extracted " &
249 "from data file using Complex_IO, " &
250 "Procedure Process_Data_File");
257 ("Unexpected exception raised in Process_Data_File");
258 end Process_Data_File
;
264 -- Place complex values into data file.
266 Load_Data_File
(Data_File
);
267 Text_IO
.Close
(Data_File
);
270 Report
.Comment
("Data file loaded with Complex values");
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
);
279 Report
.Comment
("Complex values extracted from data file");
284 -- Verify versions of Procedures Put and Get for Strings.
287 TC_String_Array
: array (1..Number_Of_Complex_Items
)
288 of String(1..15) := (others =>(others => ' '));
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
),
301 Report
.Comment
("Complex values placed into string array");
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)"
318 Report
.Failed
("Incorrect format for complex values that " &
319 "have been placed into string variables " &
320 "using the Complex_IO.Put procedure for " &
325 Report
.Comment
("String format of Complex values verified");
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
),
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
));
346 Report
.Comment
("Complex values removed from String array");
349 -- Verify that Layout_Error is raised if the given string is
350 -- too short to hold the formatted output.
353 Much_Too_Short
: String(1..2);
354 Complex_Value
: Complex_Pack
.Complex
:= (5.0, 0.0);
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");
361 when Layout_Error
=> null; -- OK, expected exception.
364 ("Unexpected exception raised by Procedure Put when " &
365 "the given string was too short to hold the " &
367 end Layout_Error_On_Put
;
370 Report
.Comment
("Layout Errors verified");
375 Report
.Failed
("Unexpected exception raised during the " &
376 "evaluation of Put and Get for Strings");
380 -- Place complex values into strings using a variety of legal
381 -- complex data formats.
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);
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,
411 TC_Last_Character_Read
);
413 if TC_Complex
/= Complex_Array
(i
) then
415 ("Incorrect complex data value obtained from " &
416 "Procedure Get with complex data input of: " &
417 TC_Complex_String_Array
(i
).all);
420 if TC_Last_Character_Read
/= TC_Last_Char_Array
(i
) then
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
));
434 Report
.Comment
("Complex values removed from strings and " &
435 "verified against expected values");
440 Report
.Failed
("Unexpected exception raised during the " &
441 "evaluation of Get for Strings");
445 when others => Report
.Failed
("Exception raised in Test_Block");
449 -- Delete the external file.
450 if Ada
.Text_IO
.Is_Open
(Data_File
) then
451 Ada
.Text_IO
.Delete
(Data_File
);
453 Ada
.Text_IO
.Open
(Data_File
,
456 Ada
.Text_IO
.Delete
(Data_File
);
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");
472 Report
.Failed
("Unexpected exception raised on text file Create");
474 end Test_for_Text_IO_Support
;