-- CXA4011.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, 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 subprograms defined in package Ada.Strings.Unbounded -- are available, and that they produce correct results. Specifically, -- check the subprograms To_Unbounded_String, "&", ">", "<", Element, -- Replace_Element, Count, Find_Token, Translate, Trim, Delete, and -- "*". -- -- TEST DESCRIPTION: -- This test demonstrates the uses of many of the subprograms defined -- in package Ada.Strings.Unbounded for use with unbounded strings. -- The test simulates how unbounded strings could be processed in a -- user environment, using the subprograms provided in this package. -- -- This test uses a variety of the subprograms defined in the unbounded -- string package in ways typical of common usage, with different -- combinations of available subprograms being used to accomplish -- similar unbounded string processing goals. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- 27 Feb 95 SAIC Test description modification. -- 01 Nov 95 SAIC Update and repair for ACVC 2.0.1. -- --! with Report; with Ada.Strings.Maps; with Ada.Strings.Unbounded; procedure CXA4011 is begin Report.Test ("CXA4011", "Check that the subprograms defined in " & "package Ada.Strings.Unbounded are available, " & "and that they produce correct results"); Test_Block: declare package ASUnb renames Ada.Strings.Unbounded; use Ada.Strings; use type Maps.Character_Set; use type ASUnb.Unbounded_String; Cad_String : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("cad"); Complete_String : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Incomplete") & Ada.Strings.Space & ASUnb.To_Unbounded_String("String"); Incomplete_String : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("ncomplete Strin"); Incorrect_Spelling : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Guob Dai"); Magic_String : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("abracadabra"); Incantation : ASUnb.Unbounded_String := Magic_String; A_Small_G : Character := 'g'; A_Small_D : Character := 'd'; ABCD_Set : Maps.Character_Set := Maps.To_Set("abcd"); B_Set : Maps.Character_Set := Maps.To_Set('b'); AB_Set : Maps.Character_Set := Maps."OR"(Maps.To_Set('a'), B_Set); Code_Map : Maps.Character_Mapping := Maps.To_Mapping(From => "abcd", To => "wxyz"); Reverse_Code_Map : Maps.Character_Mapping := Maps.To_Mapping(From => "wxyz", To => "abcd"); Non_Existent_Map : Maps.Character_Mapping := Maps.To_Mapping(From => "jkl", To => "mno"); Token_Start : Positive; Token_End : Natural := 0; Matching_Letters : Natural := 0; begin -- "&" -- Prepend an 'I' and append a 'g' to the string. Incomplete_String := ASUnb."&"('I', Incomplete_String); -- Char & Unb Incomplete_String := ASUnb."&"(Incomplete_String, A_Small_G); -- Unb & Char if Incomplete_String < Complete_String or Incomplete_String > Complete_String or Incomplete_String /= Complete_String then Report.Failed("Incorrect result from use of ""&"" operator"); end if; -- Element -- Last element of the unbounded string should be a 'g'. if ASUnb.Element(Incomplete_String, ASUnb.Length(Incomplete_String)) /= A_Small_G then Report.Failed("Incorrect result from use of Function Element - 1"); end if; if ASUnb.Element(Incomplete_String, 2) /= ASUnb.Element(ASUnb.Tail(Incomplete_String, 2), 1) or ASUnb.Element(ASUnb.Head(Incomplete_String, 4), 2) /= ASUnb.Element(ASUnb.To_Unbounded_String("wnqz"), 2) then Report.Failed("Incorrect result from use of Function Element - 2"); end if; -- Replace_Element -- The unbounded string Incorrect_Spelling starts as "Guob Dai", and -- is transformed by the following three procedure calls to "Good Day". ASUnb.Replace_Element(Incorrect_Spelling, 2, 'o'); ASUnb.Replace_Element(Incorrect_Spelling, ASUnb.Index(Incorrect_Spelling, B_Set), A_Small_D); ASUnb.Replace_Element(Source => Incorrect_Spelling, Index => ASUnb.Length(Incorrect_Spelling), By => 'y'); if Incorrect_Spelling /= ASUnb.To_Unbounded_String("Good Day") then Report.Failed("Incorrect result from Procedure Replace_Element"); end if; -- Count -- Determine the number of characters in the unbounded string that -- are contained in the set. Matching_Letters := ASUnb.Count(Source => Magic_String, Set => ABCD_Set); if Matching_Letters /= 9 then Report.Failed ("Incorrect result from Function Count with Set parameter"); end if; -- Determine the number of occurrences of the following pattern strings -- in the unbounded string Magic_String. if ASUnb.Count(Magic_String, "ab") /= (ASUnb.Count(Magic_String, "ac") + ASUnb.Count(Magic_String, "ad")) or ASUnb.Count(Magic_String, "ab") /= 2 then Report.Failed ("Incorrect result from Function Count with String parameter"); end if; -- Find_Token ASUnb.Find_Token(Magic_String, -- Find location of first "ab". AB_Set, -- Should be (1..2). Ada.Strings.Inside, Token_Start, Token_End); if Natural(Token_Start) /= ASUnb.To_String(Magic_String)'First or Token_End /= ASUnb.Index(Magic_String, B_Set) then Report.Failed("Incorrect result from Procedure Find_Token - 1"); end if; ASUnb.Find_Token(Source => Magic_String, -- Find location of char 'r' Set => ABCD_Set, -- in string, should be (3..3) Test => Ada.Strings.Outside, First => Token_Start, Last => Token_End); if Natural(Token_Start) /= 3 or Token_End /= 3 then Report.Failed("Incorrect result from Procedure Find_Token - 2"); end if; ASUnb.Find_Token(Magic_String, -- No 'g' is in the string, so Maps.To_Set(A_Small_G), -- the result parameters should Ada.Strings.Inside, -- be First = Source'First and First => Token_Start, -- Last = 0. Last => Token_End); if Token_Start /= ASUnb.To_String(Magic_String)'First or Token_End /= 0 then Report.Failed("Incorrect result from Procedure Find_Token - 3"); end if; -- Translate -- Use a mapping ("abcd" -> "wxyz") to transform the contents of -- the unbounded string. -- Magic_String = "abracadabra" Incantation := ASUnb.Translate(Magic_String, Code_Map); if Incantation /= ASUnb.To_Unbounded_String("wxrwywzwxrw") then Report.Failed("Incorrect result from Function Translate"); end if; -- Use the inverse mapping of the one above to return the "translated" -- unbounded string to its original form. ASUnb.Translate(Incantation, Reverse_Code_Map); -- The map contained in the following call to Translate contains one -- element, and this element is not found in the unbounded string, so -- this call to Translate should have no effect on the unbounded string. if Incantation /= ASUnb.Translate(Magic_String, Non_Existent_Map) then Report.Failed("Incorrect result from Procedure Translate"); end if; -- Trim Trim_Block: declare XYZ_Set : Maps.Character_Set := Maps.To_Set("xyz"); PQR_Set : Maps.Character_Set := Maps.To_Set("pqr"); Pad : constant ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Pad"); The_New_Ada : constant ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Ada9X"); Space_Array : array (1..4) of ASUnb.Unbounded_String := (ASUnb.To_Unbounded_String(" Pad "), ASUnb.To_Unbounded_String("Pad "), ASUnb.To_Unbounded_String(" Pad"), Pad); String_Array : array (1..5) of ASUnb.Unbounded_String := (ASUnb.To_Unbounded_String("xyzxAda9Xpqr"), ASUnb.To_Unbounded_String("Ada9Xqqrp"), ASUnb.To_Unbounded_String("zxyxAda9Xqpqr"), ASUnb.To_Unbounded_String("xxxyAda9X"), The_New_Ada); begin -- Examine the version of Trim that removes blanks from -- the left and/or right of a string. for i in 1..4 loop if ASUnb.Trim(Space_Array(i), Ada.Strings.Both) /= Pad then Report.Failed("Incorrect result from Trim for spaces - " & Integer'Image(i)); end if; end loop; -- Examine the version of Trim that removes set characters from -- the left and right of a string. for i in 1..5 loop if ASUnb.Trim(String_Array(i), Left => XYZ_Set, Right => PQR_Set) /= The_New_Ada then Report.Failed ("Incorrect result from Trim for set characters - " & Integer'Image(i)); end if; end loop; end Trim_Block; -- Delete -- Use the Delete function to remove the first four and last four -- characters from the string. if ASUnb.Delete(Source => ASUnb.Delete(Magic_String, 8, ASUnb.Length(Magic_String)), From => ASUnb.To_String(Magic_String)'First, Through => 4) /= Cad_String then Report.Failed("Incorrect results from Function Delete"); end if; -- Constructors ("*") Constructor_Block: declare SOS : ASUnb.Unbounded_String; Dot : constant ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Dot_"); Dash : constant String := "Dash_"; Distress : ASUnb.Unbounded_String := ASUnb.To_Unbounded_String("Dot_Dot_Dot_") & ASUnb.To_Unbounded_String("Dash_Dash_Dash_") & ASUnb.To_Unbounded_String("Dot_Dot_Dot"); Repeat : constant Natural := 3; Separator : constant Character := '_'; Separator_Set : Maps.Character_Set := Maps.To_Set(Separator); begin -- Use the following constructor forms to construct the string -- "Dot_Dot_Dot_Dash_Dash_Dash_Dot_Dot_Dot". Note that the -- trailing underscore in the string is removed in the call to -- Trim in the If statement condition. SOS := ASUnb."*"(Repeat, Dot); -- "*"(#, Unb Str) SOS := SOS & ASUnb."*"(Repeat, Dash) & -- "*"(#, Str) ASUnb."*"(Repeat, Dot); -- "*"(#, Unb Str) if ASUnb.Trim(SOS, Maps.Null_Set, Separator_Set) /= Distress then Report.Failed("Incorrect results from Function ""*"""); end if; end Constructor_Block; exception when others => Report.Failed ("Exception raised in Test_Block"); end Test_Block; Report.Result; end CXA4011;