# Copyright (C) 2012-2025 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 mechanism
# exposing values to Python.

require allow_cplus_tests allow_python_tests

standard_testfile py-explore.cc

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

set int_ptr_ref_desc "The value of 'int_ptr_ref' is of type 'int_ptr' which is a typedef of type 'int \\*'.*\'int_ptr_ref' is a pointer to a value of type 'int'.*"

set b_desc "The value of 'b' is a struct/class of type 'B' with the following fields:.*\
A = <Enter 0 to explore this base class of type 'A'>.*\
i = 10 \\.\\. \\(Value of type 'int'\\).*\
c = 97 'a' \\.\\. \\(Value of type 'char'\\).*"

set B_desc "'B' is a struct/class with the following fields:.*\
A = <Enter 0 to explore this base class of type 'A'>.*\
i = <Enter 1 to explore this field of type 'int'>.*\
c = <Enter 2 to explore this field of type 'char'>.*"

if ![runto_main] {
   return -1
}

gdb_breakpoint [gdb_get_line_number "Break here."]
gdb_continue_to_breakpoint "Break here" ".*Break here.*"

gdb_test "explore A" "'A' is a struct/class with no fields\."
gdb_test "explore a" "The value of 'a' is a struct/class of type 'const A' with no fields\."
gdb_test "explore int_ref" "'int_ref' is a scalar value of type 'int'.*int_ref = 10"

gdb_test_multiple "explore int_ptr_ref" "" {
    -re "$int_ptr_ref_desc.*Continue exploring it as a pointer to a single value \\\[y/n\\\]:.*" {
        pass "explore int_ptr_ref"
        gdb_test_multiple "y" "explore_int_ptr_ref_as_single_value_pointer" {
            -re "'\[*\]int_ptr_ref' is a scalar value of type 'int'.*\[*\]int_ptr_ref = 10.*$gdb_prompt" {
                pass "explore_int_ptr_ref_as_single_value_pointer"
            }
        }
    }
}

gdb_test_multiple "explore b" "" {
    -re "$b_desc.*Enter the field number of choice:.*" {
        pass "explore b"
        gdb_test_multiple "0" "explore_base_class_A" {
            -re "The value of 'b\.A' is a struct/class of type 'A' with no fields\." {
                pass "explore_base_class_A, exploring b"
                gdb_test_multiple "\0" "return_to_b_from_A" {
                    -re ".*$b_desc.*Enter the field number of choice:.*" {
                        pass "return_to_b_from_A"
                        gdb_test_multiple "1" "explore_field_i_of_b" {
                            -re "'b\.i' is a scalar value of type 'int'.*b\.i = 10.*" {
                                pass "explore_field_i_of_b"
                                gdb_test_multiple "\0" "return_to_b_from_i" {
                                    -re "$b_desc.*Enter the field number of choice:.*" {
                                        pass "return_to_b_from_i"
                                    }
                                }
                            }
                        }
                        gdb_test_multiple "2" "explore_field_c_of_b" {
                            -re "'b\.c' is a scalar value of type 'char'.*b\.c = .*'a'.*" {
                                pass "explore_field_c_of_b"
                                gdb_test_multiple "\0" "return_to_b_from_c" {
                                    -re "$b_desc.*Enter the field number of choice:.*" {
                                        pass "return_to_b_from_c"
                                    }
                                }
                            }
                        }
                        gdb_test_multiple "\0" "return_to_gdb_prompt" {
                            -re "$gdb_prompt" {
                                pass "return_to_gdb_prompt_from_b"
                            }
                        }
                    }
                }
            }
        }
    }
}

gdb_test_multiple "explore B" "" {
    -re "$B_desc.*Enter the field number of choice:.*" {
        pass "explore B"
        gdb_test_multiple "0" "explore_base_class_A" {
            -re "base class 'A' of 'B' is a struct/class of type 'A' with no fields\." {
                pass "explore_base_class_A, exploring B"
                gdb_test_multiple "\0" "return_to_B" {
                    -re "$B_desc.*Enter the field number of choice:.*" {
                        pass "return_to_B"
                        gdb_test_multiple "1" "explore_field_i_of_B" {
                            -re "field 'i' of 'B' is of a scalar type 'int'.*" {
                                pass "explore_field_i_of_B"
                                gdb_test_multiple "\0" "return_to_B_from_i" {
                                    -re "$B_desc.*Enter the field number of choice:.*" {
                                        pass "return_to_B_from_i, exploring B"
                                    }
                                }
                            }
                        }
                        gdb_test_multiple "2" "explore_field_c_of_B" {
                            -re "field 'c' of 'B' is of a scalar type 'char'.*" {
                                pass "explore_field_c_of_B"
                                gdb_test_multiple "\0" "return_to_B_from_c" {
                                    -re "$B_desc.*Enter the field number of choice:.*" {
                                        pass "return_to_B_from_c"
                                    }
                                }
                            }
                        }
                        gdb_test_multiple "\0" "return_to_gdb_prompt" {
                            -re "$gdb_prompt" {
                                pass "return_to_gdb_prompt_from_B"
                            }
                        }
                    }
                }
            }
        }
    }
}
