Skip to content

Commit ea172bd

Browse files
committed
[lldb] Improve completion tests
* Assert no completions for tests that should not find completions. * Remove regex mode from complete_from_to, which was unused. This exposed bugs in 2 of the tests, target stop-hook and process unload. These were fixed in previous commits but couldn't be tested properly until this patch.
1 parent 3125bd4 commit ea172bd

File tree

3 files changed

+62
-74
lines changed

3 files changed

+62
-74
lines changed

lldb/packages/Python/lldbsuite/test/lldbtest.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2223,10 +2223,7 @@ def check_completion_with_desc(
22232223
)
22242224
self.assertFalse(got_failure, error_msg)
22252225

2226-
def complete_exactly(self, str_input, patterns):
2227-
self.complete_from_to(str_input, patterns, True)
2228-
2229-
def complete_from_to(self, str_input, patterns, turn_off_re_match=False):
2226+
def complete_from_to(self, str_input, patterns):
22302227
"""Test that the completion mechanism completes str_input to patterns,
22312228
where patterns could be a pattern-string or a list of pattern-strings"""
22322229
# Patterns should not be None in order to proceed.
@@ -2254,21 +2251,18 @@ def complete_from_to(self, str_input, patterns, turn_off_re_match=False):
22542251
for idx in range(1, num_matches + 1):
22552252
compare_string += match_strings.GetStringAtIndex(idx) + "\n"
22562253

2254+
# If the singular pattern is the same as the input, assume that we
2255+
# shouldn't have any completions.
2256+
if len(patterns) == 1 and str_input == patterns[0] and num_matches:
2257+
self.fail("Expected no completions but got:\n" + compare_string)
2258+
22572259
for p in patterns:
2258-
if turn_off_re_match:
2259-
self.expect(
2260-
compare_string,
2261-
msg=COMPLETION_MSG(str_input, p, match_strings),
2262-
exe=False,
2263-
substrs=[p],
2264-
)
2265-
else:
2266-
self.expect(
2267-
compare_string,
2268-
msg=COMPLETION_MSG(str_input, p, match_strings),
2269-
exe=False,
2270-
patterns=[p],
2271-
)
2260+
self.expect(
2261+
compare_string,
2262+
msg=COMPLETION_MSG(str_input, p, match_strings),
2263+
exe=False,
2264+
substrs=[p],
2265+
)
22722266

22732267
def completions_match(self, command, completions):
22742268
"""Checks that the completions for the given command are equal to the

lldb/test/API/commands/expression/completion/TestExprCompletion.py

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,34 @@ def test_expr_completion(self):
2929
)
3030

3131
# Completing member functions
32-
self.complete_exactly(
32+
self.complete_from_to(
3333
"expr some_expr.FooNoArgs", "expr some_expr.FooNoArgsBar()"
3434
)
35-
self.complete_exactly(
35+
self.complete_from_to(
3636
"expr some_expr.FooWithArgs", "expr some_expr.FooWithArgsBar("
3737
)
38-
self.complete_exactly(
38+
self.complete_from_to(
3939
"expr some_expr.FooWithMultipleArgs",
4040
"expr some_expr.FooWithMultipleArgsBar(",
4141
)
42-
self.complete_exactly(
42+
self.complete_from_to(
4343
"expr some_expr.FooUnderscore", "expr some_expr.FooUnderscoreBar_()"
4444
)
45-
self.complete_exactly(
45+
self.complete_from_to(
4646
"expr some_expr.FooNumbers", "expr some_expr.FooNumbersBar1()"
4747
)
48-
self.complete_exactly(
48+
self.complete_from_to(
4949
"expr some_expr.StaticMemberMethod",
5050
"expr some_expr.StaticMemberMethodBar()",
5151
)
5252

5353
# Completing static functions
54-
self.complete_exactly(
54+
self.complete_from_to(
5555
"expr Expr::StaticMemberMethod", "expr Expr::StaticMemberMethodBar()"
5656
)
5757

5858
# Completing member variables
59-
self.complete_exactly(
59+
self.complete_from_to(
6060
"expr some_expr.MemberVariab", "expr some_expr.MemberVariableBar"
6161
)
6262

@@ -94,43 +94,43 @@ def test_expr_completion(self):
9494
self.completions_contain("expr 1+", ["1+some_expr", "1+static_cast"])
9595

9696
# Test with spaces
97-
self.complete_exactly(
97+
self.complete_from_to(
9898
"expr some_expr .FooNoArgs", "expr some_expr .FooNoArgsBar()"
9999
)
100-
self.complete_exactly(
100+
self.complete_from_to(
101101
"expr some_expr .FooNoArgs", "expr some_expr .FooNoArgsBar()"
102102
)
103-
self.complete_exactly(
103+
self.complete_from_to(
104104
"expr some_expr .FooNoArgs", "expr some_expr .FooNoArgsBar()"
105105
)
106-
self.complete_exactly(
106+
self.complete_from_to(
107107
"expr some_expr. FooNoArgs", "expr some_expr. FooNoArgsBar()"
108108
)
109-
self.complete_exactly(
109+
self.complete_from_to(
110110
"expr some_expr . FooNoArgs", "expr some_expr . FooNoArgsBar()"
111111
)
112-
self.complete_exactly(
112+
self.complete_from_to(
113113
"expr Expr :: StaticMemberMethod", "expr Expr :: StaticMemberMethodBar()"
114114
)
115-
self.complete_exactly(
115+
self.complete_from_to(
116116
"expr Expr ::StaticMemberMethod", "expr Expr ::StaticMemberMethodBar()"
117117
)
118-
self.complete_exactly(
118+
self.complete_from_to(
119119
"expr Expr:: StaticMemberMethod", "expr Expr:: StaticMemberMethodBar()"
120120
)
121121

122122
# Test that string literals don't break our parsing logic.
123-
self.complete_exactly(
123+
self.complete_from_to(
124124
'expr const char *cstr = "some_e"; char c = *cst',
125125
'expr const char *cstr = "some_e"; char c = *cstr',
126126
)
127-
self.complete_exactly(
127+
self.complete_from_to(
128128
'expr const char *cstr = "some_e" ; char c = *cst',
129129
'expr const char *cstr = "some_e" ; char c = *cstr',
130130
)
131131
# Requesting completions inside an incomplete string doesn't provide any
132132
# completions.
133-
self.complete_exactly(
133+
self.complete_from_to(
134134
'expr const char *cstr = "some_e', 'expr const char *cstr = "some_e'
135135
)
136136

@@ -139,110 +139,110 @@ def test_expr_completion(self):
139139
self.assume_no_completions("expr -i0 -- some_expr.", 11)
140140

141141
# Test with expr arguments
142-
self.complete_exactly(
142+
self.complete_from_to(
143143
"expr -i0 -- some_expr .FooNoArgs", "expr -i0 -- some_expr .FooNoArgsBar()"
144144
)
145-
self.complete_exactly(
145+
self.complete_from_to(
146146
"expr -i0 -- some_expr .FooNoArgs",
147147
"expr -i0 -- some_expr .FooNoArgsBar()",
148148
)
149149

150150
# Addrof and deref
151-
self.complete_exactly(
151+
self.complete_from_to(
152152
"expr (*(&some_expr)).FooNoArgs", "expr (*(&some_expr)).FooNoArgsBar()"
153153
)
154-
self.complete_exactly(
154+
self.complete_from_to(
155155
"expr (*(&some_expr)) .FooNoArgs", "expr (*(&some_expr)) .FooNoArgsBar()"
156156
)
157-
self.complete_exactly(
157+
self.complete_from_to(
158158
"expr (* (&some_expr)) .FooNoArgs", "expr (* (&some_expr)) .FooNoArgsBar()"
159159
)
160-
self.complete_exactly(
160+
self.complete_from_to(
161161
"expr (* (& some_expr)) .FooNoArgs",
162162
"expr (* (& some_expr)) .FooNoArgsBar()",
163163
)
164164

165165
# Addrof and deref (part 2)
166-
self.complete_exactly(
166+
self.complete_from_to(
167167
"expr (&some_expr)->FooNoArgs", "expr (&some_expr)->FooNoArgsBar()"
168168
)
169-
self.complete_exactly(
169+
self.complete_from_to(
170170
"expr (&some_expr) ->FooNoArgs", "expr (&some_expr) ->FooNoArgsBar()"
171171
)
172-
self.complete_exactly(
172+
self.complete_from_to(
173173
"expr (&some_expr) -> FooNoArgs", "expr (&some_expr) -> FooNoArgsBar()"
174174
)
175-
self.complete_exactly(
175+
self.complete_from_to(
176176
"expr (&some_expr)-> FooNoArgs", "expr (&some_expr)-> FooNoArgsBar()"
177177
)
178178

179179
# Builtin arg
180-
self.complete_exactly("expr static_ca", "expr static_cast")
180+
self.complete_from_to("expr static_ca", "expr static_cast")
181181

182182
# From other files
183-
self.complete_exactly(
183+
self.complete_from_to(
184184
"expr fwd_decl_ptr->Hidden", "expr fwd_decl_ptr->HiddenMember"
185185
)
186186

187187
# Types
188-
self.complete_exactly("expr LongClassNa", "expr LongClassName")
189-
self.complete_exactly(
188+
self.complete_from_to("expr LongClassNa", "expr LongClassName")
189+
self.complete_from_to(
190190
"expr LongNamespaceName::NestedCla", "expr LongNamespaceName::NestedClass"
191191
)
192192

193193
# Namespaces
194-
self.complete_exactly("expr LongNamespaceNa", "expr LongNamespaceName::")
194+
self.complete_from_to("expr LongNamespaceNa", "expr LongNamespaceName::")
195195

196196
# Multiple arguments
197-
self.complete_exactly(
197+
self.complete_from_to(
198198
"expr &some_expr + &some_e", "expr &some_expr + &some_expr"
199199
)
200-
self.complete_exactly(
200+
self.complete_from_to(
201201
"expr SomeLongVarNameWithCapitals + SomeLongVarName",
202202
"expr SomeLongVarNameWithCapitals + SomeLongVarNameWithCapitals",
203203
)
204-
self.complete_exactly(
204+
self.complete_from_to(
205205
"expr SomeIntVar + SomeIntV", "expr SomeIntVar + SomeIntVar"
206206
)
207207

208208
# Multiple statements
209-
self.complete_exactly(
209+
self.complete_from_to(
210210
"expr long LocalVariable = 0; LocalVaria",
211211
"expr long LocalVariable = 0; LocalVariable",
212212
)
213213

214214
# Custom Decls
215-
self.complete_exactly(
215+
self.complete_from_to(
216216
"expr auto l = [](int LeftHandSide, int bx){ return LeftHandS",
217217
"expr auto l = [](int LeftHandSide, int bx){ return LeftHandSide",
218218
)
219-
self.complete_exactly(
219+
self.complete_from_to(
220220
"expr struct LocalStruct { long MemberName; } ; LocalStruct S; S.Mem",
221221
"expr struct LocalStruct { long MemberName; } ; LocalStruct S; S.MemberName",
222222
)
223223

224224
# Completing function call arguments
225-
self.complete_exactly(
225+
self.complete_from_to(
226226
"expr some_expr.FooWithArgsBar(some_exp",
227227
"expr some_expr.FooWithArgsBar(some_expr",
228228
)
229-
self.complete_exactly(
229+
self.complete_from_to(
230230
"expr some_expr.FooWithArgsBar(SomeIntV",
231231
"expr some_expr.FooWithArgsBar(SomeIntVar",
232232
)
233-
self.complete_exactly(
233+
self.complete_from_to(
234234
"expr some_expr.FooWithMultipleArgsBar(SomeIntVar, SomeIntVa",
235235
"expr some_expr.FooWithMultipleArgsBar(SomeIntVar, SomeIntVar",
236236
)
237237

238238
# Function return values
239-
self.complete_exactly(
239+
self.complete_from_to(
240240
"expr some_expr.Self().FooNoArgs", "expr some_expr.Self().FooNoArgsBar()"
241241
)
242-
self.complete_exactly(
242+
self.complete_from_to(
243243
"expr some_expr.Self() .FooNoArgs", "expr some_expr.Self() .FooNoArgsBar()"
244244
)
245-
self.complete_exactly(
245+
self.complete_from_to(
246246
"expr some_expr.Self(). FooNoArgs", "expr some_expr.Self(). FooNoArgsBar()"
247247
)
248248

lldb/test/API/functionalities/completion/TestCompletion.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,16 +237,13 @@ def test_log_dir(self):
237237
src_dir = os.path.dirname(os.path.realpath(__file__))
238238
self.complete_from_to(
239239
"log enable lldb expr -f " + src_dir,
240-
[src_dir + os.sep],
241-
turn_off_re_match=True,
242-
)
240+
[src_dir + os.sep])
243241

244242
# <rdar://problem/11052829>
245243
def test_infinite_loop_while_completing(self):
246244
"""Test that 'process print hello\' completes to itself and does not infinite loop."""
247245
self.complete_from_to(
248-
"process print hello\\", "process print hello\\", turn_off_re_match=True
249-
)
246+
"process print hello\\", "process print hello\\")
250247

251248
def test_watchpoint_co(self):
252249
"""Test that 'watchpoint co' completes to 'watchpoint command '."""
@@ -727,9 +724,7 @@ def test_symbol_name(self):
727724
self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
728725
self.complete_from_to(
729726
"breakpoint set -n Fo",
730-
"breakpoint set -n Foo::Bar(int,\\ int)",
731-
turn_off_re_match=True,
732-
)
727+
"breakpoint set -n Foo::Bar(int,\\ int)")
733728
# No completion for Qu because the candidate is
734729
# (anonymous namespace)::Quux().
735730
self.complete_from_to("breakpoint set -n Qu", "")
@@ -822,8 +817,7 @@ def test_common_completion_target_stophook_ids(self):
822817
for subcommand in subcommands:
823818
self.complete_from_to(
824819
"target stop-hook " + subcommand + " 1 ",
825-
"target stop-hook " + subcommand + " 1 ",
826-
)
820+
"target stop-hook " + subcommand + " 1 ")
827821

828822
def test_common_completion_type_language(self):
829823
self.complete_from_to("type category -l ", ["c"])

0 commit comments

Comments
 (0)