aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c3/c341a03.a
blob: 0911e636d5705f79cb274d936634869a1c178f60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
-- C341A03.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 an object of one class-wide type can initialize a 
--      class-wide object of a different type when the operation is embedded
--      in a generic unit.
--
-- TEST DESCRIPTION:
--      Declare specific-type objects of an extended type.  Declare an array
--      of access values designating class-wide objects, initialized to point
--      to the objects of the specific type.  Define a generic subprogram
--      having a generic formal derived type parameter.  Within the generic,
--      declare a class-wide variable of the formal parameter type.  Verify
--      that the variable can be initialized with the value of an object
--      of another class-wide type within the class.
--
--      The particular root and extended types used in this abstraction are
--      defined in foundation code (F341A00.A), and are graphically displayed
--      as follows:
--
--           package Bank
--              type Account
--                  |
--                  |
--                  |
--               package Checking
--                  type Account
--                      |
--                      |
--                      | 
--                   package Interest_Checking
--                          type Account
--
-- TEST FILES:
--      This test depends on the following foundation code:
--
--         F341A00.A
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      16 Dec 94   SAIC    Changed level of 'Class for ATM_Card
--
--!

with F341A00_0;            -- package Bank
generic
   type Account_Type is new F341A00_0.Account with private; -- new Bank.Account
function C341A03_0 (The_Account : Account_Type'Class)       -- function Audit
  return F341A00_0.Dollar_Amount;

function C341A03_0 (The_Account : Account_Type'Class)
  return F341A00_0.Dollar_Amount is
   Acct : Account_Type'Class := The_Account;  -- Init. of class-wide with
begin                                         -- another class-wide object.
   return Acct.Current_Balance;
end C341A03_0;


     --=================================================================--


with F341A00_0;            -- package Bank
with F341A00_1;            -- package Checking
with C341A03_0;            -- generic function Audit
with Report;

procedure C341A03 is

   package Bank     renames F341A00_0;
   package Checking renames F341A00_1;

   Current_Checking_Accounts : constant := 3;

   Checking_Acct1 : aliased Checking.Account := (Current_Balance => 10.00,
                                                 Overdraft_Fee   =>  5.00);
   Checking_Acct2 : aliased Checking.Account := (Current_Balance => 20.00,
                                                 Overdraft_Fee   =>  5.00);
   Checking_Acct3 : aliased Checking.Account := (Current_Balance => 30.00,
                                                 Overdraft_Fee   =>  5.00);

   type ATM_Card is access all Checking.Account'Class;

   -- Declare array of accesses to class-wide objects.
   Account_Array : array (1 .. Current_Checking_Accounts) of 
     ATM_Card := (Checking_Acct1'Access, 
                  Checking_Acct2'Access, 
                  Checking_Acct3'Access);
begin  -- C341A03

   Report.Test ("C341A03",  "Check that an object of one class-wide type " &
                            "can initialize a class-wide object of a "   &
                            "different type when the operation is embedded " &
                            "in a generic unit" );

   Audit_Checking_Accounts:
   declare
      Balance_In_Checking_Accounts : Bank.Dollar_Amount := 0.00;
      -- Instantiate with a specific extended type.
      function Checking_Audit is new C341A03_0 (Checking.Account);
      use type Bank.Dollar_Amount;
   begin

      for I in 1 .. Current_Checking_Accounts loop
         Balance_In_Checking_Accounts := Balance_In_Checking_Accounts + 
           Checking_Audit (Account_Array (I).all);
      end loop;

      if Balance_In_Checking_Accounts /= 60.00 then
         Report.Failed ("Incorrect initialization of class-wide object");
      end if;

   end Audit_Checking_Accounts;

   Report.Result;

end C341A03;