@@ -27,8 +27,7 @@ def _assert_expected_json_report(
27
27
expected_result : dict [str , Any ],
28
28
) -> None :
29
29
"""
30
- Helper that handles common ceremonies so tests can clearly show the
31
- consequences of setting various arguments.
30
+ Helper that creates an example file for most tests.
32
31
"""
33
32
self .make_file ("a.py" , """\
34
33
a = {'b': 1}
@@ -41,9 +40,47 @@ def _assert_expected_json_report(
41
40
if not a:
42
41
b = 4
43
42
""" )
44
- a = self .start_import_stop (cov , "a" )
45
- output_path = os .path .join (self .temp_dir , "a.json" )
46
- cov .json_report (a , outfile = output_path )
43
+ self ._compare_json_reports (cov , expected_result , "a" )
44
+
45
+ def _assert_expected_json_report_with_regions (
46
+ self ,
47
+ cov : Coverage ,
48
+ expected_result : dict [str , Any ],
49
+ ) -> None :
50
+ """
51
+ Helper that creates an example file for regions tests.
52
+ """
53
+ self .make_file ("b.py" , """\
54
+ a = {'b': 1}
55
+
56
+ def c():
57
+ return 1
58
+
59
+ class C:
60
+ pass
61
+
62
+ class D:
63
+ def e(self):
64
+ return 2
65
+ def f(self):
66
+ return 3
67
+ """ )
68
+ self ._compare_json_reports (cov , expected_result , "b" )
69
+
70
+ def _compare_json_reports (
71
+ self ,
72
+ cov : Coverage ,
73
+ expected_result : dict [str , Any ],
74
+ mod_name : str ,
75
+ ) -> None :
76
+ """
77
+ Helper that handles common ceremonies, comparing JSON reports that
78
+ it creates to expected results, so tests can clearly show the
79
+ consequences of setting various arguments.
80
+ """
81
+ mod = self .start_import_stop (cov , mod_name )
82
+ output_path = os .path .join (self .temp_dir , f"{ mod_name } .json" )
83
+ cov .json_report (mod , outfile = output_path )
47
84
with open (output_path ) as result_file :
48
85
parsed_result = json .load (result_file )
49
86
self .assert_recent_datetime (
@@ -140,6 +177,108 @@ def test_simple_line_coverage(self) -> None:
140
177
}
141
178
self ._assert_expected_json_report (cov , expected_result )
142
179
180
+ def test_regions_coverage (self ) -> None :
181
+ cov = coverage .Coverage ()
182
+ expected_result = {
183
+ "meta" : {
184
+ "branch_coverage" : False ,
185
+ "show_contexts" : False
186
+ },
187
+ "files" : {
188
+ "b.py" : {
189
+ "executed_lines" : [1 , 3 , 6 , 7 , 9 , 10 , 12 ],
190
+ "summary" : {
191
+ "covered_lines" : 7 ,
192
+ "num_statements" : 10 ,
193
+ "percent_covered" : 70.0 ,
194
+ "percent_covered_display" : "70" ,
195
+ "missing_lines" : 3 ,
196
+ "excluded_lines" : 0
197
+ },
198
+ "missing_lines" : [4 , 11 , 13 ],
199
+ "excluded_lines" : [],
200
+ "function" : {
201
+ "c" : {
202
+ "executed_lines" : [],
203
+ "summary" : {
204
+ "covered_lines" : 0 ,
205
+ "num_statements" : 1 ,
206
+ "percent_covered" : 0.0 ,
207
+ "percent_covered_display" : "0" ,
208
+ "missing_lines" : 1 ,
209
+ "excluded_lines" : 0
210
+ },
211
+ "missing_lines" : [4 ],
212
+ "excluded_lines" : []
213
+ },
214
+ "D.e" : {
215
+ "executed_lines" : [],
216
+ "summary" : {
217
+ "covered_lines" : 0 ,
218
+ "num_statements" : 1 ,
219
+ "percent_covered" : 0.0 ,
220
+ "percent_covered_display" : "0" ,
221
+ "missing_lines" : 1 ,
222
+ "excluded_lines" : 0
223
+ },
224
+ "missing_lines" : [11 ],
225
+ "excluded_lines" : []
226
+ },
227
+ "D.f" : {
228
+ "executed_lines" : [],
229
+ "summary" : {
230
+ "covered_lines" : 0 ,
231
+ "num_statements" : 1 ,
232
+ "percent_covered" : 0.0 ,
233
+ "percent_covered_display" : "0" ,
234
+ "missing_lines" : 1 ,
235
+ "excluded_lines" : 0
236
+ },
237
+ "missing_lines" : [13 ],
238
+ "excluded_lines" : []
239
+ }
240
+ },
241
+ "class" : {
242
+ "C" : {
243
+ "executed_lines" : [],
244
+ "summary" : {
245
+ "covered_lines" : 0 ,
246
+ "num_statements" : 0 ,
247
+ "percent_covered" : 100.0 ,
248
+ "percent_covered_display" : "100" ,
249
+ "missing_lines" : 0 ,
250
+ "excluded_lines" : 0
251
+ },
252
+ "missing_lines" : [],
253
+ "excluded_lines" : []
254
+ },
255
+ "D" : {
256
+ "executed_lines" : [],
257
+ "summary" : {
258
+ "covered_lines" : 0 ,
259
+ "num_statements" : 2 ,
260
+ "percent_covered" : 0.0 ,
261
+ "percent_covered_display" : "0" ,
262
+ "missing_lines" : 2 ,
263
+ "excluded_lines" : 0
264
+ },
265
+ "missing_lines" : [11 , 13 ],
266
+ "excluded_lines" : []
267
+ }
268
+ }
269
+ }
270
+ },
271
+ "totals" : {
272
+ "covered_lines" : 7 ,
273
+ "num_statements" : 10 ,
274
+ "percent_covered" : 70.0 ,
275
+ "percent_covered_display" : "70" ,
276
+ "missing_lines" : 3 ,
277
+ "excluded_lines" : 0
278
+ }
279
+ }
280
+ self ._assert_expected_json_report_with_regions (cov , expected_result )
281
+
143
282
def run_context_test (self , relative_files : bool ) -> None :
144
283
"""A helper for two tests below."""
145
284
self .make_file ("config" , f"""\
0 commit comments