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

load_lib "pascal.exp"

standard_testfile .pas

if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } {
  return -1
}

clean_restart ${testfile}

if { ![runto_main] } {
    return
}

set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
set bp_location2 [gdb_get_line_number "set breakpoint 2 here"]

if { [gdb_breakpoint ${srcfile}:${bp_location1}] } {
    pass "setting breakpoint 1"
}
if { [gdb_breakpoint ${srcfile}:${bp_location2}] } {
    pass "setting breakpoint 2"
}

gdb_test "cont" \
         "Breakpoint .*:${bp_location1}.*" \
         "Going to first breakpoint"
gdb_test "print st" \
	 ".* = ''.*" \
	 "empty string check"

# This test also fails for gpc because the program
# stops after the string has been written
# while it should stop before writing it 
if { $pascal_compiler_is_gpc } {
    setup_xfail *-*-*
}
gdb_test "cont" \
	 "Breakpoint .*:${bp_location2}.*" \
	 "Going to second breakpoint"
gdb_test "print st" \
	 ".* = 'Hello, world!'.*" \
	 "string after assignment check"
