| -- CXA4022.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 subprograms defined in package |
| -- Ada.Strings.Wide_Unbounded are available, and that they produce |
| -- correct results. Specifically, check the subprograms Count, Element, |
| -- Index, Replace_Element, To_Unbounded_Wide_String, and "&", ">", "<". |
| -- |
| -- TEST DESCRIPTION: |
| -- This test demonstrates the uses of many of the subprograms defined |
| -- in package Ada.Strings.Wide_Unbounded for use with unbounded wide |
| -- strings. The test simulates how unbounded wide strings |
| -- will be processed in a user environment, using the subprograms |
| -- provided in this package. |
| -- |
| -- Taken in conjunction with tests CXA4021 and CXA4023, this test will |
| -- constitute a test of the functionality contained in package |
| -- Ada.Strings.Wide Unbounded. This test uses a variety |
| -- of the subprograms defined in the unbounded wide string package |
| -- in ways typical of common usage, with different combinations of |
| -- available subprograms being used to accomplish similar |
| -- unbounded wide string processing goals. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- 08 Nov 95 SAIC Corrected accessibility level, type visibility, |
| -- and subtest acceptance criteria problems for |
| -- ACVC 2.0.1 |
| -- |
| --! |
| |
| with Ada.Characters.Handling; |
| with Ada.Strings; |
| |
| package CXA40220 is |
| |
| -- The following two functions are used to translate character and string |
| -- values to "Wide" values. They will be applied to all the Wide_Bounded |
| -- subprogram character and string parameters to simulate the use of non- |
| -- character Wide_Characters and Wide_Strings in actual practice. |
| -- Note: These functions do not actually return "equivalent" wide |
| -- characters to their character inputs, just "non-character" |
| -- wide characters. |
| |
| function Equiv (Ch : Character) return Wide_Character; |
| |
| function Equiv (Str : String) return Wide_String; |
| |
| |
| -- Functions and access-to-subprogram value used to supply mapping |
| -- capability to the appropriate versions of Count, Index, and |
| -- Translate. |
| |
| function AB_to_US_Mapping_Function (From : Wide_Character) |
| return Wide_Character; |
| |
| function AB_to_Blank_Mapping_Function (From : Wide_Character) |
| return Wide_Character; |
| |
| end CXA40220; |
| |
| package body CXA40220 is |
| |
| function Equiv (Ch : Character) return Wide_Character is |
| C : Character := Ch; |
| begin |
| if Ch = ' ' then |
| return Ada.Characters.Handling.To_Wide_Character(C); |
| else |
| return Wide_Character'Val(Character'Pos(Ch) + |
| Character'Pos(Character'Last) + 1); |
| end if; |
| end Equiv; |
| |
| |
| function Equiv (Str : String) return Wide_String is |
| WS : Wide_String(Str'First..Str'Last); |
| begin |
| for i in Str'First..Str'Last loop |
| WS(i) := Equiv(Str(i)); |
| end loop; |
| return WS; |
| end Equiv; |
| |
| |
| function AB_to_US_Mapping_Function (From : Wide_Character) |
| return Wide_Character is |
| UnderScore : constant Wide_Character := Equiv('_'); |
| begin |
| if From = Equiv('a') or From = Equiv('b') then |
| return UnderScore; |
| else |
| return From; |
| end if; |
| end AB_to_US_Mapping_Function; |
| |
| |
| function AB_to_Blank_Mapping_Function (From : Wide_Character) |
| return Wide_Character is |
| begin |
| if From = Equiv('a') or From = Equiv('b') then |
| return Ada.Strings.Wide_Space; |
| else |
| return From; |
| end if; |
| end AB_to_Blank_Mapping_Function; |
| |
| end CXA40220; |
| |
| |
| with CXA40220; |
| with Report; |
| with Ada.Characters.Handling; |
| with Ada.Strings.Wide_Maps; |
| with Ada.Strings.Wide_Unbounded; |
| |
| procedure CXA4022 is |
| begin |
| |
| Report.Test ("CXA4022", "Check that the subprograms defined in " & |
| "package Ada.Strings.Wide_Unbounded are " & |
| "available, and that they produce correct " & |
| "results"); |
| |
| Test_Block: |
| declare |
| |
| use CXA40220; |
| |
| package ASW renames Ada.Strings.Wide_Unbounded; |
| use Ada.Strings; |
| use type Wide_Maps.Wide_Character_Set; |
| use type ASW.Unbounded_Wide_String; |
| |
| Test_String : ASW.Unbounded_Wide_String; |
| AtoE_Str : ASW.Unbounded_Wide_String := |
| ASW.To_Unbounded_Wide_String(Equiv("abcde")); |
| |
| Complete_String : ASW.Unbounded_Wide_String := |
| ASW."&"(ASW.To_Unbounded_Wide_String(Equiv("Incomplete")), |
| ASW."&"(Ada.Strings.Wide_Space, |
| ASW.To_Unbounded_Wide_String(Equiv("String")))); |
| |
| Incomplete_String : ASW.Unbounded_Wide_String := |
| ASW.To_Unbounded_Wide_String |
| (Equiv("ncomplete Strin")); |
| |
| Incorrect_Spelling : ASW.Unbounded_Wide_String := |
| ASW.To_Unbounded_Wide_String(Equiv("Guob Dai")); |
| |
| Magic_String : ASW.Unbounded_Wide_String := |
| ASW.To_Unbounded_Wide_String(Equiv("abracadabra")); |
| |
| Incantation : ASW.Unbounded_Wide_String := Magic_String; |
| |
| |
| A_Small_G : Wide_Character := Equiv('g'); |
| A_Small_D : Wide_Character := Equiv('d'); |
| |
| ABCD_Set : Wide_Maps.Wide_Character_Set := |
| Wide_Maps.To_Set(Equiv("abcd")); |
| B_Set : Wide_Maps.Wide_Character_Set := |
| Wide_Maps.To_Set(Equiv('b')); |
| CD_Set : Wide_Maps.Wide_Character_Set := |
| Wide_Maps.To_Set(Equiv("cd")); |
| |
| CD_to_XY_Map : Wide_Maps.Wide_Character_Mapping := |
| Wide_Maps.To_Mapping(From => Equiv("cd"), |
| To => Equiv("xy")); |
| AB_to_YZ_Map : Wide_Maps.Wide_Character_Mapping := |
| Wide_Maps.To_Mapping(Equiv("ab"), Equiv("yz")); |
| |
| |
| Matching_Letters : Natural := 0; |
| Location, |
| Total_Count : Natural := 0; |
| |
| |
| Map_Ptr : Wide_Maps.Wide_Character_Mapping_Function := |
| AB_to_US_Mapping_Function'Access; |
| |
| |
| begin |
| |
| |
| -- Function "&" |
| |
| -- Prepend an 'I' and append a 'g' to the wide string. |
| Incomplete_String := ASW."&"(Equiv('I'), |
| Incomplete_String); -- Ch & W Unb |
| Incomplete_String := ASW."&"(Incomplete_String, |
| A_Small_G); -- W Unb & Ch |
| |
| if ASW."<"(Incomplete_String, Complete_String) or |
| ASW.">"(Incomplete_String, Complete_String) or |
| Incomplete_String /= Complete_String |
| then |
| Report.Failed("Incorrect result from use of ""&"" operator"); |
| end if; |
| |
| |
| |
| -- Function Element |
| |
| -- Last element of the unbounded wide string should be a 'g'. |
| if ASW.Element(Incomplete_String, ASW.Length(Incomplete_String)) /= |
| A_Small_G |
| then |
| Report.Failed("Incorrect result from use of Function Element - 1"); |
| end if; |
| |
| if ASW.Element(Incomplete_String, 2) /= |
| ASW.Element(ASW.Tail(Incomplete_String, 2), 1) or |
| ASW.Element(ASW.Head(Incomplete_String, 4), 2) /= |
| ASW.Element(ASW.To_Unbounded_Wide_String(Equiv("wnqz")), 2) |
| then |
| Report.Failed("Incorrect result from use of Function Element - 2"); |
| end if; |
| |
| |
| |
| -- Procedure Replace_Element |
| |
| -- The unbounded wide string Incorrect_Spelling starts as "Guob Dai", |
| -- and is transformed by the following three procedure calls to |
| -- "Good Day". |
| |
| ASW.Replace_Element(Incorrect_Spelling, 2, Equiv('o')); |
| |
| ASW.Replace_Element(Incorrect_Spelling, |
| ASW.Index(Incorrect_Spelling, B_Set), |
| A_Small_D); |
| |
| ASW.Replace_Element(Source => Incorrect_Spelling, |
| Index => ASW.Length(Incorrect_Spelling), |
| By => Equiv('y')); |
| |
| if Incorrect_Spelling /= |
| ASW.To_Unbounded_Wide_String(Equiv("Good Day")) |
| then |
| Report.Failed("Incorrect result from Procedure Replace_Element"); |
| end if; |
| |
| |
| |
| -- Function Index with non-Identity map. |
| -- Evaluate the function Index with a non-identity map |
| -- parameter which will cause mapping of the source parameter |
| -- prior to the evaluation of the index position search. |
| |
| Location := ASW.Index(Source => ASW.To_Unbounded_Wide_String |
| (Equiv("abcdefghij")), |
| Pattern => Equiv("xy"), |
| Going => Ada.Strings.Forward, |
| Mapping => CD_to_XY_Map); -- change "cd" to "xy" |
| |
| if Location /= 3 then |
| Report.Failed("Incorrect result from Index, non-Identity map - 1"); |
| end if; |
| |
| Location := ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcdabcdab")), |
| Equiv("yz"), |
| Ada.Strings.Backward, |
| AB_to_YZ_Map); -- change all "ab" to "yz" |
| |
| if Location /= 9 then |
| Report.Failed("Incorrect result from Index, non-Identity map - 2"); |
| end if; |
| |
| -- A couple with identity maps (default) as well. |
| |
| if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcd")), -- Pat = Src |
| Equiv("abcd")) /= 1 or |
| ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abc")), -- Pat < Src |
| Equiv("abcd")) /= 0 or |
| ASW.Index(ASW.Null_Unbounded_Wide_String, -- Src = Null |
| Equiv("abc")) /= 0 |
| then |
| Report.Failed |
| ("Incorrect result from Index with wide string patterns"); |
| end if; |
| |
| |
| |
| -- Function Index (for Sets). |
| -- This version of Index uses Sets as the basis of the search. |
| |
| -- Test = Inside, Going = Forward (Default case). |
| Location := |
| ASW.Index(Source => ASW.To_Unbounded_Wide_String(Equiv("abcdeabcde")), |
| Set => CD_Set); -- set containing 'c' and 'd' |
| |
| if not (Location = 3) then -- position of first 'c' in source. |
| Report.Failed("Incorrect result from Index using Sets - 1"); |
| end if; |
| |
| -- Test = Inside, Going = Backward. |
| Location := |
| ASW.Index(Source => ASW."&"(AtoE_Str, AtoE_Str), |
| Set => CD_Set, -- set containing 'c' and 'd' |
| Test => Ada.Strings.Inside, |
| Going => Ada.Strings.Backward); |
| |
| if not (Location = 9) then -- position of last 'd' in source. |
| Report.Failed("Incorrect result from Index using Sets - 2"); |
| end if; |
| |
| -- Test = Outside, Going = Forward, Backward |
| if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), |
| Wide_Maps.To_Set(Equiv("xydcgf")), |
| Test => Ada.Strings.Outside, |
| Going => Ada.Strings.Forward) /= 2 or |
| ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), |
| Wide_Maps.To_Set(Equiv("xydcgf")), |
| Test => Ada.Strings.Outside, |
| Going => Ada.Strings.Backward) /= 5 or |
| ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), |
| CD_Set, |
| Ada.Strings.Outside, |
| Ada.Strings.Backward) /= 5 |
| then |
| Report.Failed("Incorrect result from Index using Sets - 3"); |
| end if; |
| |
| -- Default direction (forward) and mapping (identity). |
| |
| if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("cd")), -- Source = Set |
| CD_Set) /= 1 or |
| ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("c")), -- Source < Set |
| CD_Set) /= 1 or |
| ASW.Index(ASW.Null_Unbounded_Wide_String, -- Source = Null |
| CD_Set) /= 0 or |
| ASW.Index(AtoE_Str, |
| Wide_Maps.Null_Set) /= 0 or -- Null set |
| ASW.Index(AtoE_Str, |
| Wide_Maps.To_Set(Equiv('x'))) /= 0 -- No match. |
| then |
| Report.Failed("Incorrect result from Index using Sets - 4"); |
| end if; |
| |
| |
| |
| -- Function Index using access-to-subprogram mapping. |
| -- Evaluate the function Index with an access value that supplies the |
| -- mapping function for this version of Index. |
| |
| Map_Ptr := AB_to_US_Mapping_Function'Access; |
| |
| Location := ASW.Index(Source => ASW.To_Unbounded_Wide_String |
| (Equiv("xAxabbxax xaax _cx")), |
| Pattern => Equiv("_x"), |
| Going => Ada.Strings.Forward, |
| Mapping => Map_Ptr); -- change 'a'or 'b' to '_' |
| |
| if Location /= 6 then -- location of "bx" substring |
| Report.Failed("Incorrect result from Index, access value map - 1"); |
| end if; |
| |
| Map_Ptr := AB_to_Blank_Mapping_Function'Access; |
| |
| Location := ASW.Index(ASW.To_Unbounded_Wide_String |
| (Equiv("ccacdcbbcdacc")), |
| Equiv("cd "), |
| Ada.Strings.Backward, |
| Map_Ptr); -- change 'a' or 'b' to ' ' |
| |
| if Location /= 9 then |
| Report.Failed("Incorrect result from Index, access value map - 2"); |
| end if; |
| |
| if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcd")), |
| Equiv(" cd"), |
| Ada.Strings.Forward, |
| Map_Ptr) /= 1 or |
| ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abc")), |
| Equiv(" c "), -- No match |
| Ada.Strings.Backward, |
| Map_Ptr) /= 0 |
| then |
| Report.Failed("Incorrect result from Index, access value map - 3"); |
| end if; |
| |
| |
| |
| -- Function Count |
| |
| -- Determine the number of characters in the unbounded wide string that |
| -- are contained in the set. |
| |
| Matching_Letters := ASW.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 wide |
| -- strings in the unbounded wide string Magic_String. |
| |
| if ASW.Count(Magic_String, Equiv("ab")) /= |
| (ASW.Count(Magic_String, Equiv("ac")) + |
| ASW.Count(Magic_String, Equiv("ad"))) or |
| ASW.Count(Magic_String, Equiv("ab")) /= 2 |
| then |
| Report.Failed |
| ("Incorrect result from Function Count, wide string parameter"); |
| end if; |
| |
| |
| |
| -- Function Count with non-Identity mapping. |
| -- Evaluate the function Count with a non-identity map |
| -- parameter which will cause mapping of the source parameter |
| -- prior to the evaluation of the number of matching patterns. |
| |
| Total_Count := |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("abbabbabbabba")), |
| Pattern => Equiv("yz"), |
| Mapping => AB_to_YZ_Map); |
| |
| if Total_Count /= 4 then |
| Report.Failed |
| ("Incorrect result from function Count, non-Identity map - 1"); |
| end if; |
| |
| if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("ADCBADABCD")), |
| Equiv("AB"), |
| Wide_Maps.To_Mapping(Equiv("CD"), Equiv("AB"))) /= 5 or |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("dcccddcdccdddccccd")), |
| Equiv("xxy"), |
| CD_to_XY_Map) /= 3 |
| then |
| Report.Failed |
| ("Incorrect result from function Count, non-Identity map - 2"); |
| end if; |
| |
| -- And a few with identity Wide_Maps as well. |
| |
| if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("ABABABABAB")), |
| Equiv("ABA"), |
| Wide_Maps.Identity) /= 2 or |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("aaaaaaaaaa")), |
| Equiv("aaa")) /= 3 or |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("XX")), -- Src < Pat |
| Equiv("XXX"), |
| Wide_Maps.Identity) /= 0 or |
| ASW.Count(AtoE_Str, -- Source = Pattern |
| Equiv("abcde")) /= 1 or |
| ASW.Count(ASW.Null_Unbounded_Wide_String, -- Source = Null |
| Equiv(" ")) /= 0 |
| then |
| Report.Failed |
| ("Incorrect result from function Count, w,w/o mapping"); |
| end if; |
| |
| |
| |
| -- Function Count using access-to-subprogram mapping. |
| -- Evaluate the function Count with an access value specifying the |
| -- mapping that is going to occur to Source. |
| |
| Map_Ptr := AB_to_US_Mapping_Function'Access; |
| |
| Total_Count := |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("abcbacbadbaAbbB")), |
| Pattern => Equiv("__"), |
| Mapping => Map_Ptr); -- change 'a' and 'b' to '_' |
| |
| if Total_Count /= 5 then |
| Report.Failed |
| ("Incorrect result from function Count, access value map - 1"); |
| end if; |
| |
| Map_Ptr := AB_to_Blank_Mapping_Function'Access; |
| |
| if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("cccaccBcbcaccacAc")), |
| Equiv("c c"), |
| Map_Ptr) /= 3 or |
| ASW.Count(ASW.To_Unbounded_Wide_String |
| (Equiv("aBBAAABaBBBBAaBABBABaBBbBB")), |
| Equiv(" BB"), |
| Map_Ptr) /= 4 or |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("aaaaaaaaaa")), |
| Equiv(" "), |
| Map_Ptr) /= 3 or |
| ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("XX")), -- Src < Pat |
| Equiv("XX "), |
| Map_Ptr) /= 0 or |
| ASW.Count(AtoE_Str, -- Source'Length = Pattern'Length |
| Equiv(" cde"), |
| Map_Ptr) /= 1 |
| then |
| Report.Failed |
| ("Incorrect result from function Count, access value map - 3"); |
| end if; |
| |
| |
| |
| exception |
| when others => Report.Failed ("Exception raised in Test_Block"); |
| end Test_Block; |
| |
| |
| Report.Result; |
| |
| end CXA4022; |