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

set testfile "break-reverse"
set srcfile  ${testfile}.c

if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
    return -1
}

set foo_location  [gdb_get_line_number "break in foo" ]
set bar_location  [gdb_get_line_number "break in bar" ]
set main_location [gdb_get_line_number "break in main"]
set end_location  [gdb_get_line_number "end of main"  ]

runto main

# FIXME 'record' command should say something so we know it's working.
gdb_test "record" "" "start recording"

gdb_test "break foo" \
    "Breakpoint $decimal at .* line $foo_location\." \
    "set breakpoint on foo"

gdb_test "break bar" \
    "Breakpoint $decimal at .* line $bar_location\." \
    "set breakpoint on bar"

gdb_test "break $end_location" \
    "Breakpoint $decimal at .* line $end_location\." \
    set breakpoint at end of main"

gdb_continue_to_breakpoint "foo" ".*/$srcfile:$foo_location.*"
gdb_continue_to_breakpoint "bar" ".*/$srcfile:$bar_location.*"
gdb_continue_to_breakpoint "end" ".*/$srcfile:$end_location.*"

# FIXME 'set exec-dir' command should give some output so we can test.
gdb_test "set exec-direction reverse" "" "set reverse"

gdb_continue_to_breakpoint "bar backward"  ".*/$srcfile:$bar_location.*"
gdb_continue_to_breakpoint "foo backward"  ".*/$srcfile:$foo_location.*"

gdb_test_multiple "continue" "main backward" {
    -re ".*Breakpoint $decimal,.*/$srcfile:$main_location.*$gdb_prompt $" {
	pass "main backward"
    }
    -re "No more reverse-execution history.* break in main .*$gdb_prompt $" {
	pass "main backward"
    }
}

gdb_test "set exec-direction forward" "" "set forward"

gdb_continue_to_breakpoint "foo" ".*/$srcfile:$foo_location.*"
gdb_continue_to_breakpoint "bar" ".*/$srcfile:$bar_location.*"

gdb_test_multiple "continue" "end of record log" {
    -re ".*Breakpoint $decimal,.*/$srcfile:$end_location.*$gdb_prompt $" {
	pass "end of record log"
    }
    -re "No more reverse-execution history.* end of main .*$gdb_prompt $" {
	pass "end of record log"
    }
}
