# Copyright 1999-2021 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 -file-list-exec-source-files.

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

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile basics.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     return -1
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_file_cmd ${binfile}

proc test_file_list_exec_source_file {} {
    global srcfile
    global srcdir
    global subdir
    global fullname_syntax
    if { [is_remote host] } {
	set srcfilepath ".*${srcfile}"
    } else {
	set srcfilepath [string_to_regexp ${srcdir}/${subdir}/${srcfile}]
    }

    # get the path and absolute path to the current executable
    #
    # In gdb 6.2 (at least), the default line number is set by
    # select_source_symtab to the first line of "main" minus
    # the value of "lines_to_list" (which defaults to 10) plus one.
    # --chastain 2004-08-13

    set line_main_head [gdb_get_line_number "main ("]
    set line_main_body [expr $line_main_head + 2]
    set gdb_lines_to_list 10
    set line_default [expr $line_main_body - $gdb_lines_to_list + 1]

    mi_gdb_test "111-file-list-exec-source-file" \
	    "111\\\^done,line=\"$line_default\",file=\"${srcfilepath}\",fullname=\"$fullname_syntax${srcfile}\",macro-info=\"0\"" \
               "request path info of current source file (${srcfile})"
}

proc test_file_list_exec_source_files {} {
    global srcfile
    global fullname_syntax

    # get the path and absolute path to the current executable
    mi_gdb_test "222-file-list-exec-source-files" \
	    "222\\\^done,files=\\\[\{file=\".*${srcfile}\",fullname=\"$fullname_syntax${srcfile}\",debug-fully-read=\"\[^\"\]+\"\}.*]" \
              "Getting a list of source files."
}

test_file_list_exec_source_file
test_file_list_exec_source_files

mi_gdb_exit
return 0
