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

# Test the 'maint print xml-tdesc' command.  This file picks up every
# XML file matching the pattern maint-xml-dump-*.xml (in the same
# directory as this script) and passes each in turn to the command
# 'maint print xml-tdesc'.
#
# The expected output is generated by parsing the input XML file.  The
# rules for changing an XML file into the expected output are:
#
# 1. Blank lines, and lines starting with a comment are stripped from
#    the expected output.
#
# 2. The <?xml ... ?> and <!DOCTYPE ...> entities are optional,
#    suitable defaults will be added if these lines are missing from
#    the input file.
#
# 3. A trailing comment on a line will replace the expected output for
#    that line but with the indentation of the line preserved.  So
#    this (The '|' marks the start of the line):
#    |    <reg name="r1" bitsize="32"/>  <!-- <reg name="r1" bitsize="32" type="int" regnum="0"/> -->
#    Will actually look for the following output:
#    |    <reg name="r1" bitsize="32" type="int" regnum="0"/>
#
# 4. Indentation of lines will be preserved so your input file needs
#    to follow the expected indentation.
if {[gdb_skip_xml_test]} {
    unsupported "xml tests not being run"
    return -1
}

gdb_start

# Read the XML file FILENAME and produce an output pattern that should
# match what GDB produces with the 'maint print xml-desc' command.
proc build_pattern { filename } {
    set pattern {}

    set xml_version_line {<?xml version="1.0"?>}
    set doc_type_line {<!DOCTYPE target SYSTEM "gdb-target.dtd">}

    set linenum 0
    set ifd [open "$filename" r]
    while {[gets $ifd line] >= 0} {
	incr linenum

	# The <?xml .... ?> tag can only appear as the first line in
	# the file.  If it is not present then add one to the expected
	# output now.
	if {$linenum == 1} {
	    if {![regexp {^<\?xml} $line]} {
		set pattern [string_to_regexp $xml_version_line]
		set xml_version_line ""
	    }
	}

	# If we have not yet seen a DOCTYPE line, then maybe we should
	# be adding one?  If we find <target> then add a default
	# DOCTYPE line, otherwise, if the XML file includes a DOCTYPE
	# line, use that.
	if {$doc_type_line != "" } {
	    if {[regexp {^[ \t]*<target>} $line]} {
		set pattern [multi_line $pattern \
				 [string_to_regexp $doc_type_line]]
		set doc_type_line ""
	    } elseif {[regexp {^[ \t]*<!DOCTYPE } $line]} {
		set doc_type_line ""
	    }
	}

	if {[regexp {^[ \t]*<!--} $line]} {
	    # Comment line, ignore it.
	} elseif {[regexp {^[ \t]+$} $line]} {
	    # Blank line, ignore it.
	} elseif {[regexp {^([ \t]*).*<!-- (.*) -->$} $line \
		       matches grp1 grp2]} {
	    set pattern [multi_line \
			     $pattern \
			     [string_to_regexp "$grp1$grp2"]]
	} else {
	    set pattern [multi_line \
			     $pattern \
			     [string_to_regexp $line]]
	}
    }
    close $ifd

    # Due to handling the <?xml ...?> tags we can end up with a stray
    # '\r\n' at the start of the output pattern.  Remove it here.
    if {[string range $pattern 0 1] == "\r\n"} {
	set pattern [string range $pattern 2 end]
    }

    return $pattern
}

# Run over every test XML file and check the output.
foreach filename [lsort [glob $srcdir/$subdir/maint-xml-dump-*.xml]] {
    set pattern [build_pattern $filename]

    if {[is_remote host]} {
	set test_path [remote_download host $filename]
    } else {
	set test_path $filename
    }

    verbose -log "Looking for:\n$pattern"

    gdb_test "maint print xml-tdesc $test_path" \
	"$pattern" "check [file tail $filename]"
}
