| -- C392A01.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 the use of a class-wide formal parameter allows for the |
| -- proper dispatching of objects to the appropriate implementation of |
| -- a primitive operation. Check this for the root tagged type defined |
| -- in a package, and the extended type is defined in that same package. |
| -- |
| -- TEST DESCRIPTION: |
| -- Declare a root tagged type, and some associated primitive operations. |
| -- Extend the root type, and override one or more primitive operations, |
| -- inheriting the other primitive operations from the root type. |
| -- Derive from the extended type, again overriding some primitive |
| -- operations and inheriting others (including some that the parent |
| -- inherited). |
| -- Define a subprogram with a class-wide parameter, inside of which is a |
| -- call on a dispatching primitive operation. These primitive operations |
| -- modify global variables (the class-wide parameter has mode IN). |
| -- |
| -- |
| -- |
| -- The following hierarchy of tagged types and primitive operations is |
| -- utilized in this test: |
| -- |
| -- type Bank_Account (root) |
| -- | |
| -- | Operations |
| -- | Increment_Bank_Reserve |
| -- | Assign_Representative |
| -- | Increment_Counters |
| -- | Open |
| -- | |
| -- type Savings_Account (extended from Bank_Account) |
| -- | |
| -- | Operations |
| -- | (Increment_Bank_Reserve) (inherited) |
| -- | Assign_Representative (overridden) |
| -- | Increment_Counters (overridden) |
| -- | Open (overridden) |
| -- | |
| -- type Preferred_Account (extended from Savings_Account) |
| -- | |
| -- | Operations |
| -- | (Increment_Bank_Reserve) (inherited twice - Bank_Acct.) |
| -- | (Assign_Representative) (inherited - Savings_Acct.) |
| -- | Increment_Counters (overridden) |
| -- | Open (overridden) |
| -- |
| -- |
| -- In this test, we are concerned with the following selection of dispatching |
| -- calls, accomplished with the use of a Bank_Account'Class IN procedure |
| -- parameter : |
| -- |
| -- \ Type |
| -- Prim. Op \ Bank_Account Savings_Account Preferred_Account |
| -- \------------------------------------------------ |
| -- Increment_Bank_Reserve| X X X |
| -- Assign_Representative | X |
| -- Increment_Counters | X X X |
| -- |
| -- |
| -- |
| -- The location of the declaration and derivation of the root and extended |
| -- types will be varied over a series of tests. Locations of declaration |
| -- and derivation for a particular test are marked with an asterisk (*). |
| -- |
| -- Root type: |
| -- |
| -- * Declared in package. |
| -- Declared in generic package. |
| -- |
| -- Extended types: |
| -- |
| -- * Derived in parent location. |
| -- Derived in a nested package. |
| -- Derived in a nested subprogram. |
| -- Derived in a nested generic package. |
| -- Derived in a separate package. |
| -- Derived in a separate visible child package. |
| -- Derived in a separate private child package. |
| -- |
| -- Primitive Operations: |
| -- |
| -- * Procedures with same parameter profile. |
| -- Procedures with different parameter profile. |
| -- Functions with same parameter profile. |
| -- Functions with different parameter profile. |
| -- Mixture of Procedures and Functions. |
| -- |
| -- |
| -- TEST FILES: |
| -- This test depends on the following foundation code: |
| -- |
| -- F392A00.A |
| -- |
| -- The following files comprise this test: |
| -- |
| -- => C392A01.A |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| with F392A00; -- package Accounts |
| with Report; |
| |
| procedure C392A01 is |
| |
| package Accounts renames F392A00; |
| |
| -- Declare account objects. |
| |
| B_Account : Accounts.Bank_Account; |
| S_Account : Accounts.Savings_Account; |
| P_Account : Accounts.Preferred_Account; |
| |
| -- Procedures to operate on accounts. |
| -- Each uses a class-wide IN parameter, as well as a call to a |
| -- dispatching operation. |
| |
| -- Procedure Tabulate_Account performs a dispatching call on a primitive |
| -- operation that has been overridden for each of the extended types. |
| |
| procedure Tabulate_Account (Acct : in Accounts.Bank_Account'Class) is |
| begin |
| Accounts.Increment_Counters (Acct); -- Dispatch according to tag. |
| end Tabulate_Account; |
| |
| |
| -- Procedure Accumulate_Reserve performs a dispatching call on a |
| -- primitive operation that has been defined for the root type and |
| -- inherited by each derived type. |
| |
| procedure Accumulate_Reserve (Acct : in Accounts.Bank_Account'Class) is |
| begin |
| Accounts.Increment_Bank_Reserve (Acct); -- Dispatch according to tag. |
| end Accumulate_Reserve; |
| |
| |
| -- Procedure Resolve_Dispute performs a dispatching call on a primitive |
| -- operation that has been defined in the root type, overridden in the |
| -- first derived extended type, and inherited by the subsequent extended |
| -- type. |
| |
| procedure Resolve_Dispute (Acct : in Accounts.Bank_Account'Class) is |
| begin |
| Accounts.Assign_Representative (Acct); -- Dispatch according to tag. |
| end Resolve_Dispute; |
| |
| |
| |
| begin -- Main test procedure. |
| |
| Report.Test ("C392A01", "Check that the use of a class-wide parameter " & |
| "allows for proper dispatching where root type " & |
| "and extended types are declared in the same " & |
| "package" ); |
| |
| Bank_Account_Subtest: |
| declare |
| use Accounts; |
| begin |
| Accounts.Open (B_Account); |
| |
| -- Demonstrate class-wide parameter allowing dispatch by a primitive |
| -- operation that has been defined for this specific type. |
| Accumulate_Reserve (Acct => B_Account); |
| Tabulate_Account (B_Account); |
| |
| if (Accounts.Bank_Reserve /= Accounts.Opening_Balance) or |
| (Accounts.Number_Of_Accounts (Bank) /= 1) or |
| (Accounts.Number_Of_Accounts (Total) /= 1) |
| then |
| Report.Failed ("Failed in Bank_Account_Subtest"); |
| end if; |
| |
| end Bank_Account_Subtest; |
| |
| |
| Savings_Account_Subtest: |
| declare |
| use Accounts; |
| begin |
| Accounts.Open (Acct => S_Account); |
| |
| -- Demonstrate class-wide parameter allowing dispatch by a primitive |
| -- operation that has been inherited by this extended type. |
| Accumulate_Reserve (Acct => S_Account); |
| |
| -- Demonstrate class-wide parameter allowing dispatch by a primitive |
| -- operation that has been overridden for this extended type. |
| Resolve_Dispute (Acct => S_Account); |
| Tabulate_Account (S_Account); |
| |
| if Accounts.Bank_Reserve /= (3.0 * Accounts.Opening_Balance) or |
| Accounts.Daily_Representative /= Accounts.Manager or |
| Accounts.Number_Of_Accounts (Savings) /= 1 or |
| Accounts.Number_Of_Accounts (Total) /= 2 |
| then |
| Report.Failed ("Failed in Savings_Account_Subtest"); |
| end if; |
| |
| end Savings_Account_Subtest; |
| |
| |
| Preferred_Account_Subtest: |
| declare |
| use Accounts; |
| begin |
| Accounts.Open (P_Account); |
| |
| -- Verify that the correct implementation of Open (overridden) was |
| -- used for the Preferred_Account object. |
| if not Accounts.Verify_Open (P_Account) then |
| Report.Failed ("Incorrect values for init. Preferred Acct object"); |
| end if; |
| |
| -- Demonstrate class-wide parameter allowing dispatch by a primitive |
| -- operation that has been twice inherited by this extended type. |
| Accumulate_Reserve (Acct => P_Account); |
| |
| -- Demonstrate class-wide parameter allowing dispatch by a primitive |
| -- operation that has been overridden for this extended type (the |
| -- operation was overridden by its parent type as well). |
| Tabulate_Account (P_Account); |
| |
| if Accounts.Bank_Reserve /= 1300.00 or |
| Accounts.Number_Of_Accounts (Preferred) /= 1 or |
| Accounts.Number_Of_Accounts (Total) /= 3 |
| then |
| Report.Failed ("Failed in Preferred_Account_Subtest"); |
| end if; |
| |
| end Preferred_Account_Subtest; |
| |
| |
| Report.Result; |
| |
| end C392A01; |
| |