| -- CXA4027.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 versions of Ada.Strings.Bounded subprograms Translate, |
| -- (procedure and function), Index, and Count, which use the |
| -- Maps.Character_Mapping_Function input parameter, produce correct |
| -- results. |
| -- |
| -- TEST DESCRIPTION: |
| -- This test examines the operation of several subprograms from within |
| -- the Ada.Strings.Bounded package that use the |
| -- Character_Mapping_Function mapping parameter to provide a mapping |
| -- capability. |
| -- |
| -- Two functions are defined to provide the mapping. Access values |
| -- are defined to refer to these functions. One of the functions will |
| -- map upper case characters in the range 'A'..'Z' to their lower case |
| -- counterparts, while the other function will map lower case characters |
| -- ('a'..'z', or a character whose position is in one of the ranges |
| -- 223..246 or 248..255, provided the character has an upper case form) |
| -- to their upper case form. |
| -- |
| -- Function Index uses the mapping function access value to map the input |
| -- string prior to searching for the appropriate index value to return. |
| -- Function Count uses the mapping function access value to map the input |
| -- string prior to counting the occurrences of the pattern string. |
| -- Both the Procedure and Function version of Translate use the mapping |
| -- function access value to perform the translation. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 16 FEB 95 SAIC Initial prerelease version |
| -- 17 Jul 95 SAIC Incorporated reviewer comments. Replaced two |
| -- internally declared functions with two library |
| -- level functions to eliminate accessibility |
| -- problems. |
| -- |
| --! |
| |
| |
| -- Function CXA4027_0 will return the lower case form of |
| -- the character input if it is in upper case, and return the input |
| -- character otherwise. |
| |
| with Ada.Characters.Handling; |
| function CXA4027_0 (From : Character) return Character; |
| |
| function CXA4027_0 (From : Character) return Character is |
| begin |
| return Ada.Characters.Handling.To_Lower(From); |
| end CXA4027_0; |
| |
| |
| |
| -- Function CXA4027_1 will return the upper case form of |
| -- Characters in the range 'a'..'z', or whose position is in one |
| -- of the ranges 223..246 or 248..255, provided the character has |
| -- an upper case form. |
| |
| with Ada.Characters.Handling; |
| function CXA4027_1 (From : Character) return Character; |
| |
| function CXA4027_1 (From : Character) return Character is |
| begin |
| return Ada.Characters.Handling.To_Upper(From); |
| end CXA4027_1; |
| |
| |
| with CXA4027_0, CXA4027_1; |
| with Ada.Strings.Bounded; |
| with Ada.Strings.Maps; |
| with Ada.Characters.Handling; |
| with Report; |
| |
| procedure CXA4027 is |
| begin |
| |
| Report.Test ("CXA4027", "Check that Ada.Strings.Bounded subprograms " & |
| "Translate, Index, and Count, which use the " & |
| "Character_Mapping_Function input parameter, " & |
| "produce correct results"); |
| |
| Test_Block: |
| declare |
| |
| use Ada.Strings; |
| |
| -- Functions used to supply mapping capability. |
| |
| function Map_To_Lower_Case (From : Character) return Character |
| renames CXA4027_0; |
| |
| function Map_To_Upper_Case (From : Character) return Character |
| renames CXA4027_1; |
| |
| Map_To_Lower_Case_Ptr : Maps.Character_Mapping_Function := |
| Map_To_Lower_Case'Access; |
| |
| Map_To_Upper_Case_Ptr : Maps.Character_Mapping_Function := |
| Map_To_Upper_Case'Access; |
| |
| |
| -- Instantiations of Bounded String generic package. |
| |
| package BS1 is new Ada.Strings.Bounded.Generic_Bounded_Length(1); |
| package BS20 is new Ada.Strings.Bounded.Generic_Bounded_Length(20); |
| package BS40 is new Ada.Strings.Bounded.Generic_Bounded_Length(40); |
| package BS80 is new Ada.Strings.Bounded.Generic_Bounded_Length(80); |
| |
| use type BS1.Bounded_String, BS20.Bounded_String, |
| BS40.Bounded_String, BS80.Bounded_String; |
| |
| String_1 : String(1..1) := "A"; |
| String_20 : String(1..20) := "ABCDEFGHIJKLMNOPQRST"; |
| String_40 : String(1..40) := "abcdefghijklmnopqrst" & String_20; |
| String_80 : String(1..80) := String_40 & String_40; |
| |
| BString_1 : BS1.Bounded_String := BS1.Null_Bounded_String; |
| BString_20 : BS20.Bounded_String := BS20.Null_Bounded_String; |
| BString_40 : BS40.Bounded_String := BS40.Null_Bounded_String; |
| BString_80 : BS80.Bounded_String := BS80.Null_Bounded_String; |
| |
| |
| begin |
| |
| -- Function Index. |
| |
| if BS40.Index(BS40.To_Bounded_String("Package Strings.Bounded"), |
| Pattern => "s.b", |
| Going => Ada.Strings.Forward, |
| Mapping => Map_To_Lower_Case_Ptr) /= 15 or |
| BS80.Index(BS80.To_Bounded_String("STRING TRANSLATIONS SUBPROGRAMS"), |
| "tr", |
| Mapping => Map_To_Lower_Case_Ptr) /= 2 or |
| BS20.Index(BS20.To_Bounded_String("maximum number"), |
| "um", |
| Ada.Strings.Backward, |
| Map_To_Lower_Case_Ptr) /= 10 or |
| BS80.Index(BS80.To_Bounded_String("CoMpLeTeLy MiXeD CaSe StRiNg"), |
| "MIXED CASE STRING", |
| Ada.Strings.Forward, |
| Map_To_Upper_Case_Ptr) /= 12 or |
| BS40.Index(BS40.To_Bounded_String("STRING WITH NO MATCHING PATTERN"), |
| "WITH", |
| Ada.Strings.Backward, |
| Map_To_Lower_Case_Ptr) /= 0 or |
| BS80.Index(BS80.To_Bounded_String("THIS STRING IS IN UPPER CASE"), |
| "I", |
| Ada.Strings.Backward, |
| Map_To_Upper_Case_Ptr) /= 16 or |
| BS1.Index(BS1.Null_Bounded_String, |
| "i", |
| Mapping => Map_To_Lower_Case_Ptr) /= 0 or |
| BS40.Index(BS40.To_Bounded_String("AAABBBaaabbb"), |
| "aabb", |
| Mapping => Map_To_Lower_Case_Ptr) /= 2 or |
| BS80.Index(BS80.To_Bounded_String("WOULD MATCH BUT FOR THE CASE"), |
| "WOULD MATCH BUT FOR THE CASE", |
| Ada.Strings.Backward, |
| Map_To_Lower_Case_Ptr) /= 0 |
| then |
| Report.Failed("Incorrect results from Function Index, using a " & |
| "Character Mapping Function parameter"); |
| end if; |
| |
| |
| -- Function Index, Pattern_Error if Pattern = Null_String |
| |
| declare |
| use BS20; |
| TC_Natural : Natural := 1000; |
| begin |
| TC_Natural := Index(To_Bounded_String("A Valid String"), |
| "", |
| Ada.Strings.Forward, |
| Map_To_Lower_Case_Ptr); |
| Report.Failed("Pattern_Error not raised by Function Index when " & |
| "given a null pattern string"); |
| exception |
| when Pattern_Error => null; -- OK, expected exception. |
| when others => |
| Report.Failed("Incorrect exception raised by Function Index " & |
| "using a Character_Mapping_Function parameter " & |
| "when given a null pattern string"); |
| end; |
| |
| |
| -- Function Count. |
| |
| if BS20.Count(BS20.To_Bounded_String("ABABABA"), |
| Pattern => "aba", |
| Mapping => Map_To_Lower_Case_Ptr) /= 2 or |
| BS20.Count(BS20.To_Bounded_String("ABABABA"), |
| "ABA", |
| Map_To_Lower_Case_Ptr) /= 0 or |
| BS40.Count(BS40.To_Bounded_String("This IS a MISmatched issue"), |
| "is", |
| Map_To_Lower_Case_Ptr) /= 4 or |
| BS80.Count(BS80.To_Bounded_String("ABABABA"), |
| "ABA", |
| Map_To_Upper_Case_Ptr) /= 2 or |
| BS40.Count(BS40.To_Bounded_String("This IS a MISmatched issue"), |
| "is", |
| Map_To_Upper_Case_Ptr) /= 0 or |
| BS80.Count(BS80.To_Bounded_String |
| ("Peter Piper and his Pickled Peppers"), |
| "p", |
| Map_To_Lower_Case_Ptr) /= 7 or |
| BS20.Count(BS20.To_Bounded_String("She sells sea shells"), |
| "s", |
| Map_To_Upper_Case_Ptr) /= 0 or |
| BS80.Count(BS80.To_Bounded_String("No matches what-so-ever"), |
| "matches", |
| Map_To_Upper_Case_Ptr) /= 0 |
| then |
| Report.Failed("Incorrect results from Function Count, using " & |
| "a Character_Mapping_Function parameter"); |
| end if; |
| |
| |
| -- Function Count, Pattern_Error if Pattern = Null_String |
| |
| declare |
| use BS80; |
| TC_Natural : Natural := 1000; |
| begin |
| TC_Natural := Count(To_Bounded_String("A Valid String"), |
| "", |
| Map_To_Lower_Case_Ptr); |
| Report.Failed("Pattern_Error not raised by Function Count using " & |
| "a Character_Mapping_Function parameter when " & |
| "given a null pattern string"); |
| exception |
| when Pattern_Error => null; -- OK, expected exception. |
| when others => |
| Report.Failed("Incorrect exception raised by Function Count " & |
| "using a Character_Mapping_Function parameter " & |
| "when given a null pattern string"); |
| end; |
| |
| |
| -- Function Translate. |
| |
| if BS40.Translate(BS40.To_Bounded_String("A Mixed Case String"), |
| Mapping => Map_To_Lower_Case_Ptr) /= |
| BS40.To_Bounded_String("a mixed case string") or |
| |
| BS20."/="(BS20.Translate(BS20.To_Bounded_String("ALL LOWER CASE"), |
| Map_To_Lower_Case_Ptr), |
| "all lower case") or |
| |
| BS20."/="("end with lower case", |
| BS20.Translate( |
| BS20.To_Bounded_String("end with lower case"), |
| Map_To_Lower_Case_Ptr)) or |
| |
| BS1.Translate(BS1.Null_Bounded_String, |
| Map_To_Lower_Case_Ptr) /= |
| BS1.Null_Bounded_String or |
| |
| BS80."/="(BS80.Translate(BS80.To_Bounded_String |
| ("start with lower case, end with upper case"), |
| Map_To_Upper_Case_Ptr), |
| "START WITH LOWER CASE, END WITH UPPER CASE") or |
| |
| BS40.Translate(BS40.To_Bounded_String("ALL UPPER CASE STRING"), |
| Map_To_Upper_Case_Ptr) /= |
| BS40.To_Bounded_String("ALL UPPER CASE STRING") or |
| |
| BS80."/="(BS80.Translate(BS80.To_Bounded_String |
| ("LoTs Of MiXeD CaSe ChArAcTeRs In ThE StRiNg"), |
| Map_To_Upper_Case_Ptr), |
| "LOTS OF MIXED CASE CHARACTERS IN THE STRING") |
| |
| then |
| Report.Failed("Incorrect results from Function Translate, using " & |
| "a Character_Mapping_Function parameter"); |
| end if; |
| |
| |
| -- Procedure Translate. |
| |
| BString_1 := BS1.To_Bounded_String("A"); |
| |
| BS1.Translate(Source => BString_1, Mapping => Map_To_Lower_Case_Ptr); |
| |
| if not BS1."="(BString_1, "a") then -- "=" for Bounded_String, String |
| Report.Failed("Incorrect result from Procedure Translate - 1"); |
| end if; |
| |
| BString_20 := BS20.To_Bounded_String(String_20); |
| BS20.Translate(BString_20, Mapping => Map_To_Lower_Case_Ptr); |
| |
| if BString_20 /= BS20.To_Bounded_String("abcdefghijklmnopqrst") then |
| Report.Failed("Incorrect result from Procedure Translate - 2"); |
| end if; |
| |
| BString_40 := BS40.To_Bounded_String("String needing highlighting"); |
| BS40.Translate(BString_40, Map_To_Upper_Case_Ptr); |
| |
| if not (BString_40 = "STRING NEEDING HIGHLIGHTING") then |
| Report.Failed("Incorrect result from Procedure Translate - 3"); |
| end if; |
| |
| BString_80 := BS80.Null_Bounded_String; |
| BS80.Translate(BString_80, Map_To_Upper_Case_Ptr); |
| |
| if not (BString_80 = BS80.Null_Bounded_String) then |
| Report.Failed("Incorrect result from Procedure Translate - 4"); |
| end if; |
| |
| |
| exception |
| when others => Report.Failed ("Exception raised in Test_Block"); |
| end Test_Block; |
| |
| Report.Result; |
| |
| end CXA4027; |