-- 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;