2012-12-06 Jens Elmenthaler <jens.elmenthaler@advantest.com>
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.python / py-mi.exp
CommitLineData
c5a57081 1# Copyright (C) 2008-2012 Free Software Foundation, Inc.
b6313243
TT
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16# This file is part of the GDB testsuite. It tests Python-based
17# pretty-printing for MI.
18
19load_lib mi-support.exp
20set MIFLAGS "-i=mi2"
21
22gdb_exit
23if [mi_gdb_start] {
24 continue
25}
26
b4a58790 27standard_testfile py-prettyprint.c
3b48433d 28set pyfile py-prettyprint.py
b6313243 29if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DMI}] != "" } {
3b48433d 30 untested ${testfile}.exp
b6313243
TT
31 return -1
32}
33
34mi_delete_breakpoints
35mi_gdb_reinitialize_dir $srcdir/$subdir
36mi_gdb_load ${binfile}
37
38if {[lsearch -exact [mi_get_features] python] < 0} {
39 unsupported "python support is disabled"
40 return -1
41}
42
43mi_runto main
44
3b48433d 45set remote_python_file [remote_download host ${srcdir}/${subdir}/${pyfile}]
f24fce77
NF
46
47mi_gdb_test "python execfile ('${remote_python_file}')" ""
b6313243 48
3b48433d 49mi_continue_to_line [gdb_get_line_number {MI breakpoint here} ${srcfile}] \
b6313243
TT
50 "step to breakpoint"
51
0cc7d26f
TT
52mi_create_dynamic_varobj container c \
53 "create container varobj, no pretty-printing"
54
55mi_list_varobj_children container {
56 { container.name name 1 string }
57 { container.len len 0 int }
58 { container.elements elements 1 "int ." }
59} "examine container children=0, no pretty-printing"
60
61mi_delete_varobj container "delete varobj"
62
79f283fe
PM
63mi_create_dynamic_varobj nscont nstype \
64 "create nscont varobj, no pretty-printing"
65
66mi_list_varobj_children nscont {
67 { nscont.len len 0 int }
68 { nscont.elements elements 1 "int ." }
69} "examine nscont children=0, no pretty-printing"
70
71mi_delete_varobj nscont "delete varobj"
72
0cc7d26f
TT
73mi_gdb_test "-enable-pretty-printing" ""
74
75mi_create_varobj_checked string string_1 \
76 "struct string_repr" \
77 "create string_1 varobj"
78
be759fcf
PM
79mi_create_varobj_checked lstring estring \
80 "struct lazystring" \
81 "create estring varobj"
82
0cc7d26f
TT
83mi_gdb_test "-data-evaluate-expression \"string_1 = string_2\"" ".*" \
84 "assign string_1 from string_2"
85
86mi_gdb_test "-var-update string" \
87 "\\^done,changelist=\\\[{name=\"string\",in_scope=\"true\",type_changed=\"false\",dynamic=\"1\",has_more=\"0\"}\\\]" \
88 "update string varobj after assignment"
89
90mi_create_dynamic_varobj container c \
91 "create container varobj"
b6313243
TT
92
93mi_list_varobj_children container {
94} "examine container children=0"
95
96mi_next "next over update 1"
97
0cc7d26f
TT
98mi_varobj_update_dynamic container "varobj update 1" {
99 type_changed false new_num_children 1 dynamic 1 has_more 0
100} {
101} {
102 { name {container.\[0\]} exp {\[0\]} numchild 0 type int thread-id 1 }
103}
b6313243
TT
104
105mi_next "next over update 2"
106
0cc7d26f
TT
107mi_varobj_update_dynamic container "varobj update 2" {
108 type_changed false new_num_children 2 dynamic 1 has_more 0
109} {
110} {
111 { name {container.\[1\]} exp {\[1\]} numchild 0 type int thread-id 1 }
112}
b6313243
TT
113
114mi_gdb_test "-var-set-visualizer container None" \
115 "\\^done" \
116 "clear visualizer"
117
118mi_gdb_test "-var-update container" \
119 "\\^done,changelist=\\\[\\\]" \
120 "varobj update after clearing"
121
122mi_gdb_test "-var-set-visualizer container gdb.default_visualizer" \
123 "\\^done" \
124 "choose default visualizer"
125
0cc7d26f
TT
126mi_varobj_update_dynamic container "varobj update after choosing default" {
127 type_changed false new_num_children 2 dynamic 1 has_more 0
128} {
129} {
130 { name {container.\[0\]} exp {\[0\]} numchild 0 type int thread-id 1 }
131 { name {container.\[1\]} exp {\[1\]} numchild 0 type int thread-id 1 }
132}
b6313243
TT
133
134mi_gdb_test "-var-set-visualizer container ContainerPrinter" \
135 "\\^done" \
136 "choose visualizer using expression"
137
0cc7d26f
TT
138mi_varobj_update_dynamic container \
139 "varobj update after choosing via expression" {
140 type_changed false new_num_children 2 dynamic 1 has_more 0
141 } {
142 } {
143 { name {container.\[0\]} exp {\[0\]} numchild 0 type int thread-id 1 }
144 { name {container.\[1\]} exp {\[1\]} numchild 0 type int thread-id 1 }
145 }
146
147mi_list_varobj_children_range container 1 2 2 {
148 { {container.\[1\]} {\[1\]} 0 int }
149} "list varobj children after selecting child range"
150
151mi_list_varobj_children_range container -1 -1 2 {
b6313243
TT
152 { {container.\[0\]} {\[0\]} 0 int }
153 { {container.\[1\]} {\[1\]} 0 int }
0cc7d26f
TT
154} "list varobj children after resetting child range"
155
156mi_next "next over update 3"
157
158mi_gdb_test "-var-set-update-range container 0 1" \
159 "\\^done" \
160 "set update range"
161
162# This should truncate the list.
163mi_list_varobj_children container {
164 { {container.\[0\]} {\[0\]} 0 int }
165} "list children after setting update range"
166
167# This should return just the items in [1,2).
168mi_list_varobj_children_range container 1 2 2 {
169 { {container.\[1\]} {\[1\]} 0 int }
170} "list selected children after setting range"
171
172# This should not be affected by the previous list-children request.
173mi_list_varobj_children container {
174 { {container.\[0\]} {\[0\]} 0 int }
175} "list children after listing selected range"
176
177mi_next "next over update 4"
178
179# This should only show the first child, because the update range has
180# been set.
181mi_varobj_update_dynamic container \
182 "update after next with restricted range" {
183 type_changed false new_num_children 1 dynamic 1 has_more 1
184 } {
731145cb 185 { name {container.\[0\]} in_scope true type_changed false has_more 0 }
0cc7d26f
TT
186 } {
187 }
188
189mi_gdb_test "-var-set-update-range container 3 4" \
190 "\\^done" \
191 "set update range with non-zero start"
192
193# Elements were updated but should not be reported.
194mi_varobj_update_dynamic container \
195 "update varobj with change outside selected range" {
196 type_changed false new_num_children 3 dynamic 1 has_more 0
197 } {
198 } {
199 }
200
201mi_next "next over update 5"
202
203# Regression test: examine an object that has no children, then update
204# it to ensure that we don't print the children.
205mi_create_dynamic_varobj container2 c2 \
206 "create second container varobj"
207
208mi_gdb_test "-var-update container2" \
209 "\\^done,changelist=.." \
210 "update varobj, no children requested"
211
212mi_next "next over update 6"
213
214# Now container2 has an element -- and an update should mention that
215# it has_more. But, because we did not request children, we still
216# should not actually see them.
217mi_varobj_update_dynamic container2 \
218 "update varobj 2, no children requested" {
219 type_changed false dynamic 1 has_more 1
220 } {} {}
221
222mi_continue_to_line \
3b48433d 223 [gdb_get_line_number {MI outer breakpoint here} ${srcfile}] \
0cc7d26f
TT
224 "step to outer breakpoint"
225
226mi_create_dynamic_varobj outer outer \
227 "create outer varobj"
228
229mi_list_varobj_children outer {
230 { outer.s s 2 "struct substruct" }
231 { outer.x x 0 "int" }
232} "list children of outer"
233
234mi_list_varobj_children outer.s {
235 { outer.s.a a 0 int }
236 { outer.s.b b 0 int }
237} "list children of outer.s"
238
239mi_next "next over outer update"
240
241mi_gdb_test "-var-update outer" \
731145cb 242 ".done,changelist=.{name=\"outer.s.a\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}." \
0cc7d26f 243 "update after updating element of outer"
b6313243
TT
244
245mi_continue_to_line \
3b48433d 246 [gdb_get_line_number {Another MI breakpoint} ${srcfile}] \
b6313243
TT
247 "step to second breakpoint"
248
249mi_varobj_update_with_type_change container int 0 "update after type change"
f24fce77 250
79f283fe
PM
251
252mi_continue_to_line \
3b48433d 253 [gdb_get_line_number {break to inspect struct and union} ${srcfile}] \
79f283fe
PM
254 "step to outer breakpoint"
255
256mi_create_dynamic_varobj nscont nstype \
257 "create nstype varobj"
258
259mi_list_varobj_children nscont {
260 { {nscont.\[0\]} {\[0\]} 0 int }
261 { {nscont.\[1\]} {\[1\]} 0 int }
262} "list children after setting update range"
263
264mi_gdb_test "-var-set-visualizer nscont None" \
265 "\\^done" \
266 "clear visualizer"
267
268mi_gdb_test "-var-update nscont" \
269 "\\^done,changelist=\\\[\\\]" \
270 "varobj update after clearing"
271
272mi_gdb_test "-var-set-visualizer nscont gdb.default_visualizer" \
273 "\\^done" \
274 "choose default visualizer"
275
a4c8e806
TT
276mi_gdb_test "python exception_flag = True" ""
277
278mi_create_dynamic_varobj nstype2 nstype2 \
279 "create nstype2 varobj"
280
281mi_list_varobj_children nstype2 {
282 { {nstype2.<error at 0>} {<error at 0>} 6 {char \[6\]} }
283} "list children after setting exception flag"
284
00bd41d6
PM
285mi_create_varobj me me \
286 "create me varobj"
287
288mi_gdb_test "-var-evaluate-expression me" \
289 "\\^done,value=\"<error reading variable: Cannot access memory.>.*\"" \
290 "evaluate me varobj"
291
2c12abee
TT
292# Regression test for python/14836.
293mi_create_dynamic_varobj children_as_list children_as_list \
294 "printer whose children are returned as a list"
295
731145cb
TT
296# Regression test for bug 14741.
297mi_continue_to_line \
298 [gdb_get_line_number {breakpoint bug 14741} ${srcfile}] \
299 "step to breakpoint for bug 14741"
300
301mi_create_dynamic_varobj c c \
302 "create varobj for c"
303
304mi_gdb_test "-var-set-visualizer c ArrayPrinter" \
305 "\\^done" \
306 "choose array visualizer for c"
307
308mi_list_varobj_children c {
309 { {c.\[0\]} {\[0\]} 0 int }
310} "list children of c"
311
312mi_next "next over change of array element"
313
314mi_gdb_test "-var-update c" \
315 "\\^done,changelist=\\\[{name=\"c.\\\[0\\\]\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}\\\]" \
316 "update varobj after element change"
317
d65aec65
PM
318# C++ MI tests
319gdb_exit
db8e4570 320if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" \
d65aec65
PM
321 executable {debug c++ additional_flags=-DMI}] != "" } {
322 untested "Couldn't compile ${srcfile} in c++ mode"
323 return -1
324}
325
326if [mi_gdb_start] {
327 continue
328}
329mi_delete_breakpoints
330mi_gdb_reinitialize_dir $srcdir/$subdir
db8e4570 331mi_gdb_load ${binfile}-cxx
d65aec65
PM
332
333if {[lsearch -exact [mi_get_features] python] < 0} {
334 unsupported "python support is disabled"
335 return -1
336}
337
338mi_runto main
339mi_continue_to_line \
3b48433d 340 [gdb_get_line_number {break to inspect struct and union} ${srcfile}] \
d65aec65
PM
341 "step to breakpoint"
342
343# Test python/12531. Install visualizer on a cplus_fake_child.
344mi_create_varobj fake fake \
345 "create fake varobj"
346
347mi_list_varobj_children fake {
348 { fake.private private 1 }
349} "list children of fake"
350
351mi_list_varobj_children fake.private {
352 { fake.private.sname sname 0 int }
353} "list children fake.private"
354
355mi_gdb_test "-var-set-visualizer fake.private gdb.default_visualizer" \
356 "\\^done" "Install visualizer on a cplus_fake_child"
357
f24fce77 358remote_file host delete ${remote_python_file}
This page took 0.437393 seconds and 4 git commands to generate.