--
-- C352001.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 predefined Character type comprises 256 positions.  
--      Check that the names of the non-graphic characters are usable with 
--      the attributes (Wide_)Image and (Wide_)Value, and that these
--      attributes produce the correct result.
--                 
-- TEST DESCRIPTION:
--      Build two tables of nongraphic characters from positions of Row 00 
--      (0000-001F and 007F-009F) of the ISO 10646 Basic Multilingual Plane.
--      Fill the first table with compiler created strings. Fill the second 
--      table with strings defined by the language.  Compare the two tables.  
--      Check 256 positions of the predefined character type.  Use attributes 
--      (Wide_)Image and (Wide_)Value to check the values of the non-graphic 
--      characters and the last 2 characters.
--
--
-- CHANGE HISTORY:
--      20 Jun 95   SAIC    Initial prerelease version.
--      27 Jan 96   SAIC    Revised for 2.1.  Hid values, added "del" case.
--
--!

with Ada.Characters.Handling;
with Report;
procedure C352001 is

   Lower_Bound  : Integer  :=  0;
   Middle_Bound : Integer  := 31;
   Upper_Bound  : Integer  := 159;
   Half_Bound   : Integer  := 127;
   Max_Bound    : Integer  := 255;

   type Dyn_String is access String;
   type Value_Result is array (Character) of Dyn_String;

   Table_Of_Character : Value_Result;
   TC_Table           : Value_Result;

   function CVII(K : Natural) return Character is
   begin
     return Character'Val( Report.Ident_Int(K) );
   end CVII;

   function "=" (L, R : String) return Boolean is
      UCL : String (L'First .. L'Last);
      UCR : String (R'First .. R'last);
   begin
      UCL := Ada.Characters.Handling.To_Upper (L);
      UCR := Ada.Characters.Handling.To_Upper (R);
      if UCL'Last /= UCR'Last then 
         return False;
      else
         for I in UCL'First .. UCR'Last loop
            if UCL (I) /= UCR (I) then 
               return False;
            end if;
         end loop;
         return True;
       end if;
   end "=";

begin

   Report.Test ("C352001", "Check that, the predefined Character type "     &
                "comprises 256 positions.  Check that the names of the "    &
                "non-graphic characters are usable with the attributes "    &
                "(Wide_)Image and (Wide_)Value, and that these attributes " &
                "produce the correct result");

   -- Fill table with strings (positions of Row 00 (0000-001F) of the ISO 
   -- 10646 Basic Multilingual Plane created by the compiler.

   for I in CVII(Lower_Bound) .. CVII(Middle_Bound) loop
      Table_Of_Character (I) := new String'(Character'Image(I));
   end loop;

   -- Fill table with strings (positions of Row 00 (007F-009F) of the ISO 
   -- 10646 Basic Multilingual Plane created by the compiler.

   for I in CVII(Half_Bound) .. CVII(Upper_Bound) loop
      Table_Of_Character (I) := new String'(Character'Image(I));
   end loop;

   -- Fill table with strings (positions of Row 00 (0000-001F) of the ISO 
   -- 10646 Basic Multilingual Plane defined by the language.

   TC_Table (CVII(0))   := new String'("nul");
   TC_Table (CVII(1))   := new String'("soh");
   TC_Table (CVII(2))   := new String'("stx");
   TC_Table (CVII(3))   := new String'("etx");
   TC_Table (CVII(4))   := new String'("eot");
   TC_Table (CVII(5))   := new String'("enq");
   TC_Table (CVII(6))   := new String'("ack");
   TC_Table (CVII(7))   := new String'("bel"); 
   TC_Table (CVII(8))   := new String'("bs");
   TC_Table (CVII(9))   := new String'("ht");
   TC_Table (CVII(10))  := new String'("lf");
   TC_Table (CVII(11))  := new String'("vt");
   TC_Table (CVII(12))  := new String'("ff");
   TC_Table (CVII(13))  := new String'("cr");
   TC_Table (CVII(14))  := new String'("so");
   TC_Table (CVII(15))  := new String'("si");
   TC_Table (CVII(16))  := new String'("dle");
   TC_Table (CVII(17))  := new String'("dc1");
   TC_Table (CVII(18))  := new String'("dc2");
   TC_Table (CVII(19))  := new String'("dc3");
   TC_Table (CVII(20))  := new String'("dc4");
   TC_Table (CVII(21))  := new String'("nak");
   TC_Table (CVII(22))  := new String'("syn");
   TC_Table (CVII(23))  := new String'("etb");
   TC_Table (CVII(24))  := new String'("can");
   TC_Table (CVII(25))  := new String'("em");
   TC_Table (CVII(26))  := new String'("sub");
   TC_Table (CVII(27))  := new String'("esc");
   TC_Table (CVII(28))  := new String'("fs");
   TC_Table (CVII(29))  := new String'("gs");
   TC_Table (CVII(30))  := new String'("rs");
   TC_Table (CVII(31))  := new String'("us");
   TC_Table (CVII(127)) := new String'("del");

   -- Fill table with strings (positions of Row 00 (007F-009F) of the ISO 
   -- 10646 Basic Multilingual Plane defined by the language.

   TC_Table (CVII(128)) := new String'("reserved_128");
   TC_Table (CVII(129)) := new String'("reserved_129");
   TC_Table (CVII(130)) := new String'("bph");
   TC_Table (CVII(131)) := new String'("nbh");
   TC_Table (CVII(132)) := new String'("reserved_132");
   TC_Table (CVII(133)) := new String'("nel");
   TC_Table (CVII(134)) := new String'("ssa");
   TC_Table (CVII(135)) := new String'("esa");
   TC_Table (CVII(136)) := new String'("hts");
   TC_Table (CVII(137)) := new String'("htj");
   TC_Table (CVII(138)) := new String'("vts");
   TC_Table (CVII(139)) := new String'("pld");
   TC_Table (CVII(140)) := new String'("plu");
   TC_Table (CVII(141)) := new String'("ri");
   TC_Table (CVII(142)) := new String'("ss2");
   TC_Table (CVII(143)) := new String'("ss3");
   TC_Table (CVII(144)) := new String'("dcs");
   TC_Table (CVII(145)) := new String'("pu1");
   TC_Table (CVII(146)) := new String'("pu2");
   TC_Table (CVII(147)) := new String'("sts");
   TC_Table (CVII(148)) := new String'("cch");
   TC_Table (CVII(149)) := new String'("mw");
   TC_Table (CVII(150)) := new String'("spa");
   TC_Table (CVII(151)) := new String'("epa");
   TC_Table (CVII(152)) := new String'("sos");
   TC_Table (CVII(153)) := new String'("reserved_153");
   TC_Table (CVII(154)) := new String'("sci");
   TC_Table (CVII(155)) := new String'("csi");
   TC_Table (CVII(156)) := new String'("st");
   TC_Table (CVII(157)) := new String'("osc");
   TC_Table (CVII(158)) := new String'("pm");
   TC_Table (CVII(159)) := new String'("apc");


   -- Compare the first half of two tables.
   for I in CVII(Lower_Bound) .. CVII(Middle_Bound) loop
     if TC_Table(I).all /= Table_Of_Character(I).all then
       Report.Failed("Value of character#" & Integer'Image(Character'Pos(I)) &
                     " is not the same in the first half of the table");
     end if;
   end loop;


   -- Compare the second half of two tables.
   for I in CVII(Half_Bound) .. CVII(Upper_Bound) loop
     if TC_Table(I).all /= Table_Of_Character(I).all then
       Report.Failed("Value of character#" & Integer'Image(Character'Pos(I)) &
                     " is not the same in the second half of the table");
     end if;
   end loop;


   -- Check the first character.
   if Character'Image( Character'First ) /= "NUL" then
      Report.Failed("Value of character#"                           &
                     Integer'Image(Character'Pos (Character'First)) &
                    " is not NUL");
   end if;


   -- Check that the names of the non-graphic characters are usable with
   -- Image and Value attributes.
   if Character'Value( Character'Image( CVII(153) )) /= 
     CVII( 153 ) then
        Report.Failed ("Value of character#"                       &
                        Integer'Image( Character'Pos(CVII(153)) )  &
                       " is not reserved_153");
   end if;


   for I in CVII(Lower_Bound) .. CVII(Max_Bound) loop
     if Character'Value( 
          Report.Ident_Str(
            Character'Image(CVII(Character'Pos(I)))))
        /= CVII( Character'Pos(I)) then
          Report.Failed ("Value of character#"                             &
                          Integer'Image( Character'Pos(I) )                &
                         " is not the same as the predefined character type");
     end if;
   end loop;


   -- Check Wide_Character attributes.
   for I in Wide_Character'Val(Lower_Bound) .. Wide_Character'Val(Max_Bound) 
   loop
     if Wide_Character'Wide_Value(
          Report.Ident_Wide_Str(
            Wide_Character'Wide_Image(
              Wide_Character'Val(Wide_Character'Pos(I)))))
        /= Wide_Character'Val(Wide_Character'Pos(I)) 
     then
        Report.Failed ("Value of the predefined Wide_Character type " &
                       "is not correct");
     end if;
   end loop;


   if Wide_Character'Value( Wide_Character'Image(Wide_Character'Val(132)) ) 
     /= Wide_Character'Val( Report.Ident_Int(132) ) then
        Report.Failed ("Wide_Character at 132 is not reserved_132");
   end if;


   if Wide_Character'Image( Wide_Character'First ) /= "NUL" then
      Report.Failed ("Wide_Character'First is not NUL");
   end if;


   if Wide_Character'Image 
     (Wide_Character'Pred (Wide_Character'Last) ) /= "FFFE" then
      Report.Failed ("Wide_Character at 65534 is not FFFE");
   end if;
  
    
   if Wide_Character'Image(Wide_Character'Last) /= "FFFF" then
      Report.Failed ("Wide_Character'Last is not FFFF");
   end if;

   Report.Result;

end C352001;
