| -- CA13A02.A |
| -- |
| -- Grant of Unlimited Rights |
| -- |
| -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, |
| -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained |
| -- unlimited rights in the software and documentation contained herein. |
| -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making |
| -- this public release, the Government intends to confer upon all |
| -- recipients unlimited rights equal to those held by the Government. |
| -- These rights include rights to use, duplicate, release or disclose the |
| -- released technical data and computer software in whole or in part, in |
| -- any manner and for any purpose whatsoever, and to have or permit others |
| -- to do so. |
| -- |
| -- DISCLAIMER |
| -- |
| -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR |
| -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED |
| -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE |
| -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE |
| -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A |
| -- PARTICULAR PURPOSE OF SAID MATERIAL. |
| --* |
| -- |
| -- OBJECTIVE: |
| -- Check that subunits declared in generic child units of a public |
| -- parent have the same visibility into its parent, its siblings |
| -- (public and private), and packages on which its parent depends |
| -- as is available at the point of their declaration. |
| -- |
| -- TEST DESCRIPTION: |
| -- Declare an outside elevator button operation as a subunit in a |
| -- generic child package of the basic operation package (FA13A00.A). |
| -- This procedure has visibility into its parent ancestor and its |
| -- private sibling. |
| -- |
| -- In the main program, instantiate the child package. Check that |
| -- subunits perform as expected. |
| -- |
| -- TEST FILES: |
| -- The following files comprise this test: |
| -- |
| -- FA13A00.A |
| -- CA13A02.A |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| -- Public generic child package of an elevator application. This package |
| -- provides outside elevator button operations. |
| |
| generic -- Instantiate once for each floor. |
| Our_Floor : in Floor; -- Reference type declared in parent. |
| |
| package FA13A00_1.CA13A02_4 is -- Outside Elevator Button Operations |
| |
| type Light is (Up, Down, Express, Off); |
| |
| type Direction is (Up, Down, Express); |
| |
| function Call_Elevator (D : Direction) return Light; |
| |
| -- other type definitions and procedure declarations in real application. |
| |
| end FA13A00_1.CA13A02_4; |
| |
| --==================================================================-- |
| |
| -- Context clauses required for visibility needed by separate subunit. |
| |
| with FA13A00_0; -- Building Manager |
| |
| with FA13A00_1.FA13A00_2; -- Floor Calculation (private) |
| |
| with FA13A00_1.FA13A00_3; -- Move Elevator |
| |
| use FA13A00_0; |
| |
| package body FA13A00_1.CA13A02_4 is |
| |
| function Call_Elevator (D : Direction) return Light is separate; |
| |
| end FA13A00_1.CA13A02_4; |
| |
| --==================================================================-- |
| |
| separate (FA13A00_1.CA13A02_4) |
| |
| -- Subunit Call_Elevator declared in Outside Elevator Button Operations. |
| |
| function Call_Elevator (D : Direction) return Light is |
| Elevator_Button : Light; |
| |
| begin |
| -- See if power is on. |
| |
| if Power = Off then -- Reference package with'ed by |
| Elevator_Button := Off; -- the subunit parent's body. |
| |
| else |
| case D is |
| when Express => |
| FA13A00_1.FA13A00_3.Move_Elevator -- Reference public sibling of |
| (Penthouse, Call_Waiting); -- the subunit parent's body. |
| |
| Elevator_Button := Express; |
| |
| when Up => |
| if Current_Floor < Our_Floor then |
| FA13A00_1.FA13A00_2.Up -- Reference private sibling of |
| (Floor'pos (Our_Floor) -- the subunit parent's body. |
| - Floor'pos (Current_Floor)); |
| else |
| FA13A00_1.FA13A00_2.Down -- Reference private sibling of |
| (Floor'pos (Current_Floor) -- the subunit parent's body. |
| - Floor'pos (Our_Floor)); |
| end if; |
| |
| -- Call elevator. |
| |
| Call |
| (Current_Floor, Call_Waiting); -- Reference subprogram declared |
| -- in the parent of the subunit |
| -- parent's body. |
| Elevator_Button := Up; |
| |
| when Down => |
| if Current_Floor > Our_Floor then |
| FA13A00_1.FA13A00_2.Down -- Reference private sibling of |
| (Floor'pos (Current_Floor) -- the subunit parent's body. |
| - Floor'pos (Our_Floor)); |
| else |
| FA13A00_1.FA13A00_2.Up -- Reference private sibling of |
| (Floor'pos (Our_Floor) -- the subunit parent's body. |
| - Floor'pos (Current_Floor)); |
| end if; |
| |
| Elevator_Button := Down; |
| |
| -- Call elevator. |
| |
| Call |
| (Current_Floor, Call_Waiting); -- Reference subprogram declared |
| -- in the parent of the subunit |
| -- parent's body. |
| end case; |
| |
| if not Call_Waiting (Current_Floor) -- Reference private part of the |
| then -- parent of the subunit parent's |
| -- body. |
| TC_Operation := false; |
| end if; |
| |
| end if; |
| |
| return Elevator_Button; |
| |
| end Call_Elevator; |
| |
| --==================================================================-- |
| |
| with FA13A00_1.CA13A02_4; -- Outside Elevator Button Operations |
| -- implicitly with Basic Elevator |
| -- Operations |
| with Report; |
| |
| procedure CA13A02 is |
| |
| begin |
| |
| Report.Test ("CA13A02", "Check that subunits declared in generic child " & |
| "units of a public parent have the same visibility into " & |
| "its parent, its parent's siblings, and packages on " & |
| "which its parent depends"); |
| |
| -- Going from floor one to penthouse. |
| |
| Going_To_Penthouse: |
| declare |
| -- Declare instance of the child generic elevator package for penthouse. |
| |
| package Call_Elevator_Pkg is new FA13A00_1.CA13A02_4 |
| (FA13A00_1.Penthouse); |
| |
| use Call_Elevator_Pkg; |
| |
| Call_Button_Light : Light; |
| |
| begin |
| |
| Call_Button_Light := Call_Elevator (Express); |
| |
| if not FA13A00_1.TC_Operation or Call_Button_Light /= Express then |
| Report.Failed ("Incorrect elevator operation going to penthouse"); |
| end if; |
| |
| end Going_To_Penthouse; |
| |
| -- Going from penthouse to basement. |
| |
| Going_To_Basement: |
| declare |
| -- Declare instance of the child generic elevator package for basement. |
| |
| package Call_Elevator_Pkg is new FA13A00_1.CA13A02_4 |
| (FA13A00_1.Basement); |
| |
| use Call_Elevator_Pkg; |
| |
| Call_Button_Light : Light; |
| |
| begin |
| |
| Call_Button_Light := Call_Elevator (Down); |
| |
| if not FA13A00_1.TC_Operation or Call_Button_Light /= Down then |
| Report.Failed ("Incorrect elevator operation going to basement"); |
| end if; |
| |
| end Going_To_Basement; |
| |
| -- Going from basement to floor three. |
| |
| Going_To_Floor3: |
| declare |
| -- Declare instance of the child generic elevator package for floor |
| -- three. |
| |
| package Call_Elevator_Pkg is new FA13A00_1.CA13A02_4 |
| (FA13A00_1.Floor3); |
| |
| use Call_Elevator_Pkg; |
| |
| Call_Button_Light : Light; |
| |
| begin |
| |
| Call_Button_Light := Call_Elevator (Up); |
| |
| if not FA13A00_1.TC_Operation or Call_Button_Light /= Up then |
| Report.Failed ("Incorrect elevator operation going to floor 3"); |
| end if; |
| |
| end Going_To_Floor3; |
| |
| -- Going from floor three to floor two. |
| |
| Going_To_Floor2: |
| declare |
| -- Declare instance of the child generic elevator package for floor two. |
| |
| package Call_Elevator_Pkg is new FA13A00_1.CA13A02_4 |
| (FA13A00_1.Floor2); |
| |
| use Call_Elevator_Pkg; |
| |
| Call_Button_Light : Light; |
| |
| begin |
| |
| Call_Button_Light := Call_Elevator (Up); |
| |
| if not FA13A00_1.TC_Operation or Call_Button_Light /= Up then |
| Report.Failed ("Incorrect elevator operation going to floor 2"); |
| end if; |
| |
| end Going_To_Floor2; |
| |
| -- Going to floor one. |
| |
| Going_To_Floor1: |
| declare |
| -- Declare instance of the child generic elevator package for floor one. |
| |
| package Call_Elevator_Pkg is new FA13A00_1.CA13A02_4 |
| (FA13A00_1.Floor1); |
| |
| use Call_Elevator_Pkg; |
| |
| Call_Button_Light : Light; |
| |
| begin |
| -- Calling elevator from floor one. |
| |
| FA13A00_1.Current_Floor := FA13A00_1.Floor1; |
| |
| Call_Button_Light := Call_Elevator (Down); |
| |
| if not FA13A00_1.TC_Operation or Call_Button_Light /= Down then |
| Report.Failed ("Incorrect elevator operation going to floor 1"); |
| end if; |
| |
| end Going_To_Floor1; |
| |
| Report.Result; |
| |
| end CA13A02; |