# This testcase is part of GDB, the GNU debugger.

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

# Test integer expressions.

load_lib "go.exp"

if { [skip_go_tests] } { continue }
if { [support_go_compile] == 0 } { continue }

standard_testfile .go

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug go}] } {
    return -1
}

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

if { [go_runto_main] < 0 } {
    return -1
}

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

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
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 should still be zero
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 / 2" " = 17"
gdb_test "print 35 % 2" " = 1"

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

gdb_test "set var i = 2" " = 2"
gdb_test "print i" " = 2" "testing new i value"

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

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