# Copyright (C) 2012-2026 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
}

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
}

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