blob: d2de6f3deea913527d42fee955598fa5fffec652 [file] [log] [blame]
# Varobj Tests (C++ language)
# Copyright (C) 1998, 2003 Red Hat, 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Please email any bugs, comments, and/or additions to this file to:
# insight@sources.redhat.com
# This file was written by Keith Seitz (keiths@cygnus.com)
# Read in the standard defs file
if {![gdbtk_read_defs]} {
break
}
global objdir test_ran
# Load in a file
set program [file join $objdir cpp_variable]
if {[catch {gdbtk_test_file $program} t]} {
# This isn't a test case, since if this fails, we're hosed.
gdbtk_test_error "loading \"$program\": $t"
}
# The variables that are created are stored in an array called "var".
# proc to tell us which of the variables are changed/out of scope
proc check_update {} {
global var
set out {}
set changed {}
foreach ind [array names var] {
set ret [$var($ind) update]
if {$ret == -1} {
lappend out $ind
} elseif {$ret != ""} {
lappend changed $ret
}
}
return [list $changed $out]
}
# proc to create a variable
proc create_variable {expr} {
global var
set err [catch {gdb_variable create "$expr" -expr $expr} v]
if {!$err} {
set var($expr) $v
}
return $err
}
# proc to get the children
# Children are stored in the global "var" as
# PARENT.child. So for struct _foo {int a; int b} bar;,
# the children returned are {a b} and var(bar.a) and var(bar.b)
# map the actual objects to their names.
proc get_children {parent} {
global var
set kiddies [$var($parent) children]
set children {}
foreach child $kiddies {
set name [lindex [split $child .] end]
lappend children $name
set var($parent.$name) $child
}
return $children
}
proc delete_variable {varname} {
global var
if {[info exists var($varname)]} {
# This has to be caught, since deleting a parent
# will erase all children.
$var($varname) delete
set vars [array names var $varname*]
foreach v $vars {
if {[info exists var($v)]} {
unset var($v)
}
}
}
}
# Compare the values of variable V in format FMT with value of OBJ
# with gdb's value.
proc cppvalue {obj v fmt} {
global var
global _test
puts $_test(logfile) "obj=$obj v=$v fmt=$fmt"
puts $_test(logfile) "var(\$obj)=$var($obj)"
set value [$var($obj) value]
set gdb [gdb_cmd "output/$fmt $v"]
puts $_test(logfile) "output/$fmt $v"
if {$value == $gdb} {
puts $_test(logfile) "gdbtk: $value == gdb: $gdb"
set result ok
} else {
set result $v
puts $_test(logfile) "gdbtk: $value <> gdb: $gdb"
}
return $result
}
proc delete_all_variables {} {
global var
foreach variable [array names var] {
delete_variable $variable
}
}
##### #####
# #
# Simple Class Tests #
# #
##### #####
# run to "do_simple_class_tests"
gdb_cmd "break do_simple_class_tests"
gdbtk_test_run
# Test: cpp_variable-1.1
# Desc: stopped in do_simple_class_tests
gdbtk_test cpp_variable-1.1 {stopped in do_simple_class_tests} {
# G++ can output "do_simple_class_tests(void)". Strip the "(void)" part.
set loc [lindex [gdb_loc] 1]
set index [string first \( $loc]
if {$index > 0} {
set loc [string range $loc 0 [expr {$index-1}]]
}
set loc
} {do_simple_class_tests}
# Test: cpp_variable-1.2
# Desc: create variable v
gdbtk_test cpp_variable-1.2 {create variable v} {
create_variable v
} {0}
# Test: cpp_variable-1.3
# Desc: number of children of v
gdbtk_test cpp_variable-1.3 {number of children of v} {
$var(v) numChildren
} {5}
# Test: cpp_variable-1.4a
# Desc: children of v
gdbtk_test cpp_variable-1.4a {children of v} {
get_children v
} {VA VB VC public private}
# Test: cpp_variable-1.4b
# Desc: public children of v
gdbtk_test cpp_variable-1.4b {public children of v} {
get_children v.public
} {v_pub_int v_pub_charp}
# Test: cpp_variable-1.4c
# Desc: private children of v
gdbtk_test cpp_variable-1.4c {private children of v} {
get_children v.private
} {v_priv_int v_priv_charp}
# Test: cpp_variable-1.5
# Desc: type of v
gdbtk_test cpp_variable-1.5 {type of v} {
$var(v) type
} {V *}
# Test: cpp_variable-1.6
# Desc: format of v
gdbtk_test cpp_variable-1.6 {format of v} {
$var(v) format
} {natural}
set value {}
catch {$var(v) value} value
# Test: cpp_variable-1.6a
# Desc: Step over "V *v = new V;"
gdbtk_test cpp_variable-1.6a {step over "V *v = new V;"} {
catch {gdb_cmd "next"}
} {0}
# Test: cpp_variable-1.7
# Desc: check value of v changed
gdbtk_test cpp_variable-1.7 {check value of v changed} {
set changes [check_update]
# It is undefined whether the children will change values
# or not, so ignore them.
expr {[lsearch [lindex [lindex $changes 0] 0] v] != -1}
} {1}
# Test: cpp_variable-1.8
# Desc: check values of v
gdbtk_test cpp_variable-1.8 {check values of v} {
set new [$var(v) value]
expr {$new != $value}
} {1}
# Test: cpp_variable-1.9
# Desc: v editable
gdbtk_test cpp_variable-1.9 {v editable} {
$var(v) editable
} {1}
##### #####
# #
# Children of v tests #
# #
##### #####
# Test: cpp_variable-2.1
# Desc: type of v.v_pub_int
gdbtk_test cpp_variable-2.1 {type of v.v_pub_int} {
$var(v.public.v_pub_int) type
} {int}
# Test: cpp_variable-2.2
# Desc: format of v.v_pub_int
gdbtk_test cpp_variable-2.2 {format of v.v_pub_int} {
$var(v.public.v_pub_int) format
} {natural}
# Test: cpp_variable-2.2a
# Desc: set variable v->v_pub_int=2112
gdbtk_test cpp_variable-2.2a {set variable v.v_pub_int=2112} {
set err [catch {gdb_cmd "set variable v.v_pub_int=2112"} txt]
if {$err} {
set txt
} else {
set err
}
} {0}
# Test: cpp_variable-2.3
# Desc: value of v.v_pub_int changed
gdbtk_test cpp_variable-2.3 {value of v.v_pub_int changed} {
check_update
} {v.public.v_pub_int {v.private.v_priv_charp v.VB v.private.v_priv_int v.VC v.public.v_pub_charp v.public.v_pub_int v.private v.public v.VA}}
# Test: cpp_variable-2.4
# Desc: value of v.v_pub_int
gdbtk_test cpp_variable-2.4 {value of v.v_pub_int} {
$var(v.public.v_pub_int) value
} {2112}
# Test: cpp_variable-2.5
# Desc: changed format of v.v_pub_int
gdbtk_test cpp_variable-2.5 {changed format of v.v_pub_int} {
$var(v.public.v_pub_int) format octal
$var(v.public.v_pub_int) format
} {octal}
# Test: cpp_variable-2.6
# Desc: value of v.v_pub_int with new format
gdbtk_test cpp_variable-2.6 {value of v.v_pub_int with new format} {
$var(v.public.v_pub_int) value
} {04100}
# Test: cpp_variable-2.7
# Desc: change value of v.v_pub_int (decimal)
gdbtk_test cpp_variable-2.7 {change value of v.v_pub_int (decimal)} {
$var(v.public.v_pub_int) value 3
cppvalue v.public.v_pub_int v.v_pub_int o
} {ok}
# Test: cpp_variable-2.8
# Desc: change value of v.v_pub_int (hexadecimal)
gdbtk_test cpp_variable-2.8 {change value of v.v_pub_int (hexadecimal)} {
$var(v.public.v_pub_int) value 0x21
cppvalue v.public.v_pub_int v.v_pub_int o
} {ok}
# Test: cpp_variable-2.9
# Desc: number of children of v_pub_int
gdbtk_test cpp_variable-2.9 {number of children of v_pub_int} {
$var(v.public.v_pub_int) numChildren
} {0}
# Test: cpp_variable-2.10
# Desc: children of v.v_pub_int
gdbtk_test cpp_variable-2.10 {children of v.v_pub_int} {
get_children v.public.v_pub_int
} {}
# Test: cpp_variable-2.11
# Desc: v.v_pub_int editable
gdbtk_test cpp_variable-2.11 {v.v_pub_int editable} {
$var(v.public.v_pub_int) editable
} {1}
# Test: cpp_variable-2.21
# Desc: type of v.v_priv_charp
gdbtk_test cpp_variable-2.21 {type of v.v_priv_charp} {
$var(v.private.v_priv_charp) type
} {char *}
# Test: cpp_variable-2.22
# Desc: format of v.v_priv_charp
gdbtk_test cpp_variable-2.22 {format of v.v_priv_charp} {
$var(v.private.v_priv_charp) format
} {natural}
# Test: cpp_variable-2.22a
# Desc: set variable v->v_priv_charp=2112
gdbtk_test cpp_variable-2.22a {set variable v->v_priv_charp=2112} {
set err [catch {gdb_cmd "set variable v->v_priv_charp=2112"} txt]
if {$err} {
set txt
} else {
set err
}
} {0}
# Test: cpp_variable-2.23
# Desc: value of v.v_priv_charp changed
gdbtk_test cpp_variable-2.23 {value of v.v_priv_charp changed} {
check_update
} {{{v.public.v_pub_int v.private.v_priv_charp}} {v.private.v_priv_charp v.VB v.private.v_priv_int v.VC v.public.v_pub_charp v.public.v_pub_int v.private v.public v.VA}}
# Test: cpp_variable-2.24
# Desc: value of v.v_priv_charp
gdbtk_test cpp_variable-2.24 {value of v.v_priv_charp} {
$var(v.private.v_priv_charp) format hexadecimal
$var(v.private.v_priv_charp) value
} {0x840}
# Test: cpp_variable-2.25
# Desc: changed format of v.v_priv_charp
gdbtk_test cpp_variable-2.25 {changed format of v.v_priv_charp} {
$var(v.private.v_priv_charp) format octal
$var(v.private.v_priv_charp) format
} {octal}
# Test: cpp_variable-2.26
# Desc: value of v.v_priv_charp with new format
gdbtk_test cpp_variable-2.26 {value of v.v_priv_charp with new format} {
$var(v.private.v_priv_charp) value
} {04100}
# Test: cpp_variable-2.27
# Desc: change value of v.v_priv_charp (decimal)
gdbtk_test cpp_variable-2.27 {change value of v.v_priv_charp (decimal)} {
$var(v.private.v_priv_charp) value 3
cppvalue v.private.v_priv_charp v.v_priv_charp o
} {ok}
# Test: cpp_variable-2.28
# Desc: change value of v.v_priv_charp (hexadecimal)
gdbtk_test cpp_variable-2.28 {change value of v.v_priv_charp (hexadecimal)} {
$var(v.private.v_priv_charp) value 0x21
cppvalue v.private.v_priv_charp v.v_priv_charp o
} {ok}
# Test: cpp_variable-2.29
# Desc: number of children of v_priv_charp
gdbtk_test cpp_variable-2.29 {number of children of v_priv_charp} {
$var(v.private.v_priv_charp) numChildren
} {1}
# Test: cpp_variable-2.30
# Desc: children of v.v_priv_charp
gdbtk_test cpp_variable-2.30 {children of v.v_priv_charp} {
get_children v.private.v_priv_charp
} {*v_priv_charp}
# Test: cpp_variable-2.31
# Desc: v.v_priv_int editable
gdbtk_test cpp_variable-2.31 {v.v_priv_int editable} {
$var(v.private.v_priv_int) editable
} {1}
# Test: cpp_variable-2.41
# Desc: type of v.VA
gdbtk_test cpp_variable-2.41 {type of v.VA} {
$var(v.VA) type
} {VA}
# Test: cpp_variable-2.42
# Desc: format of v.VA
gdbtk_test cpp_variable-2.42 {format of v.VA} {
$var(v.VA) format
} {natural}
# Test: cpp_variable-2.43
# Desc: value of v.VA changed
gdbtk_test cpp_variable-2.43 {value of v.VA changed} {
check_update
} {v.private.v_priv_charp {v.private.v_priv_charp v.VB v.private.v_priv_int v.VC v.public.v_pub_charp v.private.v_priv_charp.*v_priv_charp v.public.v_pub_int v.private v.public v.VA}}
# Test: cpp_variable-2.44
# Desc: value of v.VA
gdbtk_test cpp_variable-2.44 {value of v.VA} {
$var(v.VA) value
} {{...}}
# Test: cpp_variable-2.45
# Desc: changed format of v.VA
gdbtk_test cpp_variable-2.45 {changed format of v.VA} {
$var(v.VA) format octal
$var(v.VA) format
} {octal}
# Test: cpp_variable-2.46
# Desc: value of v.VA with new format
gdbtk_test cpp_variable-2.46 {value of v.VA with new format} {
$var(v.VA) value
} {{...}}
# Test: cpp_variable-2.47
# Desc: number of children of VA
gdbtk_test cpp_variable-2.47 {number of children of VA} {
$var(v.VA) numChildren
} {3}
# Test: cpp_variable-2.48a
# Desc: children of v.VA
gdbtk_test cpp_variable-2.48a {children of v.VA} {
get_children v.VA
} {public private protected}
# Test: cpp_variable-2.48b
# Desc: public children of v.VA
gdbtk_test cpp_variable-2.48b {children of v.VA} {
get_children v.VA.public
} {va_pub_int va_pub_charp}
# Test: cpp_variable-2.48c
# Desc: private children of v.VA
gdbtk_test cpp_variable-2.48c {children of v.VA} {
get_children v.VA.private
} {va_priv_int va_priv_charp}
# Test: cpp_variable-2.48d
# Desc: protected children of v.VA
gdbtk_test cpp_variable-2.48d {children of v.VA} {
get_children v.VA.protected
} {bar}
# Test: cpp_variable-2.49
# Desc: v.VA editable
gdbtk_test cpp_variable-2.49 {v.VA editable} {
$var(v.VA) editable
} {0}
# Test: cpp_variable-2.61
# Desc: type of v.VB
gdbtk_test cpp_variable-2.61 {type of v.VB} {
$var(v.VB) type
} {VB}
# Test: cpp_variable-2.62
# Desc: format of v.VB
gdbtk_test cpp_variable-2.62 {format of v.VB} {
$var(v.VB) format
} {natural}
# Test: cpp_variable-2.63
# Desc: value of v.VB changed
gdbtk_test cpp_variable-2.63 {value of v.VB changed} {
check_update
} {{} {v.VA.protected v.private.v_priv_charp.*v_priv_charp v.VA.private v.VA.public.va_pub_int v.private.v_priv_int v.public.v_pub_int v.VA.public.va_pub_charp v.private.v_priv_charp v.VA.public v.public.v_pub_charp v.VA.private.va_priv_int v.VA v.public v.VB v.VC v.VA.protected.bar v.VA.private.va_priv_charp v.private}}
# Test: cpp_variable-2.64
# Desc: value of v.VB
gdbtk_test cpp_variable-2.64 {value of v.VB} {
$var(v.VB) value
} {{...}}
# Test: cpp_variable-2.65
# Desc: changed format of v.VB
gdbtk_test cpp_variable-2.65 {changed format of v.VB} {
$var(v.VB) format octal
$var(v.VB) format
} {octal}
# Test: cpp_variable-2.66
# Desc: value of v.VB with new format
gdbtk_test cpp_variable-2.66 {value of v.VB with new format} {
$var(v.VB) value
} {{...}}
# Note: The next two tests show whether or not the logic
# concerning vptr tables is working.
# Test: cpp_variable-2.67
# Desc: number of children of VB
gdbtk_test cpp_variable-2.67 {number of children of VB} {
$var(v.VB) numChildren
} {2}
# Test: cpp_variable-2.68a
# Desc: children of v.VB
gdbtk_test cpp_variable-2.68a {children of v.VB} {
get_children v.VB
} {public private}
# Test: cpp_variable-2.68b
# Desc: public children of v.VB
gdbtk_test cpp_variable-2.68b {children of v.VB} {
get_children v.VB.public
} {vb_pub_int}
# Test: cpp_variable-2.68c
# Desc: private children of v.VB
gdbtk_test cpp_variable-2.68c {children of v.VB} {
get_children v.VB.private
} {vb_priv_int vb_priv_charp}
# Test: cpp_variable-2.69
# Desc: v.VB editable
gdbtk_test cpp_variable-2.69 {v.VB editable} {
$var(v.VB) editable
} {0}
# Test: cpp_variable-2.70
# Desc: v.VB.public editable
gdbtk_test cpp_variable-2.70 {v.VB.public editable} {
$var(v.VB.public) editable
} {0}
# Test: cpp_variable-2.71
# Desc: v.VB.vb_pub_int editable
gdbtk_test cpp_variable-2.71 {v.VB.vb_pub_int editable} {
$var(v.VB.public.vb_pub_int) editable
} {1}
# Test: cpp_variable-2.71a
# Desc: set variable v->vb_pub_int=2112
gdbtk_test cpp_variable-2.71a {set variable v->v_pub_int=2112} {
set err [catch {gdb_cmd "set variable v->vb_pub_int=2112"} txt]
if {$err} {
set txt
} else {
set err
}
} {0}
# Test: cpp_variable-2.72
# Desc: value of v.vb_pub_int changed
gdbtk_test cpp_variable-2.72 {value of v.vb_pub_int changed} {
check_update
} {v.VB.public.vb_pub_int {v.VB.public v.VA.protected v.private.v_priv_charp.*v_priv_charp v.VA.private v.VB.private.vb_priv_int v.VB.private v.VA.public.va_pub_int v.private.v_priv_int v.VB.public.vb_pub_int v.public.v_pub_int v.VB.private.vb_priv_charp v.VA.public.va_pub_charp v.private.v_priv_charp v.VA.public v.public.v_pub_charp v.VA.private.va_priv_int v.VA v.public v.VB v.VC v.VA.protected.bar v.VA.private.va_priv_charp v.private}}
# Test: cpp_variable-2.73
# Desc: value of v.VB.vb_pub_int
gdbtk_test cpp_variable-2.73 {changed value of v.vb_pub_int} {
$var(v.VB.public.vb_pub_int) value
} {2112}
# Test: cpp_variable-2.74
# Desc: change value of v.VB.vb_pub_int
gdbtk_test cpp_variable-2.74 {change value of v.VB.public.vb_pub_int} {
$var(v.VB.public.vb_pub_int) value 3
cppvalue v.VB.public.vb_pub_int v.vb_pub_int d
} {ok}
# Test: cpp_variable-2.75
# Desc: value of v.VB.vb_pub_int
gdbtk_test cpp_variable-2.75 {changed value of v.VB.public.vb_pub_int} {
$var(v.VB.public.vb_pub_int) value
} {3}
# Exit
#
gdbtk_test_done
#Local Variables:
#mode: tcl