# 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 { "remotecache" "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 boolean_opt { "on" "off" } {
	mi_gdb_test "maint set profile ${boolean_opt}" \
	    "\\&\"maint set profile ${boolean_opt}\\\\n\"\r\n\\^done" \
	    "\"maint set profile ${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
