# Copyright 2004-2005, 2007-2012 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/>.

# interp.exp   Test interpreter-exec command

if $tracelevel then {
    strace $tracelevel
}

set testfile "interp"

if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] } {
    return -1
}

# Do not use gdb_test for this test, since it has two prompts.
set cmd "interpreter-exec mi \"-var-update *\""
gdb_test_multiple $cmd $cmd {
    -re "\\^done,changelist=\\\[\\\]\r\n$gdb_prompt " {
	pass "$cmd"
	gdb_expect 1 {
	    -re "\r\n$gdb_prompt $" { }
	}
    }
}
gdb_test "interpreter-exec console \"show version\"" "GNU gdb .*"

# Regression test for crash when an exception occurs in mi_parse.
gdb_test_multiple "interpreter-exec mi \"-break-insert --thread a\"" \
    "regression test for mi_parse crash" {
	-re ".error,msg=.Invalid value for the '--thread' option.\r\n$gdb_prompt " {
	    pass "$cmd"
	    gdb_expect 1 {
		-re "\r\n$gdb_prompt $" { }
	    }
	}
    }

set cmd "interpreter-exec mi \"-stack-info-frame\""
gdb_test_multiple $cmd $cmd {
    -re ".error,msg=.No registers\..\r\n$gdb_prompt " {
	pass "$cmd"
	gdb_expect 1 {
	    -re "\r\n$gdb_prompt $" { }
	}
    }
}

set cmd "interpreter-exec mi1 \"-break-insert main\""
gdb_test_multiple $cmd $cmd {
    -re ".done.bkpt=.number=.\[0-9\]\[^\n\]+\r\n$gdb_prompt " {
	pass "$cmd"
	gdb_expect 1 {
	    -re "\r\n$gdb_prompt $" { }
	}
    }
}

set cmd "interpreter-exec mi2 \"-break-insert main\""
gdb_test_multiple $cmd $cmd {
    -re ".done.bkpt=.number=.\[0-9\]\[^\n\]+\r\n$gdb_prompt " {
	pass "$cmd"
	gdb_expect 1 {
	    -re "\r\n$gdb_prompt $" { }
	}
    }
}

set cmd "interpreter-exec mi3 \"-break-insert main\""
gdb_test_multiple $cmd $cmd {
    -re ".done.bkpt=.number=.\[0-9\]\[^\n\]+\r\n$gdb_prompt " {
	pass "$cmd"
	gdb_expect 1 {
	    -re "\r\n$gdb_prompt $" { }
	}
    }
}

if ![runto_main] then {
  fail "run to main"
  return -1;
}

gdb_test "list" ".*\[0-9\].*main \\(int argc.*" "can list sources"
gdb_exit
