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

# This file was written by Adam Fedor (fedor@gnu.org)

standard_testfile .m

#
# Objective-C program compilation isn't standard. We need to figure out
# which libraries to link in. Most of the time it uses pthread
#
if {[gdb_compile_objc "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } {
  return -1
}

#
# Deduce language of main()
#

proc deduce_language_of_main {} {
    global gdb_prompt

    # See what language gdb thinks main() is, prior to reading full symbols.
    # I think this fails for COFF targets.
    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"auto; currently objective-c\".*$gdb_prompt $" {
	    pass "deduced language is Objective-C, before full symbols"
	}
	-re ".*$gdb_prompt $" {
	    fail "source language not correct for Objective-C (psymtabs only)"
	    return
	}
	timeout {
	    fail "can't show language (timeout)"
	    return
	}
    }

    runto_main

    # See if our idea of the language has changed.

    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"auto; currently objective-c\".*$gdb_prompt $" {
	    pass "deduced language is Objective-C, after full symbols"
	}
	-re ".*$gdb_prompt $" {
	    fail "source language not correct for Objective-C (full symbols)"
	    return
	}
	timeout {
	    fail "can't show language (timeout)"
	    return
	}
    }
}

proc do_objc_tests {} {
    global subdir
    global srcdir
    global binfile
    global gdb_prompt


    # Start with a fresh gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile

    deduce_language_of_main
}

do_objc_tests

#
# Breakpoint tests
#

# Disable pending breakpoint query to avoid timeouts
# if Obj-C symbols cannot be found
gdb_test "set breakpoint pending off" "" "set breakpoint pending"

gdb_test "break doIt" \
    "Breakpoint.*at.* file .*$srcfile, line.29.*" \
    "breakpoint method"

gdb_test "break takeArg:" \
    "Breakpoint.*at.* file .*$srcfile, line.34.*" \
    "breakpoint method with colon"

gdb_test "break newWithArg:" \
    "Breakpoint.*at.* file .*$srcfile, line.22.*" \
    "breakpoint class method with colon"

#
# Continue until breakpoint (test re-setting breakpoint)
#
gdb_test continue \
    "Continuing\\..*Breakpoint \[0-9\]+, -.BasicClass takeArg:. \\(self=.*, _cmd=.*, arg=.*\\) at .*$srcfile:34.*" \
    "continue until method breakpoint"

#
# Test resetting breakpoints when re-running program
#
gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:.*$gdb_prompt $"\
                            { pass "resetting breakpoints when rerunning" }
    -re ".*$gdb_prompt $"       { fail "resetting breakpoints when rerunning" }
    timeout                 { fail "resetting breakpoints when rerunning" }
}

#
# Continue until breakpoint (test re-setting breakpoint)
#
gdb_test continue \
    "Continuing\\..*Breakpoint \[0-9\]+, -.BasicClass takeArg:. \\(self=.*, _cmd=.*, arg=.*\\) at .*$srcfile:34.*" \
    "continue until method breakpoint"

#
# Test printing objects
#
gdb_test "print object" \
    "\\$\[0-9\] = .*0x0" \
    " print an ivar of self"

gdb_test "print self" \
    "\\$\[0-9\] = \\(.*BasicClass \\*\\) 0x\[0-9a-f\]+" \
    " print self"

gdb_test "print \*self" \
    "\\$\[0-9\] = \{{?isa = 0x\[0-9a-f\]+( <.*>)?}?, object = 0x0\}" \
    " print contents of self"

#
# Break in a category
#
gdb_test "break hiddenMethod" \
    "Breakpoint.*at.* file .*$srcfile, line.61." \
    "breakpoint in category method"


#
# Continue until breakpoint (test re-setting category breakpoint)
#
gdb_test continue \
    "Continuing\\..*Breakpoint \[0-9\]+, -.BasicClass\\(Private\\) hiddenMethod. \\(self=.*, _cmd=.*\\) at .*$srcfile:61.*" \
     "continue until category method"

#
# Test calling Objective-C methods
#
gdb_test "print \[self printHi\]" \
    "Hi.*\\$\[0-9\] = \\(.*objc_object \\*\\) 0x\[0-9a-f\]+" \
    "Call an Objective-C method with no arguments"

gdb_test "print \[self printNumber: 42\]" \
    "42.*\\$\[0-9\] = 43" \
    "Call an Objective-C method with one argument"

#
# Test printing the object description
#
gdb_test "print-object object" \
    "BasicClass gdb test object" \
    "Use of the print-object command"

gdb_test "po self" \
    "BasicClass gdb test object" \
    "Use of the po (print-object) command"


