# 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 bla

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 eol "\[\r\n\]+"
set sp "\[ \t\]*"

# 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 $decimal: 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}

###################################################
# 2. Try catching conditionnal failed assertion.  #
###################################################

# Here is the scenario:
#  - Restart the debugger from scratch, runto_main
#    We'll catch assertions if Global_Var = 2
#  - continue, we should see the second failed assertion
#  - continue, the program exits.

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

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

set bp_location [gdb_get_line_number "STOP" ${testdir}/bla.adb]
mi_execute_to "exec-continue" \
              "breakpoint-hit\",disp=\"keep\",bkptno=\"$decimal" \
              "bla" "" ".*" "$bp_location" \
              ".*" \
              "continue to assert failure catchpoint hit"

# Exit the inferior.
mi_send_resuming_command "exec-continue" "continuing to inferior exit"
mi_expect_stop "exited-normally" "" "" "" "" "" "exit normally"
