# 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