import unittest from typing import Optional import dataclasses @dataclasses.dataclass class Citation: volume: int chapter: int line: int def parse(src: str) -> Optional[Citation]: try: volume, chapter, line = src.split(".") volume = int(volume) chapter = int(chapter) line = int(line) if volume <= 0 or chapter <= 0 or line <= 0: raise ValueError(f"Invalid citation point {volume}.{chapter}.{line}") return Citation(volume, chapter, line) except ValueError: return None class TestCitation(unittest.TestCase): def test_parse(self): self.assertEqual(parse("1.2.3"), Citation(1, 2, 3)) self.assertEqual(parse("1.2.0"), None) self.assertEqual(parse("(I.2.3)"), None) self.assertEqual(parse("I.5.1"), None) self.assertEqual(parse(""), None) if __name__ == "__main__": unittest.main()