# Copyright (C) 2012 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 $testfile.exp $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"
                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_i"
                                    }
                                }
                            }
                        }
                        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"
                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"
                                    }
                                }
                            }
                        }
                        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"
                            }
                        }
                    }
                }
            }
        }
    }
}
