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

#
# test basic Machine interface (MI) operations
#
# Verify that, using the MI, we can load a program and do
# other basic things that are used by all test files through  mi_gdb_exit,
# mi_gdb_start, mi_delete_breakpoints, mi_gdb_reinitialize_dir and
# mi_gdb_load, so we can safely use those.
#
# The goal is not to test gdb functionality, which is done by other tests,
# but the command syntax and correct output response to MI operations.
#

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

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile basics.c

set escapedobjdir [string_to_regexp ${objdir}]
set envirodir [string_to_regexp ${objdir}/${subdir}]

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested mi2-basics.exp
     return -1
}

# In this file we want to test if the operations needed by the following
# procedures work, so it makes no sense using them here.

# mi_delete_breakpoints
# mi_gdb_reinitialize_dir $srcdir/$subdir
# mi_gdb_load ${binfile}

# Test if the MI interpreter has been configured

proc test_mi_interpreter_selection {} {
    global mi_gdb_prompt
    global gdb_prompt

    # All this test expects is to get the prompt back
    # with no syntax error message
    if ![mi_gdb_test "-gdb-version" "~\"GNU gdb.*" "acceptance of MI operations"] {
	return 1
    } 
    
    note "Skipping all other MI tests."
    return 0
}

proc test_exec_and_symbol_mi_operatons {} {
    global mi_gdb_prompt
    global binfile

    # Load symbols and specify executable on a single operation
    # Tests:
    # -file-exec-and-symbols

    if [mi_gdb_test "-file-exec-and-symbols ${binfile}" "\\\^done" \
       "file-exec-and-symbols operation"] {
	note "Skipping all other MI tests."
	return 0
    }

    # The following is not used by mi-support.exp, but we test here so
    # we get done with loading a program basics.

    # Do it again, but now load symbols and specify executable with
    # two separate operations
    # Tests:
    # -file-clear
    # -file-exec-file
    # -file-symbol-file

    # FIXME: file-clear is not implemented yet.
#   mi_gdb_test "-file-clear" \
#            "\\\^done" \
#            "file-clear operation"

    mi_gdb_test "-file-exec-file ${binfile}" \
             "\\\^done" \
             "file-exec-file operation"

    mi_gdb_test "-file-symbol-file ${binfile}" \
             "\\\^done" \
             "file-symbol-file operation"

    # We need to return != 0.
    return 1
}

proc test_breakpoints_deletion {} {
    global mi_gdb_prompt
    global srcfile

    # Clear all breakpoints and list to confirm
    # Tests:
    # -break-delete (all)
    # -break-list

    # The all parameter is actually no parameter.
    mi_gdb_test "200-break-delete" \
             "200\\\^done" \
             "break-delete (all) operation"

    mi_gdb_test "201-break-list" \
             ".*\\\^done,BreakpointTable=\\\{.*,body=\\\[\\\]\\\}" \
             "all breakpoints removed"
}

proc test_dir_specification {} {
    global mi_gdb_prompt
    global objdir
    global subdir
    global envirodir

    # Add to the search directories, display, then reset back to default
    # Tests:
    # -environment-directory arg
    # -environment-directory 
    # -environment-directory -r

    mi_gdb_test "202-environment-directory ${objdir}/${subdir}" \
             "202\\\^done,source-path=\"${envirodir}.\\\$cdir.\\\$cwd\"" \
             "environment-directory arg operation"

    mi_gdb_test "203-environment-directory" \
             "203\\\^done,source-path=\"${envirodir}.\\\$cdir.\\\$cwd\"" \
             "environment-directory empty-string operation"

    mi_gdb_test "204-environment-directory -r" \
             "204\\\^done,source-path=\"\\\$cdir.\\\$cwd\"" \
             "environment-directory operation"

#exp_internal 0
}

proc test_cwd_specification {} {
    global mi_gdb_prompt
    global objdir
    global subdir
    global escapedobjdir

    # Change the working directory, then print the current working directory
    # Tests:
    # -environment-cd ${objdir}
    # -environment-pwd

    mi_gdb_test "205-environment-cd ${objdir}" \
             "205\\\^done" \
             "environment-cd arg operation"

    # The canonical name of the working directory may differ on a
    # remote host from that on the build system.
    if ![is_remote host] {
	mi_gdb_test "206-environment-pwd" \
             "206\\\^done,cwd=\"${escapedobjdir}\"" \
             "environment-pwd operation"
    }
}

proc test_path_specification {} {
    global mi_gdb_prompt
    global orig_path
    global objdir
    global subdir
    global escapedobjdir
    global envirodir
    global expect_out

    # Add to the path, display, then reset 
    # Tests:
    # -environment-path 
    # -environment-path dir1 dir2
    # -environment-path -r dir
    # -environment-path -r

    mi_gdb_test "-environment-path" "\\\^done,path=\"(.*)\"" "-environment-path"
    set orig_path $expect_out(3,string)

    set orig_path [string_to_regexp ${orig_path}]
    set pathdir [string_to_regexp ${objdir}/${subdir}]

    mi_gdb_test "207-environment-path" \
             "207\\\^done,path=\"$orig_path\"" \
             "environment-path no-args operation"

    mi_gdb_test "208-environment-path $objdir ${objdir}/${subdir}" \
             "208\\\^done,path=\"$escapedobjdir.${envirodir}.$orig_path\"" \
             "environment-path dir1 dir2 operation"

    mi_gdb_test "209-environment-path -r $objdir" \
             "209\\\^done,path=\"$escapedobjdir.$orig_path\"" \
             "environment-path -r dir operation"

    mi_gdb_test "210-environment-path -r" \
             "210\\\^done,path=\"$orig_path\"" \
             "environment-path -r operation"

} 

if { [test_mi_interpreter_selection]
      && [test_exec_and_symbol_mi_operatons] } {
  test_breakpoints_deletion
  test_dir_specification
  test_cwd_specification
  test_path_specification
}

mi_gdb_exit
return 0
