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

# Copyright 2012 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 }

standard_testfile .go

if { [prepare_for_testing ${testfile}.exp ${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 } {
    untested $testfile
    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"
