Dead
[official-gcc.git] / gomp-20050608-branch / gcc / testsuite / ada / acats / tests / cxa / cxa4004.a
blobec11f7d50f9ad6e172acd4ce3bbae48703caea43
1 -- CXA4004.A
2 --
3 -- Grant of Unlimited Rights
4 --
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7 -- unlimited rights in the software and documentation contained herein.
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
9 -- this public release, the Government intends to confer upon all
10 -- recipients unlimited rights equal to those held by the Government.
11 -- These rights include rights to use, duplicate, release or disclose the
12 -- released technical data and computer software in whole or in part, in
13 -- any manner and for any purpose whatsoever, and to have or permit others
14 -- to do so.
16 -- DISCLAIMER
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
24 --*
26 -- OBJECTIVE:
27 -- Check that the subprograms defined in package Ada.Strings.Fixed are
28 -- available, and that they produce correct results. Specifically, check
29 -- the subprograms Count, Find_Token, Index, Index_Non_Blank, and Move.
30 --
31 -- TEST DESCRIPTION:
32 -- This test, when combined with tests CXA4002,3, and 5 will provide
33 -- thorough coverage of the functionality found in Ada.Strings.Fixed.
34 -- This test contains many small, specific test cases, situations that
35 -- although common in user environments, are often difficult to generate
36 -- in large numbers in a application-based test.
38 --
39 -- CHANGE HISTORY:
40 -- 06 Dec 94 SAIC ACVC 2.0
41 -- 10 Apr 95 SAIC Corrected subtest for Move, Drop=Right.
43 --!
45 with Report;
46 with Ada.Strings;
47 with Ada.Strings.Fixed;
48 with Ada.Strings.Maps;
50 procedure CXA4004 is
51 begin
53 Report.Test("CXA4004", "Check that the subprograms defined in " &
54 "package Ada.Strings.Fixed are available, " &
55 "and that they produce correct results");
57 Test_Block:
58 declare
60 package ASF renames Ada.Strings.Fixed;
61 package Maps renames Ada.Strings.Maps;
63 Result_String : String(1..10) := (others => Ada.Strings.Space);
65 Source_String1 : String(1..5) := "abcde"; -- odd length string
66 Source_String2 : String(1..6) := "abcdef"; -- even length string
67 Source_String3 : String(1..12) := "abcdefghijkl";
68 Source_String4 : String(1..12) := "abcdefghij "; -- last two ch pad
69 Source_String5 : String(1..12) := " cdefghijkl"; -- first two ch pad
70 Source_String6 : String(1..12) := "abcdefabcdef";
72 Location : Natural := 0;
73 Slice_Start : Positive;
74 Slice_End,
75 Slice_Count : Natural := 0;
77 CD_Set : Maps.Character_Set := Maps.To_Set("cd");
78 ABCD_Set : Maps.Character_Set := Maps.To_Set("abcd");
79 A_to_F_Set : Maps.Character_Set := Maps.To_Set("abcdef");
81 CD_to_XY_Map : Maps.Character_Mapping :=
82 Maps.To_Mapping(From => "cd", To => "xy");
84 begin
86 -- Procedure Move
88 -- Evaluate the Procedure Move with various combinations of
89 -- parameters.
91 -- Justify = Left (default case)
93 ASF.Move(Source => Source_String1, -- "abcde"
94 Target => Result_String);
96 if Result_String /= "abcde " then
97 Report.Failed("Incorrect result from Move with Justify = Left");
98 end if;
100 -- Justify = Right
102 ASF.Move(Source => Source_String2, -- "abcdef"
103 Target => Result_String,
104 Drop => Ada.Strings.Error,
105 Justify => Ada.Strings.Right);
107 if Result_String /= " abcdef" then
108 Report.Failed("Incorrect result from Move with Justify = Right");
109 end if;
111 -- Justify = Center (two cases, odd and even pad lengths)
113 ASF.Move(Source_String1, -- "abcde"
114 Result_String,
115 Ada.Strings.Error,
116 Ada.Strings.Center,
117 'x'); -- non-default padding.
119 if Result_String /= "xxabcdexxx" then -- Unequal padding added right
120 Report.Failed("Incorrect result from Move with Justify = Center-1");
121 end if;
123 ASF.Move(Source_String2, -- "abcdef"
124 Result_String,
125 Ada.Strings.Error,
126 Ada.Strings.Center);
128 if Result_String /= " abcdef " then -- Equal padding added on L/R.
129 Report.Failed("Incorrect result from Move with Justify = Center-2");
130 end if;
132 -- When the source string is longer than the target string, several
133 -- cases can be examined, with the results depending on the value of
134 -- the Drop parameter.
136 -- Drop = Left
138 ASF.Move(Source => Source_String3, -- "abcdefghijkl"
139 Target => Result_String,
140 Drop => Ada.Strings.Left);
142 if Result_String /= "cdefghijkl" then
143 Report.Failed("Incorrect result from Move with Drop = Left");
144 end if;
146 -- Drop = Right
148 ASF.Move(Source_String3, Result_String, Ada.Strings.Right);
150 if Result_String /= "abcdefghij" then
151 Report.Failed("Incorrect result from Move with Drop = Right");
152 end if;
154 -- Drop = Error
155 -- The effect in this case depends on the value of the justify
156 -- parameter, and on whether any characters in Source other than
157 -- Pad would fail to be copied.
159 -- Drop = Error, Justify = Left, right overflow characters are pad.
161 ASF.Move(Source => Source_String4, -- "abcdefghij "
162 Target => Result_String,
163 Drop => Ada.Strings.Error,
164 Justify => Ada.Strings.Left);
166 if not(Result_String = "abcdefghij") then -- leftmost 10 characters
167 Report.Failed("Incorrect result from Move with Drop = Error - 1");
168 end if;
170 -- Drop = Error, Justify = Right, left overflow characters are pad.
172 ASF.Move(Source_String5, -- " cdefghijkl"
173 Result_String,
174 Ada.Strings.Error,
175 Ada.Strings.Right);
177 if Result_String /= "cdefghijkl" then -- rightmost 10 characters
178 Report.Failed("Incorrect result from Move with Drop = Error - 2");
179 end if;
181 -- In other cases of Drop=Error, Length_Error is propagated, such as:
183 begin
185 ASF.Move(Source_String3, -- 12 characters, no Pad.
186 Result_String, -- 10 characters
187 Ada.Strings.Error,
188 Ada.Strings.Left);
190 Report.Failed("Length_Error not raised by Move - 1");
192 exception
193 when Ada.Strings.Length_Error => null; -- OK
194 when others =>
195 Report.Failed("Incorrect exception raised by Move - 1");
196 end;
200 -- Function Index
201 -- (Other usage examples of this function found in CXA4002-3.)
202 -- Check when the pattern is not found in the source.
204 if ASF.Index("abcdef", "gh") /= 0 or
205 ASF.Index("abcde", "abcdef") /= 0 or -- pattern > source
206 ASF.Index("xyz",
207 "abcde",
208 Ada.Strings.Backward) /= 0 or
209 ASF.Index("", "ab") /= 0 or -- null source string.
210 ASF.Index("abcde", " ") /= 0 -- blank pattern.
211 then
212 Report.Failed("Incorrect result from Index, no pattern match");
213 end if;
215 -- Check that Pattern_Error is raised when the pattern is the
216 -- null string.
217 begin
218 Location := ASF.Index(Source_String6, -- "abcdefabcdef"
219 "", -- null pattern string.
220 Ada.Strings.Forward);
221 Report.Failed("Pattern_Error not raised by Index");
222 exception
223 when Ada.Strings.Pattern_Error => null; -- OK, expected exception.
224 when others =>
225 Report.Failed("Incorrect exception raised by Index, null pattern");
226 end;
228 -- Use the search direction "backward" to locate the particular
229 -- pattern within the source string.
231 Location := ASF.Index(Source_String6, -- "abcdefabcdef"
232 "de", -- slice 4..5, 10..11
233 Ada.Strings.Backward); -- search from right end.
235 if Location /= 10 then
236 Report.Failed("Incorrect result from Index going Backward");
237 end if;
239 -- Using the version of Index testing character set membership,
240 -- check combinations of forward/backward, inside/outside parameter
241 -- configurations.
243 if ASF.Index(Source => Source_String1, -- "abcde"
244 Set => CD_Set,
245 Test => Ada.Strings.Inside,
246 Going => Ada.Strings.Forward) /= 3 or -- 'c' at pos 3.
247 ASF.Index(Source_String6, -- "abcdefabcdef"
248 CD_Set,
249 Ada.Strings.Outside,
250 Ada.Strings.Backward) /= 12 or -- 'f' at position 12
251 ASF.Index(Source_String6, -- "abcdefabcdef"
252 CD_Set,
253 Ada.Strings.Inside,
254 Ada.Strings.Backward) /= 10 or -- 'd' at position 10
255 ASF.Index("cdcdcdcdacdcdcdcd",
256 CD_Set,
257 Ada.Strings.Outside,
258 Ada.Strings.Forward) /= 9 -- 'a' at position 9
259 then
260 Report.Failed("Incorrect result from function Index for sets - 1");
261 end if;
263 -- Additional interesting uses/combinations using Index for sets.
265 if ASF.Index("cd", -- same size, str-set
266 CD_Set,
267 Ada.Strings.Inside,
268 Ada.Strings.Forward) /= 1 or -- 'c' at position 1
269 ASF.Index("abcd", -- same size, str-set,
270 Maps.To_Set("efgh"), -- different contents.
271 Ada.Strings.Outside,
272 Ada.Strings.Forward) /= 1 or
273 ASF.Index("abccd", -- set > string
274 Maps.To_Set("acegik"),
275 Ada.Strings.Inside,
276 Ada.Strings.Backward) /= 4 or -- 'c' at position 4
277 ASF.Index("abcde",
278 Maps.Null_Set) /= 0 or
279 ASF.Index("", -- Null string.
280 CD_Set) /= 0 or
281 ASF.Index("abc ab", -- blank included
282 Maps.To_Set("e "), -- in string and set.
283 Ada.Strings.Inside,
284 Ada.Strings.Backward) /= 4 -- blank in string.
285 then
286 Report.Failed("Incorrect result from function Index for sets - 2");
287 end if;
291 -- Function Index_Non_Blank.
292 -- (Other usage examples of this function found in CXA4002-3.)
295 if ASF.Index_Non_Blank(Source => Source_String4, -- "abcdefghij "
296 Going => Ada.Strings.Backward) /= 10 or
297 ASF.Index_Non_Blank("abc def ghi jkl ",
298 Ada.Strings.Backward) /= 15 or
299 ASF.Index_Non_Blank(" abcdef") /= 3 or
300 ASF.Index_Non_Blank(" ") /= 0
301 then
302 Report.Failed("Incorrect result from Index_Non_Blank");
303 end if;
307 -- Function Count
308 -- (Other usage examples of this function found in CXA4002-3.)
310 if ASF.Count("abababa", "aba") /= 2 or
311 ASF.Count("abababa", "ab" ) /= 3 or
312 ASF.Count("babababa", "ab") /= 3 or
313 ASF.Count("abaabaaba", "aba") /= 3 or
314 ASF.Count("xxxxxxxxxxxxxxxxxxxy", "xy") /= 1 or
315 ASF.Count("xxxxxxxxxxxxxxxxxxxx", "x") /= 20
316 then
317 Report.Failed("Incorrect result from Function Count");
318 end if;
320 -- Determine the number of slices of Source that when mapped to a
321 -- non-identity map, match the pattern string.
323 Slice_Count := ASF.Count(Source_String6, -- "abcdefabcdef"
324 "xy",
325 CD_to_XY_Map); -- maps 'c' to 'x', 'd' to 'y'
327 if Slice_Count /= 2 then -- two slices "xy" in "mapped" Source_String6
328 Report.Failed("Incorrect result from Count with non-identity map");
329 end if;
331 -- If the pattern supplied to Function Count is the null string, then
332 -- Pattern_Error is propagated.
334 declare
335 The_Null_String : constant String := "";
336 begin
337 Slice_Count := ASF.Count(Source_String6, The_Null_String);
338 Report.Failed("Pattern_Error not raised by Function Count");
339 exception
340 when Ada.Strings.Pattern_Error => null; -- OK
341 when others =>
342 Report.Failed("Incorrect exception from Count with null pattern");
343 end;
346 -- Function Count returning the number of characters in a particular
347 -- set that are found in source string.
349 if ASF.Count(Source_String6, CD_Set) /= 4 then -- 2 'c' and 'd' chars.
350 Report.Failed("Incorrect result from Count with set");
351 end if;
355 -- Function Find_Token.
356 -- (Other usage examples of this function found in CXA4002-3.)
358 ASF.Find_Token(Source => Source_String6, -- First slice with no
359 Set => ABCD_Set, -- 'a', 'b', 'c', or 'd'
360 Test => Ada.Strings.Outside, -- is "ef" at 5..6.
361 First => Slice_Start,
362 Last => Slice_End);
364 if Slice_Start /= 5 or Slice_End /= 6 then
365 Report.Failed("Incorrect result from Find_Token - 1");
366 end if;
368 -- If no appropriate slice is contained by the source string, then the
369 -- value returned in Last is zero, and the value in First is
370 -- Source'First.
372 ASF.Find_Token(Source_String6, -- "abcdefabcdef"
373 A_to_F_Set, -- Set of characters 'a' thru 'f'.
374 Ada.Strings.Outside, -- No characters outside this set.
375 Slice_Start,
376 Slice_End);
378 if Slice_Start /= Source_String6'First or Slice_End /= 0 then
379 Report.Failed("Incorrect result from Find_Token - 2");
380 end if;
382 -- Additional testing of Find_Token.
384 ASF.Find_Token("eabcdabcddcab",
385 ABCD_Set,
386 Ada.Strings.Inside,
387 Slice_Start,
388 Slice_End);
390 if Slice_Start /= 2 or Slice_End /= 13 then
391 Report.Failed("Incorrect result from Find_Token - 3");
392 end if;
394 ASF.Find_Token("efghijklabcdabcd",
395 ABCD_Set,
396 Ada.Strings.Outside,
397 Slice_Start,
398 Slice_End);
400 if Slice_Start /= 1 or Slice_End /= 8 then
401 Report.Failed("Incorrect result from Find_Token - 4");
402 end if;
404 ASF.Find_Token("abcdefgabcdabcd",
405 ABCD_Set,
406 Ada.Strings.Outside,
407 Slice_Start,
408 Slice_End);
410 if Slice_Start /= 5 or Slice_End /= 7 then
411 Report.Failed("Incorrect result from Find_Token - 5");
412 end if;
414 ASF.Find_Token("abcdcbabcdcba",
415 ABCD_Set,
416 Ada.Strings.Inside,
417 Slice_Start,
418 Slice_End);
420 if Slice_Start /= 1 or Slice_End /= 13 then
421 Report.Failed("Incorrect result from Find_Token - 6");
422 end if;
425 exception
426 when others => Report.Failed("Exception raised in Test_Block");
427 end Test_Block;
429 Report.Result;
431 end CXA4004;