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

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

standard_testfile basics.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested mi-cmd-param-changed.exp
     return -1
}

proc test_command_param_changed { } { with_test_prefix "cmd param" {
    if [mi_gdb_start] {
	return
    }
    mi_run_to_main

    foreach opt { "on" "off" "step" } {
	mi_gdb_test "set scheduler-locking ${opt}" \
	    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
	    "\"set scheduler-locking ${opt}\""
    }
    foreach opt { "on" "off" "step" } {
	mi_gdb_test "interpreter-exec console \"set scheduler-locking ${opt}\"" \
	    ".*=cmd-param-changed,param=\"scheduler-locking\",value=\"${opt}\".*\\^done" \
	    "interpreter-exec \"set scheduler-locking ${opt}\""
    }
    # Don't emit MI notification for request from MI.
    mi_gdb_test "-gdb-set scheduler-locking on" \
	{\^done} \
	"\"set scheduler-locking on\" no event (requested by MI)"

    mi_gdb_test "interpreter-exec mi \"-gdb-set scheduler-locking step\"" \
	"\\&\"interpreter-exec mi .*\"-gdb-set scheduler-locking step.*\"\\\\n\"\r\n\\^done\r\n\\^done" \
	"\"set scheduler-locking step\" no event (requested by MI interp)"
    mi_gdb_test "set scheduler-locking step" \
	"\\&\"set scheduler-locking step\\\\n\"\r\n\\^done" \
	"\"set scheduler-locking stepr\" no event"


    foreach command { "circular-trace-buffer" "check type" } {

	# The default value of each command option may be different, so we first
	# set it to 'off', and this may or may not trigger MI notification.
	mi_gdb_test "set ${command} off" ".*\\^done" "\"set ${command}\" warmup"

	foreach boolean_opt { "on" "off" } {
	    mi_gdb_test "set ${command} ${boolean_opt}" \
		".*=cmd-param-changed,param=\"${command}\",value=\"${boolean_opt}\".*\\^done" \
		"\"set ${command} ${boolean_opt}\""
	}
	mi_gdb_test "set ${command} off" \
	    "\\&\"set ${command} off\\\\n\"\r\n\\^done" \
	    "\"set ${command}\" no event"
    }


    foreach command { "trace-notes" "remote exec-file" } {
	foreach str_opt { "foo" "bar" } {
	    mi_gdb_test "set ${command} ${str_opt}" \
		".*=cmd-param-changed,param=\"${command}\",value=\"${str_opt}\".*\\^done" \
		"\"set ${command} ${str_opt}\""
	}
	mi_gdb_test "set ${command} bar" \
	    "\\&\"set ${command} bar\\\\n\"\r\n(\\&\"warning.*|)\\^done" \
	    "\"set ${command} bar\" no event"
    }

    # No notification is emitted for 'maint set' commands.
    foreach command { "profile" "show-debug-regs" } {
	foreach boolean_opt { "on" "off" } {
	    mi_gdb_test "maint set ${command} ${boolean_opt}" \
		"\\&\"maint set ${command} ${boolean_opt}\\\\n\"\r\n\\^done" \
		"\"maint set ${command} ${boolean_opt}\""
	}
    }

    # Full command parameters are included in the notification when a
    # abbreviated one is typed.
    mi_gdb_test "set ch type on" \
	".*=cmd-param-changed,param=\"check type\",value=\"on\".*\\^done" \
	"\"set ch type on\""

    mi_gdb_exit
}}

test_command_param_changed

return 0
