To-The-Stars/litwiki/citation.py

38 lines
987 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.125"), Citation(1, 2, 125))
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()