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

# Tests for linespec error conditions

set base ls-errs
set srcfile "$base.c"
set testfile "$base.exp"
set exefile $base

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\""] {
    # 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
}

# 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 unexpected_opt "keyword" $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")
}
