view gcc/testsuite/ada/acats/tests/cb/cb41002.a @ 111:04ced10e8804

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

-- CB41002.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 message string input parameter in a call to the
--      Raise_Exception procedure is associated with the raised exception
--      occurrence, and that the message string can be obtained using the
--      Exception_Message function with the associated Exception_Occurrence
--      object.  Check that Function Exception_Information is available
--      to provide implementation-defined information about the exception
--      occurrence.
--
-- TEST DESCRIPTION:
--      This test checks that a message associated with a raised exception
--      is propagated with the exception, and can be retrieved using the
--      Exception_Message function.  The exception will be raised using the
--      'Identity attribute as a parameter to the Raise_Exception procedure,
--      and an associated message string will be provided.  The exception
--      will be handled, and the message associated with the occurrence will
--      be compared to the original source message (non-default).
--
--      The test also includes a simulated logging procedure
--      (Check_Exception_Information) that checks that Exception_Information
--      can be called.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      22 Jun 00   RLB     Added a check at Exception_Information can be
--                          called.
--
--!

with Report;
with Ada.Exceptions;

procedure CB41002 is
begin

   Report.Test ("CB41002", "Check that the message string input parameter " &
                           "in a call to the Raise_Exception procedure is " &
                           "associated with the raised exception "          &
                           "occurrence, and that the message string can "   &
                           "be obtained using the Exception_Message "       &
                           "function with the associated "                  &
                           "Exception_Occurrence object. Also check that "  &
                           "the Exception_Information function can be called");

   Test_Block:
   declare

      Number_Of_Exceptions : constant := 3;

      User_Exception_1,
      User_Exception_2,
      User_Exception_3 : exception;

      type String_Ptr is access String;

      User_Messages : constant array (1..Number_Of_Exceptions)
        of String_Ptr :=
        (new String'("Msg"),
         new String'("This message will override the default "   &
                     "message provided by the implementation"),
         new String'("The message can be captured by procedure"  & -- 200 chars
                      " Exception_Message.  It is designed to b" &
                      "e exactly 200 characters in length, sinc" &
                      "e there is a permission  concerning the " &
                      "truncation of a message over 200 chars. "));

      procedure Check_Exception_Information (
                 Occur : in Ada.Exceptions.Exception_Occurrence) is
          -- Simulates an error logging routine.
         Info : constant String :=
              Ada.Exceptions.Exception_Information (Occur);
         function Is_Substring_of (Target, Search : in String) return Boolean is
            -- Returns True if Search is a substring of Target, and False
            -- otherwise.
         begin
            for I in Report.Ident_Int(Target'First) ..
                     Target'Last - Search'Length + 1 loop
               if Target(I .. I+Search'Length-1) = Search then
                  return True;
               end if;
            end loop;
            return False;
         end Is_Substring_of;
      begin
         -- We can't display Info, as it often contains line breaks
         -- (confusing Report), and might look much like the failure of a test
         -- with an unhandled exception (thus confusing grading tools).
         --
         -- We don't particular care if the implementation advice is followed,
         -- but we make these checks to insure that a compiler cannot optimize
         -- away Info or the rest of this routine.
         if not Is_Substring_of (Info,
                       Ada.Exceptions.Exception_Name (Occur)) then
             Report.Comment ("Exception_Information does not contain " &
                             "Exception_Name - see 11.4.1(19)");
         elsif not Is_Substring_of (Info,
                       Ada.Exceptions.Exception_Message (Occur)) then
             Report.Comment ("Exception_Information does not contain " &
                             "Exception_Message - see 11.4.1(19)");
         end if;
      end Check_Exception_Information;

   begin

      for i in 1..Number_Of_Exceptions loop
         begin

            -- Raise a user-defined exception with a specific message string.
            case i is
               when 1 =>
                  Ada.Exceptions.Raise_Exception(User_Exception_1'Identity,
                                                 User_Messages(i).all);
               when 2 =>
                  Ada.Exceptions.Raise_Exception(User_Exception_2'Identity,
                                                 User_Messages(i).all);
               when 3 =>
                  Ada.Exceptions.Raise_Exception(User_Exception_3'Identity,
                                                 User_Messages(i).all);
               when others =>
                  Report.Failed("Incorrect result from Case statement");
            end case;

            Report.Failed
              ("Exception not raised by procedure Exception_With_Message " &
               "for User_Exception #" & Integer'Image(i));

         exception
            when Excptn : others =>

               begin
                  -- The message that is associated with the raising of each
                  -- exception is captured here using the Exception_Message
                  -- function.

                  if User_Messages(i).all /=
                     Ada.Exceptions.Exception_Message(Excptn)
                  then
                     Report.Failed
                       ("Message captured from exception is not the "  &
                        "message provided when the exception was raised, " &
                        "User_Exception #" & Integer'Image(i));
                  end if;

                  Check_Exception_Information(Excptn);
               end;
         end;
      end loop;



      -- Verify that the exception specific message is carried across
      -- various boundaries:

      begin

         begin
            Ada.Exceptions.Raise_Exception(User_Exception_1'Identity,
                                           User_Messages(1).all);
            Report.Failed("User_Exception_1 not raised");
         end;
         Report.Failed("User_Exception_1 not propagated");
      exception
         when Excptn : User_Exception_1 =>

            if User_Messages(1).all /=
               Ada.Exceptions.Exception_Message(Excptn)
            then
               Report.Failed("User_Message_1 not found");
            end if;
            Check_Exception_Information(Excptn);

         when others => Report.Failed("Unexpected exception handled - 1");
      end;



      begin

         begin
            Ada.Exceptions.Raise_Exception(User_Exception_2'Identity,
                                           User_Messages(2).all);
            Report.Failed("User_Exception_2 not raised");
         exception
            when Exc : User_Exception_2 =>

               -- The exception is reraised here; message should propagate
               -- with exception occurrence.

               Ada.Exceptions.Reraise_Occurrence(Exc);
            when others => Report.Failed("User_Exception_2 not handled");
         end;
         Report.Failed("User_Exception_2 not propagated");
      exception
         when Excptn : User_Exception_2 =>

            if User_Messages(2).all /=
               Ada.Exceptions.Exception_Message(Excptn)
            then
               Report.Failed("User_Message_2 not found");
            end if;
            Check_Exception_Information(Excptn);

         when others => Report.Failed("Unexpected exception handled - 2");
      end;


      -- Check exception and message propagation across task boundaries.

      declare

         task Raise_An_Exception is  -- single task
            entry Raise_It;
         end Raise_An_Exception;

         task body Raise_An_Exception is
         begin
            accept Raise_It do
               Ada.Exceptions.Raise_Exception(User_Exception_3'Identity,
                                              User_Messages(3).all);
            end Raise_It;
            Report.Failed("User_Exception_3 not raised");
         exception
            when Excptn : User_Exception_3 =>
               if User_Messages(3).all /=
                  Ada.Exceptions.Exception_Message(Excptn)
               then
                  Report.Failed
                    ("User_Message_3 not returned inside task body");
               end if;
               Check_Exception_Information(Excptn);
            when others =>
               Report.Failed("Incorrect exception raised in task body");
         end Raise_An_Exception;

      begin
         Raise_An_Exception.Raise_It;  -- Exception will be propagated here.
         Report.Failed("User_Exception_3 not propagated to caller");
      exception
         when Excptn : User_Exception_3 =>
            if User_Messages(3).all /=
               Ada.Exceptions.Exception_Message(Excptn)
            then
               Report.Failed("User_Message_3 not returned to caller of task");
            end if;
            Check_Exception_Information(Excptn);
         when others =>
            Report.Failed("Incorrect exception raised by task");
      end;


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

   Report.Result;

end CB41002;