@@ -224,3 +224,59 @@ def test_extract_metrics_missing_patterns(self, sample_stats_file):
224224 metrics = config .extract_metrics (sample_stats_file )
225225
226226 assert metrics ["missing_cumtime" ] is None
227+
228+ def test_extract_metrics_duplicate_func_no_line_number (self , sample_stats_file ):
229+ """Test that we match the first occurrence when line_number is None."""
230+ patterns = [
231+ FunctionCallConfiguration (
232+ "duplicate_first" ,
233+ "vivarium/framework/values/pipeline.py" ,
234+ "duplicate_func" ,
235+ line_number = None , # Should match first occurrence
236+ extract_cumtime = True ,
237+ extract_percall = True ,
238+ extract_ncalls = True ,
239+ )
240+ ]
241+ config = ExtractionConfig (patterns = patterns )
242+ metrics = config .extract_metrics (sample_stats_file )
243+
244+ # Should match line 66, the first occurrence
245+ assert metrics ["duplicate_first_cumtime" ] == 0.450
246+ assert metrics ["duplicate_first_percall" ] == 0.003
247+ assert metrics ["duplicate_first_ncalls" ] == 150
248+
249+ def test_extract_metrics_duplicate_func_with_line_number (self , sample_stats_file ):
250+ """Test that we can match specific occurrences by line number."""
251+ patterns = [
252+ FunctionCallConfiguration (
253+ "duplicate_line_66" ,
254+ "vivarium/framework/values/pipeline.py" ,
255+ "duplicate_func" ,
256+ line_number = 66 ,
257+ extract_cumtime = True ,
258+ extract_percall = True ,
259+ extract_ncalls = True ,
260+ ),
261+ FunctionCallConfiguration (
262+ "duplicate_line_150" ,
263+ "vivarium/framework/values/pipeline.py" ,
264+ "duplicate_func" ,
265+ line_number = 150 ,
266+ extract_cumtime = True ,
267+ extract_percall = True ,
268+ extract_ncalls = True ,
269+ ),
270+ ]
271+ config = ExtractionConfig (patterns = patterns )
272+ metrics = config .extract_metrics (sample_stats_file )
273+
274+ # Line 66
275+ assert metrics ["duplicate_line_66_cumtime" ] == 0.450
276+ assert metrics ["duplicate_line_66_percall" ] == 0.003
277+ assert metrics ["duplicate_line_66_ncalls" ] == 150
278+
279+ # Line 150
280+ assert metrics ["duplicate_line_150_cumtime" ] == 0.800
281+ assert metrics ["duplicate_line_150_percall" ] == 0.004
282+ assert metrics ["duplicate_line_150_ncalls" ] == 200
0 commit comments