# Copyright 2007, 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 "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
	}
}
