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

# Tests for linespec error conditions

standard_testfile
set exefile $testfile

if {[prepare_for_testing $testfile $exefile $srcfile \
	 {debug nowarnings}]} {
    return -1
}

# Turn off the pending breakpoint queries.
gdb_test_no_output "set breakpoint pending off"

# We intentionally do not use gdb_breakpoint for these tests.

# Add the (invalid) LINESPEC to the test array named in ARRAY_NAME.
# Use the index into ::error_messages MSG_ID and ARGS to create
# an error message which is the expect result of attempting to
# break on the given LINESPEC.
proc add {array_name linespec msg_id args} {
    global error_messages
    upvar $array_name tests

    lappend tests(linespecs) $linespec
    set tests("$linespec") [string_to_regexp \
				[eval format \$error_messages($msg_id) $args]]
}

# Common error message format strings.
array set error_messages {
    invalid_file "No source file named %s."
    invalid_function "Function \"%s\" not defined."
    invalid_var_or_func "Undefined convenience variable or function \"%s\" not defined."
    invalid_function_f "Function \"%s\" not defined in \"%s\"."
    invalid_var_or_func_f \
	"Undefined convenience variable or function \"%s\" not defined in \"%s\"."
    invalid_label "No label \"%s\" defined in function \"%s\"."
    invalid_offset "No line %d in the current file."
    invalid_offset_f "No line %d in file \"%s\"."
    unexpected "malformed linespec error: unexpected %s"
    unexpected_opt "malformed linespec error: unexpected %s, \"%s\""
    unmatched_quote "unmatched quote"
}

# Some commonly used whitespace tests around ':'.
set spaces [list ":" ": " " :" " : " "\t:  " "  :\t" "\t:\t" " \t:\t " \
		"\t  \t:\t  \t  \t"]

# A list of invalid offsets.
set invalid_offsets [list -100 +500 1000]

# THE_TESTS will hold all of our test information.  Array index
# "linespecs" will contain the complete list of all linespecs
# to be tested.  An array index of \"$linespec\" will contain
# the expected result.
set the_tests(linespecs) {}

# Try some simple, invalid linespecs involving spaces.
foreach x $spaces {
    add the_tests $x unexpected "colon"
}

# Test invalid filespecs starting with offset.  This is done
# first so that default offsets are tested.
foreach x $invalid_offsets {
    set offset $x

    # Relative offsets are relative to line 16.  Adjust
    # expected offset from error message accordingly.
    if {[string index $x 0] == "+" ||
	[string index $x 0] == "-"} {
	incr offset 16
    }
    add the_tests $x invalid_offset $offset
}

# Test offsets with trailing tokens w/ and w/o spaces.
foreach x $spaces {
    add the_tests "3$x" unexpected "colon"
    add the_tests "+10$x" unexpected "colon"
    add the_tests "-10$x" unexpected "colon"
}

foreach x {1 +1 +100 -10} {
    add the_tests "3 $x" unexpected_opt "number" $x
    add the_tests "+10 $x" unexpected_opt "number" $x
    add the_tests "-10 $x" unexpected_opt "number" $x
}

add the_tests "3 foo" unexpected_opt "string" "foo"
add the_tests "+10 foo" unexpected_opt "string" "foo"
add the_tests "-10 foo" unexpected_opt "string" "foo"

# Test invalid linespecs starting with filename.
foreach x [list "this_file_doesn't_exist.c" \
	       "this file has spaces.c" \
	       "\"file::colons.c\"" \
	       "'file::colons.c'" \
	       "\"this \"file\" has quotes.c\"" \
	       "'this \"file\" has quotes.c'" \
	       "'this 'file' has quotes.c'" \
	       "\"this 'file' has quotes.c\"" \
	       "\"spaces: and :colons.c\"" \
	       "'more: :spaces: :and  colons::.c'"] {
    # Remove any quoting from FILENAME for the error message.
    add the_tests "$x:3" invalid_file [string trim $x \"']
}

# Test unmatched quotes.
foreach x {"\"src-file.c'" "'src-file.c"} {
    add the_tests "$x:3" unmatched_quote
}

add the_tests $srcfile invalid_function $srcfile
foreach x {"foo" " foo" " foo "} {
    # Trim any leading/trailing whitespace for error messages.
    add the_tests "$srcfile:$x" invalid_function_f [string trim $x] $srcfile
    add the_tests "$srcfile:main:$x" invalid_label [string trim $x] "main" 
}

foreach x $spaces {
    add the_tests "$srcfile$x" unexpected "end of input"
    add the_tests "$srcfile:main$x" unexpected "end of input"
}

add the_tests "${srcfile}::" invalid_function "${srcfile}::"
add the_tests "$srcfile:3 1" unexpected_opt "number" "1"
add the_tests "$srcfile:3 +100" unexpected_opt "number" "+100"
add the_tests "$srcfile:3 -100" unexpected_opt "number" "-100"
add the_tests "$srcfile:3 foo" unexpected_opt "string" "foo"

foreach x $invalid_offsets {
    add the_tests "$srcfile:$x" invalid_offset_f $x $srcfile
    add the_tests "\"$srcfile:$x\"" invalid_offset_f $x $srcfile
    add the_tests "'$srcfile:$x'" invalid_offset_f $x $srcfile
}

# Test invalid filespecs starting with function.
foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \
	       "foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} {
    add the_tests $x invalid_function $x
}

foreach x $spaces {
    add the_tests "main${x}there" invalid_label "there" "main"
    add the_tests "main:here${x}" unexpected "end of input"
}

add the_tests "main 3" invalid_function "main 3"
add the_tests "main +100" invalid_function "main +100"
add the_tests "main -100" invalid_function "main -100"
add the_tests "main foo" invalid_function "main foo"

foreach x {"3" "+100" "-100" "foo"} {
    add the_tests "main:here $x" invalid_label "here $x" "main"
}

foreach x {"if" "task" "thread"} {
    add the_tests $x invalid_function $x
}

add the_tests "'main.c'flubber" unexpected_opt "string" "flubber"
add the_tests "'main.c',21" invalid_function "main.c"
add the_tests "'main.c' " invalid_function "main.c"
add the_tests "'main.c'3" unexpected_opt "number" "3"
add the_tests "'main.c'+3" unexpected_opt "number" "+3"

# Test undefined convenience variables.
set x {$zippo}
add the_tests $x invalid_var_or_func $x
add the_tests "$srcfile:$x" invalid_var_or_func_f $x $srcfile

# Run the tests
foreach linespec $the_tests(linespecs) {
    gdb_test "break $linespec" $the_tests("$linespec")
}
