# Copyright 1992, 2004, 2005, 2007, 2008, 2009, 2010
# 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 $tracelevel {
    strace $tracelevel
}

if { [skip_stl_tests] } { continue }

# On SPU this test fails because the executable exceeds local storage size.
if { [istarget "spu*-*-*"] } {
        return 0
}

set testfile "bs15503"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug c++"] != "" } {
    untested bs15503.exp
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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\""
