# Copyright (C) 2010-2013 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 $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

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

if ![runto_main] then {
    fail "Can't run to main"
    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_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 "python print (str (typedef_const_typedef_class1_ref_obj.type))" "const typedef_const_typedef_class1_ref"
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'\]}
