# Copyright 2008-2012 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/>.


set testfile info-target
if { [prepare_for_testing ${testfile}.exp $testfile start.c] } {
    return -1
}

set eol "\[\r\n\]+"

# Check the output of "info target".  Note that we are not interested
# in this case in checking the actual info, but rather to make sure that
# it is formatted properly.  For instance, make sure that no '\n' is
# missing at the end some lines.
gdb_test "info target" \
         "Symbols from \".*${testfile}.*\"\\..*${eol}Local exec file:${eol}.*Entry point: 0x\[0-9a-zA-Z\]+${eol}.*" \
         "info target"

