-- CXA3004.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 functions defined in package Ada.Characters.Handling
--      for classification of and conversion between Wide_Character and
--      Character values produce correct results when given the appropriate
--      Character and String inputs.
--
-- TEST DESCRIPTION:
--      This test demonstrates the functions defined in package 
--      Ada.Characters.Handling which provide for the classification of and 
--      conversion between Wide_Characters and Characters, in character 
--      variables and strings.
--      Each of the functions is provided with input values that are of the 
--      appropriate range. The results of the function processing are 
--      subsequently evaluated.
--      
-- APPLICABILITY CRITERIA: 
--      Applicable to all implementations using the Latin_1 set as the
--      definition of Character.
--
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      27 Dec 94   SAIC    Corrected variable names.
--
--!
with Report;
with Ada.Characters.Handling;
procedure CXA3004 is
begin
   Report.Test ("CXA3004", "Check that the functions defined in package "  &
                           "Ada.Characters.Handling for classification "   &
                           "of and conversion between Wide_Character and " &
                           "Character values produce correct results "     &
                           "when given the appropriate Character "         &
                           "and String inputs");
   Test_Block:
   declare
      package ACH renames Ada.Characters.Handling;
      Char_End      : Integer        := 255;
      WC_Start      : Integer        := 256;
      Sub_Char      : Character      := '*';
      Blank         : Character      := ' ';
      First_Char    : Character      := Character'First;
      Last_Char     : Character      := Character'Last;
      F_Char        : Character      := 'F';
      First_Wide_Char        : Wide_Character := Wide_Character'First;
      Last_Non_Wide_Char     : Wide_Character := Wide_Character'Val(Char_End);
      First_Unique_Wide_Char : Wide_Character := Wide_Character'Val(WC_Start);
      Last_Wide_Char         : Wide_Character := Wide_Character'Last;
      A_String      : String (1..3)      := First_Char & 'X' & Last_Char;
      A_Wide_String : Wide_String (1..3) := First_Wide_Char            & 
                                            ACH.To_Wide_Character('X') & 
                                            ACH.To_Wide_Character(Last_Char);
      Unique_Wide_String : Wide_String (1..2) := First_Unique_Wide_Char &
                                                 Last_Wide_Char;
      Mixed_Wide_String  : Wide_String (1..6) := ACH.To_Wide_Character('A') & 
                                                 First_Wide_Char            &
                                                 Last_Non_Wide_Char         & 
                                                 First_Unique_Wide_Char     & 
                                                 Last_Wide_Char             &
                                                 ACH.To_Wide_Character('Z');
      Basic_Char         : Character          := 'A';
      Basic_Wide_Char    : Wide_Character     := 'A';
      Basic_String       : String (1..6)      := "ABCXYZ";
      Basic_Wide_String  : Wide_String (1..6) := "ABCXYZ";
   begin
      -- Function Is_Character
      if not ACH.Is_Character(First_Wide_Char) then
         Report.Failed ("Incorrect result from Is_Character - 1");
      end if;
      if ACH.Is_Character(First_Unique_Wide_Char) or        
         ACH.Is_Character(Last_Wide_Char)
      then
         Report.Failed ("Incorrect result from Is_Character - 2");
      end if;
       
      -- Function Is_String
      if not ACH.Is_String(A_Wide_String) then
         Report.Failed ("Incorrect result from Is_String - 1");
      end if;
      if ACH.Is_String(Unique_Wide_String) or
         ACH.Is_String(Mixed_Wide_String)
      then
         Report.Failed ("Incorrect result from Is_String - 2");
      end if;
      
      -- Function To_Character
      -- Use default substitution character in call of To_Character.
      if ACH.To_Character(First_Wide_Char)    /= First_Char or 
         ACH.To_Character(Last_Non_Wide_Char) /= Last_Char
      then
         Report.Failed ("Incorrect result from To_Character - 1");
      end if;
      -- Provide a substitution character for use with To_Character.
      if ACH.To_Character(First_Unique_Wide_Char, Blank)    /= Blank    or
         ACH.To_Character(First_Unique_Wide_Char, Sub_Char) /= Sub_Char or
         ACH.To_Character(Last_Wide_Char)                   /= ' '  -- default
      then
         Report.Failed ("Incorrect result from To_Character - 2");
      end if;
      -- Function To_String
      if ACH.To_String(A_Wide_String) /=  A_String then
         Report.Failed ("Incorrect result from To_String - 1");
      end if;
     
      if ACH.To_String(Unique_Wide_String, Sub_Char) /= "**" then
         Report.Failed ("Incorrect result from To_String - 2");
      end if;
      if ACH.To_String(Mixed_Wide_String,  Sub_Char) /= 
         ('A' & First_Char & Last_Char & "**" & 'Z')   or
         ACH.To_String(Mixed_Wide_String,  Sub_Char) /= 
         (ACH.To_Character(Mixed_Wide_String(1), Sub_Char) &
          ACH.To_Character(Mixed_Wide_String(2), Sub_Char) &
          ACH.To_Character(Mixed_Wide_String(3), Sub_Char) &
          ACH.To_Character(Mixed_Wide_String(4), Sub_Char) &
          ACH.To_Character(Mixed_Wide_String(5), Sub_Char) &
          ACH.To_Character(Mixed_Wide_String(6), Sub_Char)) 
      then
         Report.Failed ("Incorrect result from To_String - 3");
      end if;
      -- Function To_Wide_Character
      if ACH.To_Wide_Character(Basic_Char) /= Basic_Wide_Char then
         Report.Failed ("Incorrect result from To_Wide_Character");
      end if;
    
      -- Function To_Wide_String
      if not (ACH.To_Wide_String(Basic_String) = Basic_Wide_String) then
         Report.Failed ("Incorrect result from To_Wide_String");
      end if;
      -- Functions Used In Combination
      if not ACH.Is_Character (ACH.To_Wide_Character (
        ACH.To_Character(First_Wide_Char))) 
      then
         Report.Failed ("Incorrect result from functions in combination - 1");
      end if;
      if not ACH.Is_String(ACH.To_Wide_String(ACH.To_String(A_Wide_String)))
      then
         Report.Failed ("Incorrect result from functions in combination - 2");
      end if;
      if ACH.To_String(ACH.To_Wide_Character('A')    &
                       ACH.To_Wide_Character(F_Char) &
                       ACH.To_Wide_Character('Z'))     /=  "AFZ"
      then
         Report.Failed ("Incorrect result from functions in combination - 3");
      end if;
         
   exception
      when others => Report.Failed ("Exception raised in Test_Block");
   end Test_Block;
   Report.Result;
end CXA3004;