summaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/ca/ca11017.a
blob: cbcce701d37f3c0760d74527a4a7d07adb256d7b (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
-- CA11017.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 body of the parent package may depend on one of its own 
--      public children.
--
-- TEST DESCRIPTION:
--      A scenario is created that demonstrates the potential of adding a
--      public child during code maintenance without distubing a large 
--      subsystem.  After child is added to the subsystem, a maintainer
--      decides to take advantage of the new functionality and rewrites
--      the parent's body.
--
--      Declare a string abstraction in a package which manipulates string
--      replacement. Define a parent package which provides operations for 
--      a record type with discriminant.  Declare a public child of this 
--      package which adds functionality to the original subsystem.  In the 
--      parent body, call operations from the public child.
--
--      In the main program, check that operations in the parent and public 
--      child perform as expected.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

-- Simulates application which manipulates strings.

package CA11017_0 is               

   type String_Rec (The_Size : positive) is private;

   type Substring is new string;

   -- ... Various other types used by the application.

   procedure Replace (In_The_String   : in out String_Rec;
                      At_The_Position : in     positive;
                      With_The_String : in     String_Rec);

   -- ... Various other operations used by the application.

private
   -- Different size for each individual record.

   type String_Rec (The_Size : positive) is
      record
         The_Length  : natural := 0;
         The_Content : Substring (1 .. The_Size);
      end record;

end CA11017_0;

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

-- Public child added during code maintenance without disturbing a 
-- large system.  This public child would add functionality to the
-- original system.

package CA11017_0.CA11017_1 is    

   Position_Error : exception;

   function Equal_Length (Left  : in String_Rec;
                          Right : in String_Rec) return boolean;

   function Same_Content (Left  : in String_Rec;
                          Right : in String_Rec) return boolean;

   procedure Copy (From_The_Substring : in     Substring;
                   To_The_String      : in out String_Rec);

   -- ... Various other operations used by the application.

end CA11017_0.CA11017_1;

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

package body CA11017_0.CA11017_1 is    

   function Equal_Length (Left  : in String_Rec;
                          Right : in String_Rec) return boolean is
   -- Quick comparison between the lengths of the input strings.

   begin
      return (Left.The_Length = Right.The_Length);  -- Parent's private
                                                    -- type.
   end Equal_Length;
   --------------------------------------------------------------------
   function Same_Content (Left  : in String_Rec;
                          Right : in String_Rec) return boolean is

   begin
      for I in 1 .. Left.The_Length loop
         if Left.The_Content (I) = Right.The_Content (I) then
            return true;
         else
            return false;
         end if;
      end loop;

   end Same_Content;
   --------------------------------------------------------------------
   procedure Copy (From_The_Substring : in     Substring;
                   To_The_String      : in out String_Rec) is
   begin
      To_The_String.The_Content        -- Parent's private type.
        (1 .. From_The_Substring'length) := From_The_Substring;

      To_The_String.The_Length         -- Parent's private type.
                                         := From_The_Substring'length;
   end Copy;

end CA11017_0.CA11017_1;

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

--  After child is added to the subsystem, a maintainer decides
--  to take advantage of the new functionality and rewrites the
--  parent's body.

with CA11017_0.CA11017_1;

package body CA11017_0 is

   -- Calls functions from public child for a quick comparison of the
   -- input strings.  If their lengths are the same, do the replacement.

   procedure Replace (In_The_String   : in out String_Rec;
                      At_The_Position : in     positive;
                      With_The_String : in     String_Rec) is
      End_Position : natural := At_The_Position +
                                With_The_String.The_Length - 1;

   begin
      if not CA11017_0.CA11017_1.Equal_Length  -- Public child's operation.
        (With_The_String, In_The_String) then
           raise CA11017_0.CA11017_1.Position_Error;                 
                                               -- Public child's exception.
      else 
         In_The_String.The_Content (At_The_Position .. End_Position) :=
           With_The_String.The_Content (1 .. With_The_String.The_Length);
      end if;

   end Replace;

end CA11017_0;

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

with Report;

with CA11017_0.CA11017_1;   -- Explicit with public child package,
                            -- implicit with parent package (CA11017_0).

procedure CA11017 is

   package String_Pkg renames CA11017_0;
   use String_Pkg;

begin

   Report.Test ("CA11017", "Check that body of the parent package can " &
                "depend on one of its own public children");

-- Both input strings have the same size. Replace the first string by the 
-- second string.  

        Replace_Subtest:
        declare
           The_First_String, The_Second_String : String_Rec (16);
                                                 -- Parent's private type.
           The_Position                        : positive := 1;
        begin
           CA11017_1.Copy ("This is the time", 
                           To_The_String => The_First_String); 

           CA11017_1.Copy ("For all good men", The_Second_String); 

           Replace (The_First_String, The_Position, The_Second_String);
  
           -- Compare results using function from public child since
           -- the type is private.

           if not CA11017_1.Same_Content
                            (The_First_String, The_Second_String) then
              Report.Failed ("Incorrect results");
           end if;

        end Replace_Subtest;

-- During processing, the application may erroneously attempt to replace
-- strings of different size. This would result in the raising of an 
-- exception.                                                       

        Exception_Subtest:
        declare
           The_First_String  : String_Rec (17);
                                                 -- Parent's private type.
           The_Second_String : String_Rec (13);
                                                 -- Parent's private type.
           The_Position      : positive := 2;
        begin
           CA11017_1.Copy (" ACVC Version 2.0", The_First_String); 

           CA11017_1.Copy (From_The_Substring => "ACVC 9X Basic", 
                           To_The_String      => The_Second_String); 

           Replace (The_First_String, The_Position, The_Second_String);

           Report.Failed ("Exception was not raised");

        exception
           when CA11017_1.Position_Error =>
                  Report.Comment ("Exception is raised as expected");

        end Exception_Subtest;

   Report.Result;

end CA11017;