# Copyright 2016-2020 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/>.

standard_testfile

set compile_options "debug"
if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} {
    untested "failed to compile"
    return -1
}

# Ensure no output has been sent.  Use MESSAGE as test message.

proc ensure_no_output {message} {
    global decimal

    # Run a command and use an anchor to make sure no output appears
    # before the command's expected output.
    gdb_test "print 999" "^print 999\r\n\\\$$decimal = 999" $message
}

# Run a few execution-related commands on CON1, and ensure the proper
# output, or none, if appropriate, is sent to CON2.  CON1_NAME and
# CON2_NAME are the names of the consoles.

proc do_execution_tests {con1 con1_name con2 con2_name} {
    global srcfile
    global decimal

    set bp_lineno [gdb_get_line_number "set break $con1_name here"]

    with_spawn_id $con1 {
	gdb_test "next" "global = 1;"
    }
    with_spawn_id $con2 {
	ensure_no_output "next causes no spurious output on other console"
    }

    with_spawn_id $con1 {
	gdb_test "break $srcfile:$bp_lineno" \
	    "Breakpoint $decimal .*$srcfile, line $bp_lineno\\." \
	    "set breakpoint"
    }
    with_spawn_id $con2 {
	ensure_no_output "break causes no spurious output on other console"
    }

    with_spawn_id $con1 {
	gdb_test "continue" "set break $con1_name here .*" "continue to breakpoint"
    }

    with_spawn_id $con2 {
	set test "breakpoint hit reported on other console"
	gdb_test_multiple "" $test {
	    -re "Breakpoint $decimal, .* set break $con1_name here " {
		pass $test
	    }
	}
    }
}

# The test proper.

proc_with_prefix do_test {} {
    global srcfile testfile
    global gdb_prompt
    global gdb_spawn_id
    global gdb_main_spawn_id extra_spawn_id

    clean_restart $testfile

    if ![runto_main] {
	untested "could not run to main"
	return -1
    }

    gdb_test "new-ui" \
	"Usage: new-ui INTERPRETER TTY" \
	"new-ui without arguments"

    set test "new-ui does not repeat"
    send_gdb "\n"
    gdb_test_multiple "" $test {
	-re "^\r\n$gdb_prompt $" {
	    pass $test
	}
    }

    # Save the main UI's spawn ID.
    set gdb_main_spawn_id $gdb_spawn_id

    # Create the new PTY for the secondary console UI.
    spawn -pty
    set extra_spawn_id $spawn_id
    set extra_tty_name $spawn_out(slave,name)
    gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" {
	-re "New UI allocated\r\n$gdb_prompt $" {
	}
    }

    with_spawn_id $extra_spawn_id {
	set test "initial prompt on extra console"
	gdb_test_multiple "" $test {
	    -re "$gdb_prompt $" {
		pass $test
	    }
	}
    }

    # Ensure non-execution commands in one console don't cause output
    # in the other consoles.
    with_spawn_id $gdb_main_spawn_id {
	gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console"
    }
    with_spawn_id $extra_spawn_id {
	gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console"
    }

    # Verify that we get proper queries on the main UI, but that they are
    # auto-answered on secondary UIs.
    with_spawn_id $gdb_main_spawn_id {
	gdb_test "delete" "" "delete all breakpoint on main console" \
		 "Delete all breakpoints. .y or n. $" "n"
    }
    with_spawn_id $extra_spawn_id {
	# Check output in two stages in order to override
	# gdb_test_multiple's internal "got interactive prompt" fail
	# that would otherwise match if the expect buffer happens to
	# fill with partial output that ends in "(y or n) ".
	set test "delete all breakpoints on extra console"
	gdb_test_multiple "delete" $test {
	    -re "Delete all breakpoints. .y or n. " {
		gdb_test "" \
		    ".answered Y; input not from terminal." \
		    $test
	    }
	}
    }

    # Run a few execution tests with the main console as the driver
    # console.
    with_test_prefix "main console" {
	do_execution_tests \
	    $gdb_main_spawn_id "main console" \
	    $extra_spawn_id "extra console"
    }
    # Same, but with the extra console as driver.
    with_test_prefix "extra console" {
	do_execution_tests \
	    $extra_spawn_id "extra console" \
	    $gdb_main_spawn_id "main console"
    }
}

# Test missing / invalid arguments.

proc_with_prefix do_test_invalid_args {} {
    global testfile

    clean_restart $testfile

    spawn -pty
    set extra_tty_name $spawn_out(slave,name)

    # Test bad terminal path.
    gdb_test "new-ui console /non/existent/path" \
	     "opening terminal failed: No such file or directory\." \
	     "new-ui with bad terminal path"

    # Test bad interpreter name.
    gdb_test "new-ui bloop $extra_tty_name" \
	     "Interpreter `bloop' unrecognized" \
	     "new-ui with bad interpreter name"

    # Test that we can continue working normally.
    if ![runto_main] {
	fail "could not run to main"
    }
}

do_test
do_test_invalid_args
