# Copyright 1999, 2000, 2001, 2002, 2003, 2004
# 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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# 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" \
             "\\\^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}" \
             "\\\^done,source-path=\"${envirodir}.\\\$cdir.\\\$cwd\"" \
             "environment-directory arg operation"

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

    mi_gdb_test "204-environment-directory -r" \
             "\\\^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}" \
             "\\\^done" \
             "environment-cd arg operation"

    mi_gdb_test "206-environment-pwd" \
             "\\\^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 
	}
    }

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

    mi_gdb_test "208-environment-path $srcdir $objdir" \
             "\\\^done,path=\"$escapedsrcdir.$escapedobjdir.$orig_path\"" \
             "environment-path dir1 dir2 operation"

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

    mi_gdb_test "210-environment-path -r" \
             "\\\^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
