1-- C940006.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 external calls
28--      to other protected functions and that the body of a protected
29--      procedure can have external calls to protected procedures and to
30--      protected functions.
31--
32-- TEST DESCRIPTION:
33--      Use a subset of the simulation of the freeway on-ramp described in
34--      c940005.  In this case two protected objects are used but only a
35--      minimum of routines are shown in each.  Both objects are hard coded
36--      and detail two adjacent on-ramps (Ramp_31 & Ramp_32) with routines in
37--      each which use external calls to the  other.
38
39--
40--
41-- CHANGE HISTORY:
42--      06 Dec 94   SAIC    ACVC 2.0
43--
44--!
45
46with Report;
47
48procedure C940006 is
49
50begin
51
52   Report.Test ("C940006", "Check external calls of protected functions" &
53                        " and procedures");
54
55   declare  -- encapsulate the test
56
57      -- Weighted load given to each potential problem area and accumulated
58      type Load_Factor is range 0..8;
59      --
60      Clear_Level    : constant Load_Factor := 0;
61      Minimum_Level  : constant Load_Factor := 1;
62      Moderate_Level : constant Load_Factor := 3;
63      Serious_Level  : constant Load_Factor := 4;
64      Critical_Level : constant Load_Factor := 6;
65
66      --================================================================
67      -- Only the Routines that are used in this test are shown
68      --
69      protected Ramp_31 is
70
71         function Local_Overload        return Load_Factor;
72         procedure Set_Local_Overload(Sensor_Level : Load_Factor);
73         procedure Notify;
74         function Next_Ramp_Overload    return Load_Factor;
75         function Freeway_Overload      return Load_Factor;
76         procedure Downstream_Ramps;
77         function Get_DSR_Accumulate    return Load_Factor;
78
79      private
80         Next_Ramp_Alert : Boolean  := false;  -- Next Ramp is in trouble?
81
82         -- Current state of the various Sample Points
83         Local_State     : Load_Factor := Clear_Level;
84         -- Accumulated load for next three downstream ramps
85         DSR_Accumulate  : Load_Factor := Clear_Level;
86
87      end Ramp_31;
88      --================================================================
89      -- Only the Routines that are used in this test are shown
90      --
91      protected Ramp_32 is
92
93         function Local_Overload return Load_Factor;
94         procedure Set_Local_Overload (Sensor_Level : Load_Factor);
95
96      private
97
98         Local_State : Load_Factor := Clear_Level;
99
100      end Ramp_32;
101      --================================================================
102      protected body Ramp_31 is
103
104         -- These Set/Clear routines are triggered by real-time sensors that
105         -- reflect traffic state
106         procedure Set_Local_Overload (Sensor_Level : Load_Factor) is
107         begin
108            -- Notify "previous" ramp to check this one for current state.
109            -- Subsequent changes in state will not send an alert
110            null;   --::::: (see Ramp_32 for this code)
111            Local_State := Sensor_Level;
112            null;   --::::: Start local meter if not already started
113         end Set_Local_Overload;
114
115         function Local_Overload return Load_Factor is
116         begin
117            return Local_State;
118         end Local_Overload;
119
120         -- This is notification from the next ramp that it is in
121         -- overload.  With this provision we only need to sample the next
122         -- ramp during adverse conditions.
123         procedure Notify is
124         begin
125            Next_Ramp_Alert := true;
126         end Notify;
127
128         function Next_Ramp_Overload return Load_Factor is
129         begin
130            if Next_Ramp_Alert then
131               -- EXTERNAL FUNCTION CALL FROM FUNCTION
132               -- Get next ramp's current state
133               return Ramp_32.Local_Overload;
134            else
135               return Clear_Level;
136            end if;
137         end Next_Ramp_Overload;
138
139         -- return the summation of all the load factors
140         function Freeway_Overload return Load_Factor is
141         begin
142            return    Local_Overload
143                      -- + :::: others
144                      + Next_Ramp_Overload;
145         end Freeway_Overload;
146
147         -- Snapshot the states of the next three downstream ramps
148         procedure Downstream_Ramps is
149         begin
150            DSR_Accumulate := Ramp_32.Local_Overload;    -- EXTERNAL FUNCTION
151            -- ::::         + Ramp_33.Local_Overload     -- FROM  PROCEDURE
152            -- ::::         + Ramp_34.Local_Overload
153         end Downstream_Ramps;
154
155         -- Get last snapshot
156         function Get_DSR_Accumulate return Load_Factor is
157         begin
158            return DSR_Accumulate;
159         end Get_DSR_Accumulate;
160
161      end Ramp_31;
162      --================================================================
163      protected body Ramp_32 is
164
165         function Local_Overload return Load_Factor is
166         begin
167            return Local_State;
168         end;
169
170
171         -- These Set/Clear routines are triggered by real-time sensors that
172         -- reflect traffic state
173         procedure Set_Local_Overload(Sensor_Level : Load_Factor) is
174         begin
175            if Local_State = Clear_Level then
176               -- Notify "previous" ramp to check this one for current state.
177               -- Subsequent changes in state will not send an alert
178               -- When the situation clears another routine performs the
179               -- all_clear notification. (not shown)
180               -- EXTERNAL CALL OF PROCEDURE FROM PROCEDURE
181               Ramp_31.Notify;
182            end if;
183            Local_State := Sensor_Level;
184            null;   --::::: Start local meter if not already started
185         end;
186
187      end Ramp_32;
188      --================================================================
189
190
191
192   begin -- declare
193
194      -- Test driver.  This is ALL test control code
195      -- Simulate calls to the protected functions and procedures
196      -- from without the protected object, these will, in turn make the
197      -- external calls.
198
199      -- Check initial conditions, exercising the simple calls
200      if not (Ramp_31.Local_Overload     = Clear_Level  and
201              Ramp_31.Next_Ramp_Overload = Clear_Level  and
202              Ramp_31.Freeway_Overload   = Clear_Level) and
203              Ramp_32.Local_Overload     = Clear_Level    then
204                  Report.Failed ("Initial Calls provided unexpected Results");
205      end if;
206
207      -- Simulate real-time sensors reporting overloads at a hardware level
208      Ramp_31.Set_Local_Overload (1);
209      Ramp_32.Set_Local_Overload (3);
210
211      Ramp_31.Downstream_Ramps;   -- take the current snapshot
212
213      if not (Ramp_31.Local_Overload     = Minimum_Level  and
214              Ramp_31.Get_DSR_Accumulate = Moderate_Level and
215              Ramp_31.Freeway_Overload   = Serious_Level)   then
216         Report.Failed ("Secondary Calls provided unexpected Results");
217      end if;
218
219   end; -- declare
220
221   Report.Result;
222
223end C940006;
224