# Copyright 2013-2021 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 gdb-python.exp
set opts {}
standard_testfile .S

if [info exists COMPILE] {
    # make check RUNTESTFLAGS="gdb.python/py-linetable.exp COMPILE=1"
    standard_testfile
    lappend opts debug optimize=-O2
} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping ${testfile}."
    return
}

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

if ![runto_main] {
    return -1
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

gdb_py_test_silent_cmd "python lt = gdb.selected_frame().find_sal().symtab.linetable()" \
    "get instruction" 0

gdb_test_multiline "input simple command" \
  "python" "" \
  "def list_lines():" "" \
  "   for l in lt:" "" \
  "     print ('L' + str(l.line) + ' A ' + hex(l.pc))" "" \
  "end" ""

gdb_test "python list_lines()" \
    "L20 A $hex.*L21 A $hex.*L22 A $hex.*L24 A $hex.*L25 A $hex.*L40 A $hex.*L42 A $hex.*L44 A $hex.*L42 A $hex.*L46 A $hex.*" \
    "test linetable iterator addr"
gdb_test "python print(len(lt.line(42)))" "2" \
    "Test length of a multiple pc line"
gdb_test "python print(len(lt.line(20)))" "1" \
    "Test length of a single pc line"
gdb_test "python print(lt.line(1))" "None" \
    "Test None returned for line with no pc"

# Test gdb.Linetable.sourcelines ()
gdb_py_test_silent_cmd "python fset = lt.source_lines()" \
    "Get all source lines into a frozen set" 0
gdb_test "python print (sorted(fset))" \
    "\\\[20, 21, 22, 24, 25, 28, 29, 30, 32, 33, 37, 39, 40, 42, 44, 45, 46\\\].*" \
    "test frozen set contains line numbers"

# Test gdb.Linetable.has_line ()
gdb_test "python print(lt.has_line(20))" \
    "True.*" \
    "Test has_pcs at line 20"
gdb_test "python print(lt.has_line(44))" \
    "True.*" \
    "Test has_pcs at line 40"
gdb_test "python print(lt.has_line(10))" \
    "False.*" \
    "test has_pcs at line 10"
