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

# 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_test "" "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:.*" "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"


