from mutator.coverage import covered_lines def test_jacoco_marks_lines_with_covered_instructions(tmp_path): report = tmp_path / "target" / "site" / "jacoco" / "jacoco.xml" report.parent.mkdir(parents=True) report.write_text( """ """, encoding="utf-8", ) source = tmp_path / "src" / "demo" / "Board.java" source.parent.mkdir(parents=True) source.write_text("package demo;\nclass Board {}\n", encoding="utf-8") assert covered_lines(tmp_path, source, "java") == {3, 5} def test_go_profile_marks_hit_lines(tmp_path): profile = tmp_path / "target" / "coverage" / "go" / "coverage.out" profile.parent.mkdir(parents=True) profile.write_text( "mode: set\n" "demo/widget.go:2.1,4.2 1 1\n" "demo/widget.go:5.1,6.2 1 0\n", encoding="utf-8", ) source = tmp_path / "demo" / "widget.go" source.parent.mkdir() source.write_text("package demo\nfunc Run() {}\n", encoding="utf-8") assert covered_lines(tmp_path, source, "go") == {2, 3, 4} assert covered_lines(tmp_path, tmp_path / "other" / "missing.go", "go") is None empty = tmp_path / "empty" empty.mkdir() assert covered_lines(empty, empty / "demo" / "widget.go", "go") is None def test_lcov_marks_executed_lines(tmp_path): report = tmp_path / "target" / "coverage" / "python" / "lcov.info" report.parent.mkdir(parents=True) report.write_text( "SF:src/demo/app.py\nDA:1,3\nDA:2,0\nend_of_record\n", encoding="utf-8", ) source = tmp_path / "src" / "demo" / "app.py" source.parent.mkdir(parents=True) source.write_text("def place():\n return 1\n", encoding="utf-8") assert covered_lines(tmp_path, source, "python") == {1} assert covered_lines(tmp_path, source, "clojure") == {1}