# 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

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 test_break {linespec msg_id args} {
    global error_messages

    gdb_test "break $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 {
    test_break $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
    }
    test_break $x invalid_offset $offset
}

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

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

test_break "3 foo" unexpected_opt "string" "foo"
test_break "+10 foo" unexpected_opt "string" "foo"
test_break "-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.
    test_break "$x:3" invalid_file [string trim $x \"']
}

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

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

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

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

foreach x $invalid_offsets {
    test_break "$srcfile:$x" invalid_offset_f $x $srcfile
    test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile
    test_break "'$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"} {
    test_break $x invalid_function $x
}

foreach x $spaces {
    test_break "main${x}there" invalid_label "there" "main"
    if [using_clang] { setup_xfail "clang/14500" *-*-* }
    test_break "main:here${x}" unexpected "end of input"
}

test_break "main 3" invalid_function "main 3"
test_break "main +100" invalid_function "main +100"
test_break "main -100" invalid_function "main -100"
test_break "main foo" invalid_function "main foo"

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

foreach x {"if" "task" "thread"} {
    test_break $x unexpected_opt "keyword" $x
}

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

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

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