# Copyright (C) 2010-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 types.py module.

load_lib gdb-python.exp

standard_testfile .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 }

if ![runto_main] then {
    return 0
}

gdb_test_no_output "python import gdb.types"

# test get_basic_type const stripping
gdb_test_no_output "python const_class1_obj = gdb.parse_and_eval ('const_class1_obj')"
gdb_test_no_output "python basic_type_const_class1_obj = gdb.types.get_basic_type (const_class1_obj.type)"
gdb_test "python print (str (const_class1_obj.type))" "const class1"
set test "const stripping"
gdb_test_multiple "python print (str (basic_type_const_class1_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test get_basic_type volatile stripping
gdb_test_no_output "python volatile_class1_obj = gdb.parse_and_eval ('volatile_class1_obj')"
gdb_test_no_output "python basic_type_volatile_class1_obj = gdb.types.get_basic_type (volatile_class1_obj.type)"
gdb_test "python print (str (volatile_class1_obj.type))" "volatile class1"
set test "volatile stripping"
gdb_test_multiple "python print (str (basic_type_volatile_class1_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test get_basic_type volatile+const stripping
gdb_test_no_output "python const_volatile_class1_obj = gdb.parse_and_eval ('const_volatile_class1_obj')"
gdb_test_no_output "python basic_type_const_volatile_class1_obj = gdb.types.get_basic_type (const_volatile_class1_obj.type)"
gdb_test "python print (str (const_volatile_class1_obj.type))" "const volatile class1"
set test "volatile+const stripping"
gdb_test_multiple "python print (str (basic_type_const_volatile_class1_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test get_basic_type typedef stripping
gdb_test_no_output "python typedef_class1_obj = gdb.parse_and_eval ('typedef_class1_obj')"
gdb_test_no_output "python basic_type_typedef_class1_obj = gdb.types.get_basic_type (typedef_class1_obj.type)"
gdb_test "python print (str (typedef_class1_obj.type))" "typedef_class1"
set test "typedef stripping"
gdb_test_multiple "python print (str (basic_type_typedef_class1_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test get_basic_type reference stripping
gdb_test_no_output "python class1_ref_obj = gdb.parse_and_eval ('class1_ref_obj')"
gdb_test_no_output "python basic_type_class1_ref_obj = gdb.types.get_basic_type (class1_ref_obj.type)"
gdb_test "python print (str (class1_ref_obj.type))" "class1 &"
set test "reference stripping"
gdb_test_multiple "python print (str (basic_type_class1_ref_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test nested typedef stripping
gdb_test_no_output "python typedef_const_typedef_class1_obj = gdb.parse_and_eval ('typedef_const_typedef_class1_obj')"
gdb_test_no_output "python basic_type_typedef_const_typedef_class1_obj = gdb.types.get_basic_type (typedef_const_typedef_class1_obj.type)"
gdb_test "python print (str (typedef_const_typedef_class1_obj.type))" "typedef_class1"
set test "nested typedef stripping"
gdb_test_multiple "python print (str (basic_type_typedef_const_typedef_class1_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test nested typedef/reference stripping
gdb_test_no_output "python typedef_const_typedef_class1_ref_obj = gdb.parse_and_eval ('typedef_const_typedef_class1_ref_obj')"
gdb_test_no_output "python basic_type_typedef_const_typedef_class1_ref_obj = gdb.types.get_basic_type (typedef_const_typedef_class1_ref_obj.type)"
gdb_test_multiple "python print (str (typedef_const_typedef_class1_ref_obj.type))" "" {
    -re -wrap "\[\r\n\]+const typedef_const_typedef_class1_ref" {
	# Compiler with PR gcc/55641.
	xfail $gdb_test_name
    }
    -re -wrap "\[\r\n\]+typedef_const_typedef_class1_ref" {
	pass $gdb_test_name
    }
}
set test "nested typedef/ref stripping"
gdb_test_multiple "python print (str (basic_type_typedef_const_typedef_class1_ref_obj))" $test {
    -re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

# test has_field on simple class
gdb_test_no_output "python class1_obj = gdb.parse_and_eval ('class1_obj')"
gdb_test "python print (gdb.types.has_field (class1_obj.type, 'x'))" "True"
gdb_test "python print (gdb.types.has_field (class1_obj.type, 'nope'))" "False"

# test has_field in base class
gdb_test_no_output "python subclass1_obj = gdb.parse_and_eval ('subclass1_obj')"
gdb_test "python print (gdb.types.has_field (subclass1_obj.type, 'x'))" "True"

# test make_enum_dict
gdb_test_no_output "python enum1_obj = gdb.parse_and_eval ('enum1_obj')"
gdb_test_no_output "python enum1_dict = gdb.types.make_enum_dict (enum1_obj.type)"
gdb_test_no_output "python enum1_list = sorted (enum1_dict.items ())"
gdb_test "python print (enum1_list)" {\[\('A', 0L?\), \('B', 1L?\), \('C', 2L?\)\]}

# test deep_items
gdb_test_no_output "python struct_a = gdb.lookup_type ('struct A')"
gdb_test "python print (struct_a.keys ())" {\['a', '', 'c', ''\]}
gdb_test "python print (\[k for k,v in gdb.types.deep_items(struct_a)\])" {\['a', 'b0', 'b1', 'bb0', 'bb1', 'bbb0', 'bbb1', 'c', 'dd0', 'dd1', 'd2', 'd3'\]}
