37 lines
923 B
Python
37 lines
923 B
Python
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()
|