# Copyright 2012-2013 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
