# Copyright 2011-2020 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

load_lib "ada.exp"

standard_ada_testfile foo

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-gnata ]] != "" } {
  return -1
}

# Some global variables used to simplify the maintenance of some of
# the regular expressions below.
set any_nb "\[0-9\]+"
set eol "\[\r\n\]+"

# Before going any further, verify that we can insert exception
# catchpoints...  That way, we won't have to do this while doing
# the actual GDB/MI testing.

clean_restart ${testfile}

if ![runto_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

set msg "insert catchpoint on all Ada exceptions"
gdb_test_multiple "catch exception" $msg {
    -re "Catchpoint $any_nb: all Ada exceptions$eol$gdb_prompt $" {
	pass $msg
    }
    -re "Your Ada runtime appears to be missing some debugging information.*\[\r\n\]+$gdb_prompt $" {
	# If the runtime was not built with enough debug information,
	# or if it was stripped, we can not test exception
	# catchpoints.
	unsupported $msg
	return -1
    }
}

# Now, we can start the GDB/MI testing itself...

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

####################################
# 1. Try catching all exceptions.  #
####################################

if ![mi_run_to_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

mi_gdb_test "-catch-exception" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"all Ada exceptions\",.*}" \
            "catch all exceptions"

# Continue to caught exception.

proc continue_to_exception { exception_name exception_message test } {
    global hex any_nb

    mi_send_resuming_command "exec-continue" "$test"

    # Match console stream output.
    gdb_expect {
	-re " $exception_name\( \\($exception_message\\)\)? at $hex in foo " {
	}
	timeout {
	    fail "$test (timeout)"
	    return -1
	}
    }

    # Now MI stream output.
    mi_expect_stop \
	"breakpoint-hit\",disp=\"keep\",bkptno=\"$any_nb\",exception-name=\"$exception_name\(\",exception-message=\"$exception_message\)?" \
	"foo" "" ".*" ".*" \
	".*" \
	$test
}

continue_to_exception \
    "CONSTRAINT_ERROR" "foo\\.adb:$decimal explicit raise" \
    "continue until CE caught by all-exceptions catchpoint"

continue_to_exception \
    "PROGRAM_ERROR" "foo\\.adb:$decimal explicit raise" \
    "continue until PE caught by all-exceptions catchpoint"

################################################
# 2. Try catching only some of the exceptions. #
################################################

# Here is the scenario:
#  - Restart the debugger from scratch, runto_main
#  - We'll catch only "Program_Error"
#    We'll catch assertions
#    We'll catch unhandled exceptions
#  - continue, we should see the first Program_Error exception
#  - continue, we should see the failed assertion
#  - continue, we should see the unhandled Constrait_Error exception
#  - continue, the program exits.

if ![mi_run_to_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

mi_gdb_test "-catch-exception -e Program_Error" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"`Program_Error' Ada exception\",.*}" \
            "catch Program_Error"

mi_gdb_test "-catch-assert" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"failed Ada assertions\",.*}" \
            "catch assert failures"

mi_gdb_test "-catch-exception -u" \
            "\\^done,bkptno=\"$decimal\",bkpt={.*disp=\"keep\",enabled=\"y\",what=\"unhandled Ada exceptions\",.*}" \
            "catch unhandled exceptions"

mi_execute_to "exec-continue" \
              "breakpoint-hit\",disp=\"keep\",bkptno=\"$any_nb\",exception-name=\"PROGRAM_ERROR(\",exception-message=\"foo\\.adb:$decimal explicit raise)?" \
              "foo" "" ".*" ".*" \
              ".*" \
              "continue to exception catchpoint hit"

mi_execute_to "exec-continue" \
              "breakpoint-hit\",disp=\"keep\",bkptno=\"$any_nb" \
              "foo" "" ".*" ".*" \
              ".*" \
              "continue to assert failure catchpoint hit"

mi_execute_to "exec-continue" \
              "breakpoint-hit\",disp=\"keep\",bkptno=\"$any_nb\",exception-name=\"CONSTRAINT_ERROR" \
              "foo" "" ".*" ".*" \
              ".*" \
              "continue to unhandled exception catchpoint hit"

