# Copyright 2008, 2009 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/>.

if $tracelevel then {
    strace $tracelevel
}

load_lib "pascal.exp"

set testfile "integers"
set srcfile ${testfile}.pas
set binfile ${objdir}/${subdir}/${testfile}$EXEEXT

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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
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"
}

# Verify that "start" lands inside the right procedure.
if { [gdb_start_cmd] < 0 } {
    untested start
    return -1
}

gdb_test "" ".* at .*${srcfile}.*" "start"

gdb_test "cont" "Breakpoint .*:${bp_location1}.*" "Going to first breakpoint"

gdb_test "print i" ".* = 0" "Print i before assigned to 1"

gdb_test "next" "i := 1;" "Next to 'i := 1' line"
gdb_test "next" "j := 2;" "Next to 'j := 2' line"
# At that point, 
# i should be equal to 1
gdb_test "print i" " = 1" 
# but j should still be equal to zero
if { $pascal_compiler_is_gpc } {
  setup_xfail *-*-*
}
gdb_test "print j" " = 0" "Test j value before assignment"

gdb_test "next" "k := 3;" "Next to 'k := 3' line"
gdb_test "next" "l := k;" "Next to 'l := k' line"

#j should be equal to 2
gdb_test "print j" " = 2"
# k should be equal to 3
gdb_test "print k" " = 3"
# But l shoud still be zero
if { $pascal_compiler_is_gpc } {
  setup_xfail *-*-*
}
gdb_test "print l" " = 0"

# Test addition
gdb_test "print i + j" " = 3"
gdb_test "print i + k" " = 4"
gdb_test "print j + k" " = 5"
gdb_test "print i + j + k" " = 6"

# Test substraction
gdb_test "print j - i" " = 1"
gdb_test "print i - j" "= -1"
gdb_test "print k -i -j" " = 0"
gdb_test "print k -(i + j)" " = 0"

# Test unany minus
gdb_test "print -i" " = -1"
gdb_test "print (-i)" " = -1"
gdb_test "print -(i)" " = -1"
gdb_test "print -(i+j)" " = -3"

# Test boolean operators =, <>, <, <=, > and >=
gdb_test "print i + 1 = j" " = true"
gdb_test "print i + 1 <> j" " = false"
gdb_test "print i + 1 < j" " = false"
gdb_test "print i + 1 <= j" " = true"
gdb_test "print i + 1 > j" " = false"
gdb_test "print i + 1 >= j" " = true"

# Test multiplication
gdb_test "print 2 * i" " = 2"
gdb_test "print j * k" " = 6"
gdb_test "print 3000*i" " = 3000"

#Test div and mod operators
gdb_test "print 35 div 2" " = 17"
gdb_test "print 35 mod 2" " = 1"

# Test several operators together
gdb_test "print i+10*j+100*k" " = 321"
gdb_test " print (i + 5) * (j + 7)" " = 54"

# 'set i' does not work, as there are set sub-commands starting with 'i'
# Thus we need to use 'set var i'
gdb_test "set var i := 2" " := 2"
gdb_test "print i" " = 2" "Testing new i value"

gdb_test "cont" \
	 "Breakpoint .*:${bp_location2}.*" \
	 "Going to second breakpoint"
gdb_test "print i" \
	 ".* = 5.*" \
	 "Value of i after assignment"
