view gcc/testsuite/ada/acats/tests/c3/c392003.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- C392003.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 where the root tagged type is
--      defined in a package, and the extended type is defined in a nested
--      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
--   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.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!
 
 
 with Report;
 
 procedure C392003 is
 
       --
       -- Types and subtypes.
       --
 
       type Dollar_Amount  is new float;
       type Interest_Rate  is delta 0.001 range 0.000 .. 1.000;
       type Account_Types  is (Bank, Savings, Preferred, Total);
       type Account_Counter is array (Account_Types) of integer;
       type Account_Rep is (President, Manager, New_Account_Manager, Teller);
 
       --
       -- Constants.
       --
 
       Opening_Balance           : constant Dollar_Amount := 100.00;
       Current_Rate              : constant Interest_Rate := 0.030;
       Preferred_Minimum_Balance : constant Dollar_Amount := 1000.00;
 
       --
       -- Global Variables
       --
 
       Bank_Reserve         : Dollar_Amount   := 0.00;
       Daily_Representative : Account_Rep     := New_Account_Manager;
       Number_Of_Accounts   : Account_Counter := (Bank      => 0,
                                                  Savings   => 0,
                                                  Preferred => 0,
                                                  Total     => 0);
 
    -- Root tagged type and primitive operations declared in internal 
    -- package (Accounts).
    -- Extended types (and primitive operations) derived in nested packages.
 
      --=================================================================--
 
    package Accounts is
 
       --
       -- Root account type and primitive operations.
       --
 
       -- Root type.
 
       type Bank_Account is tagged
          record
             Balance : Dollar_Amount;
          end record;
 
       -- Primitive operations of Bank_Account.
 
       function  Increment_Bank_Reserve (Acct : in     Bank_Account) 
         return Dollar_Amount;
       function Assign_Representative   (Acct : in     Bank_Account)
         return Account_Rep;
       procedure Increment_Counters     (Acct : in     Bank_Account);
       procedure Open                   (Acct : in out Bank_Account);
 
      --=================================================================--
                           
       package S_And_L is 
 
          -- Declare extended type in a nested package.
 
          type Savings_Account is new Bank_Account with
          record
             Rate : Interest_Rate;
          end record;
 
          -- Function Increment_Bank_Reserve inherited from 
          -- parent (Bank_Account).
 
          -- Primitive operations (Overridden).
          function Assign_Representative (Acct : in     Savings_Account)
            return Account_Rep;
          procedure Increment_Counters   (Acct : in     Savings_Account);
          procedure Open                 (Acct : in out Savings_Account);
                           
 
      --=================================================================--
                           
          package Premium is 
 
             -- Declare further extended type in a nested package.
 
             type Preferred_Account is new Savings_Account with
             record
                Minimum_Balance : Dollar_Amount;
             end record;
 
             -- Function Increment_Bank_Reserve inherited twice.
             -- Function Assign_Representative inherited from parent 
             --   (Savings_Account).
 
             -- Primitive operation (Overridden).
             procedure Increment_Counters (Acct : in     Preferred_Account);
             procedure Open               (Acct : in out Preferred_Account);
 
             -- Function used to verify Open operation for Preferred_Account 
             -- objects.
             function Verify_Open (Acct : in Preferred_Account) return Boolean;
 
          end Premium;
 
       end S_And_L;
 
    end Accounts;
 
      --=================================================================--
 
    package body Accounts is
 
       --
       -- Primitive operations for Bank_Account.
       --
 
       function Increment_Bank_Reserve (Acct : in Bank_Account) 
         return Dollar_Amount is
       begin
          return (Bank_Reserve + Acct.Balance);
       end Increment_Bank_Reserve;
 
       function Assign_Representative (Acct : in Bank_Account) 
         return Account_Rep is
       begin
          return Account_Rep'(Teller);
       end Assign_Representative;
 
       procedure Increment_Counters (Acct : in Bank_Account) is
       begin
          Number_Of_Accounts (Bank)  := Number_Of_Accounts (Bank) + 1;
          Number_Of_Accounts (Total) := Number_Of_Accounts (Total) + 1;
       end Increment_Counters;
 
       procedure Open (Acct : in out Bank_Account) is
       begin
          Acct.Balance := Opening_Balance;
       end Open;
 
      --=================================================================--
 
       package body S_And_L is
 
          --
          -- Overridden operations for Savings_Account type.
          --
 
          function Assign_Representative (Acct : in Savings_Account) 
            return Account_Rep is
          begin
             return (Manager);
          end Assign_Representative;
 
          procedure Increment_Counters (Acct : in Savings_Account) is
          begin
             Number_Of_Accounts (Savings) := Number_Of_Accounts (Savings) + 1;
             Number_Of_Accounts (Total)   := Number_Of_Accounts (Total) + 1;
          end Increment_Counters;
 
          procedure Open (Acct : in out Savings_Account) is
          begin
             Open (Bank_Account(Acct));
             Acct.Rate := Current_Rate;
             Acct.Balance := 2.0 * Opening_Balance;
          end Open;
      
      --=================================================================--
 
          package body Premium is
 
             --
             -- Overridden operations for Preferred_Account type.
             --
                      
             procedure Increment_Counters (Acct : in Preferred_Account) is
             begin
                Number_Of_Accounts (Preferred) := 
                  Number_Of_Accounts (Preferred) + 1;
                Number_Of_Accounts (Total)     := 
                  Number_Of_Accounts (Total) + 1;
             end Increment_Counters;
 
             procedure Open (Acct : in out Preferred_Account) is
             begin
                Open (Savings_Account(Acct));
                Acct.Minimum_Balance := Preferred_Minimum_Balance;
                Acct.Balance := Acct.Minimum_Balance;
             end Open;
 
             --
             -- Function used to verify Open operation for Preferred_Account 
             -- objects.
             --
 
             function Verify_Open (Acct : in Preferred_Account) 
               return Boolean is
             begin                                                    
                return (Acct.Balance         = Preferred_Minimum_Balance and
                        Acct.Rate            = Current_Rate              and
                        Acct.Minimum_Balance = Preferred_Minimum_Balance);
             end Verify_Open;
 
          end Premium;
  
       end S_And_L;
 
    end Accounts;
 
      --=================================================================--
 
    -- Declare account objects.
 
    B_Account : Accounts.Bank_Account;
    S_Account : Accounts.S_And_L.Savings_Account;
    P_Account : Accounts.S_And_L.Premium.Preferred_Account;
 
    -- Procedures to operate on accounts.
    -- Each uses a class-wide IN parameter, as well as a call to a
    -- dispatching operation.
 
    -- Function 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;
 
    -- Function Accumulate_Reserve performs a dispatching call on a
    -- primitive operation that has been defined for the root type and 
    -- inherited by each derived type.
 
    function Accumulate_Reserve (Acct : in Accounts.Bank_Account'Class) 
      return Dollar_Amount is
    begin
       -- Dispatch according to tag.
       return (Accounts.Increment_Bank_Reserve (Acct));   
    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
       -- Dispatch according to tag.
       Daily_Representative := Accounts.Assign_Representative (Acct);   
    end Resolve_Dispute;
 
      --=================================================================--
 
 begin  -- Main test procedure.
 
    Report.Test ("C392003", "Check that the use of a class-wide parameter "   &
                             "allows for proper dispatching where root type " &
                             "is declared in a nested package, and "          &
                             "subsequent extended types are derived in "      &
                             "further nested packages" );
    
    Bank_Account_Subtest:
    begin
       Accounts.Open (B_Account);
 
       -- Demonstrate class-wide parameter allowing dispatch by a primitive
       -- operation that has been defined for this specific type.
       Bank_Reserve := Accumulate_Reserve (Acct => B_Account);
       Tabulate_Account (B_Account);
 
       if (Bank_Reserve /= Opening_Balance) or
          (Number_Of_Accounts (Bank) /= 1)  or
          (Number_Of_Accounts (Total) /= 1) 
       then
          Report.Failed ("Failed in Bank_Account_Subtest");
       end if;
 
    end Bank_Account_Subtest;
 
 
    Savings_Account_Subtest:
    begin
       Accounts.S_And_L.Open (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 (Daily_Representative /= Manager)   or 
          (Number_Of_Accounts (Savings) /= 1) or
          (Number_Of_Accounts (Total) /= 2)
       then
          Report.Failed ("Failed in Savings_Account_Subtest");
       end if;
 
    end Savings_Account_Subtest;
 
 
 
    Preferred_Account_Subtest:
    begin
       Accounts.S_And_L.Premium.Open (P_Account);
 
       -- Verify that the correct implementation of Open (overridden) was 
       -- used for the Preferred_Account object.
       if not Accounts.S_And_L.Premium.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.
       Bank_Reserve := 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 Bank_Reserve /= 1100.00             or 
          Number_Of_Accounts (Preferred) /= 1 or
          Number_Of_Accounts (Total) /= 3
       then
          Report.Failed ("Failed in Preferred_Account_Subtest");
       end if;
 
    end Preferred_Account_Subtest;
 
    Report.Result;
 
 end C392003;