view gcc/testsuite/ada/acats/tests/cxf/cxf3a03.a @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
line wrap: on
line source

-- CXF3A03.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 function Length in the generic package Decimal_Output
--      returns the number of characters in the edited output string 
--      produced by function Image, for a particular decimal type, 
--      currency string, and radix mark.
--      Check that function Valid in the generic package Decimal_Output 
--      returns correct results based on the particular decimal value, 
--      and the Picture and Currency string parameters.
--      
-- TEST DESCRIPTION:
--      This test uses two instantiations of package Decimal_Output, one
--      for decimal data with delta 0.01, the other for decimal data with
--      delta 1.0. The functions Length and Valid found in this generic 
--      package are evaluated for each instantiation.
--      Function Length is examined with picture and currency string input
--      parameters of different sizes.
--      Function Valid is examined with a decimal type data item, picture
--      object, and currency string, for cases that are both valid and
--      invalid (Layout_Error would result from the particular items as
--      input parameters to function Image).
--
-- TEST FILES:
--      The following files comprise this test:
--
--         FXF3A00.A   (foundation code)
--      => CXF3A03.A
--
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!

with FXF3A00;
with Ada.Text_IO.Editing;
with Report;

procedure CXF3A03 is
begin

   Report.Test ("CXF3A03", "Check that function Length returns the "     &
                           "number of characters in the edited output "  &
                           "string produced by function Image, for a "   &
                           "particular decimal type, currency string, "  &
                           "and radix mark.  Check that function Valid " &
                           "returns correct results based on the "       &
                           "particular decimal value, and the Picture "  &
                           "and Currency string parameters");

   Test_Block:
   declare

      use Ada.Text_IO;
      use FXF3A00;

      type Instantiation_Type is (NDP, TwoDP);

      -- Defaults used for all other generic parameters in these
      -- instantiations.
      package Pack_NDP is new Editing.Decimal_Output (Decimal_Type_NDP);
      package Pack_2DP is new Editing.Decimal_Output (Decimal_Type_2DP);

      TC_Lower_Bound,
      TC_Higher_Bound : Integer := 0;

      TC_Picture      : Editing.Picture;
      TC_US_String    : constant String := "$";
      TC_FF_String    : constant String := "FF";
      TC_DM_String    : constant String := "DM";
      TC_CHF_String   : constant String := "CHF";


      function Dollar_Sign_Present (Str : String) return Boolean is
      begin
         for i in 1..Str'Length loop
            if Str(i) = '$' then
               return True;
            end if;
         end loop;
         return False;
      end Dollar_Sign_Present;

      function V_Present (Str : String) return Boolean is
      begin
         for i in 1..Str'Length loop
            if Str(i) = 'V' or Str(i) = 'v' then
               return True;
            end if;
         end loop;
         return False;
      end V_Present;


      function Accurate_Length (Pict_Str        : String;
                                Inst            : Instantiation_Type;
                                Currency_String : String) 
        return Boolean is

         TC_Length                     : Natural := 0;
         TC_Currency_Length_Adjustment : Natural := 0;
         TC_Radix_Adjustment           : Natural := 0;
      begin

         -- Create the picture object from the picture string.
         TC_Picture := Editing.To_Picture(Pict_Str);

         -- Calculate the currency length adjustment.
         if Dollar_Sign_Present (Editing.Pic_String(TC_Picture)) then
            TC_Currency_Length_Adjustment := Currency_String'Length - 1;
         end if;

         -- Calculate the Radix adjustment.
         if V_Present (Editing.Pic_String(TC_Picture)) then
            TC_Radix_Adjustment := 1;
         end if;

         -- Calculate the length, using the version of Length that comes
         -- from the appropriate instantiation of Decimal_Output, based
         -- on the decimal type used in the instantiation.
         if Inst = NDP then
            TC_Length  := Pack_NDP.Length(TC_Picture,
                                          Currency_String);
         else
            TC_Length  := Pack_2DP.Length(TC_Picture,
                                          Currency_String);
         end if;

         return TC_Length = Editing.Pic_String(TC_Picture)'Length +
                              TC_Currency_Length_Adjustment       -
                              TC_Radix_Adjustment;
      end Accurate_Length;


   begin

      Length_Block:
      begin

         -- The first 10 picture strings in the Valid_Strings array correspond
         -- to data values of a decimal type with delta 0.01. 
         -- Note: The appropriate instantiation of the Decimal_Output package 
         --       (and therefore function Length) is used by function 
         --       Accurate_Length to calculate length.

         for i in 1..10 loop
            if not Accurate_Length (FXF3A00.Valid_Strings(i).all, 
                                    TwoDP, 
                                    TC_US_String)
            then
               Report.Failed("Incorrect result from function Length, "       &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_US_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Valid_Strings(i).all );
            end if;
         end loop;


         -- Picture strings 17-20 in the Valid_Strings array correspond
         -- to data values of a decimal type with delta 1.0.  Again, the
         -- instantiation of Decimal_Output used is based on this particular
         -- decimal type.

         for i in 17..20 loop
            if not Accurate_Length (FXF3A00.Valid_Strings(i).all, 
                                    NDP, 
                                    TC_US_String)
            then
               Report.Failed("Incorrect result from function Length, "       &
                             "when used with a decimal type with delta 1.0 " &
                             "and with the currency string " & TC_US_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Valid_Strings(i).all );
            end if;
         end loop;


         -- The first 4 picture strings in the Foreign_Strings array
         -- correspond to data values of a decimal type with delta 0.01, 
         -- and to the currency string "FF" (two characters). 

         for i in 1..FXF3A00.Number_of_FF_Strings loop
            if not Accurate_Length (FXF3A00.Foreign_Strings(i).all, 
                                    TwoDP, 
                                    TC_FF_String)
            then
               Report.Failed("Incorrect result from function Length, "       &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_FF_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Foreign_Strings(i).all );
            end if;
         end loop;


         -- Picture strings 5-9 in the Foreign_Strings array correspond
         -- to data values of a decimal type with delta 0.01, and to the
         -- currency string "DM" (two characters). 

         TC_Lower_Bound  := FXF3A00.Number_of_FF_Strings + 1;
         TC_Higher_Bound := FXF3A00.Number_of_FF_Strings + 
                            FXF3A00.Number_of_DM_Strings;

         for i in TC_Lower_Bound..TC_Higher_Bound loop
            if not Accurate_Length (FXF3A00.Foreign_Strings(i).all, 
                                    TwoDP, 
                                    TC_DM_String)
            then
               Report.Failed("Incorrect result from function Length, "       &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_DM_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Foreign_Strings(i).all );
            end if;
         end loop;


         -- Picture string #10 in the Foreign_Strings array corresponds
         -- to a data value of a decimal type with delta 0.01, and to the
         -- currency string "CHF" (three characters). 

         if not Accurate_Length (FXF3A00.Foreign_Strings(10).all, 
                                 TwoDP, 
                                 TC_CHF_String)
         then
            Report.Failed("Incorrect result from function Length, "       &
                          "when used with a decimal type with delta .01 " &
                          "and with the currency string "                 & 
                          TC_CHF_String);
         end if;

      exception
         when others => 
           Report.Failed("Unexpected exception raised in Length_Block");
      end Length_Block;


      Valid_Block:
      declare

         -- This offset value is used to align picture string and decimal
         -- data values from package FXF3A00 for proper correspondence for
         -- the evaluations below.  

         TC_Offset : constant Natural := 10;

      begin

         -- The following four For Loops examine cases where the
         -- decimal data/picture string/currency combinations used will 
         -- generate valid Edited Output strings.  These combinations, when
         -- provided to the Function Valid (from instantiations of 
         -- Decimal_Output), should result in a return result of True.
         -- The particular instantiated version of Valid used in these loops
         -- is that for decimal data with delta 0.01.

         -- The first 4 picture strings in the Foreign_Strings array
         -- correspond to data values of a decimal type with delta 0.01, 
         -- and to the currency string "FF" (two characters). 

         for i in 1..FXF3A00.Number_of_FF_Strings loop
            -- Create the picture object from the picture string.
            TC_Picture := Editing.To_Picture(FXF3A00.Foreign_Strings(i).all);

            if not Pack_2DP.Valid (FXF3A00.Data_With_2DP(TC_Offset + i),
                                   TC_Picture,
                                   TC_FF_String)
            then
               Report.Failed("Incorrect result from function Valid, "        &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_FF_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Foreign_Strings(i).all );
            end if;
         end loop;


         -- Picture strings 5-9 in the Foreign_Strings array correspond
         -- to data values of a decimal type with delta 0.01, and to the
         -- currency string "DM" (two characters). 

         TC_Lower_Bound  := FXF3A00.Number_of_FF_Strings + 1; 
         TC_Higher_Bound := FXF3A00.Number_of_FF_Strings + 
                            FXF3A00.Number_of_DM_Strings;

         for i in TC_Lower_Bound..TC_Higher_Bound loop
            -- Create the picture object from the picture string.
            TC_Picture := Editing.To_Picture(FXF3A00.Foreign_Strings(i).all);

            if not Pack_2DP.Valid (FXF3A00.Data_With_2DP(TC_Offset + i),
                                   TC_Picture,
                                   TC_DM_String)
            then
               Report.Failed("Incorrect result from function Valid, "        &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_DM_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Foreign_Strings(i).all );
            end if;
         end loop;


         -- Picture string #10 in the Foreign_Strings array corresponds
         -- to a data value of a decimal type with delta 0.01, and to the
         -- currency string "CHF" (three characters). 

         -- Create the picture object from the picture string.
         TC_Picture := Editing.To_Picture(FXF3A00.Foreign_Strings(10).all);

         if not Pack_2DP.Valid (FXF3A00.Data_With_2DP(TC_Offset + 10),
                                TC_Picture,
                                TC_CHF_String)
         then
            Report.Failed("Incorrect result from function Valid, "        &
                          "when used with a decimal type with delta .01 " &
                          "and with the currency string "                 & 
                          TC_CHF_String);
         end if;


         -- The following For Loop examines cases where the
         -- decimal data/picture string/currency combinations used will 
         -- generate valid Edited Output strings.  
         -- The particular instantiated version of Valid used in this loop
         -- is that for decimal data with delta 1.0; the others above have
         -- been for decimal data with delta 0.01.
         -- Note: TC_Offset is used here to align picture strings from the
         --       FXF3A00.Valid_Strings table with the appropriate decimal
         --       data in the FXF3A00.Data_With_NDP table.

         for i in 1..FXF3A00.Number_Of_NDP_Items loop
            -- Create the picture object from the picture string.
            TC_Picture := 
               Editing.To_Picture(FXF3A00.Valid_Strings(TC_Offset + i).all);

            if not Pack_NDP.Valid (FXF3A00.Data_With_NDP(i),
                                   TC_Picture, 
                                   TC_US_String)
            then
               Report.Failed("Incorrect result from function Valid, "        &
                             "when used with a decimal type with delta .01 " &
                             "and with the currency string " & TC_US_String  & 
                             " in evaluating picture string "                &
                             FXF3A00.Valid_Strings(i).all );
            end if;
         end loop;


         -- The following three evaluations of picture strings, used in
         -- conjunction with the specific decimal values provided, will cause 
         -- Editing.Image to raise Layout_Error (to be examined in other
         -- tests).  Function Valid should return a False result for these 
         -- combinations.
         -- The first two evaluations use the instantiation of Decimal_Output
         -- with a decimal type with delta 0.01, while the last evaluation
         -- uses the instantiation with decimal type with delta 1.0.

         for i in 1..FXF3A00.Number_of_Erroneous_Conditions loop

            -- Create the picture object from the picture string.
            TC_Picture := 
               Editing.To_Picture(FXF3A00.Erroneous_Strings(i).all);

            if i < 3 then  -- Choose the appropriate instantiation.
               if Pack_2DP.Valid(Item     => FXF3A00.Erroneous_Data(i),
                                 Pic      => TC_Picture,
                                 Currency => TC_US_String)
               then
                  Report.Failed("Incorrect result from function Valid, "    &
                                "when used with a decimal type with delta " &
                                "0.01 and with the currency string "        & 
                                TC_US_String                                & 
                                " in evaluating picture string "            &
                                FXF3A00.Valid_Strings(i).all );
               end if;
            else
               if Pack_NDP.Valid(Item     => FXF3A00.Decimal_Type_NDP(
                                               FXF3A00.Erroneous_Data(i)),
                                 Pic      => TC_Picture,
                                 Currency => TC_US_String)
               then
                  Report.Failed("Incorrect result from function Valid, "    &
                                "when used with a decimal type with delta " &
                                "1.0 and with the currency string "         & 
                                TC_US_String                                & 
                                " in evaluating picture string "            &
                                FXF3A00.Valid_Strings(i).all );
               end if;
            end if;
         end loop;

      exception
         when others => 
           Report.Failed("Unexpected exception raised in Valid_Block");
      end Valid_Block;


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

   Report.Result;

end CXF3A03;