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

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 

3 

4"""Tests for coverage.py's arc measurement.""" 

5 

6from __future__ import annotations 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

7 

8import textwrap 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

9from unittest import mock 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

10 

11import pytest 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

12 

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

15 

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

20 

21 

22class SimpleArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

23 """Tests for coverage.py's arc measurement.""" 

24 

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 

36 

37 b = 3 

38 """, 

39 branchz="", 

40 ) 

41 self.check_coverage( 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz

42 """\ 

43 

44 a = 2 

45 b = 3 

46 

47 c = 5 

48 """, 

49 branchz="", 

50 ) 

51 

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 

57 

58 foo() 

59 """, 

60 branchz="", 

61 ) 

62 

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 ) 

84 

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 ) 

108 

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 ) 

130 

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 ) 

143 

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 ) 

158 

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 ) 

185 

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 

196 

197 for i in range(3): # 9 

198 foo(i) 

199 """, 

200 branchz="23 27 9A 9.", 

201 branchz_missing="", 

202 ) 

203 

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) 

211 

212 func([5], True) 

213 """, 

214 branchz="2-1 23", 

215 branchz_missing="", 

216 ) 

217 assert self.stdout() == "5\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz

218 

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 

223 

224 if foo == True: 

225 foo = False 

226 else: # pragma: no cover 

227 pass 

228 

229 if foo == False: 

230 foo = True 

231 else: # pragma: no cover 

232 None 

233 

234 print("Done") 

235 """, 

236 branchz="34 36 89 8B", 

237 branchz_missing="", 

238 ) 

239 assert self.stdout() == "Done\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz

240 

241 

242class WithTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

243 """Arc-measuring tests involving context managers.""" 

244 

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 

252 

253 example() 

254 """, 

255 branchz="", 

256 branchz_missing="", 

257 ) 

258 

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 

266 

267 example() 

268 """, 

269 branchz="", 

270 branchz_missing="", 

271 ) 

272 

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

287 

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 

297 

298 example(8) 

299 """, 

300 branchz="", 

301 branchz_missing="", 

302 ) 

303 

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 ) 

316 

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 ) 

329 

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

350 

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

369 

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

391 

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

405 

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 ) 

417 

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 ) 

434 

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 ) 

453 

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 ) 

470 

471 

472class LoopArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

473 """Arc-measuring tests involving loops.""" 

474 

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 ) 

495 

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 ) 

507 

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 ) 

520 

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 ) 

533 

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 ) 

548 

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 ) 

563 

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 ) 

579 

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 ) 

595 

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 ) 

608 

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 ) 

623 

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

642 

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 ) 

658 

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 ) 

671 

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 

681 

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 

689 

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 ) 

696 

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 ) 

726 

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 ) 

739 

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 ) 

771 

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 ) 

794 

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 

804 

805 wrong_loop(8) 

806 """, 

807 branchz="23 26 34 3.", 

808 branchz_missing="26", 

809 ) 

810 

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 

821 

822 wrong_loop(8) 

823 """, 

824 branchz="23 26 34 3.", 

825 branchz_missing="26 3.", 

826 ) 

827 

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 ) 

841 

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 ) 

858 

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 ) 

884 

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 ) 

926 

927 

928class ExceptionArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

929 """Arc-measuring tests involving exception handling.""" 

930 

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 ) 

944 

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 ) 

960 

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 ) 

979 

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 ) 

1001 

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 ) 

1044 

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 ) 

1084 

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 ) 

1105 

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 ) 

1126 

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 ) 

1147 

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 ) 

1162 

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 

1177 

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 ) 

1187 

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 ) 

1219 

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 ) 

1284 

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 ) 

1304 

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 

1332 

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 ) 

1342 

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 

1372 

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 ) 

1382 

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 ) 

1412 

1413 

1414class YieldTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

1415 """Arc tests for generators.""" 

1416 

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 

1423 

1424 list(gen([1,2,3])) 

1425 """, 

1426 branchz="23 2-1", 

1427 branchz_missing="", 

1428 ) 

1429 

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 

1440 

1441 list(gen([1,2,3])) 

1442 """, 

1443 branchz="34 37", 

1444 branchz_missing="", 

1445 ) 

1446 

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 

1453 

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 

1466 

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 

1477 

1478 for f in run(): 

1479 print(f()) 

1480 """, 

1481 branchz="45 4.", 

1482 branchz_missing="", 

1483 ) 

1484 

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)) 

1494 

1495 list(gen([1,2,3])) 

1496 """, 

1497 branchz="23 2.", 

1498 branchz_missing="", 

1499 ) 

1500 

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 

1509 

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

1520 

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 

1531 

1532 list(gen([1,2,3])) 

1533 """, 

1534 branchz="34 37", 

1535 branchz_missing="", 

1536 ) 

1537 

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) 

1546 

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

1555 

1556 

1557class MatchCaseTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

1558 """Tests of match-case.""" 

1559 

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

1577 

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

1595 

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

1613 

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

1630 

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

1686 

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" 

1699 

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

1710 

1711 

1712class OptimizedIfTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

1713 """Tests of if statements being optimized away.""" 

1714 

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 ) 

1732 

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 ) 

1750 

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 ) 

1764 

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 ) 

1788 

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 ) 

1806 

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 ) 

1820 

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 ) 

1835 

1836 

1837class MiscArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

1838 """Miscellaneous arc-measuring tests.""" 

1839 

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 ) 

1871 

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 ) 

1905 

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 ] 

1925 

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

1931 

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)) 

1944 

1945 f(['a', 'b'], [1, 2, 3]) 

1946 """, 

1947 branchz="", 

1948 branchz_missing="", 

1949 ) 

1950 

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. 

1969 

1970 

1971class DecoratorArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

1972 """Tests of arcs with decorators.""" 

1973 

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 

1981 

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 ) 

1996 

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 

2004 

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 ) 

2018 

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): 

2026 

2027 @classmethod 

2028 def parse(cls): 

2029 formats = [ 5 ] 

2030 

2031 

2032 return None 

2033 

2034 Parser.parse() 

2035 """, 

2036 branchz="", 

2037 branchz_missing="", 

2038 ) 

2039 

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): 

2046 

2047 @classmethod 

2048 def parse(cls): 

2049 formats = [ 

2050 6, 

2051 ] 

2052 return None 

2053 

2054 Parser.parse() 

2055 """, 

2056 branchz="", 

2057 branchz_missing="", 

2058 ) 

2059 

2060 

2061class LambdaArcTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2062 """Tests of lambdas""" 

2063 

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 """\ 

2077 

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 ) 

2091 

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 ) 

2102 

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 ) 

2123 

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 } 

2135 

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 ) 

2143 

2144 

2145class AsyncTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2146 """Tests of the new async and await keywords in Python 3.5""" 

2147 

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 

2152 

2153 async def compute(x, y): # 3 

2154 print(f"Compute {x} + {y} ...") 

2155 await asyncio.sleep(0.001) 

2156 return x + y # 6 

2157 

2158 async def print_sum(x, y): # 8 

2159 result = (0 + 

2160 await compute(x, y) # A 

2161 ) 

2162 print(f"{x} + {y} = {result}") 

2163 

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

2172 

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 

2177 

2178 class AsyncIteratorWrapper: # 3 

2179 def __init__(self, obj): # 4 

2180 self._it = iter(obj) 

2181 

2182 def __aiter__(self): # 7 

2183 return self 

2184 

2185 async def __anext__(self): # A 

2186 try: 

2187 return next(self._it) 

2188 except StopIteration: 

2189 raise StopAsyncIteration 

2190 

2191 async def doit(): # G 

2192 async for letter in AsyncIteratorWrapper("abc"): 

2193 print(letter) 

2194 print(".") 

2195 

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

2204 

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 ) 

2215 

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 

2221 

2222 @wrap # 4 

2223 async def go(): 

2224 return 

2225 """, 

2226 branchz="", 

2227 branchz_missing="", 

2228 ) 

2229 

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 

2235 

2236 async def async_gen(): 

2237 yield 4 

2238 

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 

2246 

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

2254 

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 

2261 

2262 async def async_gen(): 

2263 yield 4 

2264 

2265 async def async_test(): 

2266 async for i in async_gen(): 

2267 print(i + 8) 

2268 

2269 asyncio.run(async_test()) 

2270 """, 

2271 branchz="78 7-6", 

2272 branchz_missing="", 

2273 ) 

2274 assert self.stdout() == "12\n" 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXx1yz

2275 

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 

2290 

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 ) 

2297 

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 

2302 

2303 async def async_range(number): 

2304 for n in range(number): 

2305 yield n 

2306 

2307 async def do_something(number): 

2308 try: 

2309 async for n in async_range(number): 

2310 print(n) 

2311 finally: 

2312 print("Done.") 

2313 

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

2320 

2321 

2322class AnnotationTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2323 """Tests using type annotations.""" 

2324 

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

2337 

2338 

2339class ExcludeTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2340 """Tests of exclusions to indicate known partial branches.""" 

2341 

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 ) 

2366 

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 ) 

2381 

2382 

2383class LineDataTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2384 """Tests that line_data gives us what we expect.""" 

2385 

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 

2393 

2394 fun1(3) 

2395 """, 

2396 ) 

2397 

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

2400 

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

2404 

2405 

2406class NonPythonFileTest(CoverageTest): 12Y3Z40AaBbCcDdEeFfGgHhIiJjKkLlMm5Nn6Oo7Pp8Qq9Rr!Ss#Tt$Uu%Vv'Ww(Xx)1yz

2407 """Tools like Jinja run code credited to non-Python files.""" 

2408 

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