comparison gcc/testsuite/ada/acats/tests/cxa/cxacc01.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 -- CXACC01.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 use of 'Class'Output and 'Class'Input allow stream
28 -- manipulation of objects of non-limited class-wide types.
29 --
30 -- TEST DESCRIPTION:
31 -- This test demonstrates the uses of 'Class'Output and 'Class'Input
32 -- in moving objects of a particular class to and from a stream file.
33 -- A procedure uses a class-wide parameter to move objects of specific
34 -- types in the class to the stream, using the 'Class'Output attribute
35 -- of the root type of the class. A function returns a class-wide object,
36 -- using the 'Class'Input attribute of the root type of the class to
37 -- extract the object from the stream.
38 -- A field-by-field comparison of record objects is performed to validate
39 -- the data read from the stream. Operator precedence rules are used
40 -- in the comparison rather than parentheses.
41 --
42 -- APPLICABILITY CRITERIA:
43 -- This test is applicable to all implementations capable of supporting
44 -- external Stream_IO files.
45 --
46 --
47 -- CHANGE HISTORY:
48 -- 06 Dec 94 SAIC ACVC 2.0
49 -- 14 Nov 95 SAIC Corrected prefix of 'Tag attribute for ACVC 2.0.1.
50 -- 24 Aug 96 SAIC Changed a call to "Create" to "Reset".
51 -- 26 Feb 97 CTA.PWB Allowed for non-support of some IO operations.
52 --!
53
54 with FXACC00, Ada.Streams.Stream_IO, Ada.Tags, Report;
55
56 procedure CXACC01 is
57
58 Order_File : Ada.Streams.Stream_IO.File_Type;
59 Order_Stream : Ada.Streams.Stream_IO.Stream_Access;
60 Order_Filename : constant String :=
61 Report.Legal_File_Name ( Nam => "CXACC01" );
62 Incomplete : exception;
63
64 begin
65
66 Report.Test ("CXACC01", "Check that the use of 'Class'Output " &
67 "and 'Class'Input allow stream manipulation " &
68 "of objects of non-limited class-wide types");
69
70 Test_for_Stream_IO_Support:
71 begin
72
73 -- If an implementation does not support Stream_IO in a particular
74 -- environment, the exception Use_Error or Name_Error will be raised on
75 -- calls to various Stream_IO operations. This block statement
76 -- encloses a call to Create, which should produce an exception in a
77 -- non-supportive environment. These exceptions will be handled to
78 -- produce a Not_Applicable result.
79
80 Ada.Streams.Stream_IO.Create (Order_File,
81 Ada.Streams.Stream_IO.Out_File,
82 Order_Filename);
83
84 exception
85
86 when Ada.Streams.Stream_IO.Use_Error | Ada.Streams.Stream_IO.Name_Error =>
87 Report.Not_Applicable
88 ( "Files not supported - Create as Out_File for Stream_IO" );
89 raise Incomplete;
90
91 end Test_for_Stream_IO_Support;
92
93 Operational_Test_Block:
94 declare
95
96 -- Store tag values associated with objects of tagged types.
97
98 TC_Box_Office_Tag : constant String :=
99 Ada.Tags.External_Tag(FXACC00.Ticket_Request'Tag);
100
101 TC_Summer_Tag : constant String :=
102 Ada.Tags.External_Tag(FXACC00.Subscriber_Request'Tag);
103
104 TC_Mayoral_Tag : constant String :=
105 Ada.Tags.External_Tag(FXACC00.VIP_Request'Tag);
106
107 TC_Late_Tag : constant String :=
108 Ada.Tags.External_Tag(FXACC00.Last_Minute_Request'Tag);
109
110 -- The following procedure will take an object of the Ticket_Request
111 -- class and output it to the stream. Objects of any extended type
112 -- in the class can be output to the stream with this procedure.
113
114 procedure Order_Entry (Order : FXACC00.Ticket_Request'Class) is
115 begin
116 FXACC00.Ticket_Request'Class'Output (Order_Stream, Order);
117 end Order_Entry;
118
119
120 -- The following function will retrieve from the stream an object of
121 -- the Ticket_Request class.
122
123 function Order_Retrieval return FXACC00.Ticket_Request'Class is
124 begin
125 return FXACC00.Ticket_Request'Class'Input (Order_Stream);
126 end Order_Retrieval;
127
128 begin
129
130 Order_Stream := Ada.Streams.Stream_IO.Stream (Order_File);
131
132 -- Store the data objects in the stream.
133 -- Each of the objects is of a different type within the class.
134
135 Order_Entry (FXACC00.Box_Office_Request); -- Object of root type
136 Order_Entry (FXACC00.Summer_Subscription); -- Obj. of extended type
137 Order_Entry (FXACC00.Mayoral_Ticket_Request); -- Obj. of extended type
138 Order_Entry (FXACC00.Late_Request); -- Object of twice
139 -- extended type.
140
141 -- Reset mode of stream to In_File prior to reading data from it.
142 Reset1:
143 begin
144 Ada.Streams.Stream_IO.Reset (Order_File,
145 Ada.Streams.Stream_IO.In_File);
146 exception
147 when Ada.Streams.Stream_IO.Use_Error =>
148 Report.Not_Applicable
149 ( "Reset to In_File not supported for Stream_IO - 1" );
150 raise Incomplete;
151 end Reset1;
152
153 Process_Order_Block:
154 declare
155
156 use FXACC00;
157
158 -- Declare variables of the root type class,
159 -- and initialize them with class-wide objects returned from
160 -- the stream as function result.
161
162 Order_1 : Ticket_Request'Class := Order_Retrieval;
163 Order_2 : Ticket_Request'Class := Order_Retrieval;
164 Order_3 : Ticket_Request'Class := Order_Retrieval;
165 Order_4 : Ticket_Request'Class := Order_Retrieval;
166
167 -- Declare objects of the specific types from within the class
168 -- that correspond to the types of the data written to the
169 -- stream. Perform a type conversion on the class-wide objects.
170
171 Ticket_Order : Ticket_Request :=
172 Ticket_Request(Order_1);
173 Subscriber_Order : Subscriber_Request :=
174 Subscriber_Request(Order_2);
175 VIP_Order : VIP_Request :=
176 VIP_Request(Order_3);
177 Last_Minute_Order : Last_Minute_Request :=
178 Last_Minute_Request(Order_4);
179
180 begin
181
182 -- Perform a field-by-field comparison of all the class-wide
183 -- objects input from the stream with specific type objects
184 -- originally written to the stream.
185
186 if Ticket_Order.Location /=
187 Box_Office_Request.Location or
188 Ticket_Order.Number_Of_Tickets /=
189 Box_Office_Request.Number_Of_Tickets
190 then
191 Report.Failed ("Ticket_Request object validation failure");
192 end if;
193
194 if Subscriber_Order.Location /=
195 Summer_Subscription.Location or
196 Subscriber_Order.Number_Of_Tickets /=
197 Summer_Subscription.Number_Of_Tickets or
198 Subscriber_Order.Subscription_Number /=
199 Summer_Subscription.Subscription_Number
200 then
201 Report.Failed ("Subscriber_Request object validation failure");
202 end if;
203
204 if VIP_Order.Location /=
205 Mayoral_Ticket_Request.Location or
206 VIP_Order.Number_Of_Tickets /=
207 Mayoral_Ticket_Request.Number_Of_Tickets or
208 VIP_Order.Rank /=
209 Mayoral_Ticket_Request.Rank
210 then
211 Report.Failed ("VIP_Request object validation failure");
212 end if;
213
214 if Last_Minute_Order.Location /=
215 Late_Request.Location or
216 Last_Minute_Order.Number_Of_Tickets /=
217 Late_Request.Number_Of_Tickets or
218 Last_Minute_Order.Rank /=
219 Late_Request.Rank or
220 Last_Minute_Order.Special_Consideration /=
221 Late_Request.Special_Consideration or
222 Last_Minute_Order.Donation /=
223 Late_Request.Donation
224 then
225 Report.Failed ("Last_Minute_Request object validation failure");
226 end if;
227
228 -- Verify tag values from before and after processing.
229 -- The 'Tag attribute is used with objects of a class-wide type.
230
231 if TC_Box_Office_Tag /=
232 Ada.Tags.External_Tag(Order_1'Tag)
233 then
234 Report.Failed("Failed tag comparison - 1");
235 end if;
236
237 if TC_Summer_Tag /=
238 Ada.Tags.External_Tag(Order_2'Tag)
239 then
240 Report.Failed("Failed tag comparison - 2");
241 end if;
242
243 if TC_Mayoral_Tag /=
244 Ada.Tags.External_Tag(Order_3'Tag)
245 then
246 Report.Failed("Failed tag comparison - 3");
247 end if;
248
249 if TC_Late_Tag /=
250 Ada.Tags.External_Tag(Order_4'Tag)
251 then
252 Report.Failed("Failed tag comparison - 4");
253 end if;
254
255 end Process_Order_Block;
256
257 -- After all the data has been correctly extracted, the file
258 -- should be empty.
259
260 if not Ada.Streams.Stream_IO.End_Of_File (Order_File) then
261 Report.Failed ("Stream file not empty");
262 end if;
263
264 exception
265 when Incomplete =>
266 raise;
267 when Constraint_Error =>
268 Report.Failed ("Constraint_Error raised in Operational Block");
269 when others =>
270 Report.Failed ("Exception raised in Operational Test Block");
271 end Operational_Test_Block;
272
273 Deletion:
274 begin
275 if Ada.Streams.Stream_IO.Is_Open (Order_File) then
276 Ada.Streams.Stream_IO.Delete (Order_File);
277 else
278 Ada.Streams.Stream_IO.Open (Order_File,
279 Ada.Streams.Stream_IO.Out_File,
280 Order_Filename);
281 Ada.Streams.Stream_IO.Delete (Order_File);
282 end if;
283 exception
284 when others =>
285 Report.Failed
286 ( "Delete not properly implemented for Stream_IO" );
287 end Deletion;
288
289 Report.Result;
290
291 exception
292
293 when Incomplete =>
294 Report.Result;
295 when others =>
296 Report.Failed ( "Unexpected exception" );
297 Report.Result;
298
299 end CXACC01;