@@ -125,20 +125,18 @@ def test_set_and_clear(self):
125125 # Set 3 breakpoints and verify that they got set correctly
126126 response = self .dap_server .request_setBreakpoints (self .main_path , lines )
127127 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" )
142140
143141 # There is no breakpoint delete packet, clients just send another
144142 # setBreakpoints packet with the same source file with fewer lines.
@@ -151,75 +149,66 @@ def test_set_and_clear(self):
151149 # Set 2 breakpoints and verify that the previous breakpoints that were
152150 # set above are still set.
153151 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
156163 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" ,
160167 )
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" )
175169
176170 # Now get the full list of breakpoints set in the target and verify
177171 # we have only 2 breakpoints set. The response above could have told
178172 # us about 2 breakpoints, but we want to make sure we don't have the
179173 # third one still set in the target
180174 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
183185 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" ,
187189 )
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" )
201192
202193 # Now clear all breakpoints for the source file by passing down an
203194 # empty lines array
204195 lines = []
205196 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+ )
213203
214204 # Verify with the target that all breakpoints have been cleared
215205 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+ )
223212
224213 # Now set a breakpoint again in the same source file and verify it
225214 # was added.
@@ -281,12 +270,11 @@ def test_clear_breakpoints_unset_breakpoints(self):
281270 self .assertEqual (
282271 len (breakpoints ), len (lines ), "expect %u source breakpoints" % (len (lines ))
283272 )
284- for breakpoint , index in zip (breakpoints , range ( len ( lines )) ):
273+ for index , breakpoint in enumerate (breakpoints ):
285274 line = breakpoint ["line" ]
286- self .assertTrue (line , lines [index ])
275+ self .assertEqual (line , lines [index ])
287276 # Store the "id" of the breakpoint that was set for later
288277 line_to_id [line ] = breakpoint ["id" ]
289- self .assertIn (line , lines , "line expected in lines array" )
290278 self .assertTrue (breakpoint ["verified" ], "expect breakpoint verified" )
291279
292280 # Now clear all breakpoints for the source file by not setting the
@@ -356,3 +344,49 @@ def test_functionality(self):
356344 self .continue_to_breakpoints (breakpoint_ids )
357345 i = int (self .dap_server .get_local_variable_value ("i" ))
358346 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)" )
0 commit comments