comparison gcc/testsuite/ada/acats/tests/c9/c940005.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 -- C940005.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 body of a protected function can have internal calls
28 -- to other protected functions and that the body of a protected
29 -- procedure can have internal calls to protected procedures and to
30 -- protected functions.
31 --
32 -- TEST DESCRIPTION:
33 -- Simulate a meter at a freeway on-ramp which, when real-time sensors
34 -- determine that the freeway is becoming saturated, triggers stop lights
35 -- which control the access of vehicles to prevent further saturation.
36 -- Each on-ramp is represented by a protected object - in this case only
37 -- one is shown (Test_Ramp). The routines to sample and alter the states
38 -- of the various sensors, to queue the vehicles on the meter and to
39 -- release them are all part of the protected object and can be shared
40 -- by various tasks. Apart from the function/procedure tests this example
41 -- has a mix of other tasking features.
42 --
43 --
44 -- CHANGE HISTORY:
45 -- 06 Dec 94 SAIC ACVC 2.0
46 -- 13 Nov 95 SAIC Updated and fixed bugs ACVC 2.0.1
47 --
48 --!
49
50
51 with Report;
52 with ImpDef;
53 with Ada.Calendar;
54
55 procedure C940005 is
56
57 begin
58
59 Report.Test ("C940005", "Check internal calls of protected functions" &
60 " and procedures");
61
62 declare -- encapsulate the test
63
64 function "+" (Left : Ada.Calendar.Time; Right: Duration)
65 return Ada.Calendar.Time renames Ada.Calendar."+";
66
67 -- Weighted load given to each potential problem area and accumulated
68 type Load_Factor is range 0..8;
69 Clear_Level : constant Load_Factor := 0;
70 Minimum_Level : constant Load_Factor := 1;
71 Moderate_Level : constant Load_Factor := 2;
72 Serious_Level : constant Load_Factor := 4;
73 Critical_Level : constant Load_Factor := 6;
74
75 -- Weighted loads given to each Sample Point (pure weights, not levels)
76 Local_Overload_wt : constant Load_Factor := 1;
77 Next_Ramp_in_Overload_wt : constant Load_Factor := 1;
78 Ramp_Junction_in_Overload_wt : constant Load_Factor :=2; --higher wght
79 -- :::: other weighted loads
80
81 TC_Multiplier : integer := 1; -- changed half way through
82 TC_Expected_Passage_Total : constant integer := 486;
83
84 -- This is the time between synchronizing pulses to the ramps.
85 -- In reality one would expect a time of 5 to 10 seconds. In
86 -- the interests of speeding up the test suite a shorter time
87 -- is used
88 Pulse_Time_Delta : constant duration := ImpDef.Long_Switch_To_New_Task;
89
90 -- control over stopping tasks
91 protected Control is
92 procedure Stop_Now;
93 function Stop return Boolean;
94 private
95 Halt : Boolean := False;
96 end Control;
97
98 protected body Control is
99 procedure Stop_Now is
100 begin
101 Halt := True;
102 end Stop_Now;
103
104 function Stop return Boolean is
105 begin
106 return Halt;
107 end Stop;
108 end Control;
109
110 task Pulse_Task; -- task to generate a pulse for each ramp
111
112 -- Carrier task. One is created for each vehicle arriving at the ramp
113 task type Vehicle;
114 type acc_Vehicle is access Vehicle;
115
116 --================================================================
117 protected Test_Ramp is
118 function Next_Ramp_in_Overload return Load_Factor;
119 function Local_Overload return Load_Factor;
120 function Freeway_Overload return Load_Factor;
121 function Freeway_Breakdown return Boolean;
122 function Meter_in_use_State return Boolean;
123 procedure Set_Local_Overload;
124 procedure Add_Meter_Queue;
125 procedure Subtract_Meter_Queue;
126 procedure Time_Pulse_Received;
127 entry Wait_at_Meter;
128 procedure TC_Passage (Pass_Point : Integer);
129 function TC_Get_Passage_Total return integer;
130 -- ::::::::: many routines are not shown (for example none of the
131 -- clears, none of the real-time-sensor handlers)
132
133 private
134
135 Release_One_Vehicle : Boolean := false;
136 Meter_in_Use : Boolean := false;
137 Fwy_Break_State : Boolean := false;
138
139
140 Ramp_Count : integer range 0..20 := 0;
141 Ramp_Count_Threshold : integer := 15;
142
143 -- Current state of the various Sample Points
144 Local_State : Load_Factor := Clear_Level;
145 Next_Ramp_State : Load_Factor := Clear_Level;
146 -- :::: other Sample Point states not shown
147
148 TC_Passage_Total : integer := 0;
149 end Test_Ramp;
150 --================================================================
151 protected body Test_Ramp is
152
153 procedure Start_Meter is
154 begin
155 Meter_in_Use := True;
156 null; -- stub :::: trigger the metering hardware
157 end Start_Meter;
158
159 -- External call for Meter_in_Use
160 function Meter_in_Use_State return Boolean is
161 begin
162 return Meter_in_Use;
163 end Meter_in_Use_State;
164
165 -- Trace the paths through the various routines by totaling the
166 -- weighted call parameters
167 procedure TC_Passage (Pass_Point : Integer) is
168 begin
169 TC_Passage_Total := TC_Passage_Total+(Pass_Point*TC_Multiplier);
170 end TC_Passage;
171
172 -- For the final check of the whole test
173 function TC_Get_Passage_Total return integer is
174 begin
175 return TC_Passage_Total;
176 end TC_Get_Passage_Total;
177
178 -- These Set/Clear routines are triggered by real-time sensors that
179 -- reflect traffic state
180 procedure Set_Local_Overload is
181 begin
182 Local_State := Local_Overload_wt;
183 if not Meter_in_Use then
184 Start_Meter; -- LOCAL INTERNAL PROCEDURE FROM PROCEDURE
185 end if;
186 end Set_Local_Overload;
187
188 --::::: Set/Clear routines for all the other sensors not shown
189
190 function Local_Overload return Load_Factor is
191 begin
192 return Local_State;
193 end Local_Overload;
194
195 function Next_Ramp_in_Overload return Load_Factor is
196 begin
197 return Next_Ramp_State;
198 end Next_Ramp_in_Overload;
199
200 -- :::::::: other overload factor states not shown
201
202 -- return the summation of all the load factors
203 function Freeway_Overload return Load_Factor is
204 begin
205 return Local_Overload -- EACH IS A CALL OF A
206 -- + :::: others -- FUNCTION FROM WITHIN
207 + Next_Ramp_in_Overload; -- A FUNCTION
208 end Freeway_Overload;
209
210 -- Freeway Breakdown is defined as traffic moving < 5mph
211 function Freeway_Breakdown return Boolean is
212 begin
213 return Fwy_Break_State;
214 end Freeway_Breakdown;
215
216 -- Keep count of vehicles currently on meter queue - we can't use
217 -- the 'count because we need the outcall trigger
218 procedure Add_Meter_Queue is
219 TC_Pass_Point : constant integer := 22;
220 begin
221 Ramp_Count := Ramp_Count + 1;
222 TC_Passage ( TC_Pass_Point ); -- note passage through here
223 if Ramp_Count > Ramp_Count_Threshold then
224 null; -- :::: stub, trigger surface street notification
225 end if;
226 end Add_Meter_Queue;
227 --
228 procedure Subtract_Meter_Queue is
229 TC_Pass_Point : constant integer := 24;
230 begin
231 Ramp_Count := Ramp_Count - 1;
232 TC_Passage ( TC_Pass_Point ); -- note passage through here
233 end Subtract_Meter_Queue;
234
235 -- Here each Vehicle task queues itself awaiting release
236 entry Wait_at_Meter when Release_One_Vehicle is
237 -- EXAMPLE OF ENTRY WITH BARRIERS AND PERSISTENT SIGNAL
238 TC_Pass_Point : constant integer := 23;
239 begin
240 TC_Passage ( TC_Pass_Point ); -- note passage through here
241 Release_One_Vehicle := false; -- Consume the signal
242 -- Decrement number of vehicles on ramp
243 Subtract_Meter_Queue; -- CALL PROCEDURE FROM WITHIN ENTRY BODY
244 end Wait_at_Meter;
245
246
247 procedure Time_Pulse_Received is
248 Load : Load_factor := Freeway_Overload; -- CALL MULTILEVEL
249 -- FUNCTION
250 -- FROM WITHIN PROCEDURE
251 begin
252 -- if broken down, no vehicles are released
253 if not Freeway_Breakdown then -- CALL FUNCTION FROM A PROCEDURE
254 if Load < Moderate_Level then
255 Release_One_Vehicle := true;
256 end if;
257 null; -- stub ::: If other levels, release every other
258 -- pulse, every third pulse etc.
259 end if;
260 end Time_Pulse_Received;
261
262 end Test_Ramp;
263 --================================================================
264
265
266 -- Simulate the arrival of a vehicle at the Ramp_Receiver and the
267 -- generation of an accompanying carrier task
268 procedure New_Arrival is
269 Next_Vehicle_Task: acc_Vehicle := new Vehicle;
270 TC_Pass_Point : constant integer := 3;
271 begin
272 Test_Ramp.TC_Passage ( TC_Pass_Point ); -- Note passage through here
273 null;
274 end New_arrival;
275
276
277 -- Carrier task. One is created for each vehicle arriving at the ramp
278 task body Vehicle is
279 TC_Pass_point : constant integer := 1;
280 TC_Pass_Point_2 : constant integer := 21;
281 TC_Pass_Point_3 : constant integer := 2;
282 begin
283 Test_Ramp.TC_Passage ( TC_Pass_Point ); -- note passage through here
284 if Test_Ramp.Meter_in_Use_State then
285 Test_Ramp.TC_Passage ( TC_Pass_Point_2 ); -- note passage
286 -- Increment count of number of vehicles on ramp
287 Test_Ramp.Add_Meter_Queue; -- CALL a protected PROCEDURE
288 -- which is also called from within
289 -- enter the meter queue
290 Test_Ramp.Wait_at_Meter; -- CALL a protected ENTRY
291 end if;
292 Test_Ramp.TC_Passage ( TC_Pass_Point_3 ); -- note passage thru here
293 null; --:::: call to the first in the series of the Ramp_Sensors
294 -- this "passes" the vehicle from one sensor to the next
295 exception
296 when others =>
297 Report.Failed ("Unexpected exception in Vehicle Task");
298 end Vehicle;
299
300
301 -- Task transmits a synchronizing "pulse" to all ramps
302 --
303 task body Pulse_Task is
304 Pulse_Time : Ada.Calendar.Time := Ada.Calendar.Clock;
305 begin
306 While not Control.Stop loop
307 delay until Pulse_Time;
308 Test_Ramp.Time_Pulse_Received; -- causes INTERNAL CALLS
309 -- :::::::::: and to all the others
310 Pulse_Time := Pulse_Time + Pulse_Time_Delta; -- calculate next
311 end loop;
312 exception
313 when others =>
314 Report.Failed ("Unexpected exception in Pulse_Task");
315 end Pulse_Task;
316
317
318 begin -- declare
319
320 -- Test driver. This is ALL test control code
321
322 -- First simulate calls to the protected functions and procedures
323 -- from without the protected object
324 --
325 -- CALL FUNCTIONS
326 if Test_Ramp.Local_Overload /= Clear_Level then
327 Report.Failed ("External Call to Local_Overload incorrect");
328 end if;
329 if Test_Ramp.Next_Ramp_in_Overload /= Clear_Level then
330 Report.Failed ("External Call to Next_Ramp_in_Overload incorrect");
331 end if;
332 if Test_Ramp.Freeway_Overload /= Clear_Level then
333 Report.Failed ("External Call to Freeway_Overload incorrect");
334 end if;
335
336 -- Now Simulate the arrival of a vehicle to verify path through test
337 New_Arrival;
338 delay Pulse_Time_Delta*2; -- allow it to pass through the complex
339
340 TC_Multiplier := 5; -- change the weights for the paths for the next
341 -- part of the test
342
343 -- Simulate a real-time sensor reporting overload
344 Test_Ramp.Set_Local_Overload; -- CALL A PROCEDURE (and change levels)
345
346 -- CALL FUNCTIONS again
347 if Test_Ramp.Local_Overload /= Minimum_Level then
348 Report.Failed ("External Call to Local_Overload incorrect - 2");
349 end if;
350 if Test_Ramp.Freeway_Overload /= Minimum_Level then
351 Report.Failed ("External Call to Freeway_Overload incorrect -2");
352 end if;
353
354 -- Now Simulate the arrival of another vehicle again causing
355 -- INTERNAL CALLS but following different paths (queuing on the
356 -- meter etc.)
357 New_Arrival;
358 delay Pulse_Time_Delta*2; -- allow it to pass through the complex
359
360 Control.Stop_Now; -- finish test
361
362 if TC_Expected_Passage_Total /= Test_Ramp.TC_Get_Passage_Total then
363 Report.Failed ("Unexpected paths taken");
364 end if;
365
366 end; -- declare
367
368 Report.Result;
369
370 end C940005;