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

load_lib "pascal.exp"

set testfile "floats"
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 r" ".* = 0" "Print r before assigned to 1.25"

gdb_test "next" "r := 1\\.25;" "Next to 'r := 1.25' line"
gdb_test "next" "s := 2\\.2;" "Next to 's := 2.2' line"
gdb_test "next" "t := -3\\.2;" "Next to 't := -3.2' line"
gdb_test "next" "u := 78\\.3;" "Next to 'u := 78.3' line"
gdb_test "next" "l := 1;" "Next to 'l := 1' line"
gdb_test "next" "i := 1;" "Next to 'i := 1' line"

# At that point, 
# r should be equal to 1.25
gdb_test "print r" " = 1\\.25" 
# s should be equal to 2.2
gdb_test "print s" " = 2\\.(199.*|2|200.*)"
# t should be equal to -3.2
gdb_test "print t" " = -3\\.(199.*|2|200.*)"
# u should be equal to 78.3
gdb_test "print u" " = 78\\.(3|300.*|299.*)"

# Test addition
gdb_test "print r + s" " = 3\\.4(499.*|5|500.*)"
gdb_test "print r + t" " = -1\\.9(499.*|5|500.*)"

#Test addition with float constants
gdb_test "print r + 1.5" " = 2\\.7(499.*|5|500.*)"
gdb_test "print r + 0.03" " = 1\\.2(799.*|8|800.*)"
gdb_test "print r + (-0.2)" " = 1\\.0(499.*|5|500.*)"
gdb_test "print r + 1.5E+3" " = 1501\\.2(499.*|5|500.*)"
gdb_test "print r + 1.5E+2" " = 151\\.2(499.*|5|500.*)"
gdb_test "print r + 1.5E+1" " = 16\\.2(499.*|5|500.*)"
gdb_test "print r + 1.5E+0" " = 2\\.7(499.*|5|500.*)"
gdb_test "print r + 1.5E-1" " = 1\\.(399.*|4|400.*)"
gdb_test "print r + 1.5E-2" " = 1\\.26(499.*|5|500.*)"
gdb_test "print r + 1.5E-3" " = 1\\.251(499.*|5|500.*)"

# Test addition with integer variables
gdb_test "print r + l" " = 2\\.2(499.*|5|500.*)"
gdb_test "print l + t" " = -2\\.(199.*|2|200.*)"

# Test addition with integer constants
gdb_test "print r + 10" " = 11\\.2(499.*|5|500.*)"
gdb_test "print r + 5" " = 6\\.2(499.*|5|500.*)"
gdb_test "print r + 1" " = 2\\.2(499.*|5|500.*)"
gdb_test "print r + 0" " = 1\\.2(499.*|5|500.*)"
gdb_test "print r + (-1)" " = 0\\.2(499.*|5|500.*)"
gdb_test "print r + (-5)" " = -3\\.7(499.*|5|500.*)"
gdb_test "print r + (-10)" " = -8\\.7(499.*|5|500.*)"

# Test substraction
gdb_test "print r - s" " = -0\\.9(499.*|5|500.*)"
gdb_test "print r - t" " = 4\\.4(499.*|5|500.*)"

# Test unany minus
gdb_test "print -r" " = -1\\.2(499.*|5|500.*)"
gdb_test "print (-r)" " = -1\\.2(499.*|5|500.*)"
gdb_test "print -(r)" " = -1.2(499.*|5|500.*)"
gdb_test "print -(r + s)" " = -3\\.4(499.*|5|500.*)"

# Test multiplication
gdb_test "print 2 * r" " = 2\\.(499.*|5|500.*)"
gdb_test "print 2.0 * r" " = 2\\.(499.*|5|500.*)"
gdb_test "print 1000*r" " = 12(49\\.99.*|50|50\\.00.*)"

#Test division
gdb_test "print r / 2" " = 0\\.62(499.*|5|500.*)"
gdb_test "print 35 / 2" " = 17\\.(499.*|5|500.*)"

# 'set r' does not work, as there are set sub-commands starting with 'r'
# Thus we need to use 'set var r'
gdb_test "set var r := 2.56" " := 2\\.56"
gdb_test "print r" " = 2\\.5(599.*|6|600.*)" "Testing new r value"

gdb_test "cont" \
	 "Breakpoint .*:${bp_location2}.*" \
	 "Going to second breakpoint"
gdb_test "next" "r := cos\\(u\\);" "Advance to 'r := cos(u)' line"
gdb_test "print u" " = 3\\.14159.*" "Test pi value"
gdb_test "next" "s := sin\\(u\\);" "Advance to 's := sin(u)' line"
gdb_test "print r" " = -1" "Test cos(pi) is equal to -1" 
gdb_test "next" "" "Go past 's := sin(u)' line"

set msg "Test sin(pi) is equal to 0" 

gdb_test_multiple "print s" $msg {
	-re ".* = (0|-?\[0-9\]\\.\[0-9\]*\[eE\](-?\[0-9\]*))\[\r\n\]+$gdb_prompt $" {
	  set value "$expect_out(1,string)"
	  verbose "value is $value" 1
	  if [info exists expect_out(2,string)] {
	    set expo $expect_out(2,string)
	    verbose "expo found: $expo" 1
	  } else {
	    set expo "0"
	    regsub  ".*\[eE\]" "$value" "" expo;
	  }
	  regsub  "^-" "$expo" "" mexpo;
	  verbose "expo is $expo" 1
	  verbose "mexpo is $mexpo" 1
	  if { $value == 0 } {
	    pass $msg
	  } elseif {$mexpo > 8} {
	    pass "$msg '$value' is close to zero"
	  } else {
	    fail "$msg '$value' too large"
	  }
	  verbose "Still here" 1
	}
}
