| -- CA11015.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 a generic child of a non-generic package can use its |
| -- parent's declarations and operations. Check that the instantiation |
| -- of the generic child can correctly use the operations. |
| -- |
| -- TEST DESCRIPTION: |
| -- Declare a map abstraction in a package which manages basic physical |
| -- maps. Declare a generic child of this package which defines copies |
| -- of maps of any discrete type, i.e., population, density, or weather. |
| -- |
| -- In the main program, declare an instance of the child. Check that |
| -- the operations in the parent and instance of the child package |
| -- perform as expected. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| -- Simulates map of physical features, i.e., desert, forest, water, |
| -- or plains. |
| |
| package CA11015_0 is |
| type Map_Type is private; |
| subtype Latitude is integer range 1 .. 9; |
| subtype Longitude is integer range 1 .. 7; |
| |
| type Physical_Features is (Desert, Forest, Water, Plains, Unexplored); |
| type Page_Type is range 0 .. 80; |
| |
| Terra_Incognita : exception; |
| |
| -- Use geographic database to initialize the basic map. |
| |
| procedure Initialize_Basic_Map (Map : in out Map_Type); |
| |
| function Get_Physical_Feature (Lat : Latitude; |
| Long : Longitude; |
| Map : Map_Type) return Physical_Features; |
| |
| function Next_Page return Page_Type; |
| |
| private |
| type Map_Type is array (Latitude, Longitude) of Physical_Features; |
| Basic_Map : Map_Type; |
| Page : Page_Type := 0; -- Location for each copy of Map. |
| |
| end CA11015_0; |
| |
| --==================================================================-- |
| |
| package body CA11015_0 is |
| |
| procedure Initialize_Basic_Map (Map : in out Map_Type) is |
| -- Not a real initialization. Real application can use geographic |
| -- database to create the basic map. |
| begin |
| for I in Latitude'first .. Latitude'last loop |
| for J in 1 .. 2 loop |
| Map (I, J) := Unexplored; |
| end loop; |
| for J in 3 .. 4 loop |
| Map (I, J) := Desert; |
| end loop; |
| for J in 5 .. 7 loop |
| Map (I, J) := Plains; |
| end loop; |
| end loop; |
| |
| end Initialize_Basic_Map; |
| --------------------------------------------------- |
| function Get_Physical_Feature (Lat : Latitude; |
| Long : Longitude; |
| Map : Map_Type) |
| return Physical_Features is |
| begin |
| return (Map (Lat, Long)); |
| end Get_Physical_Feature; |
| --------------------------------------------------- |
| function Next_Page return Page_Type is |
| begin |
| Page := Page + 1; |
| return (Page); |
| end Next_Page; |
| |
| --------------------------------------------------- |
| begin -- CA11015_0 |
| -- Initialize a basic map. |
| Initialize_Basic_Map (Basic_Map); |
| |
| end CA11015_0; |
| |
| --==================================================================-- |
| |
| -- Generic child package of physical map. Instantiate this package to |
| -- create map copy with a new geographic feature, i.e., population, density, |
| -- or weather. |
| |
| generic |
| |
| type Generic_Feature is (<>); -- Any geographic feature, i.e., population, |
| -- density, or weather that can be |
| -- characterized by a scalar value. |
| |
| package CA11015_0.CA11015_1 is |
| |
| type Feature_Map is private; |
| |
| function Get_Feature_Val (Lat : Latitude; |
| Long : Longitude; |
| Map : Feature_Map) return Generic_Feature; |
| |
| procedure Set_Feature_Val (Lat : in Latitude; |
| Long : in Longitude; |
| Fea : in Generic_Feature; |
| Map : in out Feature_Map); |
| |
| function Check_Page (Map : Feature_Map; |
| Page_No : Page_Type) return boolean; |
| |
| private |
| type Feature_Type is array (Latitude, Longitude) of Generic_Feature; |
| |
| type Feature_Map is |
| record |
| Feature : Feature_Type; |
| Page : Page_Type := Next_Page; -- Operation from parent. |
| end record; |
| |
| end CA11015_0.CA11015_1; |
| |
| --==================================================================-- |
| |
| package body CA11015_0.CA11015_1 is |
| |
| function Get_Feature_Val (Lat : Latitude; |
| Long : Longitude; |
| Map : Feature_Map) return Generic_Feature is |
| begin |
| return (Map.Feature (Lat, Long)); |
| end Get_Feature_Val; |
| --------------------------------------------------- |
| procedure Set_Feature_Val (Lat : in Latitude; |
| Long : in Longitude; |
| Fea : in Generic_Feature; |
| Map : in out Feature_Map) is |
| begin |
| if Get_Physical_Feature (Lat, Long, Basic_Map) = Unexplored |
| -- Parent's operation, |
| -- Parent's private object. |
| then |
| raise Terra_Incognita; -- Exception from parent. |
| else |
| Map.Feature (Lat, Long) := Fea; |
| end if; |
| end Set_Feature_Val; |
| --------------------------------------------------- |
| function Check_Page (Map : Feature_Map; |
| Page_No : Page_Type) return boolean is |
| begin |
| return (Map.Page = Page_No); |
| end Check_Page; |
| |
| end CA11015_0.CA11015_1; |
| |
| --==================================================================-- |
| |
| with CA11015_0.CA11015_1; -- Generic map operation, |
| -- implicitly withs parent, basic map |
| -- application. |
| with Report; |
| |
| procedure CA11015 is |
| |
| begin |
| |
| Report.Test ("CA11015", "Check that an instantiation of a child package " & |
| "of a non-generic package can use its parent's " & |
| "declarations and operations"); |
| |
| -- An application creates a population map using an integer type. |
| |
| Population_Map_Subtest: |
| declare |
| type Population_Type is range 0 .. 10_000; |
| |
| -- Declare instance of the child generic map package for one |
| -- particular integer type. |
| |
| package Population is new CA11015_0.CA11015_1 (Population_Type); |
| |
| Population_Map_Latitude : CA11015_0.Latitude := 1; |
| -- parent's type |
| Population_Map_Longitude : CA11015_0.Longitude := 5; |
| -- parent's type |
| Pop_Map : Population.Feature_Map; |
| Pop : Population_Type := 1000; |
| |
| begin |
| Population.Set_Feature_Val (Population_Map_Latitude, |
| Population_Map_Longitude, |
| Pop, |
| Pop_Map); |
| |
| If not ( (Population.Get_Feature_Val (Population_Map_Latitude, |
| Population_Map_Longitude, Pop_Map) = Pop) or |
| (Population.Check_Page (Pop_Map, 1)) ) then |
| Report.Failed ("Population map contains incorrect values"); |
| end if; |
| |
| end Population_Map_Subtest; |
| |
| -- An application creates a weather map using an enumeration type. |
| |
| Weather_Map_Subtest: |
| declare |
| type Weather_Type is (Hot, Cold, Mild); |
| |
| -- Declare instance of the child generic map package for one |
| -- particular enumeration type. |
| |
| package Weather_Pkg is new CA11015_0.CA11015_1 (Weather_Type); |
| |
| Weather_Map_Latitude : CA11015_0.Latitude := 2; |
| -- parent's type |
| Weather_Map_Longitude : CA11015_0.Longitude := 6; |
| -- parent's type |
| Weather_Map : Weather_Pkg.Feature_Map; |
| Weather : Weather_Type := Mild; |
| |
| begin |
| Weather_Pkg.Set_Feature_Val (Weather_Map_Latitude, |
| Weather_Map_Longitude, |
| Weather, |
| Weather_Map); |
| |
| if ( (Weather_Pkg.Get_Feature_Val (Weather_Map_Latitude, |
| Weather_Map_Longitude, Weather_Map) /= Weather) or |
| not (Weather_Pkg.Check_Page (Weather_Map, 2)) ) |
| then |
| Report.Failed ("Weather map contains incorrect values"); |
| end if; |
| |
| end Weather_Map_Subtest; |
| |
| -- During processing, the application may erroneously attempts to create |
| -- a density map on an unexplored area. This would result in the raising |
| -- of an exception. |
| |
| Density_Map_Subtest: |
| declare |
| type Density_Type is (High, Medium, Low); |
| |
| -- Declare instance of the child generic map package for one |
| -- particular enumeration type. |
| |
| package Density_Pkg is new CA11015_0.CA11015_1 (Density_Type); |
| |
| Density_Map_Latitude : CA11015_0.Latitude := 7; |
| -- parent's type |
| Density_Map_Longitude : CA11015_0.Longitude := 2; |
| -- parent's type |
| Density : Density_Type := Low; |
| Density_Map : Density_Pkg.Feature_Map; |
| |
| begin |
| Density_Pkg.Set_Feature_Val (Density_Map_Latitude, |
| Density_Map_Longitude, |
| Density, |
| Density_Map); |
| |
| Report.Failed ("Exception not raised in child generic package"); |
| |
| exception |
| |
| when CA11015_0.Terra_Incognita => -- parent's exception, |
| null; -- raised in child. |
| |
| when others => |
| Report.Failed ("Others exception is raised"); |
| |
| end Density_Map_Subtest; |
| |
| Report.Result; |
| |
| end CA11015; |