# Copyright (C) 2010-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 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 = enum1_dict.items ()"
gdb_test_no_output "python enum1_list.sort ()"
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'\]}
