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