# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

#
# 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}/${testfile}
set escapedobjdir [string_to_regexp ${objdir}]
set escapedsrcdir [string_to_regexp ${srcdir}]

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 srcdir
    global subdir

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

    set envirodir [string_to_regexp ${srcdir}/${subdir}]

    mi_gdb_test "202-environment-directory ${srcdir}/${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 srcdir
    global escapedobjdir
    global escapedsrcdir

    # 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}]

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

    mi_gdb_test "208-environment-path $srcdir $objdir" \
             "208\\\^done,path=\"$escapedsrcdir.$escapedobjdir.$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
