Coverage for tests / test_arcs.py: 100.000%
336 statements
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
« prev ^ index » next coverage.py v7.12.1a0.dev1, created at 2025-11-30 17:57 +0000
1# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
4"""Tests for coverage.py's arc measurement."""
6from __future__ import annotations 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
8import textwrap 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
9from unittest import mock 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
11import pytest 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
13from tests.coveragetest import CoverageTest 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
14from tests.helpers import assert_count_equal 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
16import coverage 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
17from coverage import env 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
18from coverage.data import sorted_lines 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
19from coverage.files import abs_file 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
22class SimpleArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
23 """Tests for coverage.py's arc measurement."""
25 def test_simple_sequence(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
26 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
27 """\
28 a = 1
29 b = 2
30 """,
31 branchz="",
32 )
33 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
34 """\
35 a = 1
37 b = 3
38 """,
39 branchz="",
40 )
41 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
42 """\
44 a = 2
45 b = 3
47 c = 5
48 """,
49 branchz="",
50 )
52 def test_function_def(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
53 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
54 """\
55 def foo():
56 a = 2
58 foo()
59 """,
60 branchz="",
61 )
63 def test_if(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
64 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
65 """\
66 a = 1
67 if len([]) == 0:
68 a = 3
69 assert a == 3
70 """,
71 branchz="23 24",
72 branchz_missing="24",
73 )
74 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
75 """\
76 a = 1
77 if len([]) == 1:
78 a = 3
79 assert a == 1
80 """,
81 branchz="23 24",
82 branchz_missing="23",
83 )
85 def test_if_else(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
86 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
87 """\
88 if len([]) == 0:
89 a = 2
90 else:
91 a = 4
92 assert a == 2
93 """,
94 branchz="12 14",
95 branchz_missing="14",
96 )
97 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
98 """\
99 if len([]) == 1:
100 a = 2
101 else:
102 a = 4
103 assert a == 4
104 """,
105 branchz="12 14",
106 branchz_missing="12",
107 )
109 def test_compact_if(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
110 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
111 """\
112 a = 1
113 if len([]) == 0: a = 2
114 assert a == 2
115 """,
116 branchz="",
117 branchz_missing="",
118 )
119 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
120 """\
121 def fn(x):
122 if x % 2: return True
123 return False
124 a = fn(1)
125 assert a is True
126 """,
127 branchz="2. 23",
128 branchz_missing="23",
129 )
131 def test_multiline(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
132 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
133 """\
134 a = (
135 2 +
136 3
137 )
138 b = \\
139 6
140 """,
141 branchz="",
142 )
144 def test_if_return(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
145 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
146 """\
147 def if_ret(a):
148 if a:
149 return 3
150 b = 4
151 return 5
152 x = if_ret(0) + if_ret(1)
153 assert x == 8
154 """,
155 branchz="23 24",
156 branchz_missing="",
157 )
159 def test_dont_confuse_exit_and_else(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
160 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
161 """\
162 def foo():
163 if foo:
164 a = 3
165 else:
166 a = 5
167 return a
168 assert foo() == 3 # 7
169 """,
170 branchz="23 25",
171 branchz_missing="25",
172 )
173 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
174 """\
175 def foo():
176 if foo:
177 a = 3
178 else:
179 a = 5
180 foo() # 6
181 """,
182 branchz="23 25",
183 branchz_missing="25",
184 )
186 def test_bug_1184(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
187 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
188 """\
189 def foo(x):
190 if x:
191 try:
192 1/(x - 1)
193 except ZeroDivisionError:
194 pass
195 return x # 7
197 for i in range(3): # 9
198 foo(i)
199 """,
200 branchz="23 27 9A 9.",
201 branchz_missing="",
202 )
204 def test_bug_1991(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
205 # A bytecode was missing a line number, causing a KeyError in sysmon.py.
206 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
207 """\
208 def func(x, y):
209 for size in (x or ()) if y else ():
210 print(size)
212 func([5], True)
213 """,
214 branchz="2-1 23",
215 branchz_missing="",
216 )
217 assert self.stdout() == "5\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
219 def test_bug_576(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
220 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
221 """\
222 foo = True
224 if foo == True:
225 foo = False
226 else: # pragma: no cover
227 pass
229 if foo == False:
230 foo = True
231 else: # pragma: no cover
232 None
234 print("Done")
235 """,
236 branchz="34 36 89 8B",
237 branchz_missing="",
238 )
239 assert self.stdout() == "Done\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
242class WithTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
243 """Arc-measuring tests involving context managers."""
245 def test_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
246 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
247 """\
248 def example():
249 with open("test", "w", encoding="utf-8") as f:
250 f.write("3")
251 a = 4
253 example()
254 """,
255 branchz="",
256 branchz_missing="",
257 )
259 def test_with_return(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
260 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
261 """\
262 def example():
263 with open("test", "w", encoding="utf-8") as f:
264 f.write("3")
265 return 4
267 example()
268 """,
269 branchz="",
270 branchz_missing="",
271 )
273 def test_bug_146(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
274 # https://github.com/coveragepy/coveragepy/issues/146
275 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
276 """\
277 for i in range(2):
278 with open("test", "w", encoding="utf-8") as f:
279 print(3)
280 print(4)
281 print(5)
282 """,
283 branchz="12 15",
284 branchz_missing="",
285 )
286 assert self.stdout() == "3\n4\n3\n4\n5\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
288 def test_nested_with_return(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
289 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
290 """\
291 def example(x):
292 with open("test", "w", encoding="utf-8") as f2:
293 a = 3
294 with open("test2", "w", encoding="utf-8") as f4:
295 f2.write("5")
296 return 6
298 example(8)
299 """,
300 branchz="",
301 branchz_missing="",
302 )
304 def test_break_through_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
305 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
306 """\
307 for i in range(1+1):
308 with open("test", "w", encoding="utf-8") as f:
309 print(3)
310 break
311 print(5)
312 """,
313 branchz="12 15",
314 branchz_missing="15",
315 )
317 def test_continue_through_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
318 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
319 """\
320 for i in range(1+1):
321 with open("test", "w", encoding="utf-8") as f:
322 print(3)
323 continue
324 print(5)
325 """,
326 branchz="12 15",
327 branchz_missing="",
328 )
330 # https://github.com/coveragepy/coveragepy/issues/1270
331 def test_raise_through_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
332 cov = self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
333 """\
334 from contextlib import nullcontext
335 def f(x):
336 with nullcontext():
337 print(4)
338 raise Exception("Boo6")
339 print(6)
340 try:
341 f(8)
342 except Exception:
343 print("oops 10")
344 """,
345 branchz="",
346 branchz_missing="",
347 )
348 expected = "line 3 didn't jump to the function exit" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
349 assert self.get_missing_arc_description(cov, 3, -2) == expected 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
351 def test_untaken_if_through_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
352 cov = self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
353 """\
354 from contextlib import nullcontext
355 def f(x):
356 with nullcontext():
357 print(4)
358 if x == 5:
359 print(6)
360 print(7)
361 f(8)
362 """,
363 branchz="56 57",
364 branchz_missing="56",
365 )
366 assert self.stdout() == "4\n7\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
367 expected = "line 3 didn't jump to the function exit" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
368 assert self.get_missing_arc_description(cov, 3, -2) == expected 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
370 def test_untaken_raise_through_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
371 cov = self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
372 """\
373 from contextlib import nullcontext
374 def f(x):
375 with nullcontext():
376 print(4)
377 if x == 5:
378 raise Exception("Boo6")
379 print(7)
380 try:
381 f(9)
382 except Exception:
383 print("oops 11")
384 """,
385 branchz="56 57",
386 branchz_missing="56",
387 )
388 assert self.stdout() == "4\n7\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
389 expected = "line 3 didn't jump to the function exit" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
390 assert self.get_missing_arc_description(cov, 3, -2) == expected 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
392 def test_leaving_module(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
393 cov = self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
394 """\
395 print(a := 1)
396 if a == 1:
397 print(3)
398 """,
399 branchz="2. 23",
400 branchz_missing="2.",
401 )
402 assert self.stdout() == "1\n3\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
403 expected = "line 2 didn't exit the module because the condition on line 2 was always true" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
404 assert self.get_missing_arc_description(cov, 2, -1) == expected 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
406 def test_with_with_lambda(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
407 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
408 """\
409 from contextlib import nullcontext
410 with nullcontext(lambda x: 2):
411 print(3)
412 print(4)
413 """,
414 branchz="",
415 branchz_missing="",
416 )
418 def test_multiline_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
419 # https://github.com/coveragepy/coveragepy/issues/1880
420 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
421 """\
422 import contextlib, itertools
423 nums = itertools.count()
424 with (
425 contextlib.nullcontext() as x,
426 ):
427 while next(nums) < 6:
428 y = 7
429 z = 8
430 """,
431 branchz="67 68",
432 branchz_missing="",
433 )
435 def test_multi_multiline_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
436 # https://github.com/coveragepy/coveragepy/issues/1880
437 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
438 """\
439 import contextlib, itertools
440 nums = itertools.count()
441 with (
442 contextlib.nullcontext() as x,
443 contextlib.nullcontext() as y,
444 contextlib.nullcontext() as z,
445 ):
446 while next(nums) < 8:
447 y = 9
448 z = 10
449 """,
450 branchz="89 8A",
451 branchz_missing="",
452 )
454 def test_multi_multiline_with_backslash(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
455 # https://github.com/coveragepy/coveragepy/issues/1880
456 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
457 """\
458 import contextlib, itertools
459 nums = itertools.count()
460 with contextlib.nullcontext() as x, \\
461 contextlib.nullcontext() as y, \\
462 contextlib.nullcontext() as z:
463 while next(nums) < 6:
464 y = 7
465 z = 8
466 """,
467 branchz="67 68",
468 branchz_missing="",
469 )
472class LoopArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
473 """Arc-measuring tests involving loops."""
475 def test_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
476 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
477 """\
478 for i in range(10):
479 a = i
480 assert a == 9
481 """,
482 branchz="12 13",
483 branchz_missing="",
484 )
485 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
486 """\
487 a = -1
488 for i in range(0):
489 a = i
490 assert a == -1
491 """,
492 branchz="23 24",
493 branchz_missing="23",
494 )
496 def test_nested_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
497 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
498 """\
499 for i in range(3):
500 for j in range(3):
501 a = i + j
502 assert a == 4
503 """,
504 branchz="12 14 23 21",
505 branchz_missing="",
506 )
508 def test_break(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
509 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
510 """\
511 for i in range(10):
512 a = i
513 break # 3
514 a = 99
515 assert a == 0 # 5
516 """,
517 branchz="12 15",
518 branchz_missing="15",
519 )
521 def test_continue(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
522 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
523 """\
524 for i in range(10):
525 a = i
526 continue # 3
527 a = 99
528 assert a == 9 # 5
529 """,
530 branchz="12 15",
531 branchz_missing="",
532 )
534 def test_nested_breaks(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
535 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
536 """\
537 for i in range(3):
538 for j in range(3):
539 a = i + j
540 break # 4
541 if i == 2:
542 break
543 assert a == 2 and i == 2 # 7
544 """,
545 branchz="12 17 23 25 51 56",
546 branchz_missing="17 25",
547 )
549 def test_if_1(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
550 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
551 """\
552 a = 1
553 if not not 1:
554 a = 3
555 else:
556 a = 5
557 assert a == 3
558 """,
559 lines=[1, 2, 3, 6],
560 branchz="",
561 branchz_missing="",
562 )
564 def test_while_1(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
565 # With "while 1", the loop knows it's constant.
566 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
567 """\
568 a, i = 1, 0
569 while 1:
570 if i >= 3:
571 a = 4
572 break
573 i += 1
574 assert a == 4 and i == 3
575 """,
576 branchz="34 36",
577 branchz_missing="",
578 )
580 def test_while_true(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
581 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
582 """\
583 a, i = 1, 0
584 while True:
585 if i >= 3:
586 a = 4
587 break
588 i += 1
589 assert a == 4 and i == 3
590 """,
591 lines=[1, 2, 3, 4, 5, 6, 7],
592 branchz="34 36",
593 branchz_missing="",
594 )
596 def test_while_false(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
597 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
598 """\
599 a, i = 1, 0
600 while False:
601 1/0
602 assert a == 1 and i == 0
603 """,
604 lines=[1, 2, 4],
605 branchz="",
606 branchz_missing="",
607 )
609 def test_while_not_false(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
610 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
611 """\
612 a, i = 1, 0
613 while not False:
614 if i >= 3:
615 a = 4
616 break
617 i += 1
618 assert a == 4 and i == 3
619 """,
620 branchz="34 36",
621 branchz_missing="",
622 )
624 def test_zero_coverage_while_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
625 # https://github.com/coveragepy/coveragepy/issues/502
626 self.make_file("main.py", "print('done')") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
627 self.make_file( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
628 "zero.py",
629 """\
630 def method(self):
631 while True:
632 return 1
633 """,
634 )
635 cov = coverage.Coverage(source=["."], branch=True) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
636 self.start_import_stop(cov, "main") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
637 assert self.stdout() == "done\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
638 expected = "zero.py 3 3 0 0 0% 1-3" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
639 report = self.get_report(cov, show_missing=True) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
640 squeezed = self.squeezed_lines(report) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
641 assert expected in squeezed[3] 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
643 def test_bug_496_continue_in_constant_while(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
644 # https://github.com/coveragepy/coveragepy/issues/496
645 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
646 """\
647 up = iter('ta')
648 while True:
649 char = next(up)
650 if char == 't':
651 continue
652 i = "line 6"
653 break
654 """,
655 branchz="45 46",
656 branchz_missing="",
657 )
659 def test_missing_while_body(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
660 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
661 """\
662 a = 3; b = 0
663 if 0:
664 while a > 0:
665 a -= 1
666 assert a == 3 and b == 0
667 """,
668 branchz="",
669 branchz_missing="",
670 )
672 def test_for_if_else_for(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
673 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
674 """\
675 def branches_2(l):
676 if l:
677 for e in l:
678 a = 4
679 else:
680 a = 6
682 def branches_3(l):
683 for x in l:
684 if x:
685 for e in l:
686 a = 12
687 else:
688 a = 14
690 branches_2([0,1])
691 branches_3([0,1])
692 """,
693 branchz="23 26 34 3. 9A 9-8 AB AE BC B9",
694 branchz_missing="26",
695 )
697 def test_for_else(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
698 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
699 """\
700 def forelse(seq):
701 for n in seq:
702 if n > 5:
703 break
704 else:
705 print('None of the values were greater than 5')
706 print('Done')
707 forelse([1,2])
708 """,
709 branchz="23 26 34 32",
710 branchz_missing="34",
711 )
712 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
713 """\
714 def forelse(seq):
715 for n in seq:
716 if n > 5:
717 break
718 else:
719 print('None of the values were greater than 5')
720 print('Done')
721 forelse([1,6])
722 """,
723 branchz="23 26 34 32",
724 branchz_missing="26",
725 )
727 def test_split_for(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
728 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
729 """\
730 a = 0
731 for (i
732 ) in [1,2,3,4,5]:
733 a += i
734 assert a == 15
735 """,
736 lines=[1, 2, 4, 5],
737 branchz="24 25",
738 )
740 def test_while_else(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
741 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
742 """\
743 def whileelse(seq):
744 while seq:
745 n = seq.pop()
746 if n > 4:
747 break
748 else:
749 n = 99
750 return n
751 assert whileelse([1, 2]) == 99
752 """,
753 branchz="23 27 45 42",
754 branchz_missing="45",
755 )
756 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
757 """\
758 def whileelse(seq):
759 while seq:
760 n = seq.pop()
761 if n > 4:
762 break
763 else:
764 n = 99
765 return n
766 assert whileelse([1, 5]) == 5
767 """,
768 branchz="23 27 45 42",
769 branchz_missing="27 42",
770 )
772 def test_confusing_for_loop_bug_175(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
773 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
774 """\
775 o = [(1,2), (3,4)]
776 o = [a for a in o]
777 for tup in o:
778 x = tup[0]
779 y = tup[1]
780 """,
781 branchz="34 3.",
782 branchz_missing="",
783 )
784 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
785 """\
786 o = [(1,2), (3,4)]
787 for tup in [a for a in o]:
788 x = tup[0]
789 y = tup[1]
790 """,
791 branchz="23 2.",
792 branchz_missing="",
793 )
795 def test_incorrect_loop_exit_bug_1175(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
796 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
797 """\
798 def wrong_loop(x):
799 if x:
800 for i in [3, 33]:
801 print(i+4)
802 else:
803 pass
805 wrong_loop(8)
806 """,
807 branchz="23 26 34 3.",
808 branchz_missing="26",
809 )
811 # https://bugs.python.org/issue44672
812 def test_incorrect_if_bug_1175(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
813 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
814 """\
815 def wrong_loop(x):
816 if x:
817 if x:
818 print(4)
819 else:
820 pass
822 wrong_loop(8)
823 """,
824 branchz="23 26 34 3.",
825 branchz_missing="26 3.",
826 )
828 def test_generator_expression(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
829 # Generator expression:
830 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
831 """\
832 o = ((1,2), (3,4))
833 o = (a for a in o)
834 for tup in o:
835 x = tup[0]
836 y = tup[1]
837 """,
838 branchz="34 3.",
839 branchz_missing="",
840 )
842 def test_generator_expression_another_way(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
843 # https://bugs.python.org/issue44450
844 # Generator expression:
845 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
846 """\
847 o = ((1,2), (3,4))
848 o = (a for
849 a in
850 o)
851 for tup in o:
852 x = tup[0]
853 y = tup[1]
854 """,
855 branchz="56 5.",
856 branchz_missing="",
857 )
859 def test_other_comprehensions(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
860 # Set comprehension:
861 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
862 """\
863 o = ((1,2), (3,4))
864 o = {a for a in o}
865 for tup in o:
866 x = tup[0]
867 y = tup[1]
868 """,
869 branchz="34 3.",
870 branchz_missing="",
871 )
872 # Dict comprehension:
873 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
874 """\
875 o = ((1,2), (3,4))
876 o = {a:1 for a in o}
877 for tup in o:
878 x = tup[0]
879 y = tup[1]
880 """,
881 branchz="34 3.",
882 branchz_missing="",
883 )
885 def test_multiline_dict_comp(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
886 # Multiline dict comp:
887 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
888 """\
889 # comment
890 d = \\
891 {
892 i:
893 str(i)
894 for
895 i
896 in
897 range(9)
898 }
899 x = 11
900 """,
901 branchz="",
902 branchz_missing="",
903 )
904 # Multi dict comp:
905 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
906 """\
907 # comment
908 d = \\
909 {
910 (i, j):
911 str(i+j)
912 for
913 i
914 in
915 range(9)
916 for
917 j
918 in
919 range(13)
920 }
921 x = 15
922 """,
923 branchz="",
924 branchz_missing="",
925 )
928class ExceptionArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
929 """Arc-measuring tests involving exception handling."""
931 def test_try_except(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
932 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
933 """\
934 a, b = 1, 1
935 try:
936 a = 3
937 except:
938 b = 5
939 assert a == 3 and b == 1
940 """,
941 branchz="",
942 branchz_missing="",
943 )
945 def test_raise_followed_by_statement(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
946 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
947 """\
948 a, b = 1, 1
949 try:
950 a = 3
951 raise Exception("Yikes!")
952 a = 5
953 except:
954 b = 7
955 assert a == 3 and b == 7
956 """,
957 branchz="",
958 branchz_missing="",
959 )
961 def test_hidden_raise(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
962 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
963 """\
964 a, b = 1, 1
965 def oops(x):
966 if x % 2:
967 raise Exception("odd")
968 try:
969 a = 6
970 oops(1)
971 a = 8
972 except:
973 b = 10
974 assert a == 6 and b == 10
975 """,
976 branchz="34 3-2",
977 branchz_missing="3-2",
978 )
980 def test_except_with_type(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
981 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
982 """\
983 a, b = 1, 1
984 def oops(x):
985 if x % 2:
986 raise ValueError("odd")
987 def try_it(x):
988 try:
989 a = 7
990 oops(x)
991 a = 9
992 except ValueError:
993 b = 11
994 return a
995 assert try_it(0) == 9 # C
996 assert try_it(1) == 7 # D
997 """,
998 branchz="34 3-2",
999 branchz_missing="",
1000 )
1002 def test_try_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1003 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1004 """\
1005 a, c = 1, 1
1006 try:
1007 a = 3
1008 finally:
1009 c = 5
1010 assert a == 3 and c == 5
1011 """,
1012 branchz="",
1013 )
1014 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1015 """\
1016 a, c, d = 1, 1, 1
1017 try:
1018 try:
1019 a = 4
1020 finally:
1021 c = 6
1022 except:
1023 d = 8
1024 assert a == 4 and c == 6 and d == 1 # 9
1025 """,
1026 branchz="",
1027 )
1028 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1029 """\
1030 a, c, d = 1, 1, 1
1031 try:
1032 try:
1033 a = 4
1034 raise Exception("Yikes!")
1035 # line 6
1036 finally:
1037 c = 8
1038 except:
1039 d = 10 # A
1040 assert a == 4 and c == 8 and d == 10 # B
1041 """,
1042 branchz="",
1043 )
1045 def test_finally_in_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1046 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1047 """\
1048 a, c, d, i = 1, 1, 1, 99
1049 try:
1050 for i in range(5):
1051 try:
1052 a = 5
1053 if i > 0:
1054 raise Exception("Yikes!")
1055 a = 8
1056 finally:
1057 c = 10
1058 except:
1059 d = 12 # C
1060 assert a == 5 and c == 10 and d == 12 # D
1061 """,
1062 branchz="34 3D 67 68",
1063 branchz_missing="3D",
1064 )
1065 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1066 """\
1067 a, c, d, i = 1, 1, 1, 99
1068 try:
1069 for i in range(5):
1070 try:
1071 a = 5
1072 if i > 10:
1073 raise Exception("Yikes!")
1074 a = 8
1075 finally:
1076 c = 10
1077 except:
1078 d = 12 # C
1079 assert a == 8 and c == 10 and d == 1 # D
1080 """,
1081 branchz="34 3D 67 68",
1082 branchz_missing="67",
1083 )
1085 def test_break_through_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1086 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1087 """\
1088 a, c, d, i = 1, 1, 1, 99
1089 try:
1090 for i in range(3):
1091 try:
1092 a = 5
1093 if i > 0:
1094 break
1095 a = 8
1096 finally:
1097 c = 10
1098 except:
1099 d = 12 # C
1100 assert a == 5 and c == 10 and d == 1 # D
1101 """,
1102 branchz="34 3D 67 68",
1103 branchz_missing="3D",
1104 )
1106 def test_break_continue_without_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1107 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1108 """\
1109 a, c, d, i = 1, 1, 1, 99
1110 try:
1111 for i in range(3):
1112 try:
1113 a = 5
1114 if i > 0:
1115 break
1116 continue
1117 except:
1118 c = 10
1119 except:
1120 d = 12 # C
1121 assert a == 5 and c == 1 and d == 1 # D
1122 """,
1123 branchz="34 3D 67 68",
1124 branchz_missing="3D",
1125 )
1127 def test_continue_through_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1128 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1129 """\
1130 a, b, c, d, i = 1, 1, 1, 1, 99
1131 try:
1132 for i in range(3):
1133 try:
1134 a = 5
1135 if i > 0:
1136 continue
1137 b = 8
1138 finally:
1139 c = 10
1140 except:
1141 d = 12 # C
1142 assert (a, b, c, d) == (5, 8, 10, 1) # D
1143 """,
1144 branchz="34 3D 67 68",
1145 branchz_missing="",
1146 )
1148 def test_finally_in_loop_bug_92(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1149 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1150 """\
1151 for i in range(5):
1152 try:
1153 j = 3
1154 finally:
1155 f = 5
1156 g = 6
1157 h = 7
1158 """,
1159 branchz="12 17",
1160 branchz_missing="",
1161 )
1163 def test_bug_212(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1164 # "except Exception as e" is crucial here.
1165 # Bug 212 said that the "if exc" line was incorrectly marked as only
1166 # partially covered.
1167 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1168 """\
1169 def b(exc):
1170 try:
1171 while "no peephole".upper():
1172 raise Exception(exc) # 4
1173 except Exception as e:
1174 if exc != 'expected':
1175 raise
1176 q = 8
1178 b('expected')
1179 try:
1180 b('unexpected') # C
1181 except:
1182 pass
1183 """,
1184 branchz="34 3-1 67 68",
1185 branchz_missing="3-1",
1186 )
1188 def test_except_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1189 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1190 """\
1191 a, b, c = 1, 1, 1
1192 try:
1193 a = 3
1194 except:
1195 b = 5
1196 finally:
1197 c = 7
1198 assert a == 3 and b == 1 and c == 7
1199 """,
1200 branchz="",
1201 )
1202 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1203 """\
1204 a, b, c = 1, 1, 1
1205 def oops(x):
1206 if x % 2: raise Exception("odd")
1207 try:
1208 a = 5
1209 oops(1)
1210 a = 7
1211 except:
1212 b = 9
1213 finally:
1214 c = 11
1215 assert a == 5 and b == 9 and c == 11
1216 """,
1217 branchz="",
1218 )
1220 def test_multiple_except_clauses(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1221 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1222 """\
1223 a, b, c = 1, 1, 1
1224 try:
1225 a = 3
1226 except ValueError:
1227 b = 5
1228 except IndexError:
1229 a = 7
1230 finally:
1231 c = 9
1232 assert a == 3 and b == 1 and c == 9
1233 """,
1234 branchz="",
1235 )
1236 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1237 """\
1238 a, b, c = 1, 1, 1
1239 try:
1240 a = int("xyz") # ValueError
1241 except ValueError:
1242 b = 5
1243 except IndexError:
1244 a = 7
1245 finally:
1246 c = 9
1247 assert a == 1 and b == 5 and c == 9
1248 """,
1249 branchz="",
1250 )
1251 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1252 """\
1253 a, b, c = 1, 1, 1
1254 try:
1255 a = [1][3] # IndexError
1256 except ValueError:
1257 b = 5
1258 except IndexError:
1259 a = 7
1260 finally:
1261 c = 9
1262 assert a == 7 and b == 1 and c == 9
1263 """,
1264 branchz="",
1265 )
1266 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1267 """\
1268 a, b, c = 1, 1, 1
1269 try:
1270 try:
1271 a = 4/0 # ZeroDivisionError
1272 except ValueError:
1273 b = 6
1274 except IndexError:
1275 a = 8
1276 finally:
1277 c = 10
1278 except ZeroDivisionError:
1279 pass
1280 assert a == 1 and b == 1 and c == 10
1281 """,
1282 branchz="",
1283 )
1285 def test_return_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1286 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1287 """\
1288 a = [1]
1289 def check_token(data):
1290 if data:
1291 try:
1292 return 5
1293 finally:
1294 a.append(7)
1295 return 8
1296 assert check_token(False) == 8
1297 assert a == [1]
1298 assert check_token(True) == 5
1299 assert a == [1, 7]
1300 """,
1301 branchz="34 38",
1302 branchz_missing="",
1303 )
1305 def test_except_jump_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1306 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1307 """\
1308 def func(x):
1309 a = f = g = 2
1310 try:
1311 for i in range(4):
1312 try:
1313 6/0
1314 except ZeroDivisionError:
1315 if x == 'break':
1316 a = 9
1317 break
1318 elif x == 'continue':
1319 a = 12
1320 continue
1321 elif x == 'return':
1322 a = 15 # F
1323 return a, f, g, i # G
1324 elif x == 'raise': # H
1325 a = 18 # I
1326 raise ValueError() # J
1327 finally:
1328 f = 21 # L
1329 except ValueError: # M
1330 g = 23 # N
1331 return a, f, g, i # O
1333 assert func('break') == (9, 21, 2, 0) # Q
1334 assert func('continue') == (12, 21, 2, 3) # R
1335 assert func('return') == (15, 2, 2, 0) # S
1336 assert func('raise') == (18, 21, 23, 0) # T
1337 assert func('other') == (2, 21, 2, 3) # U 30
1338 """,
1339 branchz="45 4O 89 8B BC BE EF EH HI HL",
1340 branchz_missing="",
1341 )
1343 def test_else_jump_finally(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1344 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1345 """\
1346 def func(x):
1347 a = f = g = 2
1348 try:
1349 for i in range(4):
1350 try:
1351 b = 6
1352 except ZeroDivisionError:
1353 pass
1354 else:
1355 if x == 'break':
1356 a = 11
1357 break
1358 elif x == 'continue':
1359 a = 14
1360 continue
1361 elif x == 'return':
1362 a = 17 # H
1363 return a, f, g, i # I
1364 elif x == 'raise': # J
1365 a = 20 # K
1366 raise ValueError() # L
1367 finally:
1368 f = 23 # N
1369 except ValueError: # O
1370 g = 25 # P
1371 return a, f, g, i # Q
1373 assert func('break') == (11, 23, 2, 0) # S
1374 assert func('continue') == (14, 23, 2, 3) # T
1375 assert func('return') == (17, 2, 2, 0) # U
1376 assert func('raise') == (20, 23, 25, 0) # V
1377 assert func('other') == (2, 23, 2, 3) # W 32
1378 """,
1379 branchz="45 4Q AB AD DE DG GH GJ JK JN",
1380 branchz_missing="",
1381 )
1383 @pytest.mark.skipif(env.PYVERSION < (3, 11), reason="ExceptionGroup is new in Python 3.11") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1384 def test_exception_group(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1385 # PyPy3.11 traces this incorrectly: https://github.com/pypy/pypy/issues/5354
1386 if env.PYPY: 1AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)yz
1387 missing = "5, 11" 1yz
1388 else:
1389 missing = "5-6, 11-12" 1AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)
1390 self.check_coverage( 1AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)yz
1391 """\
1392 a = 1
1393 try:
1394 raise ExceptionGroup("Zero!", [ZeroDivisionError()])
1395 except* ValueError:
1396 a = 5
1397 b = 6/0
1398 except* ZeroDivisionError:
1399 a = 8
1400 b = 9
1401 except* Exception:
1402 a = 11
1403 b = 12/0
1404 assert a == 8
1405 assert b == 9
1406 """,
1407 lines=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
1408 missing=missing,
1409 branchz="",
1410 branchz_missing="",
1411 )
1414class YieldTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1415 """Arc tests for generators."""
1417 def test_yield_in_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1418 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1419 """\
1420 def gen(inp):
1421 for n in inp:
1422 yield n
1424 list(gen([1,2,3]))
1425 """,
1426 branchz="23 2-1",
1427 branchz_missing="",
1428 )
1430 def test_padded_yield_in_loop(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1431 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1432 """\
1433 def gen(inp):
1434 i = 2
1435 for n in inp:
1436 i = 4
1437 yield n
1438 i = 6
1439 i = 7
1441 list(gen([1,2,3]))
1442 """,
1443 branchz="34 37",
1444 branchz_missing="",
1445 )
1447 def test_bug_308(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1448 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1449 """\
1450 def run():
1451 for i in range(10):
1452 yield lambda: i
1454 for f in run():
1455 print(f())
1456 """,
1457 branchz="23 2. 56 5.",
1458 branchz_missing="",
1459 )
1460 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1461 """\
1462 def run():
1463 yield lambda: 100
1464 for i in range(10):
1465 yield lambda: i
1467 for f in run():
1468 print(f())
1469 """,
1470 branchz="34 3. 67 6.",
1471 branchz_missing="",
1472 )
1473 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1474 """\
1475 def run():
1476 yield lambda: 100 # no branch miss
1478 for f in run():
1479 print(f())
1480 """,
1481 branchz="45 4.",
1482 branchz_missing="",
1483 )
1485 def test_bug_324(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1486 # This code is tricky: the list() call pulls all the values from gen(),
1487 # but each of them is a generator itself that is never iterated. As a
1488 # result, the generator expression on line 3 is never entered or run.
1489 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1490 """\
1491 def gen(inp):
1492 for n in inp:
1493 yield (i * 2 for i in range(n))
1495 list(gen([1,2,3]))
1496 """,
1497 branchz="23 2.",
1498 branchz_missing="",
1499 )
1501 def test_coroutines(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1502 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1503 """\
1504 def double_inputs():
1505 while len([1]): # avoid compiler differences
1506 x = yield
1507 x *= 2
1508 yield x
1510 gen = double_inputs()
1511 next(gen)
1512 print(gen.send(10))
1513 next(gen)
1514 print(gen.send(6))
1515 """,
1516 branchz="23 2-1",
1517 branchz_missing="2-1",
1518 )
1519 assert self.stdout() == "20\n12\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1521 def test_yield_from(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1522 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1523 """\
1524 def gen(inp):
1525 i = 2
1526 for n in inp:
1527 i = 4
1528 yield from range(3)
1529 i = 6
1530 i = 7
1532 list(gen([1,2,3]))
1533 """,
1534 branchz="34 37",
1535 branchz_missing="",
1536 )
1538 def test_abandoned_yield(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1539 # https://github.com/coveragepy/coveragepy/issues/440
1540 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1541 """\
1542 def gen():
1543 print(2)
1544 yield 3
1545 print(4)
1547 print(next(gen()))
1548 """,
1549 lines=[1, 2, 3, 4, 6],
1550 missing="4",
1551 branchz="",
1552 branchz_missing="",
1553 )
1554 assert self.stdout() == "2\n3\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1557class MatchCaseTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1558 """Tests of match-case."""
1560 def test_match_case_with_default(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1561 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1562 """\
1563 for command in ["huh", "go home", "go n"]:
1564 match command.split():
1565 case ["go", direction] if direction in "nesw":
1566 match = f"go: {direction}"
1567 case ["go", _]:
1568 match = "no go"
1569 case _:
1570 match = "default"
1571 print(match)
1572 """,
1573 branchz="12 1-1 34 35 56 57",
1574 branchz_missing="",
1575 )
1576 assert self.stdout() == "default\nno go\ngo: n\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1578 def test_match_case_with_named_default(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1579 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1580 """\
1581 for command in ["huh", "go home", "go n"]:
1582 match command.split():
1583 case ["go", direction] if direction in "nesw":
1584 match = f"go: {direction}"
1585 case ["go", _]:
1586 match = "no go"
1587 case _ as value:
1588 match = "default"
1589 print(match)
1590 """,
1591 branchz="12 1-1 34 35 56 57",
1592 branchz_missing="",
1593 )
1594 assert self.stdout() == "default\nno go\ngo: n\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1596 def test_match_case_with_wildcard(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1597 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1598 """\
1599 for command in ["huh", "go home", "go n"]:
1600 match command.split():
1601 case ["go", direction] if direction in "nesw":
1602 match = f"go: {direction}"
1603 case ["go", _]:
1604 match = "no go"
1605 case x:
1606 match = f"default: {x}"
1607 print(match)
1608 """,
1609 branchz="12 1-1 34 35 56 57",
1610 branchz_missing="",
1611 )
1612 assert self.stdout() == "default: ['huh']\nno go\ngo: n\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1614 def test_match_case_without_wildcard(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1615 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1616 """\
1617 match = None
1618 for command in ["huh", "go home", "go n"]:
1619 match command.split():
1620 case ["go", direction] if direction in "nesw":
1621 match = f"go: {direction}"
1622 case ["go", _]:
1623 match = "no go"
1624 print(match)
1625 """,
1626 branchz="23 2-1 45 46 67 68",
1627 branchz_missing="",
1628 )
1629 assert self.stdout() == "None\nno go\ngo: n\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1631 def test_absurd_wildcards(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1632 # https://github.com/coveragepy/coveragepy/issues/1421
1633 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1634 """\
1635 def absurd(x):
1636 match x:
1637 case (3 | 99 | (999 | _)):
1638 print("default")
1639 absurd(5)
1640 """,
1641 # No branches because 3 always matches.
1642 branchz="",
1643 branchz_missing="",
1644 )
1645 assert self.stdout() == "default\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1646 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1647 """\
1648 def absurd(x):
1649 match x:
1650 case (3 | 99 | 999 as y):
1651 print("not default")
1652 absurd(5)
1653 """,
1654 branchz="34 3-1",
1655 branchz_missing="34",
1656 )
1657 assert self.stdout() == "" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1658 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1659 """\
1660 def absurd(x):
1661 match x:
1662 case (3 | 17 as y):
1663 print("not default")
1664 case 7: # 5
1665 print("also not default")
1666 absurd(7)
1667 """,
1668 branchz="34 35 56 5-1",
1669 branchz_missing="34 5-1",
1670 )
1671 assert self.stdout() == "also not default\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1672 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1673 """\
1674 def absurd(x):
1675 match x:
1676 case 3:
1677 print("not default")
1678 case _ if x == 7: # 5
1679 print("also not default")
1680 absurd(7)
1681 """,
1682 branchz="34 35 56 5-1",
1683 branchz_missing="34 5-1",
1684 )
1685 assert self.stdout() == "also not default\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1687 def test_split_match_case(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1688 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1689 """\
1690 def foo(x):
1691 match x:
1692 case (
1693 1
1694 | 2
1695 ):
1696 return "output: 1 or 2"
1697 case _:
1698 return "output: other"
1700 print(foo(1))
1701 print(foo(2))
1702 print(foo(3))
1703 """,
1704 lines=[1, 2, 3, 7, 8, 9, 11, 12, 13],
1705 missing="",
1706 branchz="37 38",
1707 branchz_missing="",
1708 )
1709 assert self.stdout() == "output: 1 or 2\noutput: 1 or 2\noutput: other\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1712class OptimizedIfTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1713 """Tests of if statements being optimized away."""
1715 def test_optimized_away_if_0(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1716 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1717 """\
1718 a = 1
1719 if len([2]):
1720 c = 3
1721 if 0:
1722 if len([5]):
1723 d = 6
1724 else:
1725 e = 8
1726 f = 9
1727 """,
1728 lines=[1, 2, 3, 4, 8, 9],
1729 branchz="23 24",
1730 branchz_missing="24",
1731 )
1733 def test_optimized_away_if_1(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1734 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1735 """\
1736 a = 1
1737 if len([2]):
1738 c = 3
1739 if 1:
1740 if len([5]):
1741 d = 6
1742 else:
1743 e = 8
1744 f = 9
1745 """,
1746 lines=[1, 2, 3, 4, 5, 6, 9],
1747 branchz="23 24 56 59",
1748 branchz_missing="24 59",
1749 )
1751 def test_optimized_away_if_1_no_else(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1752 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1753 """\
1754 a = 1
1755 if 1:
1756 b = 3
1757 c = 4
1758 d = 5
1759 """,
1760 lines=[1, 2, 3, 4, 5],
1761 branchz="",
1762 branchz_missing="",
1763 )
1765 def test_optimized_if_nested(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1766 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1767 """\
1768 a = 1
1769 if 0:
1770 if 0:
1771 b = 4
1772 else:
1773 c = 6
1774 else:
1775 if 0:
1776 d = 9
1777 else:
1778 if 0: e = 11
1779 f = 12
1780 if 0: g = 13
1781 h = 14
1782 i = 15
1783 """,
1784 lines=[1, 2, 8, 11, 12, 13, 14, 15],
1785 branchz="",
1786 branchz_missing="",
1787 )
1789 def test_dunder_debug(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1790 # Since some of our tests use __debug__, let's make sure it is true as
1791 # we expect
1792 assert __debug__ 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1793 # Check that executed code has __debug__
1794 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1795 """\
1796 assert __debug__, "assert __debug__"
1797 """,
1798 )
1799 # Check that if it didn't have debug, it would let us know.
1800 with pytest.raises(AssertionError): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1801 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1802 """\
1803 assert not __debug__, "assert not __debug__"
1804 """,
1805 )
1807 def test_if_debug(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1808 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1809 """\
1810 for value in [True, False]:
1811 if value:
1812 if __debug__:
1813 x = 4
1814 else:
1815 x = 6
1816 """,
1817 branchz="12 1. 23 26",
1818 branchz_missing="",
1819 )
1821 def test_if_not_debug(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1822 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1823 """\
1824 lines = set()
1825 for value in [True, False]:
1826 if value:
1827 if not __debug__:
1828 lines.add(5)
1829 else:
1830 lines.add(7)
1831 assert lines == {7}
1832 """,
1833 branchz="23 28 34 37",
1834 )
1837class MiscArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1838 """Miscellaneous arc-measuring tests."""
1840 def test_dict_literal(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1841 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1842 """\
1843 d = {
1844 'a': 2,
1845 'b': 3,
1846 'c': {
1847 'd': 5,
1848 'e': 6,
1849 }
1850 }
1851 assert d
1852 """,
1853 branchz="",
1854 branchz_missing="",
1855 )
1856 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1857 """\
1858 d = \\
1859 { 'a': 2,
1860 'b': 3,
1861 'c': {
1862 'd': 5,
1863 'e': 6,
1864 }
1865 }
1866 assert d
1867 """,
1868 branchz="",
1869 branchz_missing="",
1870 )
1872 def test_unpacked_literals(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1873 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1874 """\
1875 d = {
1876 'a': 2,
1877 'b': 3,
1878 }
1879 weird = {
1880 **d,
1881 **{'c': 7},
1882 'd': 8,
1883 }
1884 assert weird['b'] == 3
1885 """,
1886 branchz="",
1887 branchz_missing="",
1888 )
1889 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1890 """\
1891 l = [
1892 2,
1893 3,
1894 ]
1895 weird = [
1896 *l,
1897 *[7],
1898 8,
1899 ]
1900 assert weird[1] == 3
1901 """,
1902 branchz="",
1903 branchz_missing="",
1904 )
1906 @pytest.mark.parametrize("n", [10, 50, 100, 500, 1000, 2000, 10000]) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1907 def test_pathologically_long_code_object(self, n: int) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1908 # https://github.com/coveragepy/coveragepy/issues/359
1909 # Long code objects sometimes cause problems. Originally, it was
1910 # due to EXTENDED_ARG bytes codes. Then it showed a mistake in
1911 # line-number packing.
1912 code = ( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1913 """\
1914 data = [
1915 """
1916 + "".join(
1917 f"""\
1918 [
1919 {i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}],
1920 """
1921 for i in range(n)
1922 )
1923 + """\
1924 ]
1926 print(len(data))
1927 """
1928 )
1929 self.check_coverage(code, branchz="") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1930 assert self.stdout() == f"{n}\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
1932 def test_partial_generators(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1933 # https://github.com/coveragepy/coveragepy/issues/475
1934 # Line 2 is executed completely.
1935 # Line 3 is started but not finished, because zip ends before it finishes.
1936 # Line 4 is never started.
1937 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1938 """\
1939 def f(a, b):
1940 c = (i for i in a) # 2
1941 d = (j for j in b) # 3
1942 e = (k for k in b) # 4
1943 return dict(zip(c, d))
1945 f(['a', 'b'], [1, 2, 3])
1946 """,
1947 branchz="",
1948 branchz_missing="",
1949 )
1951 def test_failing_open(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1952 with mock.patch.object(coverage.python, "open", side_effect=IOError("Nope")): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1953 self.make_file( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1954 "some_branches.py",
1955 """\
1956 def forelse(seq):
1957 for n in seq:
1958 if n > 5:
1959 break
1960 else:
1961 print('None of the values were greater than 5')
1962 print('Done')
1963 forelse([1,2])
1964 """,
1965 )
1966 cov = coverage.Coverage(branch=True) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1967 self.start_import_stop(cov, "some_branches") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1968 # No assert: the test passes if it didn't raise an exception.
1971class DecoratorArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1972 """Tests of arcs with decorators."""
1974 def test_function_decorator(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1975 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1976 """\
1977 def decorator(arg):
1978 def _dec(f):
1979 return f
1980 return _dec
1982 @decorator(6)
1983 @decorator(
1984 len([8]),
1985 )
1986 def my_function(
1987 a=len([11]),
1988 ):
1989 x = 13
1990 a = 14
1991 my_function()
1992 """,
1993 branchz="",
1994 branchz_missing="",
1995 )
1997 def test_class_decorator(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1998 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
1999 """\
2000 def decorator(arg):
2001 def _dec(c):
2002 return c
2003 return _dec
2005 @decorator(6)
2006 @decorator(
2007 len([8]),
2008 )
2009 class MyObject(
2010 object
2011 ):
2012 X = 13
2013 a = 14
2014 """,
2015 branchz="",
2016 branchz_missing="",
2017 )
2019 def test_bug_466a(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2020 # A bad interaction between decorators and multi-line list assignments,
2021 # believe it or not...!
2022 # This example makes more sense when considered in tandem with 466b below.
2023 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2024 """\
2025 class Parser(object):
2027 @classmethod
2028 def parse(cls):
2029 formats = [ 5 ]
2032 return None
2034 Parser.parse()
2035 """,
2036 branchz="",
2037 branchz_missing="",
2038 )
2040 def test_bug_466b(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2041 # A bad interaction between decorators and multi-line list assignments,
2042 # believe it or not...!
2043 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2044 """\
2045 class Parser(object):
2047 @classmethod
2048 def parse(cls):
2049 formats = [
2050 6,
2051 ]
2052 return None
2054 Parser.parse()
2055 """,
2056 branchz="",
2057 branchz_missing="",
2058 )
2061class LambdaArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2062 """Tests of lambdas"""
2064 def test_multiline_lambda(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2065 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2066 """\
2067 fn = (lambda x:
2068 x + 2
2069 )
2070 assert fn(4) == 6
2071 """,
2072 branchz="",
2073 branchz_missing="",
2074 )
2075 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2076 """\
2078 fn = \\
2079 (
2080 lambda
2081 x:
2082 x
2083 +
2084 8
2085 )
2086 assert fn(10) == 18
2087 """,
2088 branchz="",
2089 branchz_missing="",
2090 )
2092 def test_unused_lambdas_are_confusing_bug_90(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2093 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2094 """\
2095 a = 1
2096 fn = lambda x: x
2097 b = 3
2098 """,
2099 branchz="",
2100 branchz_missing="",
2101 )
2103 def test_raise_with_lambda_looks_like_partial_branch(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2104 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2105 """\
2106 def ouch(fn):
2107 2/0
2108 a = b = c = d = 3
2109 try:
2110 a = ouch(lambda: 5)
2111 if a:
2112 b = 7
2113 except ZeroDivisionError:
2114 c = 9
2115 d = 10
2116 assert (a, b, c, d) == (3, 3, 9, 10)
2117 """,
2118 lines=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
2119 missing="6-7",
2120 branchz="67 6A",
2121 branchz_missing="67 6A",
2122 )
2124 def test_lambda_in_dict(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2125 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2126 """\
2127 x = 1
2128 x = 2
2129 d = {
2130 4: lambda: [],
2131 5: lambda: [],
2132 6: lambda: [],
2133 7: lambda: [],
2134 }
2136 for k, v in d.items(): # 10
2137 if k & 1:
2138 v()
2139 """,
2140 branchz="AB A. BA BC",
2141 branchz_missing="",
2142 )
2145class AsyncTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2146 """Tests of the new async and await keywords in Python 3.5"""
2148 def test_async(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2149 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2150 """\
2151 import asyncio
2153 async def compute(x, y): # 3
2154 print(f"Compute {x} + {y} ...")
2155 await asyncio.sleep(0.001)
2156 return x + y # 6
2158 async def print_sum(x, y): # 8
2159 result = (0 +
2160 await compute(x, y) # A
2161 )
2162 print(f"{x} + {y} = {result}")
2164 loop = asyncio.new_event_loop() # E
2165 loop.run_until_complete(print_sum(1, 2))
2166 loop.close() # G
2167 """,
2168 branchz="",
2169 branchz_missing="",
2170 )
2171 assert self.stdout() == "Compute 1 + 2 ...\n1 + 2 = 3\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2173 def test_async_for(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2174 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2175 """\
2176 import asyncio
2178 class AsyncIteratorWrapper: # 3
2179 def __init__(self, obj): # 4
2180 self._it = iter(obj)
2182 def __aiter__(self): # 7
2183 return self
2185 async def __anext__(self): # A
2186 try:
2187 return next(self._it)
2188 except StopIteration:
2189 raise StopAsyncIteration
2191 async def doit(): # G
2192 async for letter in AsyncIteratorWrapper("abc"):
2193 print(letter)
2194 print(".")
2196 loop = asyncio.new_event_loop() # L
2197 loop.run_until_complete(doit())
2198 loop.close()
2199 """,
2200 branchz="HI HJ",
2201 branchz_missing="",
2202 )
2203 assert self.stdout() == "a\nb\nc\n.\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2205 def test_async_with(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2206 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2207 """\
2208 async def go():
2209 async with x:
2210 pass
2211 """,
2212 branchz="",
2213 branchz_missing="",
2214 )
2216 def test_async_decorator(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2217 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2218 """\
2219 def wrap(f): # 1
2220 return f
2222 @wrap # 4
2223 async def go():
2224 return
2225 """,
2226 branchz="",
2227 branchz_missing="",
2228 )
2230 # https://github.com/coveragepy/coveragepy/issues/1158
2231 def test_bug_1158(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2232 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2233 """\
2234 import asyncio
2236 async def async_gen():
2237 yield 4
2239 async def async_test():
2240 global a
2241 a = 8
2242 async for i in async_gen():
2243 print(i + 10)
2244 else:
2245 a = 12
2247 asyncio.run(async_test())
2248 assert a == 12
2249 """,
2250 branchz="9A 9C",
2251 branchz_missing="",
2252 )
2253 assert self.stdout() == "14\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2255 # https://github.com/coveragepy/coveragepy/issues/1176
2256 # https://bugs.python.org/issue44622
2257 def test_bug_1176(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2258 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2259 """\
2260 import asyncio
2262 async def async_gen():
2263 yield 4
2265 async def async_test():
2266 async for i in async_gen():
2267 print(i + 8)
2269 asyncio.run(async_test())
2270 """,
2271 branchz="78 7-6",
2272 branchz_missing="",
2273 )
2274 assert self.stdout() == "12\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2276 # https://github.com/coveragepy/coveragepy/issues/1205
2277 def test_bug_1205(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2278 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2279 """\
2280 def func():
2281 if T(2):
2282 if T(3):
2283 if F(4):
2284 if X(5):
2285 return 6
2286 else:
2287 return 8
2288 elif X(9) and Y:
2289 return 10
2291 T, F = (lambda _: True), (lambda _: False)
2292 func()
2293 """,
2294 branchz="23 29 34 38 45 4. 56 5. 9A 9.",
2295 branchz_missing="29 38 45 56 5. 9A 9.",
2296 )
2298 def test_bug_1999(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2299 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2300 """\
2301 import asyncio
2303 async def async_range(number):
2304 for n in range(number):
2305 yield n
2307 async def do_something(number):
2308 try:
2309 async for n in async_range(number):
2310 print(n)
2311 finally:
2312 print("Done.")
2314 asyncio.run(do_something(3))
2315 """,
2316 branchz="4-3 45 9A 9C",
2317 branchz_missing="",
2318 )
2319 assert self.stdout() == "0\n1\n2\nDone.\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2322class AnnotationTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2323 """Tests using type annotations."""
2325 def test_annotations(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2326 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2327 """\
2328 def f(x:str, y:int) -> str:
2329 a:int = 2
2330 return f"{x}, {y}, {a}, 3"
2331 print(f("x", 4))
2332 """,
2333 branchz="",
2334 branchz_missing="",
2335 )
2336 assert self.stdout() == "x, 4, 2, 3\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2339class ExcludeTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2340 """Tests of exclusions to indicate known partial branches."""
2342 def test_default(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2343 # A number of forms of pragma comment are accepted.
2344 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2345 """\
2346 a = 1
2347 if a: #pragma: no branch
2348 b = 3
2349 c = 4
2350 if c: # pragma NOBRANCH
2351 d = 6
2352 e = 7
2353 if e:#\tpragma:\tno branch
2354 f = 9
2355 import typing
2356 if typing.TYPE_CHECKING: # only for mypy
2357 g = 12
2358 else:
2359 h = 14
2360 """,
2361 lines=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14],
2362 missing="",
2363 branchz="23 24 56 57 89 8A BC BE",
2364 branchz_missing="",
2365 )
2367 def test_custom_pragmas(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2368 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2369 """\
2370 a = 1
2371 while a: # [only some]
2372 c = 3
2373 break
2374 assert c == 5-2
2375 """,
2376 lines=[1, 2, 3, 4, 5],
2377 partials=["only some"],
2378 branchz="23 25",
2379 branchz_missing="",
2380 )
2383class LineDataTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2384 """Tests that line_data gives us what we expect."""
2386 def test_branch(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2387 self.make_file( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2388 "fun1.py",
2389 """\
2390 def fun1(x):
2391 if x == 1:
2392 return
2394 fun1(3)
2395 """,
2396 )
2398 cov = coverage.Coverage(branch=True) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2399 self.start_import_stop(cov, "fun1") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2401 data = cov.get_data() 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2402 fun1_lines = sorted_lines(data, abs_file("fun1.py")) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2403 assert_count_equal(fun1_lines, [1, 2, 5]) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz
2406class NonPythonFileTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2407 """Tools like Jinja run code credited to non-Python files."""
2409 def test_non_python_file(self) -> None: 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2410 # Make a code object with branches, and claim it came from an HTML file.
2411 # With sysmon, this used to fail trying to parse the source. #2077
2412 self.make_file("hello.html", "<h1>Hello!</h1>") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2413 code = textwrap.dedent("""\ 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2414 a = 1
2415 while a:
2416 c = 3
2417 break
2418 assert c == 5 - 2
2419 """)
2420 code_obj = compile(code, filename="hello.html", mode="exec") 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2421 cov = coverage.Coverage(branch=True, debug=["trace"]) 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2422 with cov.collect(): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz
2423 exec(code_obj) 1YZ0abcdefghijklmnopqrstuvwx1yz