[lldb-dap] Support column breakpoints (#113787) · llvm/llvm-project@4f48a81 (original) (raw)
`@@ -125,20 +125,18 @@ def test_set_and_clear(self):
`
125
125
`# Set 3 breakpoints and verify that they got set correctly
`
126
126
`response = self.dap_server.request_setBreakpoints(self.main_path, lines)
`
127
127
`line_to_id = {}
`
128
``
`-
if response:
`
129
``
`-
breakpoints = response["body"]["breakpoints"]
`
130
``
`-
self.assertEqual(
`
131
``
`-
len(breakpoints),
`
132
``
`-
len(lines),
`
133
``
`-
"expect %u source breakpoints" % (len(lines)),
`
134
``
`-
)
`
135
``
`-
for breakpoint, index in zip(breakpoints, range(len(lines))):
`
136
``
`-
line = breakpoint["line"]
`
137
``
`-
self.assertTrue(line, lines[index])
`
138
``
`-
Store the "id" of the breakpoint that was set for later
`
139
``
`-
line_to_id[line] = breakpoint["id"]
`
140
``
`-
self.assertIn(line, lines, "line expected in lines array")
`
141
``
`-
self.assertTrue(breakpoint["verified"], "expect breakpoint verified")
`
``
128
`+
breakpoints = response["body"]["breakpoints"]
`
``
129
`+
self.assertEqual(
`
``
130
`+
len(breakpoints),
`
``
131
`+
len(lines),
`
``
132
`+
"expect %u source breakpoints" % (len(lines)),
`
``
133
`+
)
`
``
134
`+
for index, breakpoint in enumerate(breakpoints):
`
``
135
`+
line = breakpoint["line"]
`
``
136
`+
self.assertEqual(line, lines[index])
`
``
137
`+
Store the "id" of the breakpoint that was set for later
`
``
138
`+
line_to_id[line] = breakpoint["id"]
`
``
139
`+
self.assertTrue(breakpoint["verified"], "expect breakpoint verified")
`
142
140
``
143
141
`# There is no breakpoint delete packet, clients just send another
`
144
142
`# setBreakpoints packet with the same source file with fewer lines.
`
`@@ -151,75 +149,66 @@ def test_set_and_clear(self):
`
151
149
`# Set 2 breakpoints and verify that the previous breakpoints that were
`
152
150
`# set above are still set.
`
153
151
`response = self.dap_server.request_setBreakpoints(self.main_path, lines)
`
154
``
`-
if response:
`
155
``
`-
breakpoints = response["body"]["breakpoints"]
`
``
152
`+
breakpoints = response["body"]["breakpoints"]
`
``
153
`+
self.assertEqual(
`
``
154
`+
len(breakpoints),
`
``
155
`+
len(lines),
`
``
156
`+
"expect %u source breakpoints" % (len(lines)),
`
``
157
`+
)
`
``
158
`+
for index, breakpoint in enumerate(breakpoints):
`
``
159
`+
line = breakpoint["line"]
`
``
160
`+
self.assertEqual(line, lines[index])
`
``
161
`+
Verify the same breakpoints are still set within LLDB by
`
``
162
`+
making sure the breakpoint ID didn't change
`
156
163
`self.assertEqual(
`
157
``
`-
len(breakpoints),
`
158
``
`-
len(lines),
`
159
``
`-
"expect %u source breakpoints" % (len(lines)),
`
``
164
`+
line_to_id[line],
`
``
165
`+
breakpoint["id"],
`
``
166
`+
"verify previous breakpoints stayed the same",
`
160
167
` )
`
161
``
`-
for breakpoint, index in zip(breakpoints, range(len(lines))):
`
162
``
`-
line = breakpoint["line"]
`
163
``
`-
self.assertTrue(line, lines[index])
`
164
``
`-
Verify the same breakpoints are still set within LLDB by
`
165
``
`-
making sure the breakpoint ID didn't change
`
166
``
`-
self.assertEqual(
`
167
``
`-
line_to_id[line],
`
168
``
`-
breakpoint["id"],
`
169
``
`-
"verify previous breakpoints stayed the same",
`
170
``
`-
)
`
171
``
`-
self.assertIn(line, lines, "line expected in lines array")
`
172
``
`-
self.assertTrue(
`
173
``
`-
breakpoint["verified"], "expect breakpoint still verified"
`
174
``
`-
)
`
``
168
`+
self.assertTrue(breakpoint["verified"], "expect breakpoint still verified")
`
175
169
``
176
170
`# Now get the full list of breakpoints set in the target and verify
`
177
171
`# we have only 2 breakpoints set. The response above could have told
`
178
172
`# us about 2 breakpoints, but we want to make sure we don't have the
`
179
173
`# third one still set in the target
`
180
174
`response = self.dap_server.request_testGetTargetBreakpoints()
`
181
``
`-
if response:
`
182
``
`-
breakpoints = response["body"]["breakpoints"]
`
``
175
`+
breakpoints = response["body"]["breakpoints"]
`
``
176
`+
self.assertEqual(
`
``
177
`+
len(breakpoints),
`
``
178
`+
len(lines),
`
``
179
`+
"expect %u source breakpoints" % (len(lines)),
`
``
180
`+
)
`
``
181
`+
for breakpoint in breakpoints:
`
``
182
`+
line = breakpoint["line"]
`
``
183
`+
Verify the same breakpoints are still set within LLDB by
`
``
184
`+
making sure the breakpoint ID didn't change
`
183
185
`self.assertEqual(
`
184
``
`-
len(breakpoints),
`
185
``
`-
len(lines),
`
186
``
`-
"expect %u source breakpoints" % (len(lines)),
`
``
186
`+
line_to_id[line],
`
``
187
`+
breakpoint["id"],
`
``
188
`+
"verify previous breakpoints stayed the same",
`
187
189
` )
`
188
``
`-
for breakpoint in breakpoints:
`
189
``
`-
line = breakpoint["line"]
`
190
``
`-
Verify the same breakpoints are still set within LLDB by
`
191
``
`-
making sure the breakpoint ID didn't change
`
192
``
`-
self.assertEqual(
`
193
``
`-
line_to_id[line],
`
194
``
`-
breakpoint["id"],
`
195
``
`-
"verify previous breakpoints stayed the same",
`
196
``
`-
)
`
197
``
`-
self.assertIn(line, lines, "line expected in lines array")
`
198
``
`-
self.assertTrue(
`
199
``
`-
breakpoint["verified"], "expect breakpoint still verified"
`
200
``
`-
)
`
``
190
`+
self.assertIn(line, lines, "line expected in lines array")
`
``
191
`+
self.assertTrue(breakpoint["verified"], "expect breakpoint still verified")
`
201
192
``
202
193
`# Now clear all breakpoints for the source file by passing down an
`
203
194
`# empty lines array
`
204
195
`lines = []
`
205
196
`response = self.dap_server.request_setBreakpoints(self.main_path, lines)
`
206
``
`-
if response:
`
207
``
`-
breakpoints = response["body"]["breakpoints"]
`
208
``
`-
self.assertEqual(
`
209
``
`-
len(breakpoints),
`
210
``
`-
len(lines),
`
211
``
`-
"expect %u source breakpoints" % (len(lines)),
`
212
``
`-
)
`
``
197
`+
breakpoints = response["body"]["breakpoints"]
`
``
198
`+
self.assertEqual(
`
``
199
`+
len(breakpoints),
`
``
200
`+
len(lines),
`
``
201
`+
"expect %u source breakpoints" % (len(lines)),
`
``
202
`+
)
`
213
203
``
214
204
`# Verify with the target that all breakpoints have been cleared
`
215
205
`response = self.dap_server.request_testGetTargetBreakpoints()
`
216
``
`-
if response:
`
217
``
`-
breakpoints = response["body"]["breakpoints"]
`
218
``
`-
self.assertEqual(
`
219
``
`-
len(breakpoints),
`
220
``
`-
len(lines),
`
221
``
`-
"expect %u source breakpoints" % (len(lines)),
`
222
``
`-
)
`
``
206
`+
breakpoints = response["body"]["breakpoints"]
`
``
207
`+
self.assertEqual(
`
``
208
`+
len(breakpoints),
`
``
209
`+
len(lines),
`
``
210
`+
"expect %u source breakpoints" % (len(lines)),
`
``
211
`+
)
`
223
212
``
224
213
`# Now set a breakpoint again in the same source file and verify it
`
225
214
`# was added.
`
`@@ -281,12 +270,11 @@ def test_clear_breakpoints_unset_breakpoints(self):
`
281
270
`self.assertEqual(
`
282
271
`len(breakpoints), len(lines), "expect %u source breakpoints" % (len(lines))
`
283
272
` )
`
284
``
`-
for breakpoint, index in zip(breakpoints, range(len(lines))):
`
``
273
`+
for index, breakpoint in enumerate(breakpoints):
`
285
274
`line = breakpoint["line"]
`
286
``
`-
self.assertTrue(line, lines[index])
`
``
275
`+
self.assertEqual(line, lines[index])
`
287
276
`# Store the "id" of the breakpoint that was set for later
`
288
277
`line_to_id[line] = breakpoint["id"]
`
289
``
`-
self.assertIn(line, lines, "line expected in lines array")
`
290
278
`self.assertTrue(breakpoint["verified"], "expect breakpoint verified")
`
291
279
``
292
280
`# Now clear all breakpoints for the source file by not setting the
`
`@@ -356,3 +344,49 @@ def test_functionality(self):
`
356
344
`self.continue_to_breakpoints(breakpoint_ids)
`
357
345
`i = int(self.dap_server.get_local_variable_value("i"))
`
358
346
`self.assertEqual(i, 7, "i != 7 showing post hitCondition hits every time")
`
``
347
+
``
348
`+
@skipIfWindows
`
``
349
`+
def test_column_breakpoints(self):
`
``
350
`+
"""Test setting multiple breakpoints in the same line at different columns."""
`
``
351
`+
loop_line = line_number("main.cpp", "// break loop")
`
``
352
+
``
353
`+
program = self.getBuildArtifact("a.out")
`
``
354
`+
self.build_and_launch(program)
`
``
355
+
``
356
`+
Set two breakpoints on the loop line at different columns.
`
``
357
`+
columns = [13, 39]
`
``
358
`+
response = self.dap_server.request_setBreakpoints(
`
``
359
`+
self.main_path, [loop_line, loop_line], list({"column": c} for c in columns)
`
``
360
`+
)
`
``
361
+
``
362
`+
Verify the breakpoints were set correctly
`
``
363
`+
breakpoints = response["body"]["breakpoints"]
`
``
364
`+
breakpoint_ids = []
`
``
365
`+
self.assertEqual(
`
``
366
`+
len(breakpoints),
`
``
367
`+
len(columns),
`
``
368
`+
"expect %u source breakpoints" % (len(columns)),
`
``
369
`+
)
`
``
370
`+
for index, breakpoint in enumerate(breakpoints):
`
``
371
`+
self.assertEqual(breakpoint["line"], loop_line)
`
``
372
`+
self.assertEqual(breakpoint["column"], columns[index])
`
``
373
`+
self.assertTrue(breakpoint["verified"], "expect breakpoint verified")
`
``
374
`+
breakpoint_ids.append(breakpoint["id"])
`
``
375
+
``
376
`+
Continue to the first breakpoint,
`
``
377
`+
self.continue_to_breakpoints([breakpoint_ids[0]])
`
``
378
+
``
379
`` +
We should have stopped right before the call to twelve
.
``
``
380
`` +
Step into and check we are inside twelve
.
``
``
381
`+
self.stepIn()
`
``
382
`+
func_name = self.get_stackFrames()[0]["name"]
`
``
383
`+
self.assertEqual(func_name, "twelve(int)")
`
``
384
+
``
385
`+
Continue to the second breakpoint.
`
``
386
`+
self.continue_to_breakpoints([breakpoint_ids[1]])
`
``
387
+
``
388
`` +
We should have stopped right before the call to fourteen
.
``
``
389
`` +
Step into and check we are inside fourteen
.
``
``
390
`+
self.stepIn()
`
``
391
`+
func_name = self.get_stackFrames()[0]["name"]
`
``
392
`+
self.assertEqual(func_name, "a::fourteen(int)")
`