# Copyright 2019-2025 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 'info sources [-d | -b] [--] [REGEX]'

standard_testfile .c info_sources_base.c

if {[prepare_for_testing $testfile.exp $testfile \
	 [list $srcfile $srcfile2] debug]} {
    untested $testfile.exp
    return -1
}

# Executes "info sources ARGS".
#
# EXPECT_SEEN_INFO_SOURCES 1 indicates that the source file info_sources.c
# must be seen in the output.  Similarly, EXPECT_SEEN_INFO_SOURCES_BASE
# indicates that the source file info_sources_base.c must be seen in the
# output.
#
# If TESTNAME is not the empty string then this is the test name, otherwise
# uses "info sources ARGS" as the test name.
proc test_info_sources {args expect_seen_info_sources \
			    expect_seen_info_sources_base \
			    {testname ""}} {
    global gdb_prompt srcfile srcfile2

    set seen_info_sources 0
    set seen_info_sources_base 0
    set cmd [concat "info sources " $args]

    if { $testname eq "" } {
	set $testname $cmd
    }

    gdb_test_multiple $cmd $testname {
	-re "^\[^,\]*${srcfile}(, |\[\r\n\]+)" {
	    incr seen_info_sources
	    exp_continue
	}
	-re "^\[^,\]*${srcfile2}(, |\[\r\n\]+)" {
	    incr seen_info_sources_base 1
	    exp_continue
	}
	-re ", " {
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    if {$seen_info_sources == $expect_seen_info_sources \
		    && $seen_info_sources_base == $expect_seen_info_sources_base} {
		pass $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }
}

if ![runto_main] {
    return -1
}

# List both files with no regexp:
with_test_prefix "in main" {
    test_info_sources "" 1 1
}

gdb_test "break some_other_func" ""
gdb_test "continue"

# List both files with no regexp:
test_info_sources "" 1 1
# Same but with option terminator:
test_info_sources "--" 1 1

# List both files with regexp matching anywhere in the filenames:
test_info_sources "info_sources" 1 1
if { ! [is_remote host] } {
    test_info_sources "gdb.base" 1 1
}

# List both files with regexp matching the filename basenames,
# using various parts of the -basename option:
test_info_sources "-b info_sources" 1 1
test_info_sources "-basename info_sources" 1 1
test_info_sources "-b -- info_sources" 1 1
test_info_sources "-ba info_sources" 1 1
test_info_sources "-base -- info_sources" 1 1
test_info_sources "-basena info_sources" 1 1
test_info_sources "-basename -- info_sources" 1 1

# List only the file with basename matching regexp:
test_info_sources "-b base" 0 1

# List the files with dirname matching regexp,
# using various part of the -dirname option:
if { ! [is_remote host] } {
    test_info_sources "-d base" 1 1
    test_info_sources "-dirname base" 1 1
}

# Test non matching regexp against the basename, with option
# terminator:
test_info_sources "-b -- -d" 0 0

# The following tests relies on using a regexp which will not match
# either the directory name of the source files.  Unlike the basename
# test above we need to be more careful picking the regexp as the
# source filename might contain any simple character patterns, and so
# could unexpectedly match the regexp.
#
# Loop through all the characters a-z trying regexp '-C' (where 'C' is
# each character), looking for a regexp which doesn't match the
# directory name.
set re ""
for {set i [scan a %c]} {$i <= [scan z %c]} {incr i} {
    set tmp_re -[format %c $i]

    if {$re eq "" && ![regexp $tmp_re $srcdir/$subdir/]} {
	set re $tmp_re
    }
}

# If we found a suitable regexp then test non matching regexp against
# the directory name, with option terminator:
if { $re ne "" } {
    test_info_sources "-d -- $re" 0 0 \
	"info sources -d -- <non matching regexp>"
} else {
    unresolved \
	"info sources -d -- <non matching regexp> (failed to find regexp)"
}
