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

# Tests whether -var-info-path-expression fails as documented when
# invoked on a dynamic varobj.

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
standard_testfile

if {[gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable {debug}] != "" } {
    return -1
}

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

set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
mi_gdb_test "source ${pyfile}" \
  ".*\\^done" \
  "load python file"

mi_gdb_test "-enable-pretty-printing" \
  "\\^done" \
  "-enable-pretty-printing"

mi_gdb_test "set python print-stack full" \
  ".*\\^done" \
  "set python print-stack full"


mi_run_to_main


mi_continue_to_line [gdb_get_line_number "next line" ${srcfile}] \
  "step to breakpoint"

mi_gdb_test "-var-create c1 * &c1" \
   "\\^done.*" \
   "-var-create c1 * &c1"

mi_gdb_test "-var-info-path-expression c1" \
  "\\^done,path_expr=\"&c1\"" \
  "-var-info-path-expression c1"

mi_gdb_test "-var-list-children c1" \
  "\\^done,numchild=\"2\",children=.child=\{name=\"c1.car\".*child=\{name=\"c1.cdr\".*" \
  "-var-list-children c1"

mi_gdb_test "-var-info-path-expression c1.cdr" \
  "\\^error,msg=\".*\"" \
  "-var-info-path-expression c1.cdr"

mi_gdb_test "-var-list-children c1.cdr" \
  "\\^done,numchild=\"2\",children=.child=\{name=\"c1.cdr.car\".*child=\{name=\"c1.cdr.cdr\".*" \
  "-var-list-children c1.cdr"

mi_gdb_test "-var-info-path-expression c1.cdr.cdr" \
  "\\^error,msg=\".*\"" \
  "-var-info-path-expression c1.cdr.cdr"

mi_gdb_test "-var-list-children c1.car" \
  "\\^done,numchild=\"1\",children=.child=\{name=\"c1.car.atom\".*" \
  "-var-list-children c1.car"

mi_gdb_test "-var-list-children c1.car.atom" \
  "\\^done,numchild=\"1\",children=.child=\{name=\"c1.car.atom.ival\".*" \
  "-var-list-children c1.car.atom"

mi_gdb_test "-var-info-path-expression c1.car.atom.ival" \
  "\\^error,msg=\".*\"" \
  "-var-info-path-expression c1.car.atom.ival"
