# Copyright (C) 2014-2020 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/>.

# This file is part of the GDB testsuite.
# It tests the iterator facility.

load_lib gdb-guile.exp

standard_testfile

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

# Skip all tests if Guile scripting is not enabled.
if { [skip_guile_tests] } { continue }

if ![gdb_guile_runto_main] {
    return
}

gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end."

gdb_scm_test_silent_cmd "guile (use-modules (gdb iterator))" \
    "import (gdb iterator)"

gdb_scm_test_silent_cmd "guile (define this-sal (find-pc-line (frame-pc (selected-frame))))" \
    "get frame sal"

gdb_scm_test_silent_cmd "guile (define this-symtab (sal-symtab this-sal))" \
    "get frame symtab"

gdb_scm_test_silent_cmd "guile (define this-global-block (symtab-global-block this-symtab))" \
    "get frame global block"

gdb_scm_test_silent_cmd "guile (define syms-iter (make-block-symbols-iterator this-global-block))" \
    "get global block iterator"

gdb_scm_test_silent_cmd "guile (define functions (iterator-filter symbol-function? syms-iter))" \
    "get global functions"

gdb_test "guile (print (sort (map symbol-name functions) string<?))" \
    "= \\(foo main\\)" "test function list"

gdb_scm_test_silent_cmd "guile (define syms-iter (make-block-symbols-iterator this-global-block))" \
    "get global block iterator 2"

gdb_test "guile (print (sort (map symbol-name (iterator->list syms-iter)) string<?))" \
    "= \\(foo main\\)" "iterator->list"
