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

# Some varobj tests involving pretty-printers

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

require allow_python_tests

standard_testfile

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

mi_clean_restart $binfile

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_runto_main

mi_gdb_test "-var-create tval * tval" \
   "\\^done.*"

mi_gdb_test "-var-list-children --all-values tval" \
    ".*value=.*flicker.*"

mi_gdb_test "-var-create test_ptr * test_ptr" \
   "\\^done.*"

mi_gdb_test "-var-evaluate-expression test_ptr" \
   "\\^done,value=\"map\""
mi_gdb_test "-var-set-visualizer test_ptr None" \
    "\\^done.*"
# mi_gdb_test "-var-update test_ptr" ".*"
mi_gdb_test "-var-evaluate-expression test_ptr" \
   "\\^done,value=\"$hex.*\"" \
    "evaluate without visualizer"
