#!/usr/bin/python3

import unittest
import lcov_parser
from io import StringIO


def expected_coverage(covered, uncovered):
	lines = {}  # Type: Dict[int, bool]

	for cov in covered:
		lines[cov] = True
	for uncov in uncovered:
		lines[uncov] = False

	return lines


class LcovParserTest(unittest.TestCase):

	def test_small_dir_passes(self):
		want_data = {}  # Type: Dict[Text, lcov_parser.FileData]

		want_data['/kunit/test/strerror.c'] = expected_coverage([156], [154])
		want_data['/kunit/test/strerror-test.c'] = expected_coverage([14], [16])

		with StringIO(_TEST_FILE_DATA.strip()) as input:
			test_name, coverage_data = lcov_parser.parse(input)
			self.assertEqual(test_name, 'kunit_presubmit_tests')
			self.assertEqual(coverage_data, want_data)

	def test_raises_errors(self):

		with self.assertRaises(lcov_parser.LcovSyntaxError):
			with StringIO('') as input_data:
				test_name, data = lcov_parser.parse(input_data)

		with self.assertRaises(lcov_parser.LcovSyntaxError):
			with StringIO('invalid_first_line\n') as input_data:
				test_name, data = lcov_parser.parse(input_data)

		with self.assertRaises(lcov_parser.LcovSyntaxError):
			with StringIO('TN:valid_line\nDA:invalid_second,str\n') as input_data:
				test_name, data = lcov_parser.parse(input_data)


_TEST_FILE_DATA = """
TN:kunit_presubmit_tests
SF:/kunit/test/strerror.c
DA:154,0
DA:156,10
end_of_record
SF:/kunit/test/strerror-test.c
DA:14,1
DA:16,0
end_of_record
"""

if __name__ == '__main__':
	unittest.main()
