view gcc/testsuite/ada/acats/tests/cxa/cxa4015.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- CXA4015.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_Fixed
--      are available, and that they produce correct results.  Specifically, 
--      check the subprograms Count, Find_Token, Index, Index_Non_Blank, and
--      Move.
--      
-- TEST DESCRIPTION:
--      This test, when combined with tests CXA4013,14,16 will provide 
--      coverage of the functionality found in Ada.Strings.Wide_Fixed.  
--      This test contains many small, specific test cases, situations that 
--      although common in user environments, are often difficult to generate 
--      in large numbers in a application-based test.
--
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      02 Nov 95   SAIC    Corrected various accesssibility problems and
--                          expected result strings for ACVC 2.0.1.
--
--!

package CXA40150 is

   -- Wide Character mapping function defined for use with specific 
   -- versions of functions Index and Count.

   function AK_to_ZQ_Mapping (From : Wide_Character) return Wide_Character;

end CXA40150;

package body CXA40150 is

   function AK_to_ZQ_Mapping (From : Wide_Character) 
     return Wide_Character is
   begin
      if From = 'a' then
         return 'z';
      elsif From = 'k' then
         return 'q';
      else
         return From;
      end if;
   end AK_to_ZQ_Mapping;

end CXA40150;


with CXA40150;
with Report;
with Ada.Strings;
with Ada.Strings.Wide_Fixed;
with Ada.Strings.Wide_Maps;

procedure CXA4015 is
begin

   Report.Test("CXA4015", "Check that the subprograms defined in "         &
                          "package Ada.Strings.Wide_Fixed are available, " &
                          "and that they produce correct results");


   Test_Block:
   declare

      use CXA40150;

      package ASF  renames Ada.Strings.Wide_Fixed;
      package Maps renames Ada.Strings.Wide_Maps;

      Result_String  : Wide_String(1..10) := 
                          (others => Ada.Strings.Wide_Space);

      Source_String1 : Wide_String(1..5)  := "abcde";  -- odd len Wide_String
      Source_String2 : Wide_String(1..6)  := "abcdef"; -- even len Wide_String
      Source_String3 : Wide_String(1..12) := "abcdefghijkl";   
      Source_String4 : Wide_String(1..12) := "abcdefghij  "; -- last 2 ch pad
      Source_String5 : Wide_String(1..12) := "  cdefghijkl"; -- first 2 ch pad
      Source_String6 : Wide_String(1..12) := "abcdefabcdef";   
      
      Location       : Natural := 0;
      Slice_Start    : Positive;
      Slice_End,
      Slice_Count    : Natural := 0;

      CD_Set         : Maps.Wide_Character_Set := Maps.To_Set("cd");  
      ABCD_Set       : Maps.Wide_Character_Set := Maps.To_Set("abcd");
      A_to_F_Set     : Maps.Wide_Character_Set := Maps.To_Set("abcdef");
                  
      CD_to_XY_Map   : Maps.Wide_Character_Mapping :=
                         Maps.To_Mapping(From => "cd",  To => "xy");


      -- Access-to-Subprogram object defined for use with specific versions of 
      -- functions Index and Count.
      
      Map_Ptr : Maps.Wide_Character_Mapping_Function := 
                  AK_to_ZQ_Mapping'Access;


   begin


      -- Procedure Move
      -- Evaluate the Procedure Move with various combinations of
      -- parameters.

      -- Justify = Left (default case)

      ASF.Move(Source => Source_String1,       -- "abcde"
               Target => Result_String);
      
      if Result_String /= "abcde     " then
         Report.Failed("Incorrect result from Move with Justify = Left");
      end if;
 
      -- Justify = Right
 
      ASF.Move(Source  => Source_String2,      -- "abcdef"
               Target  => Result_String,
               Drop    => Ada.Strings.Error,
               Justify => Ada.Strings.Right);

      if Result_String /= "    abcdef" then
         Report.Failed("Incorrect result from Move with Justify = Right");
      end if;

      -- Justify = Center (two cases, odd and even pad lengths)
 
      ASF.Move(Source_String1,                 -- "abcde"
               Result_String,
               Ada.Strings.Error,
               Ada.Strings.Center,
               'x');                           -- non-default padding.

      if Result_String /= "xxabcdexxx" then  -- Unequal padding added right
         Report.Failed("Incorrect result from Move with Justify = Center-1");
      end if;

      ASF.Move(Source_String2,                 -- "abcdef"
               Result_String,
               Ada.Strings.Error,
               Ada.Strings.Center);

      if Result_String /= "  abcdef  " then  -- Equal padding added on L/R.
         Report.Failed("Incorrect result from Move with Justify = Center-2");
      end if;

      -- When the source Wide_String is longer than the target Wide_String,
      -- several cases can be examined, with the results depending on the 
      -- value of the Drop parameter.

      -- Drop = Left

      ASF.Move(Source => Source_String3,       -- "abcdefghijkl"
               Target => Result_String,
               Drop   => Ada.Strings.Left);

      if Result_String /= "cdefghijkl" then
         Report.Failed("Incorrect result from Move with Drop = Left");
      end if;

      -- Drop = Right
     
      ASF.Move(Source_String3, Result_String, Ada.Strings.Right);

      if Result_String /= "abcdefghij" then
         Report.Failed("Incorrect result from Move with Drop = Right");
      end if;

      -- Drop = Error
      -- The effect in this case depends on the value of the justify
      -- parameter, and on whether any characters in Source other than 
      -- Pad would fail to be copied.

      -- Drop = Error, Justify = Left, right overflow characters are pad.

      ASF.Move(Source  => Source_String4,      -- "abcdefghij  "
               Target  => Result_String,
               Drop    => Ada.Strings.Error,
               Justify => Ada.Strings.Left);

      if not(Result_String = "abcdefghij") then  -- leftmost 10 characters
          Report.Failed("Incorrect result from Move with Drop = Error - 1");
      end if;

      -- Drop = Error, Justify = Right, left overflow characters are pad.

      ASF.Move(Source_String5,                 -- "  cdefghijkl"
               Result_String, 
               Ada.Strings.Error, 
               Ada.Strings.Right);

      if Result_String /= "cdefghijkl" then  -- rightmost 10 characters
         Report.Failed("Incorrect result from Move with Drop = Error - 2");
      end if;

      -- In other cases of Drop=Error, Length_Error is propagated, such as:

      begin

         ASF.Move(Source_String3,     -- 12 characters, no Pad.
                  Result_String,      -- 10 characters
                  Ada.Strings.Error,  
                  Ada.Strings.Left);  

         Report.Failed("Length_Error not raised by Move - 1");

      exception
         when Ada.Strings.Length_Error => null;   -- OK
         when others => 
            Report.Failed("Incorrect exception raised by Move - 1");
      end;



      -- Function Index
      -- (Other usage examples of this function found in CXA4013-14.)
      -- Check when the pattern is not found in the source.

      if ASF.Index("abcdef", "gh")       /= 0 or
         ASF.Index("abcde",  "abcdef")   /= 0 or  -- pattern > source
         ASF.Index("xyz", 
                   "abcde", 
                   Ada.Strings.Backward) /= 0 or
         ASF.Index("",      "ab")        /= 0 or  -- null source Wide_String.
         ASF.Index("abcde", "  ")        /= 0     -- blank pattern.
      then
         Report.Failed("Incorrect result from Index, no pattern match");
      end if;

      -- Check that Pattern_Error is raised when the pattern is the 
      -- null Wide_String.
      begin
         Location := ASF.Index(Source_String6,    -- "abcdefabcdef"
                               "",                -- null pattern Wide_String.
                               Ada.Strings.Forward);
         Report.Failed("Pattern_Error not raised by Index");
      exception
         when Ada.Strings.Pattern_Error => null;  -- OK, expected exception.
         when others                    =>
           Report.Failed("Incorrect exception raised by Index, null pattern");
      end;

      -- Use the search direction "backward" to locate the particular
      -- pattern within the source Wide_String.

      Location := ASF.Index(Source_String6,         -- "abcdefabcdef"
                            "de",                   -- slice 4..5, 10..11
                            Ada.Strings.Backward);  -- search from right end.

      if Location /= 10  then
         Report.Failed("Incorrect result from Index going Backward");
      end if;



      -- Function Index
      -- Use the version of Index that takes a Wide_Character_Mapping_Function
      -- parameter.
      -- Use the search directions Forward and Backward to locate the 
      -- particular pattern wide string within the source wide string.
      
      Location := ASF.Index("akzqefakzqef",
                            "qzq",                  -- slice 8..10
                            Ada.Strings.Backward,
                            Map_Ptr);      -- perform 'a' to 'z', 'k' to 'q'
                                           -- translation. 
      if Location /= 8  then
         Report.Failed
           ("Incorrect result from Index w/map ptr going Backward");
      end if;

      Location := ASF.Index("ddkkddakcdakdefcadckdfzaaqd",
                            "zq",                  -- slice 7..8
                            Ada.Strings.Forward,
                            Map_Ptr);      -- perform 'a' to 'z', 'k' to 'q'
                                           -- translation. 
      if Location /= 7  then
         Report.Failed
           ("Incorrect result from Index w/map ptr going Forward");
      end if;


      if ASF.Index("aakkzq", "zq",   Ada.Strings.Forward,  Map_Ptr) /= 2 or
         ASF.Index("qzedka", "qz",   Ada.Strings.Backward, Map_Ptr) /= 5 or
         ASF.Index("zazaza", "zzzz", Ada.Strings.Backward, Map_Ptr) /= 3 or
         ASF.Index("kka",    "qqz",  Ada.Strings.Forward,  Map_Ptr) /= 1
      then
         Report.Failed("Incorrect result from Index w/map ptr");
      end if;


      -- Check when the pattern wide string is not found in the source.

      if ASF.Index("akzqef", "kzq",    Ada.Strings.Forward,  Map_Ptr) /= 0 or
         ASF.Index("abcde",  "abcdef", Ada.Strings.Backward, Map_Ptr) /= 0 or
         ASF.Index("xyz",    "akzde",  Ada.Strings.Backward, Map_Ptr) /= 0 or
         ASF.Index("",       "zq",     Ada.Strings.Forward,  Map_Ptr) /= 0 or
         ASF.Index("akcde",  "  ",     Ada.Strings.Backward, Map_Ptr) /= 0
      then
         Report.Failed
           ("Incorrect result from Index w/map ptr, no pattern match");
      end if;

      -- Check that Pattern_Error is raised when the pattern is a 
      -- null Wide_String.
      begin
         Location := ASF.Index("akzqefakqzef",
                               "",                -- null pattern Wide_String.
                               Ada.Strings.Forward,
                               Map_Ptr);
         Report.Failed("Pattern_Error not raised by Index w/map ptr");
      exception
         when Ada.Strings.Pattern_Error => null;  -- OK, expected exception.
         when others                    =>
           Report.Failed
             ("Incorrect exception raised by Index w/map ptr, null pattern");
      end;



      -- Function Index
      -- Using the version of Index testing wide character set membership, 
      -- check combinations of forward/backward, inside/outside parameter
      -- configurations.

      if ASF.Index(Source => Source_String1,              -- "abcde"
                   Set    => CD_Set,
                   Test   => Ada.Strings.Inside,
                   Going  => Ada.Strings.Forward) /= 3 or -- 'c' at pos 3.
         ASF.Index(Source_String6,                        -- "abcdefabcdef"
                   CD_Set,
                   Ada.Strings.Outside,
                   Ada.Strings.Backward)  /=  12  or   -- 'f' at position 12
         ASF.Index(Source_String6,                     -- "abcdefabcdef"
                   CD_Set,
                   Ada.Strings.Inside,
                   Ada.Strings.Backward)  /=   10  or  -- 'd' at position 10
         ASF.Index("cdcdcdcdacdcdcdcd",               
                   CD_Set,
                   Ada.Strings.Outside,
                   Ada.Strings.Forward)   /=    9      -- 'a' at position 9
      then
         Report.Failed("Incorrect result from function Index for sets - 1");
      end if;

      -- Additional interesting uses/combinations using Index for sets.

      if ASF.Index("cd",                               -- same size, str-set
                   CD_Set,
                   Ada.Strings.Inside,
                   Ada.Strings.Forward)   /=    1  or  -- 'c' at position 1
         ASF.Index("abcd",                             -- same size, str-set,
                   Maps.To_Set("efgh"),                -- different contents.
                   Ada.Strings.Outside,                
                   Ada.Strings.Forward)   /=    1  or
         ASF.Index("abccd",                            -- set > Wide_String
                   Maps.To_Set("acegik"),
                   Ada.Strings.Inside,
                   Ada.Strings.Backward)  /=    4  or  -- 'c' at position 4
         ASF.Index("abcde",
                   Maps.Null_Set)         /=    0  or
         ASF.Index("",                                 -- Null string.
                   CD_Set)                /=    0  or
         ASF.Index("abc ab",                           -- blank included
                   Maps.To_Set("e "),                  -- in Wide_String and
                   Ada.Strings.Inside,                 -- set.
                   Ada.Strings.Backward)  /=    4      -- blank in Wide_Str.
      then
         Report.Failed("Incorrect result from function Index for sets - 2");
      end if;



      -- Function Index_Non_Blank.
      -- (Other usage examples of this function found in CXA4013-14.)
                                                         

      if ASF.Index_Non_Blank(Source => Source_String4,  -- "abcdefghij  "
                             Going  => Ada.Strings.Backward)  /= 10  or
         ASF.Index_Non_Blank("abc def ghi jkl  ",
                             Ada.Strings.Backward)            /= 15  or
         ASF.Index_Non_Blank("  abcdef")                      /=  3  or
         ASF.Index_Non_Blank("        ")                      /=  0
      then
          Report.Failed("Incorrect result from Index_Non_Blank");
      end if;



      -- Function Count
      -- (Other usage examples of this function found in CXA4013-14.)

      if ASF.Count("abababa",   "aba")            /=  2  or
         ASF.Count("abababa",   "ab" )            /=  3  or
         ASF.Count("babababa",  "ab")             /=  3  or
         ASF.Count("abaabaaba", "aba")            /=  3  or
         ASF.Count("xxxxxxxxxxxxxxxxxxxy", "xy")  /=  1  or
         ASF.Count("xxxxxxxxxxxxxxxxxxxx", "x")   /= 20
      then
         Report.Failed("Incorrect result from Function Count");
      end if;

      -- Determine the number of slices of Source that when mapped to a 
      -- non-identity map, match the pattern Wide_String.

      Slice_Count := ASF.Count(Source_String6, -- "abcdefabcdef"
                               "xy",
                               CD_to_XY_Map);  -- maps 'c' to 'x', 'd' to 'y'

      if Slice_Count /= 2 then  -- two slices "xy" in "mapped" Source_String6
         Report.Failed("Incorrect result from Count with non-identity map");
      end if;

      -- If the pattern supplied to Function Count is the null Wide_String,
      -- then Pattern_Error is propagated.
      declare
         The_Null_Wide_String : constant Wide_String := "";
      begin
         Slice_Count := ASF.Count(Source_String6, The_Null_Wide_String);
         Report.Failed("Pattern_Error not raised by Function Count");
      exception
         when Ada.Strings.Pattern_Error => null;   -- OK
         when others =>
           Report.Failed("Incorrect exception from Count with null pattern");
      end;




      -- Function Count
      -- Use the version of Count that takes a Wide_Character_Mapping_Function
      -- value as the basis of its source mapping.
      
      if ASF.Count("akakaka",      "zqz", Map_Ptr)          /=  2  or
         ASF.Count("akakaka",      "qz",  Map_Ptr)          /=  3  or
         ASF.Count("kakakaka",     "q",   Map_Ptr)          /=  4  or
         ASF.Count("zzqaakzaqzzk", "zzq", Map_Ptr)          /=  4  or
         ASF.Count("   ",          "z",   Map_Ptr)          /=  0  or
         ASF.Count("",             "qz",  Map_Ptr)          /=  0  or
         ASF.Count("abbababab",    "zq",  Map_Ptr)          /=  0  or
         ASF.Count("aaaaaaaaaaaaaaaaaakk", "zqq", Map_Ptr)  /=  1  or
         ASF.Count("azaazaazzzaaaaazzzza", "z",   Map_Ptr)  /= 20  
      then
         Report.Failed("Incorrect result from Function Count w/map ptr");
      end if;

      -- If the pattern supplied to Function Count is a null Wide_String,
      -- then Pattern_Error is propagated.
      declare
         The_Null_Wide_String : constant Wide_String := "";
      begin
         Slice_Count := ASF.Count(Source_String6, 
                                  The_Null_Wide_String, 
                                  Map_Ptr);
         Report.Failed
           ("Pattern_Error not raised by Function Count w/map ptr");
      exception
         when Ada.Strings.Pattern_Error => null;   -- OK
         when others =>
           Report.Failed
             ("Incorrect exception from Count w/map ptr, null pattern");
      end;




      -- Function Count returning the number of characters in a particular
      -- set that are found in source Wide_String.

      if ASF.Count(Source_String6, CD_Set) /=  4 or  -- 2 'c' and 'd' chars.
         ASF.Count("cddaccdaccdd", CD_Set) /= 10
      then
         Report.Failed("Incorrect result from Count with set");
      end if;


 
      -- Function Find_Token.
      -- (Other usage examples of this function found in CXA4013-14.)

      ASF.Find_Token(Source  => Source_String6,      -- First slice with no 
                     Set     => ABCD_Set,            -- 'a', 'b', 'c', or 'd'
                     Test    => Ada.Strings.Outside, -- is "ef" at 5..6.
                     First   => Slice_Start,
                     Last    => Slice_End);

      if Slice_Start /= 5  or Slice_End /= 6 then
         Report.Failed("Incorrect result from Find_Token - 1");
      end if;

      -- If no appropriate slice is contained by the source Wide_String,
      -- then the value returned in Last is zero, and the value in First is 
      -- Source'First.

      ASF.Find_Token(Source_String6,      -- "abcdefabcdef"
                     A_to_F_Set,          -- Set of characters 'a' thru 'f'.
                     Ada.Strings.Outside, -- No characters outside this set.
                     Slice_Start,
                     Slice_End);
      
      if Slice_Start /= Source_String6'First  or Slice_End /= 0 then
         Report.Failed("Incorrect result from Find_Token - 2");
      end if;

      -- Additional testing of Find_Token.

      ASF.Find_Token("eabcdabcddcab", 
                     ABCD_Set, 
                     Ada.Strings.Inside,
                     Slice_Start,
                     Slice_End);

      if Slice_Start /= 2  or Slice_End /= 13 then
         Report.Failed("Incorrect result from Find_Token - 3");
      end if;

      ASF.Find_Token("efghijklabcdabcd",
                     ABCD_Set,
                     Ada.Strings.Outside,
                     Slice_Start,
                     Slice_End);

      if Slice_Start /= 1  or Slice_End /= 8 then
         Report.Failed("Incorrect result from Find_Token - 4");
      end if;

      ASF.Find_Token("abcdefgabcdabcd",
                     ABCD_Set,
                     Ada.Strings.Outside,
                     Slice_Start,
                     Slice_End);

      if Slice_Start /= 5  or Slice_End /= 7 then
         Report.Failed("Incorrect result from Find_Token - 5");
      end if;

      ASF.Find_Token("abcdcbabcdcba",
                     ABCD_Set,
                     Ada.Strings.Inside,
                     Slice_Start,
                     Slice_End);

      if Slice_Start /= 1  or Slice_End /= 13 then
         Report.Failed("Incorrect result from Find_Token - 6");
      end if;


   exception
      when others => Report.Failed("Exception raised in Test_Block");
   end Test_Block;

   Report.Result;

end CXA4015;