# Copyright 1992, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# 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
}

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++"] != "" } {
    perror "Couldn't compile ${srcfile}"
    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 crash gdb!  This is going to be a great test!
# -- chastain 2004-01-07
# 
# 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\""
