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

# This file is part of the GDB testsuite.  It tests Python-based
# pretty-printing for the CLI.

if [is_remote host] {
    untested "py-pp-maint.exp can only be run locally"
    return -1
}

load_lib gdb-python.exp

standard_testfile

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

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

if ![runto_main ] then {
    return -1
}

gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
    ".*Breakpoint.*"
gdb_test "continue" ".*Breakpoint.*"

set python_file [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]

gdb_test_no_output "source ${python_file}" "load python file"

gdb_test "info pretty-printer" \
    {.*function_lookup_test.*pp-test.*struct ss.*}

gdb_test "info pretty-printer global .*function" \
    {.*function_lookup_test.*}

gdb_test "info pretty-printer .* pp-test" \
    {.*pp-test.*struct ss.*}

gdb_test "print flt" " = x=<42> y=<43>" \
    "print flt enabled #1"

gdb_test "print ss" " = a=<a=<1> b=<$hex>> b=<a=<2> b=<$hex>>" \
    "print ss enabled #1"

set num_pp 7

gdb_test "disable pretty-printer" \
    "$num_pp printers disabled.*0 of $num_pp printers enabled"

gdb_test "enable pretty-printer" \
    "$num_pp printers enabled.*$num_pp of $num_pp printers enabled" \
    "first enable of all pretty printers"

gdb_test "disable pretty-printer global" \
    "$num_pp printers disabled.*0 of $num_pp printers enabled"

gdb_test "enable pretty-printer" \
    "$num_pp printers enabled.*$num_pp of $num_pp printers enabled" \
    "second enable of all pretty printers"

gdb_test "disable pretty-printer global lookup_function_lookup_test" \
    "1 printer disabled.*[expr $num_pp - 1] of $num_pp printers enabled"

gdb_test "disable pretty-printer global pp-test;.*" \
    "[expr $num_pp - 2] printers disabled.*1 of $num_pp printers enabled"

gdb_test "info pretty-printer global .*function" \
    {.*function_lookup_test \[disabled\].*} \
    "info pretty-printer for function, pretty-printer is disabled"

gdb_test "info pretty-printer .* pp-test" \
    {.*pp-test.*struct ss \[disabled\].*} \
    "info pretty-printer for pp-test, pretty-printer is disabled"

gdb_test "print flt" " = {x = 42, y = 43}" \
    "print flt disabled"

gdb_test "print ss" " = {a = {a = 1, b = $hex}, b = {a = 2, b = $hex}}" \
    "print ss disabled"

gdb_test "enable pretty-printer global lookup_function_lookup_test" \
    "1 printer enabled.*2 of $num_pp printers enabled"

# This doesn't enable any printers because each subprinter in the collection
# is still individually disabled.  But this is still needed, to enable the
# collection itself.
gdb_test "enable pretty-printer global pp-test" \
    "0 printers enabled.*2 of $num_pp printers enabled"

gdb_test "enable pretty-printer global pp-test;.*ss.*" \
    "2 printers enabled.*[expr $num_pp - 3] of $num_pp printers enabled"

gdb_test "enable pretty-printer global pp-test;.*s.*" \
    "2 printers enabled.*[expr $num_pp - 1] of $num_pp printers enabled"

gdb_test "enable pretty-printer global pp-test;.*" \
    "1 printer enabled.*$num_pp of $num_pp printers enabled"

gdb_test "info pretty-printer" \
    {.*function_lookup_test.*pp-test.*struct ss.*} \
    "info pretty-printer after re-enabling"

gdb_test "print flt" " = x=<42> y=<43>" \
    "print flt re-enabled"

gdb_test "print ss" " = a=<a=<1> b=<$hex>> b=<a=<2> b=<$hex>>" \
    "print ss re-enabled"

gdb_test_exact "print (enum flag_enum) (FOO_1)" \
    { = 0x1 [FOO_1]}

gdb_test_exact "print (enum flag_enum) (BAR_3)" \
    { = 0x40 [BAR_3]}

gdb_test_exact "print (enum flag_enum) (BAR_2 | FOO_2)" \
    { = 0x22 [FOO_2 | BAR_2]}

gdb_test_exact "print (enum flag_enum) (FOO_1 | FOO_2 | FOO_3)" \
    { = 0x7 [FOO_1 | FOO_2 | FOO_3]}

gdb_test_exact "print (enum flag_enum) (FOO_MASK)" \
    { = 0x7 [FOO_1 | FOO_2 | FOO_3]}

gdb_test_exact "print (enum flag_enum) (FOO_MASK | (BAR_MASK & ~BAR_2))" \
    { = 0x57 [FOO_1 | FOO_2 | FOO_3 | BAR_1 | BAR_3]}

gdb_test_exact "print (enum flag_enum) (0x4 + 0x8)" \
    { = 0xc [FOO_3 | <unknown: 0x8>]}
