# Copyright 2007, 2008, 2009, 2010 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/>.

if {[gdb_skip_xml_test]} {
    unsupported "tdesc-errors.exp"
    return -1
}

gdb_start

proc set_bad_arch { srcfile errmsg } {
    global gdb_prompt
    global srcdir
    global subdir

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename $srcdir/$subdir/$srcfile"
    set msg "set tdesc filename $subdir/$srcfile"
    set cmd_regex [string_to_regexp $cmd]
    gdb_test_multiple $cmd $msg {
	-re "^$cmd_regex\r\n$errmsg$gdb_prompt $" {
	    pass $msg
	}
    }
}

set common_warn "\r\nwarning: Could not load XML target description; ignoring\r\n"

# This file contains a syntax error.  We should warn the user about
# it.
set_bad_arch "tdesc-bogus.xml" \
    "warning: while parsing .*: no element found$common_warn"

# This file contains a bunch of unrecognized elements.  They should be
# silently ignored.
set_bad_arch "tdesc-unknown.xml" ""
