# Copyright 2002-2013 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

# are we on a target board
if { [is_remote target] || ![isnative] } then {
    return
}

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

proc test_initial_complaints { } {

    global gdb_prompt

    # Unsupress complaints
    gdb_test "set stop_whining = 2"

    # Prime the system
    gdb_test "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 "call complaint (&symfile_complaints, symfile_complaints->root->fmt)" \
	    "During symbol reading, Register a complaint."

    # Check that there is only one thing in the list
    gdb_test "print symfile_complaints->root->next == &complaint_sentinel" \
	    ".\[0-9\]+ = 1" "list has one entry"

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

    return 0
}

proc test_serial_complaints { } {

    global gdb_prompt

    gdb_test_exact "call clear_complaints (&symfile_complaints, 1, 0)" "" "serial start"

    # Prime the system
    gdb_test_multiple "call complaint (&symfile_complaints, \"serial line  1\")" "serial line 1" {
	-re "During symbol reading...serial line  1...$gdb_prompt $" {
	    pass "serial line 1"
	}
    }

    # Add a second complaint, expect it
    gdb_test_multiple "call complaint (&symfile_complaints, \"serial line 2\")" "serial line 2" {
	-re "serial line 2...$gdb_prompt " {
	    pass "serial line 2"
	}
    }

    gdb_test_multiple "call clear_complaints (&symfile_complaints, 1, 0)" "serial end" {
	-re "\r\n\r\n$gdb_prompt " {
	    pass "serial end"
	}
    }

    return 0
}

# For short complaints, all are the same

proc test_short_complaints { } {

    global gdb_prompt

    gdb_test_exact "call clear_complaints (&symfile_complaints, 1, 1)" "" "short start"

    # Prime the system
    gdb_test_multiple "call complaint (&symfile_complaints, \"short line 1\")" "short line 1" {
	-re "short line 1...$gdb_prompt " {
	    pass "short line 1"
	}
    }

    # Add a second complaint, expect it
    gdb_test_multiple "call complaint (&symfile_complaints, \"short line 2\")" "short line 2" {
	-re "short line 2...$gdb_prompt " {
	    pass "short line 2"
	}
    }

    gdb_test_multiple "call clear_complaints (&symfile_complaints, 1, 0)" "short end" {
	-re "\r\n\r\n$gdb_prompt " {
	    pass "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
    gdb_test_multiple $cmd $msg {
	-re "\r\n\r\n$gdb_prompt $" {
	    fail $msg
	}
	"\r\n$gdb_prompt $" {
	    pass $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
}
