diff --git a/src/ocrmypdf/_validation.py b/src/ocrmypdf/_validation.py index 02bf043b..5c9bc2a1 100644 --- a/src/ocrmypdf/_validation.py +++ b/src/ocrmypdf/_validation.py @@ -185,7 +185,10 @@ def _pages_from_ranges(ranges): except ValueError: pages.append(int(g) - 1) else: - pages.extend(range(int(start) - 1, int(end))) + try: + pages.extend(range(int(start) - 1, int(end))) + except ValueError: + raise BadArgsError("invalid page range") if not monotonic(pages): log.warning( diff --git a/tests/test_page_numbers.py b/tests/test_page_numbers.py index b2cd7879..46643037 100644 --- a/tests/test_page_numbers.py +++ b/tests/test_page_numbers.py @@ -20,14 +20,32 @@ import pytest import ocrmypdf from ocrmypdf._validation import _pages_from_ranges from ocrmypdf.pdfinfo import PdfInfo +from ocrmypdf.exceptions import BadArgsError -def test_str_ranges(): - assert _pages_from_ranges('43') == {42} - assert _pages_from_ranges('1, 2, 3') == {0, 1, 2} - assert _pages_from_ranges('1-3') == {0, 1, 2} - assert _pages_from_ranges('1-3,5,7,42') == {0, 1, 2, 4, 6, 41} - assert _pages_from_ranges('3, 3, 3, 3,') == {2} +@pytest.mark.parametrize( + 'pages, result', + [ + ['1', {0}], + ['1,2', {0, 1}], + ['1-3', {0, 1, 2}], + ['2,5,6', {1, 4, 5}], + ['11-15, 18, ', {10, 11, 12, 13, 14, 17}], + [',,3', {2}], + ['3, 3, 3, 3,', {2}], + ['3, 2, 1, 42', {0, 1, 2, 41}], + ['-1', BadArgsError], + ['1,3,-11', BadArgsError], + ['1-,', BadArgsError], + ['start-end', BadArgsError], + ], +) +def test_pages(pages, result): + if isinstance(result, type): + with pytest.raises(result): + _pages_from_ranges(pages) + else: + assert _pages_from_ranges(pages) == result def test_nonmonotonic_warning(caplog):