summaryrefslogtreecommitdiff
path: root/tests/test_lcov.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_lcov.py')
-rw-r--r--tests/test_lcov.py308
1 files changed, 308 insertions, 0 deletions
diff --git a/tests/test_lcov.py b/tests/test_lcov.py
new file mode 100644
index 00000000..9d2f8ec6
--- /dev/null
+++ b/tests/test_lcov.py
@@ -0,0 +1,308 @@
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+"""Test LCOV-based summary reporting for coverage.py."""
+
+import textwrap
+import coverage
+
+from tests.coveragetest import CoverageTest
+
+
+class LcovTest(CoverageTest):
+ """Tests of the LCOV reports from coverage.py."""
+
+ def create_initial_files(self):
+ """
+ Helper for tests that handles the common ceremony so the tests can
+ show the consequences of changes in the setup.
+ """
+ self.make_file(
+ "main_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ def cuboid_volume(l):
+ return (l*l*l)
+
+ def IsItTrue():
+ return True
+
+ """,
+ )
+
+ self.make_file(
+ "test_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ from main_file import cuboid_volume
+ import unittest
+
+ class TestCuboid(unittest.TestCase):
+ def test_volume(self):
+ self.assertAlmostEqual(cuboid_volume(2),8)
+ self.assertAlmostEqual(cuboid_volume(1),1)
+ self.assertAlmostEqual(cuboid_volume(0),0)
+ self.assertAlmostEqual(cuboid_volume(5.5),166.375)
+
+ """,
+ )
+
+ def get_lcov_report_content(self):
+ """Return the content of the LCOV report."""
+ filename = "coverage.lcov"
+ with open(filename, "r") as file:
+ file_contents = file.read()
+ return file_contents
+
+ def test_lone_file(self):
+ """For a single file with a couple of functions, the lcov should cover
+ the function definitions themselves, but not the returns."""
+ self.make_file(
+ "main_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ def cuboid_volume(l):
+ return (l*l*l)
+
+ def IsItTrue():
+ return True
+
+ """,
+ )
+ expected_result = """\
+ TN:
+ SF:main_file.py
+ DA:3,1,7URou3io0zReBkk69lEb/Q
+ DA:6,1,ilhb4KUfytxtEuClijZPlQ
+ DA:4,0,Xqj6H1iz/nsARMCAbE90ng
+ DA:7,0,LWILTcvARcydjFFyo9qM0A
+ LF:4
+ LH:2
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(source=["."])
+ self.start_import_stop(cov, "main_file")
+ cov.lcov_report()
+ actual_result = self.get_lcov_report_content()
+ assert expected_result == actual_result
+
+ def test_simple_line_coverage_two_files(self):
+ """Test that line coverage is created when coverage is run,
+ and matches the output of the file below."""
+ self.create_initial_files()
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(source=".")
+ self.start_import_stop(cov, "test_file")
+ cov.lcov_report()
+ self.assert_exists("coverage.lcov")
+ expected_result = """\
+ TN:
+ SF:main_file.py
+ DA:3,1,7URou3io0zReBkk69lEb/Q
+ DA:6,1,ilhb4KUfytxtEuClijZPlQ
+ DA:4,0,Xqj6H1iz/nsARMCAbE90ng
+ DA:7,0,LWILTcvARcydjFFyo9qM0A
+ LF:4
+ LH:2
+ end_of_record
+ TN:
+ SF:test_file.py
+ DA:3,1,R5Rb4IzmjKRgY/vFFc1TRg
+ DA:4,1,E/tvV9JPVDhEcTCkgrwOFw
+ DA:6,1,GP08LPBYJq8EzYveHJy2qA
+ DA:7,1,MV+jSLi6PFEl+WatEAptog
+ DA:8,0,qyqd1mF289dg6oQAQHA+gQ
+ DA:9,0,nmEYd5F1KrxemgC9iVjlqg
+ DA:10,0,jodMK26WYDizOO1C7ekBbg
+ DA:11,0,LtxfKehkX8o4KvC5GnN52g
+ LF:8
+ LH:4
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ actual_result = self.get_lcov_report_content()
+ assert expected_result == actual_result
+
+ def test_branch_coverage_one_file(self):
+ """Test that the reporter produces valid branch coverage."""
+ self.make_file(
+ "main_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ def is_it_x(x):
+ if x == 3:
+ return x
+ else:
+ return False
+
+ """,
+ )
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(branch=True, source=".")
+ self.start_import_stop(cov, "main_file")
+ cov.lcov_report()
+ self.assert_exists("coverage.lcov")
+ expected_result = """\
+ TN:
+ SF:main_file.py
+ DA:3,1,4MDXMbvwQ3L7va1tsphVzw
+ DA:4,0,MuERA6EYyZNpKPqoJfzwkA
+ DA:5,0,sAyiiE6iAuPMte9kyd0+3g
+ DA:7,0,W/g8GJDAYJkSSurt59Mzfw
+ LF:4
+ LH:1
+ BRDA:5,0,0,-
+ BRDA:7,0,1,-
+ BRF:2
+ BRH:0
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ actual_result = self.get_lcov_report_content()
+ assert expected_result == actual_result
+
+ def test_branch_coverage_two_files(self):
+ """Test that valid branch coverage is generated
+ in the case of two files."""
+ self.make_file(
+ "main_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ def is_it_x(x):
+ if x == 3:
+ return x
+ else:
+ return False
+
+ """,
+ )
+
+ self.make_file(
+ "test_file.py",
+ """\
+ #!/usr/bin/env python3
+
+ from main_file import *
+ import unittest
+
+ class TestIsItX(unittest.TestCase):
+ def test_is_it_x(self):
+ self.assertEqual(is_it_x(3), 3)
+ self.assertEqual(is_it_x(4), False)
+
+ """,
+ )
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(branch=True, source=".")
+ self.start_import_stop(cov, "test_file")
+ cov.lcov_report()
+ self.assert_exists("coverage.lcov")
+ expected_result = """\
+ TN:
+ SF:main_file.py
+ DA:3,1,4MDXMbvwQ3L7va1tsphVzw
+ DA:4,0,MuERA6EYyZNpKPqoJfzwkA
+ DA:5,0,sAyiiE6iAuPMte9kyd0+3g
+ DA:7,0,W/g8GJDAYJkSSurt59Mzfw
+ LF:4
+ LH:1
+ BRDA:5,0,0,-
+ BRDA:7,0,1,-
+ BRF:2
+ BRH:0
+ end_of_record
+ TN:
+ SF:test_file.py
+ DA:3,1,9TxKIyoBtmhopmlbDNa8FQ
+ DA:4,1,E/tvV9JPVDhEcTCkgrwOFw
+ DA:6,1,C3s/c8C1Yd/zoNG1GnGexg
+ DA:7,1,9qPyWexYysgeKtB+YvuzAg
+ DA:8,0,LycuNcdqoUhPXeuXUTf5lA
+ DA:9,0,FPTWzd68bDx76HN7VHu1wA
+ LF:6
+ LH:4
+ BRDA:0,0,0,1
+ BRDA:7,0,1,1
+ BRF:2
+ BRH:2
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ actual_result = self.get_lcov_report_content()
+ assert actual_result == expected_result
+
+ def test_half_covered_branch(self):
+ """Test that for a given branch that is only half covered,
+ the block numbers remain the same, and produces valid lcov.
+ """
+ self.make_file(
+ "main_file.py",
+ """\
+ something = True
+
+ if something:
+ print("Yes, something")
+ else:
+ print("No, nothing")
+
+ """,
+ )
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(branch=True, source=".")
+ self.start_import_stop(cov, "main_file")
+ cov.lcov_report()
+ self.assert_exists("coverage.lcov")
+ expected_result = """\
+ TN:
+ SF:main_file.py
+ DA:1,1,N4kbVOlkNI1rqOfCArBClw
+ DA:3,1,CmlqqPf0/H+R/p7/PLEXZw
+ DA:4,1,rE3mWnpoMq2W2sMETVk/uQ
+ DA:6,0,+Aov7ekIts7C96udNDVIIQ
+ LF:4
+ LH:3
+ BRDA:6,0,0,-
+ BRDA:4,0,1,1
+ BRF:2
+ BRH:1
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ actual_result = self.get_lcov_report_content()
+ assert actual_result == expected_result
+
+ def test_empty_init_files(self):
+ """Test that in the case of an empty __init__.py file, the lcov
+ reporter will note that the file is there, and will note the empty
+ line. It will also note the lack of branches, and the checksum for
+ the line.
+
+ Although there are no lines found, it will note one line as hit.
+ """
+
+ self.make_file("__init__.py", "")
+ self.assert_doesnt_exist(".coverage")
+ cov = coverage.Coverage(branch=True, source=".")
+ self.start_import_stop(cov, "__init__")
+ cov.lcov_report()
+ self.assert_exists("coverage.lcov")
+ expected_result = """\
+ TN:
+ SF:__init__.py
+ DA:1,1,1B2M2Y8AsgTpgAmY7PhCfg
+ LF:0
+ LH:1
+ BRF:0
+ BRH:0
+ end_of_record
+ """
+ expected_result = textwrap.dedent(expected_result)
+ actual_result = self.get_lcov_report_content()
+ assert actual_result == expected_result