# Copyright (C) 2009, 2010 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
# of exposing types to Python.

if $tracelevel then {
    strace $tracelevel
}

set testfile "py-type"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# Build inferior to language specification.
proc build_inferior {lang} {
  global srcdir subdir srcfile binfile testfile hex

  if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug $lang"] != "" } {
      untested "Couldn't compile ${srcfile} in $lang mode"
      return -1
  }
}

# Restart GDB, set breakpoint and run to that breakpoint.
proc restart_gdb {bp} {
  global srcdir subdir srcfile binfile testfile hex

  gdb_exit
  gdb_start
  gdb_reinitialize_dir $srcdir/$subdir
  gdb_load ${binfile}

  if ![runto_main ] then {
      perror "couldn't run to breakpoint"
      return
  }

  gdb_breakpoint [gdb_get_line_number $bp]
  gdb_continue_to_breakpoint $bp
}


# Run a command in GDB, and report a failure if a Python exception is thrown.
# If report_pass is true, report a pass if no exception is thrown.
proc gdb_py_test_silent_cmd {cmd name report_pass} {
  global gdb_prompt

  gdb_test_multiple $cmd $name {
      -re "Traceback.*$gdb_prompt $"  { fail $name }
      -re "$gdb_prompt $"	      { if $report_pass { pass $name } }
  }
}

proc test_fields {lang} {
  global gdb_prompt

  if {$lang == "c++"} {
      # Test usage with a class
      gdb_py_test_silent_cmd "print c" "print value" 1
      gdb_py_test_silent_cmd "python c = gdb.history (0)" "get value from history" 1
      gdb_py_test_silent_cmd "python fields = c.type.fields()" "get fields" 1
      gdb_test "python print len(fields)" "2" "Check number of fields"
      gdb_test "python print fields\[0\].name" "c" "Check class field c name"
      gdb_test "python print fields\[1\].name" "d" "Check class field d name"
  }

  # Test normal fields usage in structs.
  gdb_py_test_silent_cmd "print st" "print value" 1
  gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value from history" 1
  gdb_py_test_silent_cmd "python fields = st.type.fields()" "get fields" 1
  gdb_test "python print len(fields)" "2" "Check number of fields"
  gdb_test "python print fields\[0\].name" "a" "Check structure field a name"
  gdb_test "python print fields\[1\].name" "b" "Check structure field b name"

  # Test regression PR python/10805
  gdb_py_test_silent_cmd "print ar" "print value" 1
  gdb_py_test_silent_cmd "python ar = gdb.history (0)" "get value from  history" 1
  gdb_test "python fields = ar.type.fields()"
  gdb_test "python print len(fields)" "1" "Check the number of fields"
  gdb_test "python print fields\[0\].type" "<range type>" "Check array field type"
}

proc test_base_class {} {
  gdb_py_test_silent_cmd "print d" "print value" 1
  gdb_py_test_silent_cmd "python d = gdb.history (0)" "get value from  history" 1
  gdb_py_test_silent_cmd "python fields = d.type.fields()" "get value from history" 1
  gdb_test "python print len(fields)" "3" "Check the number of fields"
  gdb_test "python print fields\[0\].is_base_class" "True" "Check base class"
  gdb_test "python print fields\[1\].is_base_class" "False" "Check base class"
}

proc test_range {} {

  # Test a valid range request.
  gdb_py_test_silent_cmd "print ar" "print value" 1
  gdb_py_test_silent_cmd "python ar = gdb.history (0)" "get value from history" 1
  gdb_test "python print len(ar.type.range())" "2" "Check correct tuple length"
  gdb_test "python print ar.type.range()\[0\]" "0" "Check low range"
  gdb_test "python print ar.type.range()\[1\]" "1" "Check high range"

  # Test a range request on a ranged type.
  gdb_py_test_silent_cmd "print ar" "print value" 1
  gdb_py_test_silent_cmd "python ar = gdb.history (0)" "get value from  history" 1
  gdb_py_test_silent_cmd "python fields = ar.type.fields()" "get fields" 1
  gdb_test "python print fields\[0\].type.range()\[0\]" "0" "Check range type low bound"
  gdb_test "python print fields\[0\].type.range()\[1\]" "1" "Check range type high bound"

  # Test where a range does not exist.
  gdb_py_test_silent_cmd "print st" "print value" 1
  gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value from history" 1
  gdb_test "python print st.type.range()" "RuntimeError: This type does not have a range.*" "Check range for non ranged type."
}


# Perform C Tests.
build_inferior "c"
restart_gdb "break to inspect struct and array."

gdb_test_multiple "python print 'hello, world!'" "verify python support" {
    -re "not supported.*$gdb_prompt $"	{
      unsupported "python support is disabled"
      return -1
    }
    -re "$gdb_prompt $"	{}
}

test_fields "c"

# Perform C++ Tests.
build_inferior "c++"
restart_gdb "break to inspect struct and array."
test_fields "c++"
test_base_class
test_range
