# Copyright 2011-2021 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"

if { [skip_ada_tests] } { return -1 }

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 {
   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"

mi_clean_restart $binfile

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

with_test_prefix "scenario 1" {
    if {[mi_runto_main] < 0} {
	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.

with_test_prefix "scenario 2" {
    mi_delete_breakpoints
    if {[mi_runto_main] < 0} {
	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"

