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

# This file was written by Andrew Cagney (cagney at redhat dot com),
# derived from xfullpath.exp (written by Joel Brobecker), derived from
# selftest.exp (written by Rob Savoye).

load_lib selftest-support.exp

if [target_info exists gdb,noinferiorio] {
    verbose "Skipping because of no inferiorio capabilities."
    return
}

# Similar to gdb_test_stdio, except no \r\n is expected before
# $gdb_prompt in the $gdb_spawn_id.

proc test_complaint {test inferior_io_re msg} {
    global inferior_spawn_id gdb_spawn_id
    global gdb_prompt

    set inferior_matched 0
    set gdb_matched 0

    gdb_test_multiple $test $msg {
	-i $inferior_spawn_id -re "$inferior_io_re" {
	    set inferior_matched 1
	    if {!$gdb_matched} {
		exp_continue
	    }
	}
	-i $gdb_spawn_id -re "$gdb_prompt $" {
	    set gdb_matched 1
	    if {!$inferior_matched} {
		exp_continue
	    }
	}
    }

    verbose -log "inferior_matched=$inferior_matched, gdb_matched=$gdb_matched"
    gdb_assert {$inferior_matched && $gdb_matched} $msg
}

proc test_initial_complaints { } {
    # Unsupress complaints
    gdb_test "set stop_whining = 2"

    # Prime the system
    gdb_test_stdio "call complaint (&symfile_complaints, \"Register a complaint\")" \
	    "During symbol reading, Register a complaint."

    # Check that the complaint was inserted and where
    gdb_test "print symfile_complaints->root->fmt" \
	    ".\[0-9\]+ =.*\"Register a complaint\""

    # Re-issue the first message #1
    gdb_test_stdio "call complaint (&symfile_complaints, symfile_complaints->root->fmt)" \
	    "During symbol reading, Register a complaint."

    # Check that there is only one thing in the list.  How the boolean
    # result is output depends on whether GDB is built as a C or C++
    # program.
    gdb_test "print symfile_complaints->root->next == &complaint_sentinel" \
	    ".\[0-9\]+ = \(1|true\)" "list has one entry"

    # Add a second complaint, expect it
    gdb_test_stdio "call complaint (&symfile_complaints, \"Testing! Testing! Testing!\")" \
	    "During symbol reading, Testing. Testing. Testing.."

    return 0
}

proc test_serial_complaints { } {
    gdb_test_exact "call clear_complaints (&symfile_complaints, 1, 0)" "" "serial start"

    # Prime the system
    test_complaint "call complaint (&symfile_complaints, \"serial line 1\")" \
	"During symbol reading...serial line 1..." \
	"serial line 1"

    # Add a second complaint, expect it
    test_complaint "call complaint (&symfile_complaints, \"serial line 2\")" \
	"serial line 2..." \
	"serial line 2"

    gdb_test_stdio "call clear_complaints (&symfile_complaints, 1, 0)" \
	"\r\n" \
	"" \
	"serial end"

    return 0
}

# For short complaints, all are the same

proc test_short_complaints { } {
    gdb_test_exact "call clear_complaints (&symfile_complaints, 1, 1)" "" "short start"

    # Prime the system
    test_complaint "call complaint (&symfile_complaints, \"short line 1\")" \
	"short line 1..." \
	"short line 1"

    # Add a second complaint, expect it
    test_complaint "call complaint (&symfile_complaints, \"short line 2\")" \
	"short line 2..." \
	"short line 2"

    gdb_test_stdio "call clear_complaints (&symfile_complaints, 1, 0)" \
	"\r\n" \
	"" \
	"short end"

    return 0
}

# Check that nothing comes out when there haven't been any real
# complaints.  Note that each test is really checking the previous
# command.

proc test_empty_complaint { cmd msg } {
    global gdb_prompt
    global inferior_spawn_id gdb_spawn_id

    if {$gdb_spawn_id == $inferior_spawn_id} {
	gdb_test_no_output $cmd $msg
    } else {
	set seen_output 0
	gdb_test_multiple $cmd $msg {
	    -i $inferior_spawn_id -re "." {
		set seen_output 1
		exp_continue
	    }
	    -i $gdb_spawn_id "$gdb_prompt $" {
		gdb_assert !$seen_output $msg
	    }
	}
    }
}

proc test_empty_complaints { } {

    test_empty_complaint "call clear_complaints(&symfile_complaints,0,0)" \
	    "empty non-verbose non-noisy clear"
    test_empty_complaint "call clear_complaints(&symfile_complaints,1,0)" \
	    "empty verbose non-noisy clear"
    test_empty_complaint "call clear_complaints(&symfile_complaints,1,1)" \
	    "empty verbose noisy clear"
    test_empty_complaint "call clear_complaints(&symfile_complaints,0,1)" \
	    "empty non-verbose noisy clear"

    return 0
}

do_self_tests captured_command_loop {
    test_initial_complaints
    test_serial_complaints
    test_short_complaints
    test_empty_complaints
}
