# Copyright 2023-2026 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/>.

# Check that "set tui compact-source on" has the intended effect.

require allow_tui_tests

tuiterm_env

standard_testfile

# Let's generate the source file.  We want a short file, with less than 10
# lines, and the copyright notice by itself is already more that that.
set src_list \
    [list \
	 "int" \
	 "main (void)" \
	 "{" \
	 "  return 0;" \
	 "}"]
set re_line_four [string_to_regexp [lindex $src_list 3]]
set src_txt [join $src_list "\n"]
set srcfile [standard_output_file $srcfile]
set fd [open $srcfile w]
puts $fd $src_txt
close $fd

if {[build_executable "failed to prepare" ${testfile} ${srcfile}] == -1} {
    return
}

Term::clean_restart 24 80 $testfile

gdb_test_no_output "maint set tui-left-margin-verbose on"
gdb_test_no_output "set tui compact-source on"

if {![Term::enter_tui]} {
    unsupported "TUI not supported"
    return
}

set re_border "\\|"

set max_line_nr_in_source_file [llength $src_list]
# Ensure there are more lines in the window than in the source file.
set src_window_lines [expr {$max_line_nr_in_source_file + 2}]
# Account for border size.
set src_window_size [expr {$src_window_lines + 2}]
Term::command "wh src $src_window_size"

set re_left_margin "___4_"

Term::check_contents "compact source format" \
    "$re_border$re_left_margin$re_line_four *$re_border"

set re_left_margin "___0*[expr {$max_line_nr_in_source_file + 1}]_"
Term::check_contents_not "no surplus line number" \
    "$re_border$re_left_margin *$re_border"
