# 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 tuiterm procs that interact with gdb as well as tuiterm.

tuiterm_env

proc test_accept_gdb_output { } {
    if { $::action_cnt == [llength $::actions] } {
	return 0
    }
    set action [lindex $::actions $::action_cnt]
    incr ::action_cnt

    uplevel $action

    return 1
}

proc test_send_gdb { string } {
    set expected [lindex $::expect_send $::send_cnt]
    gdb_assert { [string equal $string $expected] }

    incr ::send_cnt
}

with_override Term::accept_gdb_output test_accept_gdb_output {
    with_override send_gdb test_send_gdb {

	foreach_with_prefix border { "" "|" } {
	    with_test_prefix "Term::command match" {
		Term::_setup 4 20
		set send_cnt 0
		set expect_send { foo\n }
		set action_cnt 0
		set actions {
		    {
			Term::_insert "${::border}(gdb) foo"
		    }
		    {
			Term::_ctl_0x0d
			Term::_ctl_0x0a
			Term::_insert "${::border}(gdb) "
		    }
		}
		gdb_assert { [Term::command "foo"] }
	    }

	    with_test_prefix "Term::command mismatch" {
		Term::_setup 4 20
		set send_cnt 0
		set expect_send { foo\n }
		set action_cnt 0
		set actions {
		    {
			Term::_insert "$::border (gdb) foo"
		    }
		    {
			Term::_ctl_0x0d
			Term::_ctl_0x0a
			Term::_insert "${::border}(gdb) "
		    }
		}
		gdb_assert { ![Term::command "foo"] }
	    }

	    with_test_prefix "Term::command mismatch 2" {
		Term::_setup 4 20
		set send_cnt 0
		set expect_send { foo\n }
		set action_cnt 0
		set actions {
		    {
			Term::_insert "${::border}(gdb) foo"
		    }
		    {
			Term::_ctl_0x0d
			Term::_ctl_0x0a
			Term::_insert "${::border} (gdb) "
		    }
		}
		gdb_assert { ![Term::command "foo"] }
	    }

	    with_test_prefix Term::wait_for {
		Term::_setup 4 20
		set send_cnt 0
		set expect_send {}
		set action_cnt 0
		set actions {
		    {
			Term::_insert "(gdb) "
		    }
		}
		gdb_assert { [Term::wait_for ""] }
	    }

	    with_test_prefix "Term::wait_for 2" {
		Term::_setup 4 20
		set send_cnt 0
		set expect_send {}
		set action_cnt 0
		set actions {
		    {
			Term::_move_cursor 0 0

			Term::_insert "${::border}(gdb) "
			set pos $::Term::_cur_col

			Term::_insert "foo"

			Term::_move_cursor 19 0
			Term::_insert "$::border"

			Term::_move_cursor $pos 0
		    }
		    {
			Term::_move_cursor 0 1

			Term::_insert "${::border}(gdb) "
			set pos $::Term::_cur_col

			Term::_move_cursor 19 1
			Term::_insert "$::border"

			Term::_move_cursor $pos 1
		    }
		}

		# Wait for a prompt.
		gdb_assert { [Term::wait_for ""] }

		# The first action sets the cursor after the prompt on the
		# first line.  The second action sets the cursor after the
		# prompt on the second line.   Check that wait_for returns
		# after the second action, not the first.
		gdb_assert { $Term::_cur_row == 1 }
	    }
	}
    }
}

proc_with_prefix unrecognized_escape_sequence {} {
    if { [spawn $::srcdir/$::subdir/gdb.sh] == 0 } {
	unsupported "cannot spawn gdb.sh"
	return
    }
    switch_gdb_spawn_id $spawn_id

    Term::_setup 4 20

    save_vars ::timeout {
	set ::timeout 1

	set line { 0 0 20 1 }

	# Parse "foo".
	gdb_assert { [Term::wait_for_region_contents \
			  {*}$line \
			  [string_to_regexp "foo"]] } \
	    "foo"

	# Parse "\033(%5".
	gdb_assert { ![Term::accept_gdb_output 0] } \
	    "fail to parse escape sequence"
	gdb_assert { [Term::wait_for_region_contents \
			  {*}$line \
			  [string_to_regexp "^\[(%5"]] } \
	    "echoed escape sequence"
    }
    Term::dump_screen

    close $spawn_id
    clear_gdb_spawn_id
}

unrecognized_escape_sequence
