# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
# 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
}

set testfile "basics"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/mi2-basics
set escapedobjdir [string_to_regexp ${objdir}]
set envirodir [string_to_regexp ${objdir}/${subdir}]

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     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
    send_gdb "-gdb-version\n"
    gdb_expect {
           -re "GNU gdb .*\r\n$mi_gdb_prompt$" \
               { pass "acceptance of MI operations" 
                 return 1}
           -re ".*\r\n$mi_gdb_prompt$" \
               { fail "acceptance of MI operations"
                 note "Skipping all other MI tests." }
           -re "Undefined command.*$gdb_prompt $" \
               { fail "acceptance of MI operations"
                 note "Skipping all other MI tests." }
           -re ".*$gdb_prompt $" \
               { fail "acceptance of MI operations"
                 note "Skipping all other MI tests." }
           timeout { fail "acceptance of MI operations (timeout)"
                     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

    # Can't use mi_gdb_test as if this doesn't work,
    #  we must give up on the whole test file
    send_gdb "-file-exec-and-symbols ${binfile}\n"
    gdb_expect {
           -re "\[\r\n\]*\\\^done\r\n$mi_gdb_prompt$" \
               { pass "file-exec-and-symbols operation" }
           timeout { fail "file-exec-and-symbols operation (timeout)"
                     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"

    # FIXME: if we cannot load we have to skip all other tests.
}

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"

    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

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

    send_gdb "-environment-path\n"
    gdb_expect 20 {
	-re "\\\^done,path=\"\(.*\)\"\r\n$mi_gdb_prompt" { 
	  set orig_path $expect_out(1,string); 
	}
	timeout { 
	  perror "-environment-path (timeout)" ; 
	  return 
	}
    }

    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
