# 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" \
    "${::valnum_re} = .*0x0" \
    " print an ivar of self"

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

gdb_test "print \*self" \
    "${::valnum_re} = \{{?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.*${::valnum_re} = \\(.*objc_object \\*\\) 0x\[0-9a-f\]+" \
    "call an Objective-C method with no arguments"

gdb_test "print \[self printNumber: 42\]" \
    "42.*${::valnum_re} = 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"
