# Copyright 1992-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 case for CLLbs15503
# This file was written by Sue Kimura (sue_kimura@hp.com)
# Rewritten by Michael Chastain (mec.gnu@mindspring.com)

if { [skip_stl_tests] } { continue }

standard_testfile .cc

if [get_compiler_info] {
    return -1
}

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
    return -1
}

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

# Set breakpoint on template function

gdb_test "break StringTest<wchar_t>::testFunction" \
    "Breakpoint $decimal at $hex: file .*${srcfile}, line $decimal."

gdb_test "continue" \
    ".*Breakpoint $decimal, StringTest<wchar_t>::testFunction \\(this=$hex\\).*" \
    "continue to StringTest<wchar_t>"

# Run to some random point in the middle of the function.

gdb_breakpoint [gdb_get_line_number "find position where blank needs to be inserted"]
gdb_continue_to_breakpoint "find position where blank needs to be inserted"

# Call some string methods.

gdb_test "print s.length()"		"\\$\[0-9\]+ = 42"
gdb_test "print s\[0\]"			"\\$\[0-9\]+ =.* 'I'"
gdb_test "print s\[s.length()-1\]"	"\\$\[0-9\]+ =.* 'g'"
gdb_test "print (const char *) s" \
    "\\$\[0-9\]+ = $hex \"I am a short stringand now a longer string\""

# TODO: tests that do not work with gcc 2.95.3
# -- chastain 2004-01-07
# 
# gdb_test "print s.compare(s)"		"\\$\[0-9\]+ = 0"
# gdb_test "print s.compare(\"AAA\")"     "\\$\[0-9\]+ = 1"
# gdb_test "print s.compare(\"ZZZ\")"     "\\$\[0-9\]+ = -1"

# TODO: tests that do not work with gcc 2.95.3 and gcc 3.3.2.
# cannot call overloaded non-member operator.  -- chastain 2004-01-07
# 
# gdb_test "print s == s"			"\\$\[0-9\]+ = true"
# gdb_test "print s > "AAA"			"\\$\[0-9\]+ = true"
# gdb_test "print s < "ZZZ"			"\\$\[0-9\]+ = true"

# TODO: GDB doesn't know to convert the string to a const char *, and
# instead tries to use the string as a structure initializer.
# 
# gdb_test "print s == \"I am a short stringand now a longer string\"" \
#     "\\$\[0-9\]+ = true"

gdb_test "print (const char *) s.substr(0,4)"	"\\$\[0-9\]+ = $hex \"I am\""
gdb_test "print (const char *) (s=s.substr(0,4))" \
    "\\$\[0-9\]+ = $hex \"I am\""

# TODO: cannot call overloaded non-member operator again.
# -- chastain 2004-01-07
# 
# gdb_test "print (const char *) (s + s)" \
#    "\\$\[0-9\]+ = $hex \"I amI am\""
# gdb_test "print (const char *) (s + \" \" + s)" \
#    "\\$\[0-9\]+ = $hex \"I am I am\""
