# Copyright 2023-2024 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 'sources' and 'loadedSources'.

require allow_dap_tests

load_lib dap-support.exp

standard_testfile

if {[build_executable ${testfile}.exp $testfile] == -1} {
    return
}

if {[dap_initialize] == ""} {
    return
}

if {[dap_launch $testfile stop_at_main 1] == ""} {
    return
}

proc do_tests {} {
    dap_wait_for_event_and_check "stopped at function breakpoint" stopped \
	"body reason" breakpoint

    set obj [dap_check_request_and_response loadedSources loadedSources]
    if { $obj == "" } {
	return
    }

    set path ""
    foreach src [dict get [lindex $obj 0] body sources] {
	if {[file tail [dict get $src name]] == "sources.c"} {
	    set path [dict get $src path]
	}
    }
    gdb_assert {$path != "" } "sources.c in loadedSources"
    if {$path == ""} {
	return
    }

    set obj [dap_check_request_and_response "get source" source \
		 [format {o source [o path [s %s]] \
			      sourceReference [i 0]} $path]]
    if { $obj == "" } {
	return
    }

    set text [dict get [lindex $obj 0] body content]
    gdb_assert {[string first "Distinguishing comment" $text] != -1}
}

do_tests

dap_shutdown
