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

if { [skip_cplus_tests] } { continue }

standard_testfile py-explore.cc

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

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

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"
                            }
                        }
                    }
                }
            }
        }
    }
}
