Coverage for tests / test_report_common.py: 100.000%

128 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 of behavior common to all reporting.""" 

5 

6from __future__ import annotations 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

7 

8import textwrap 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

9 

10import coverage 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

11from coverage.files import abs_file 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

12 

13from tests.coveragetest import CoverageTest 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

14from tests.goldtest import contains, doesnt_contain 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

15from tests.helpers import arcz_to_arcs, os_sep 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

16 

17 

18class ReportMapsPathsTest(CoverageTest): 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

19 """Check that reporting implicitly maps paths.""" 

20 

21 def make_files(self, data: str, settings: bool = False) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

22 """Create the test files we need for line coverage.""" 

23 src = """\ 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

24 if VER == 1: 

25 print("line 2") 

26 if VER == 2: 

27 print("line 4") 

28 if VER == 3: 

29 print("line 6") 

30 """ 

31 self.make_file("src/program.py", src) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

32 self.make_file("ver1/program.py", src) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

33 self.make_file("ver2/program.py", src) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

34 

35 if data == "line": 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

36 self.make_data_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

37 lines={ 

38 abs_file("ver1/program.py"): [1, 2, 3, 5], 

39 abs_file("ver2/program.py"): [1, 3, 4, 5], 

40 }, 

41 ) 

42 else: 

43 self.make_data_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

44 arcs={ 

45 abs_file("ver1/program.py"): arcz_to_arcs(".1 12 23 35 5."), 

46 abs_file("ver2/program.py"): arcz_to_arcs(".1 13 34 45 5."), 

47 }, 

48 ) 

49 

50 if settings: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

51 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

52 ".coveragerc", 

53 """\ 

54 [paths] 

55 source = 

56 src 

57 ver1 

58 ver2 

59 """, 

60 ) 

61 

62 def test_map_paths_during_line_report_without_setting(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

63 self.make_files(data="line") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

64 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

65 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

66 cov.report(show_missing=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

67 expected = textwrap.dedent( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

68 os_sep("""\ 

69 Name Stmts Miss Cover Missing 

70 ----------------------------------------------- 

71 ver1/program.py 6 2 67% 4, 6 

72 ver2/program.py 6 2 67% 2, 6 

73 ----------------------------------------------- 

74 TOTAL 12 4 67% 

75 """) 

76 ) 

77 assert expected == self.stdout() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

78 

79 def test_map_paths_during_line_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

80 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

81 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

82 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

83 cov.report(show_missing=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

84 expected = textwrap.dedent( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

85 os_sep("""\ 

86 Name Stmts Miss Cover Missing 

87 ---------------------------------------------- 

88 src/program.py 6 1 83% 6 

89 ---------------------------------------------- 

90 TOTAL 6 1 83% 

91 """) 

92 ) 

93 assert expected == self.stdout() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

94 

95 def test_map_paths_during_branch_report_without_setting(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

96 self.make_files(data="arcs") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

97 cov = coverage.Coverage(branch=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

98 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

99 cov.report(show_missing=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

100 expected = textwrap.dedent( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

101 os_sep("""\ 

102 Name Stmts Miss Branch BrPart Cover Missing 

103 ------------------------------------------------------------- 

104 ver1/program.py 6 2 6 3 58% 1->3, 4, 6 

105 ver2/program.py 6 2 6 3 58% 2, 3->5, 6 

106 ------------------------------------------------------------- 

107 TOTAL 12 4 12 6 58% 

108 """) 

109 ) 

110 assert expected == self.stdout() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

111 

112 def test_map_paths_during_branch_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

113 self.make_files(data="arcs", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

114 cov = coverage.Coverage(branch=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

115 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

116 cov.report(show_missing=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

117 expected = textwrap.dedent( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

118 os_sep("""\ 

119 Name Stmts Miss Branch BrPart Cover Missing 

120 ------------------------------------------------------------ 

121 src/program.py 6 1 6 1 83% 6 

122 ------------------------------------------------------------ 

123 TOTAL 6 1 6 1 83% 

124 """) 

125 ) 

126 assert expected == self.stdout() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

127 

128 def test_map_paths_during_annotate(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

129 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

130 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

131 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

132 cov.annotate() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

133 self.assert_exists(os_sep("src/program.py,cover")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

134 self.assert_doesnt_exist(os_sep("ver1/program.py,cover")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

135 self.assert_doesnt_exist(os_sep("ver2/program.py,cover")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

136 

137 def test_map_paths_during_html_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

138 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

139 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

140 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

141 cov.html_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

142 contains("htmlcov/index.html", os_sep("src / program.py")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

143 doesnt_contain("htmlcov/index.html", "ver1", "ver2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

144 

145 def test_map_paths_during_xml_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

146 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

147 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

148 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

149 cov.xml_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

150 contains("coverage.xml", "src/program.py") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

151 doesnt_contain("coverage.xml", "ver1", "ver2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

152 

153 def test_map_paths_during_json_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

154 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

155 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

156 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

157 cov.json_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

158 

159 def os_sepj(s: str) -> str: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

160 return os_sep(s).replace("\\", r"\\") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

161 

162 contains("coverage.json", os_sepj("src/program.py")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

163 doesnt_contain("coverage.json", "ver1", "ver2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

164 

165 def test_map_paths_during_lcov_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

166 self.make_files(data="line", settings=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

167 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

168 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

169 cov.lcov_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

170 contains("coverage.lcov", os_sep("src/program.py")) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

171 doesnt_contain("coverage.lcov", "ver1", "ver2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

172 

173 

174class ReportWithJinjaTest(CoverageTest): 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

175 """Tests of Jinja-like behavior. 

176 

177 Jinja2 compiles a template into Python code, and then runs the Python code 

178 to render the template. But during rendering, it uses the template name 

179 (for example, "template.j2") as the file name, not the Python code file 

180 name. Then during reporting, we will try to parse template.j2 as Python 

181 code. 

182 

183 If the file can be parsed, it's included in the report (as a Python file!). 

184 If it can't be parsed, then it's not included in the report. 

185 

186 These tests confirm that code doesn't raise an exception (as reported in 

187 #1553), and that the current (incorrect) behavior remains stable. Ideally, 

188 good.j2 wouldn't be listed at all, since we can't report on it accurately. 

189 

190 See https://github.com/coveragepy/coveragepy/issues/1553 for more detail, and 

191 https://github.com/coveragepy/coveragepy/issues/1623 for an issue about this 

192 behavior. 

193 

194 """ 

195 

196 def make_files(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

197 """Create test files: two Jinja templates, and data from rendering them.""" 

198 # A Jinja2 file that is syntactically acceptable Python (though it wont run). 

199 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

200 "good.j2", 

201 """\ 

202 {{ data }} 

203 line2 

204 line3 

205 """, 

206 ) 

207 # A Jinja2 file that is a Python syntax error. 

208 self.make_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

209 "bad.j2", 

210 """\ 

211 This is data: {{ data }}. 

212 line 2 

213 line 3 

214 """, 

215 ) 

216 self.make_data_file( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

217 lines={ 

218 abs_file("good.j2"): [1, 3, 5, 7, 9], 

219 abs_file("bad.j2"): [1, 3, 5, 7, 9], 

220 }, 

221 ) 

222 

223 def test_report(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

224 self.make_files() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

225 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

226 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

227 cov.report(show_missing=True) 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

228 expected = textwrap.dedent("""\ 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

229 Name Stmts Miss Cover Missing 

230 --------------------------------------- 

231 good.j2 3 1 67% 2 

232 --------------------------------------- 

233 TOTAL 3 1 67% 

234 """) 

235 assert expected == self.stdout() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

236 

237 def test_html(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

238 self.make_files() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

239 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

240 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

241 cov.html_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

242 contains( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

243 "htmlcov/index.html", 

244 """\ 

245 <tbody> 

246 <tr class="region"> 

247 <td class="name"><a href="good_j2.html">good.j2</a></td> 

248 <td class="spacer">&nbsp;</td> 

249 <td>3</td> 

250 <td>1</td> 

251 <td>0</td> 

252 <td class="spacer">&nbsp;</td> 

253 <td data-ratio="2 3">67%</td> 

254 </tr> 

255 </tbody>""", 

256 ) 

257 doesnt_contain("htmlcov/index.html", "bad.j2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

258 

259 def test_xml(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

260 self.make_files() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

261 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

262 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

263 cov.xml_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

264 contains("coverage.xml", 'filename="good.j2"') 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

265 contains( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

266 "coverage.xml", 

267 '<line number="1" hits="1"/>', 

268 '<line number="2" hits="0"/>', 

269 '<line number="3" hits="1"/>', 

270 ) 

271 doesnt_contain("coverage.xml", 'filename="bad.j2"') 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

272 doesnt_contain("coverage.xml", '<line number="4"') 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

273 

274 def test_json(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

275 self.make_files() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

276 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

277 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

278 cov.json_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

279 contains( 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

280 "coverage.json", 

281 # Notice the .json report claims lines in good.j2 executed that 

282 # don't even exist in good.j2... 

283 '"files": {"good.j2": {"executed_lines": [1, 3, 5, 7, 9], ' 

284 + '"summary": {"covered_lines": 2, "num_statements": 3', 

285 ) 

286 doesnt_contain("coverage.json", "bad.j2") 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

287 

288 def test_lcov(self) -> None: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

289 self.make_files() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

290 cov = coverage.Coverage() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

291 cov.load() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

292 cov.lcov_report() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

293 with open("coverage.lcov", encoding="utf-8") as lcov: 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

294 actual = lcov.read() 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

295 expected = textwrap.dedent("""\ 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()

296 SF:good.j2 

297 DA:1,1 

298 DA:2,0 

299 DA:3,1 

300 LF:3 

301 LH:2 

302 end_of_record 

303 """) 

304 assert expected == actual 1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%'()