# Copyright 2016-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/>.

# Test that after:
#
# - a failing synchronous execution command, or,
# - a failing non-execution command, or,
# - a non-failing command,
#
# ... MI continues processing input.  We actually test all
# combinations of pairs of the above.  See PR mi/20431.

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

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile

# A synchronous execution execution command that errors out.

proc failing_sync_execution_command {} {
    mi_gdb_test "-exec-continue" \
	{\^error,msg=\"The program is not being run.\"} \
	"failing sync execution command"
}

# A non-execution command that errors out.

proc failing_non_execution_command {} {
    mi_gdb_test "-invalid-command" \
	{\^error,msg=\"Undefined MI command: invalid-command\",code=\"undefined-command\"} \
	"failing non-execution command"
}

# A command that doesn't error out.

proc non_failing_command {} {
    mi_gdb_test "-gdb-show version" \
	".*Free Software Foundation.*\\^done" \
	"non-failing command"
}

# A list of procedures to try.
set procs {
    failing_sync_execution_command
    failing_non_execution_command
    non_failing_command
}

# User-friendly names for procedures above, in the same order.
set cmdnames {
    "failing sync execution command"
    "failing non-execution command"
    "non-failing command"
}

for {set i 0} {$i < [llength $procs]} {incr i} {
    for {set j 0} {$j < [llength $procs]} {incr j} {
	with_test_prefix "[lindex $cmdnames $i] first ($i x $j)" {
	    with_test_prefix "1st" [lindex $procs $i]
	    with_test_prefix "2nd" [lindex $procs $j]
	}
    }
}
