# Copyright 2003-2026 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 {debug}] != ""} {
    return
}

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

    clean_restart $::testfile

    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 $decimal.*" \
    "breakpoint method"

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

gdb_test "break newWithArg:" \
    "Breakpoint.*at.* file .*$srcfile, line $decimal.*" \
    "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:$decimal.*" \
    "continue until method breakpoint"

#
# Test resetting breakpoints when re-running program
#
gdb_run_cmd
gdb_test "" "Breakpoint .+,.*main .*argc.*argv.* at .*$srcfile:.*" "resetting breakpoints when rerunning"

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

#
# 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 $decimal." \
    "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:$decimal.*" \
    "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"
